[OpenWrt-Devel,4/6] gpio: gemini: rename to match Faraday IP

Message ID 20170312232818.26304-4-linus.walleij@linaro.org
State New
Headers show

Commit Message

Linus Walleij March 12, 2017, 11:28 p.m.
The Gemini driver is actually a driver for the Faraday Technology
FTGPIO010 IP block. We rename the driver and the Kconfig symbol and
put in a a new compatible string for the Moxa ART SoC that is also
using this IP block.

Cc: Jonas Jensen <jonas.jensen@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/Kconfig                             |  7 ++-
 drivers/gpio/Makefile                            |  2 +-
 drivers/gpio/{gpio-gemini.c => gpio-ftgpio010.c} | 72 +++++++++++++-----------
 3 files changed, 44 insertions(+), 37 deletions(-)
 rename drivers/gpio/{gpio-gemini.c => gpio-ftgpio010.c} (73%)

Comments

Jonas Jensen March 21, 2017, 10:59 a.m. | #1
Verified on UC-7112-LX by buzzing the buzzer and writing the RTC (see
log [1] for next-20170310):

[1] https://bitbucket.org/Kasreyn/linux-next/commits/c63f3c2215f6fd106ff0ec6f9864b85b7be565ac

[    0.000000] Linux version 4.11.0-rc1-next-20170310-00004-gc63f3c2
(i@ildjarn) (gcc version 4.9.1 (crosstool-NG 1.20.0) ) #4461 PREEMP
T Tue Mar 21 11:43:29 CET 2017
..
echo 24 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio24/direction
echo 1 > /sys/class/gpio/gpio24/value
echo 0 > /sys/class/gpio/gpio24/value
..
date +%Y%m%d%h%m -s "201001202323"
hwclock -w
reboot
..
[    4.520000] moxart-rtc 90000000.soc:rtc: setting system clock to
2010-01-20 23:23:20 UTC (1264029800)
..
date +%Y%m%d%h%m -s "201212181553"
hwclock -w
reboot
..
[    4.520000] moxart-rtc 90000000.soc:rtc: setting system clock to
2012-12-18 15:53:20 UTC (1355846000)


Tested-by: Jonas Jensen <jonas.jensen@gmail.com>
Linus Walleij March 22, 2017, 8:42 a.m. | #2
On Tue, Mar 21, 2017 at 11:59 AM, Jonas Jensen <jonas.jensen@gmail.com> wrote:

> Verified on UC-7112-LX by buzzing the buzzer and writing the RTC (see
> log [1] for next-20170310):
>
> [1] https://bitbucket.org/Kasreyn/linux-next/commits/c63f3c2215f6fd106ff0ec6f9864b85b7be565ac
>
> [    0.000000] Linux version 4.11.0-rc1-next-20170310-00004-gc63f3c2
> (i@ildjarn) (gcc version 4.9.1 (crosstool-NG 1.20.0) ) #4461 PREEMP
> T Tue Mar 21 11:43:29 CET 2017
> ..
> echo 24 > /sys/class/gpio/export
> echo out > /sys/class/gpio/gpio24/direction
> echo 1 > /sys/class/gpio/gpio24/value
> echo 0 > /sys/class/gpio/gpio24/value
> ..
> date +%Y%m%d%h%m -s "201001202323"
> hwclock -w
> reboot
> ..
> [    4.520000] moxart-rtc 90000000.soc:rtc: setting system clock to
> 2010-01-20 23:23:20 UTC (1264029800)

Nice! Have you tested my new GPIO character device tools from
tools/gpio/* in the kernel tree?

> Tested-by: Jonas Jensen <jonas.jensen@gmail.com>

Thanks man. I have only a few more or these, I might save some
for the next kernel cycle. ;)

Yours,
Linus Walleij
Jonas Jensen March 22, 2017, 10:21 a.m. | #3
On 22 March 2017 at 09:42, Linus Walleij <linus.walleij@linaro.org> wrote:
> Nice! Have you tested my new GPIO character device tools from
> tools/gpio/* in the kernel tree?

I had not and thanks for pointing that out, lsgpio lists all available
gpios (though most of them are unnamed), and gpio-hammer successfully
toggled buzzer on/off.

uname -a
Linux zurkon 4.11.0-rc1-next-20170310-00004-gc63f3c2 #4466 PREEMPT Wed
Mar 22 11:05:28 CET 2017 armv4l GNU/Linux

./lsgpio
GPIO chip: gpiochip0, "FTGPIO010", 32 GPIO lines
        line  0: unnamed unused [output]
        line  1: unnamed unused [output]
        line  2: unnamed unused [output]
        line  3: unnamed unused [output]
        line  4: unnamed unused
        line  5: unnamed "rtc_sclk" [kernel output]
        line  6: unnamed "rtc_data" [kernel]
        line  7: unnamed "rtc_reset" [kernel output]
        line  8: unnamed unused
        line  9: unnamed unused
        line 10: unnamed unused
        line 11: unnamed unused [output]
        line 12: unnamed unused
        line 13: unnamed unused [output]
        line 14: unnamed unused
        line 15: unnamed unused [output]
        line 16: unnamed unused
        line 17: unnamed unused [output]
        line 18: unnamed unused
        line 19: unnamed unused
        line 20: unnamed unused
        line 21: unnamed unused
        line 22: unnamed unused
        line 23: unnamed unused
        line 24: unnamed unused [output]
        line 25: unnamed unused
        line 26: unnamed unused
        line 27: unnamed "ready-led" [kernel output active-low]
        line 28: unnamed unused
        line 29: unnamed unused
        line 30: unnamed unused
        line 31: unnamed unused [output]

./gpio-hammer -n gpiochip0 -o 24
Hammer lines [24] on gpiochip0, initial states: [0]
[|] [24: 1]

./gpio-hammer -n gpiochip0 -o 27
Failed to issue GET LINEHANDLE IOCTL (-16)


   Jonas
Linus Walleij March 23, 2017, 12:47 p.m. | #4
On Wed, Mar 22, 2017 at 11:21 AM, Jonas Jensen <jonas.jensen@gmail.com> wrote:
> On 22 March 2017 at 09:42, Linus Walleij <linus.walleij@linaro.org> wrote:

>> Nice! Have you tested my new GPIO character device tools from
>> tools/gpio/* in the kernel tree?
>
> I had not and thanks for pointing that out, lsgpio lists all available
> gpios (though most of them are unnamed), and gpio-hammer successfully
> toggled buzzer on/off.

Nice.

> GPIO chip: gpiochip0, "FTGPIO010", 32 GPIO lines
>         line  0: unnamed unused [output]
>         line  1: unnamed unused [output]
>         line  2: unnamed unused [output]
>         line  3: unnamed unused [output]

BTW you can name all the "unnamed" lines by using
gpio-line-names in the gpio node of the device tree, c.f.
commit 3a1689ea752436917c5ce4487527ed6c444630ee

>         line 24: unnamed unused [output]
>         line 25: unnamed unused
>         line 26: unnamed unused
>         line 27: unnamed "ready-led" [kernel output active-low]
(...)
>
> ./gpio-hammer -n gpiochip0 -o 24
> Hammer lines [24] on gpiochip0, initial states: [0]
> [|] [24: 1]
>
> ./gpio-hammer -n gpiochip0 -o 27
> Failed to issue GET LINEHANDLE IOCTL (-16)

So finally when the kernel is using a GPIO line you can't use it
from userspace at the same time. -16 is -EBUSY.

Yours,
Linus Walleij

Patch

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 05043071fc98..82ba825c224a 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -204,14 +204,15 @@  config GPIO_GE_FPGA
 	  and write pin state) for GPIO implemented in a number of GE single
 	  board computers.
 
-config GPIO_GEMINI
-	bool "Gemini GPIO"
+config GPIO_FTGPIO010
+	bool "Faraday FTGPIO010 GPIO"
 	depends on ARCH_GEMINI
 	depends on OF_GPIO
 	select GPIO_GENERIC
 	select GPIOLIB_IRQCHIP
 	help
-	  Support for common GPIOs found in Cortina systems Gemini platforms.
+	  Support for common GPIOs from the Faraday FTGPIO010 IP core, found in
+	  Cortina systems Gemini platforms, Moxa ART and others.
 
 config GPIO_GENERIC_PLATFORM
 	tristate "Generic memory-mapped GPIO controller support (MMIO platform device)"
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index becb96c724fe..4b904fec8273 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -48,8 +48,8 @@  obj-$(CONFIG_GPIO_EP93XX)	+= gpio-ep93xx.o
 obj-$(CONFIG_GPIO_ETRAXFS)	+= gpio-etraxfs.o
 obj-$(CONFIG_GPIO_EXAR)		+= gpio-exar.o
 obj-$(CONFIG_GPIO_F7188X)	+= gpio-f7188x.o
+obj-$(CONFIG_GPIO_FTGPIO010)	+= gpio-ftgpio010.o
 obj-$(CONFIG_GPIO_GE_FPGA)	+= gpio-ge.o
-obj-$(CONFIG_GPIO_GEMINI)	+= gpio-gemini.o
 obj-$(CONFIG_GPIO_GPIO_MM)	+= gpio-gpio-mm.o
 obj-$(CONFIG_GPIO_GRGPIO)	+= gpio-grgpio.o
 obj-$(CONFIG_HTC_EGPIO)		+= gpio-htc-egpio.o
diff --git a/drivers/gpio/gpio-gemini.c b/drivers/gpio/gpio-ftgpio010.c
similarity index 73%
rename from drivers/gpio/gpio-gemini.c
rename to drivers/gpio/gpio-ftgpio010.c
index 962485163b7f..e9386f8b67f5 100644
--- a/drivers/gpio/gpio-gemini.c
+++ b/drivers/gpio/gpio-ftgpio010.c
@@ -1,5 +1,5 @@ 
 /*
- * Gemini gpiochip and interrupt routines
+ * Faraday Technolog FTGPIO010 gpiochip and interrupt routines
  * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org>
  *
  * Based on arch/arm/mach-gemini/gpio.c:
@@ -35,28 +35,28 @@ 
 #define GPIO_DEBOUNCE_PRESCALE	0x44
 
 /**
- * struct gemini_gpio - Gemini GPIO state container
+ * struct ftgpio_gpio - Gemini GPIO state container
  * @dev: containing device for this instance
  * @gc: gpiochip for this instance
  */
-struct gemini_gpio {
+struct ftgpio_gpio {
 	struct device *dev;
 	struct gpio_chip gc;
 	void __iomem *base;
 };
 
-static void gemini_gpio_ack_irq(struct irq_data *d)
+static void ftgpio_gpio_ack_irq(struct irq_data *d)
 {
 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-	struct gemini_gpio *g = gpiochip_get_data(gc);
+	struct ftgpio_gpio *g = gpiochip_get_data(gc);
 
 	writel(BIT(irqd_to_hwirq(d)), g->base + GPIO_INT_CLR);
 }
 
-static void gemini_gpio_mask_irq(struct irq_data *d)
+static void ftgpio_gpio_mask_irq(struct irq_data *d)
 {
 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-	struct gemini_gpio *g = gpiochip_get_data(gc);
+	struct ftgpio_gpio *g = gpiochip_get_data(gc);
 	u32 val;
 
 	val = readl(g->base + GPIO_INT_EN);
@@ -64,10 +64,10 @@  static void gemini_gpio_mask_irq(struct irq_data *d)
 	writel(val, g->base + GPIO_INT_EN);
 }
 
-static void gemini_gpio_unmask_irq(struct irq_data *d)
+static void ftgpio_gpio_unmask_irq(struct irq_data *d)
 {
 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-	struct gemini_gpio *g = gpiochip_get_data(gc);
+	struct ftgpio_gpio *g = gpiochip_get_data(gc);
 	u32 val;
 
 	val = readl(g->base + GPIO_INT_EN);
@@ -75,10 +75,10 @@  static void gemini_gpio_unmask_irq(struct irq_data *d)
 	writel(val, g->base + GPIO_INT_EN);
 }
 
-static int gemini_gpio_set_irq_type(struct irq_data *d, unsigned int type)
+static int ftgpio_gpio_set_irq_type(struct irq_data *d, unsigned int type)
 {
 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-	struct gemini_gpio *g = gpiochip_get_data(gc);
+	struct ftgpio_gpio *g = gpiochip_get_data(gc);
 	u32 mask = BIT(irqd_to_hwirq(d));
 	u32 reg_both, reg_level, reg_type;
 
@@ -123,23 +123,23 @@  static int gemini_gpio_set_irq_type(struct irq_data *d, unsigned int type)
 	writel(reg_level, g->base + GPIO_INT_LEVEL);
 	writel(reg_both, g->base + GPIO_INT_BOTH_EDGE);
 
-	gemini_gpio_ack_irq(d);
+	ftgpio_gpio_ack_irq(d);
 
 	return 0;
 }
 
-static struct irq_chip gemini_gpio_irqchip = {
-	.name = "GPIO",
-	.irq_ack = gemini_gpio_ack_irq,
-	.irq_mask = gemini_gpio_mask_irq,
-	.irq_unmask = gemini_gpio_unmask_irq,
-	.irq_set_type = gemini_gpio_set_irq_type,
+static struct irq_chip ftgpio_gpio_irqchip = {
+	.name = "FTGPIO010",
+	.irq_ack = ftgpio_gpio_ack_irq,
+	.irq_mask = ftgpio_gpio_mask_irq,
+	.irq_unmask = ftgpio_gpio_unmask_irq,
+	.irq_set_type = ftgpio_gpio_set_irq_type,
 };
 
-static void gemini_gpio_irq_handler(struct irq_desc *desc)
+static void ftgpio_gpio_irq_handler(struct irq_desc *desc)
 {
 	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
-	struct gemini_gpio *g = gpiochip_get_data(gc);
+	struct ftgpio_gpio *g = gpiochip_get_data(gc);
 	struct irq_chip *irqchip = irq_desc_get_chip(desc);
 	int offset;
 	unsigned long stat;
@@ -155,11 +155,11 @@  static void gemini_gpio_irq_handler(struct irq_desc *desc)
 	chained_irq_exit(irqchip, desc);
 }
 
-static int gemini_gpio_probe(struct platform_device *pdev)
+static int ftgpio_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct resource *res;
-	struct gemini_gpio *g;
+	struct ftgpio_gpio *g;
 	int irq;
 	int ret;
 
@@ -189,7 +189,7 @@  static int gemini_gpio_probe(struct platform_device *pdev)
 		dev_err(dev, "unable to init generic GPIO\n");
 		return ret;
 	}
-	g->gc.label = "Gemini";
+	g->gc.label = "FTGPIO010";
 	g->gc.base = -1;
 	g->gc.parent = dev;
 	g->gc.owner = THIS_MODULE;
@@ -204,33 +204,39 @@  static int gemini_gpio_probe(struct platform_device *pdev)
 	writel(0x0, g->base + GPIO_INT_MASK);
 	writel(~0x0, g->base + GPIO_INT_CLR);
 
-	ret = gpiochip_irqchip_add(&g->gc, &gemini_gpio_irqchip,
+	ret = gpiochip_irqchip_add(&g->gc, &ftgpio_gpio_irqchip,
 				   0, handle_bad_irq,
 				   IRQ_TYPE_NONE);
 	if (ret) {
 		dev_info(dev, "could not add irqchip\n");
 		return ret;
 	}
-	gpiochip_set_chained_irqchip(&g->gc, &gemini_gpio_irqchip,
-				     irq, gemini_gpio_irq_handler);
+	gpiochip_set_chained_irqchip(&g->gc, &ftgpio_gpio_irqchip,
+				     irq, ftgpio_gpio_irq_handler);
 
-	dev_info(dev, "Gemini GPIO @%p registered\n", g->base);
+	dev_info(dev, "FTGPIO010 @%p registered\n", g->base);
 
 	return 0;
 }
 
-static const struct of_device_id gemini_gpio_of_match[] = {
+static const struct of_device_id ftgpio_gpio_of_match[] = {
 	{
 		.compatible = "cortina,gemini-gpio",
 	},
+	{
+		.compatible = "moxa,moxart-gpio",
+	},
+	{
+		.compatible = "faraday,ftgpio010",
+	},
 	{},
 };
 
-static struct platform_driver gemini_gpio_driver = {
+static struct platform_driver ftgpio_gpio_driver = {
 	.driver = {
-		.name		= "gemini-gpio",
-		.of_match_table = of_match_ptr(gemini_gpio_of_match),
+		.name		= "ftgpio010-gpio",
+		.of_match_table = of_match_ptr(ftgpio_gpio_of_match),
 	},
-	.probe	= gemini_gpio_probe,
+	.probe	= ftgpio_gpio_probe,
 };
-builtin_platform_driver(gemini_gpio_driver);
+builtin_platform_driver(ftgpio_gpio_driver);