From 58383c78425e4ee1c077253cf297b641c861c02e Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Wed, 4 Nov 2015 09:56:26 +0100 Subject: gpio: change member .dev to .parent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The name .dev in a struct is normally reserved for a struct device that is let us say a superclass to the thing described by the struct. struct gpio_chip stands out by confusingly using a struct device *dev to point to the parent device (such as a platform_device) that represents the hardware. As we want to give gpio_chip:s real devices, this is not working. We need to rename this member to parent. This was done by two coccinelle scripts, I guess it is possible to combine them into one, but I don't know such stuff. They look like this: @@ struct gpio_chip *var; @@ -var->dev +var->parent and: @@ struct gpio_chip var; @@ -var.dev +var.parent and: @@ struct bgpio_chip *var; @@ -var->gc.dev +var->gc.parent Plus a few instances of bgpio that I couldn't figure out how to teach Coccinelle to rewrite. This patch hits all over the place, but I *strongly* prefer this solution to any piecemal approaches that just exercise patch mechanics all over the place. It mainly hits drivers/gpio and drivers/pinctrl which is my own backyard anyway. Cc: Haavard Skinnemoen Cc: Rafał Miłecki Cc: Richard Purdie Cc: Mauro Carvalho Chehab Cc: Alek Du Cc: Jaroslav Kysela Cc: Takashi Iwai Acked-by: Dmitry Torokhov Acked-by: Greg Kroah-Hartman Acked-by: Lee Jones Acked-by: Jiri Kosina Acked-by: Hans-Christian Egtvedt Acked-by: Jacek Anaszewski Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index 34ed176df15a..e43db64e52b3 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -220,7 +220,7 @@ static void pch_gpio_setup(struct pch_gpio *chip) struct gpio_chip *gpio = &chip->gpio; gpio->label = dev_name(chip->dev); - gpio->dev = chip->dev; + gpio->parent = chip->dev; gpio->owner = THIS_MODULE; gpio->direction_input = pch_gpio_direction_input; gpio->get = pch_gpio_get; -- cgit v1.2.3 From 1cfadea8f395e3fb6a15ea548e3e86c8b6d64f98 Mon Sep 17 00:00:00 2001 From: Paul Burton Date: Mon, 30 Nov 2015 16:21:38 +0000 Subject: gpio: pch: allow use from device tree Allow GPIOs from the gpio-pch driver to be referenced from device tree by simply setting the struct gpio_chip of_node pointer to that of the struct pci_dev. Signed-off-by: Paul Burton Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index e43db64e52b3..a650a6cc1312 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -394,6 +394,7 @@ static int pch_gpio_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, chip); spin_lock_init(&chip->spinlock); pch_gpio_setup(chip); + chip->gpio.of_node = pdev->dev.of_node; ret = gpiochip_add(&chip->gpio); if (ret) { dev_err(&pdev->dev, "PCH gpio: Failed to register GPIO\n"); -- cgit v1.2.3 From a9f1a3e4c1c7dc82711bc22dc52c7b0d6912ed56 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Tue, 15 Dec 2015 14:41:44 +0100 Subject: gpio: pch: fix non-DT build commit 1cfadea8f395e3fb6a15ea548e3e86c8b6d64f98 "gpio: pch: allow use from device tree" makes the driver not compile unless CONFIG_OF_GPIO is set. Fix it. Cc: Paul Burton Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index a650a6cc1312..af0715f8524b 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -394,7 +394,9 @@ static int pch_gpio_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, chip); spin_lock_init(&chip->spinlock); pch_gpio_setup(chip); +#ifdef CONFIG_OF_GPIO chip->gpio.of_node = pdev->dev.of_node; +#endif ret = gpiochip_add(&chip->gpio); if (ret) { dev_err(&pdev->dev, "PCH gpio: Failed to register GPIO\n"); -- cgit v1.2.3 From 5b818fd18c7b81bb41c8a18943e562407ac95952 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Mon, 21 Dec 2015 11:34:11 +0100 Subject: gpio: pch: Be sure to clamp return value As we want gpio_chip .get() calls to be able to return negative error codes and propagate to drivers, we need to go over all drivers and make sure their return values are clamped to [0,1]. We do this by using the ret = !!(val) design pattern. Cc: Thierry Reding Cc: Daniel Krueger Cc: Jean Delvare Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index af0715f8524b..8c45b74dcf21 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -127,7 +127,7 @@ static int pch_gpio_get(struct gpio_chip *gpio, unsigned nr) { struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); - return ioread32(&chip->reg->pi) & (1 << nr); + return !!(ioread32(&chip->reg->pi) & (1 << nr)); } static int pch_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, -- cgit v1.2.3 From 510f48713711abed9a79aa405147687dd256d072 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Mon, 7 Dec 2015 11:34:53 +0100 Subject: gpio: pch: use gpiochip data pointer This makes the driver use the data pointer added to the gpio_chip to store a pointer to the state container instead of relying on container_of(). Cc: Thierry Reding Cc: Daniel Krueger Reviewed-by: Jean Delvare Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index 8c45b74dcf21..0475782a7e88 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -109,7 +109,7 @@ struct pch_gpio { static void pch_gpio_set(struct gpio_chip *gpio, unsigned nr, int val) { u32 reg_val; - struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); + struct pch_gpio *chip = gpiochip_get_data(gpio); unsigned long flags; spin_lock_irqsave(&chip->spinlock, flags); @@ -125,7 +125,7 @@ static void pch_gpio_set(struct gpio_chip *gpio, unsigned nr, int val) static int pch_gpio_get(struct gpio_chip *gpio, unsigned nr) { - struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); + struct pch_gpio *chip = gpiochip_get_data(gpio); return !!(ioread32(&chip->reg->pi) & (1 << nr)); } @@ -133,7 +133,7 @@ static int pch_gpio_get(struct gpio_chip *gpio, unsigned nr) static int pch_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, int val) { - struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); + struct pch_gpio *chip = gpiochip_get_data(gpio); u32 pm; u32 reg_val; unsigned long flags; @@ -158,7 +158,7 @@ static int pch_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, static int pch_gpio_direction_input(struct gpio_chip *gpio, unsigned nr) { - struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); + struct pch_gpio *chip = gpiochip_get_data(gpio); u32 pm; unsigned long flags; @@ -211,7 +211,7 @@ static void pch_gpio_restore_reg_conf(struct pch_gpio *chip) static int pch_gpio_to_irq(struct gpio_chip *gpio, unsigned offset) { - struct pch_gpio *chip = container_of(gpio, struct pch_gpio, gpio); + struct pch_gpio *chip = gpiochip_get_data(gpio); return chip->irq_base + offset; } @@ -397,7 +397,7 @@ static int pch_gpio_probe(struct pci_dev *pdev, #ifdef CONFIG_OF_GPIO chip->gpio.of_node = pdev->dev.of_node; #endif - ret = gpiochip_add(&chip->gpio); + ret = gpiochip_add_data(&chip->gpio, chip); if (ret) { dev_err(&pdev->dev, "PCH gpio: Failed to register GPIO\n"); goto err_gpiochip_add; -- cgit v1.2.3 From 166814d8413df49bf21293aacc808b2782cbd9a8 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Tue, 5 Jan 2016 14:23:47 +0100 Subject: gpio: pch: Optimize pch_gpio_get() The double negation is costly and can be avoided by shifting the register value before masking the requested bit. Signed-off-by: Jean Delvare Cc: Linus Walleij Signed-off-by: Linus Walleij --- drivers/gpio/gpio-pch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/gpio/gpio-pch.c') diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c index 0475782a7e88..7c7135da5d4a 100644 --- a/drivers/gpio/gpio-pch.c +++ b/drivers/gpio/gpio-pch.c @@ -127,7 +127,7 @@ static int pch_gpio_get(struct gpio_chip *gpio, unsigned nr) { struct pch_gpio *chip = gpiochip_get_data(gpio); - return !!(ioread32(&chip->reg->pi) & (1 << nr)); + return (ioread32(&chip->reg->pi) >> nr) & 1; } static int pch_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, -- cgit v1.2.3