* [PATCH V5 3/7] MIPS: Move Loongson GPIO driver to drivers/gpio
2014-11-21 9:16 [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
@ 2014-11-21 9:16 ` Huacai Chen
2014-11-21 9:16 ` [PATCH V5 4/7] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
2014-11-28 7:48 ` [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
2 siblings, 0 replies; 6+ messages in thread
From: Huacai Chen @ 2014-11-21 9:16 UTC (permalink / raw)
To: Ralf Baechle
Cc: John Crispin, Steven J. Hill, linux-mips, Fuxin Zhang,
Zhangjin Wu, linux-gpio, Huacai Chen
Move Loongson-2's GPIO driver to drivers/gpio and add Kconfig options.
Signed-off-by: Huacai Chen <chenhc@lemote.com>
---
arch/mips/configs/lemote2f_defconfig | 1 +
arch/mips/loongson/common/Makefile | 1 -
drivers/gpio/Kconfig | 6 ++++++
drivers/gpio/Makefile | 1 +
.../common/gpio.c => drivers/gpio/gpio-loongson.c | 0
5 files changed, 8 insertions(+), 1 deletions(-)
rename arch/mips/loongson/common/gpio.c => drivers/gpio/gpio-loongson.c (100%)
diff --git a/arch/mips/configs/lemote2f_defconfig b/arch/mips/configs/lemote2f_defconfig
index 227a9de..0549b01 100644
--- a/arch/mips/configs/lemote2f_defconfig
+++ b/arch/mips/configs/lemote2f_defconfig
@@ -172,6 +172,7 @@ CONFIG_SERIAL_8250_FOURPORT=y
CONFIG_LEGACY_PTY_COUNT=16
CONFIG_HW_RANDOM=y
CONFIG_RTC=y
+CONFIG_GPIO_LOONGSON=y
CONFIG_THERMAL=y
CONFIG_MEDIA_SUPPORT=m
CONFIG_VIDEO_DEV=m
diff --git a/arch/mips/loongson/common/Makefile b/arch/mips/loongson/common/Makefile
index d87e033..e70c33f 100644
--- a/arch/mips/loongson/common/Makefile
+++ b/arch/mips/loongson/common/Makefile
@@ -4,7 +4,6 @@
obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
bonito-irq.o mem.o machtype.o platform.o
-obj-$(CONFIG_GPIOLIB) += gpio.o
obj-$(CONFIG_PCI) += pci.o
#
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 0959ca9..bc5ffac 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -452,6 +452,12 @@ config GPIO_GRGPIO
Select this to support Aeroflex Gaisler GRGPIO cores from the GRLIB
VHDL IP core library.
+config GPIO_LOONGSON
+ tristate "Loongson-2 GPIO support"
+ depends on CPU_LOONGSON2
+ help
+ driver for GPIO functionality on Loongson-2F processors.
+
config GPIO_TB10X
bool
select GENERIC_IRQ_CHIP
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index e5d346c..2153a71 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o
obj-$(CONFIG_GPIO_KEMPLD) += gpio-kempld.o
obj-$(CONFIG_ARCH_KS8695) += gpio-ks8695.o
obj-$(CONFIG_GPIO_INTEL_MID) += gpio-intel-mid.o
+obj-$(CONFIG_GPIO_LOONGSON) += gpio-loongson.o
obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o
obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o
obj-$(CONFIG_GPIO_LYNXPOINT) += gpio-lynxpoint.o
diff --git a/arch/mips/loongson/common/gpio.c b/drivers/gpio/gpio-loongson.c
similarity index 100%
rename from arch/mips/loongson/common/gpio.c
rename to drivers/gpio/gpio-loongson.c
--
1.7.7.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH V5 4/7] GPIO: Add Loongson-3A/3B GPIO driver support
2014-11-21 9:16 [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
2014-11-21 9:16 ` [PATCH V5 3/7] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
@ 2014-11-21 9:16 ` Huacai Chen
2014-11-28 7:48 ` [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
2 siblings, 0 replies; 6+ messages in thread
From: Huacai Chen @ 2014-11-21 9:16 UTC (permalink / raw)
To: Ralf Baechle
Cc: John Crispin, Steven J. Hill, linux-mips, Fuxin Zhang,
Zhangjin Wu, linux-gpio, Huacai Chen
Improve Loongson-2's GPIO driver to support Loongson-3A/3B, and update
Loongson-3's default config file.
Signed-off-by: Huacai Chen <chenhc@lemote.com>
---
arch/mips/Kconfig | 1 +
arch/mips/configs/loongson3_defconfig | 1 +
drivers/gpio/Kconfig | 6 ++--
drivers/gpio/gpio-loongson.c | 52 +++++++++++++++++++-------------
4 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 9e909b9..c2c4674 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1235,6 +1235,7 @@ config CPU_LOONGSON3
select CPU_SUPPORTS_HUGEPAGES
select WEAK_ORDERING
select WEAK_REORDERING_BEYOND_LLSC
+ select ARCH_REQUIRE_GPIOLIB
help
The Loongson 3 processor implements the MIPS64R2 instruction
set with many extensions.
diff --git a/arch/mips/configs/loongson3_defconfig b/arch/mips/configs/loongson3_defconfig
index 1c6191e..e7a9bb4 100644
--- a/arch/mips/configs/loongson3_defconfig
+++ b/arch/mips/configs/loongson3_defconfig
@@ -243,6 +243,7 @@ CONFIG_HW_RANDOM=y
CONFIG_RAW_DRIVER=m
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_PIIX4=y
+CONFIG_GPIO_LOONGSON=y
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM93=m
CONFIG_SENSORS_W83627HF=m
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index bc5ffac..1ef82b2 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -453,10 +453,10 @@ config GPIO_GRGPIO
VHDL IP core library.
config GPIO_LOONGSON
- tristate "Loongson-2 GPIO support"
- depends on CPU_LOONGSON2
+ tristate "Loongson-2/3 GPIO support"
+ depends on CPU_LOONGSON2 || CPU_LOONGSON3
help
- driver for GPIO functionality on Loongson-2F processors.
+ driver for GPIO functionality on Loongson-2F/3A/3B processors.
config GPIO_TB10X
bool
diff --git a/drivers/gpio/gpio-loongson.c b/drivers/gpio/gpio-loongson.c
index 087aac3..dc28354 100644
--- a/drivers/gpio/gpio-loongson.c
+++ b/drivers/gpio/gpio-loongson.c
@@ -1,8 +1,10 @@
/*
- * STLS2F GPIO Support
+ * Loongson-2F/3A/3B GPIO Support
*
* Copyright (c) 2008 Richard Liu, STMicroelectronics <richard.liu@st.com>
* Copyright (c) 2008-2010 Arnaud Patard <apatard@mandriva.com>
+ * Copyright (c) 2013 Hongbing Hu <huhb@lemote.com>
+ * Copyright (c) 2014 Huacai Chen <chenhc@lemote.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,16 +22,24 @@
#include <linux/gpio.h>
#define STLS2F_N_GPIO 4
-#define STLS2F_GPIO_IN_OFFSET 16
+#define STLS3A_N_GPIO 16
+
+#ifdef CONFIG_CPU_LOONGSON3
+#define LOONGSON_N_GPIO STLS3A_N_GPIO
+#else
+#define LOONGSON_N_GPIO STLS2F_N_GPIO
+#endif
+
+#define LOONGSON_GPIO_IN_OFFSET 16
static DEFINE_SPINLOCK(gpio_lock);
-static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
+static int loongson_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
{
u32 temp;
u32 mask;
- if (gpio >= STLS2F_N_GPIO)
+ if (gpio >= LOONGSON_N_GPIO)
return -EINVAL;
spin_lock(&gpio_lock);
@@ -42,13 +52,13 @@ static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
return 0;
}
-static int ls2f_gpio_direction_output(struct gpio_chip *chip,
+static int loongson_gpio_direction_output(struct gpio_chip *chip,
unsigned gpio, int level)
{
u32 temp;
u32 mask;
- if (gpio >= STLS2F_N_GPIO)
+ if (gpio >= LOONGSON_N_GPIO)
return -EINVAL;
gpio_set_value(gpio, level);
@@ -62,15 +72,15 @@ static int ls2f_gpio_direction_output(struct gpio_chip *chip,
return 0;
}
-static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+static int loongson_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
{
u32 val;
u32 mask;
- if (gpio >= STLS2F_N_GPIO)
+ if (gpio >= LOONGSON_N_GPIO)
return __gpio_get_value(gpio);
- mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
+ mask = 1 << (gpio + LOONGSON_GPIO_IN_OFFSET);
spin_lock(&gpio_lock);
val = LOONGSON_GPIODATA;
spin_unlock(&gpio_lock);
@@ -78,13 +88,13 @@ static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
return (val & mask) != 0;
}
-static void ls2f_gpio_set_value(struct gpio_chip *chip,
+static void loongson_gpio_set_value(struct gpio_chip *chip,
unsigned gpio, int value)
{
u32 val;
u32 mask;
- if (gpio >= STLS2F_N_GPIO) {
+ if (gpio >= LOONGSON_N_GPIO) {
__gpio_set_value(gpio, value);
return;
}
@@ -101,19 +111,19 @@ static void ls2f_gpio_set_value(struct gpio_chip *chip,
spin_unlock(&gpio_lock);
}
-static struct gpio_chip ls2f_chip = {
- .label = "ls2f",
- .direction_input = ls2f_gpio_direction_input,
- .get = ls2f_gpio_get_value,
- .direction_output = ls2f_gpio_direction_output,
- .set = ls2f_gpio_set_value,
+static struct gpio_chip loongson_chip = {
+ .label = "Loongson-gpio-chip",
+ .direction_input = loongson_gpio_direction_input,
+ .get = loongson_gpio_get_value,
+ .direction_output = loongson_gpio_direction_output,
+ .set = loongson_gpio_set_value,
.base = 0,
- .ngpio = STLS2F_N_GPIO,
+ .ngpio = LOONGSON_N_GPIO,
.can_sleep = false,
};
-static int __init ls2f_gpio_setup(void)
+static int __init loongson_gpio_setup(void)
{
- return gpiochip_add(&ls2f_chip);
+ return gpiochip_add(&loongson_chip);
}
-arch_initcall(ls2f_gpio_setup);
+postcore_initcall(loongson_gpio_setup);
--
1.7.7.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver
2014-11-21 9:16 [PATCH V5 2/7] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
2014-11-21 9:16 ` [PATCH V5 3/7] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
2014-11-21 9:16 ` [PATCH V5 4/7] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
@ 2014-11-28 7:48 ` Alexandre Courbot
2014-11-28 13:14 ` 陈华才
2 siblings, 1 reply; 6+ messages in thread
From: Alexandre Courbot @ 2014-11-28 7:48 UTC (permalink / raw)
To: Huacai Chen
Cc: Ralf Baechle, John Crispin, Steven J. Hill, linux-mips,
Fuxin Zhang, Zhangjin Wu, linux-gpio@vger.kernel.org
On Fri, Nov 21, 2014 at 6:16 PM, Huacai Chen <chenhc@lemote.com> wrote:
> This cleanup is prepare to move the driver to drivers/gpio. Custom
> definitions of gpio_get_value()/gpio_set_value() are dropped.
>
> Signed-off-by: Huacai Chen <chenhc@lemote.com>
> ---
> arch/mips/include/asm/mach-loongson/gpio.h | 15 +++---
> arch/mips/loongson/common/gpio.c | 82 +++++++++++-----------------
> 2 files changed, 39 insertions(+), 58 deletions(-)
>
> diff --git a/arch/mips/include/asm/mach-loongson/gpio.h b/arch/mips/include/asm/mach-loongson/gpio.h
> index 211a7b7..b3b2169 100644
> --- a/arch/mips/include/asm/mach-loongson/gpio.h
> +++ b/arch/mips/include/asm/mach-loongson/gpio.h
> @@ -1,8 +1,9 @@
> /*
> - * STLS2F GPIO Support
> + * Loongson GPIO Support
> *
> * Copyright (c) 2008 Richard Liu, STMicroelectronics <richard.liu@st.com>
> * Copyright (c) 2008-2010 Arnaud Patard <apatard@mandriva.com>
> + * Copyright (c) 2014 Huacai Chen <chenhc@lemote.com>
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> @@ -10,14 +11,14 @@
> * (at your option) any later version.
> */
>
> -#ifndef __STLS2F_GPIO_H
> -#define __STLS2F_GPIO_H
> +#ifndef __LOONGSON_GPIO_H
> +#define __LOONGSON_GPIO_H
>
> #include <asm-generic/gpio.h>
>
> -extern void gpio_set_value(unsigned gpio, int value);
> -extern int gpio_get_value(unsigned gpio);
> -extern int gpio_cansleep(unsigned gpio);
> +#define gpio_get_value __gpio_get_value
> +#define gpio_set_value __gpio_set_value
> +#define gpio_cansleep __gpio_cansleep
Since this architecture is using the standard GPIO functions, can't we
simply get rid of this file and the ARCH_HAVE_CUSTOM_GPIO_H option so
the already-defined inline functions in include/linux/gpio.h are used
instead?
>
> /* The chip can do interrupt
> * but it has not been tested and doc not clear
> @@ -32,4 +33,4 @@ static inline int irq_to_gpio(int gpio)
> return -EINVAL;
> }
>
> -#endif /* __STLS2F_GPIO_H */
> +#endif /* __LOONGSON_GPIO_H */
> diff --git a/arch/mips/loongson/common/gpio.c b/arch/mips/loongson/common/gpio.c
> index 29dbaa2..087aac3 100644
> --- a/arch/mips/loongson/common/gpio.c
> +++ b/arch/mips/loongson/common/gpio.c
> @@ -24,55 +24,6 @@
>
> static DEFINE_SPINLOCK(gpio_lock);
>
> -int gpio_get_value(unsigned gpio)
> -{
> - u32 val;
> - u32 mask;
> -
> - if (gpio >= STLS2F_N_GPIO)
> - return __gpio_get_value(gpio);
> -
> - mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
> - spin_lock(&gpio_lock);
> - val = LOONGSON_GPIODATA;
> - spin_unlock(&gpio_lock);
> -
> - return (val & mask) != 0;
> -}
> -EXPORT_SYMBOL(gpio_get_value);
> -
> -void gpio_set_value(unsigned gpio, int state)
> -{
> - u32 val;
> - u32 mask;
> -
> - if (gpio >= STLS2F_N_GPIO) {
> - __gpio_set_value(gpio, state);
> - return ;
> - }
> -
> - mask = 1 << gpio;
> -
> - spin_lock(&gpio_lock);
> - val = LOONGSON_GPIODATA;
> - if (state)
> - val |= mask;
> - else
> - val &= (~mask);
> - LOONGSON_GPIODATA = val;
> - spin_unlock(&gpio_lock);
> -}
> -EXPORT_SYMBOL(gpio_set_value);
> -
> -int gpio_cansleep(unsigned gpio)
> -{
> - if (gpio < STLS2F_N_GPIO)
> - return 0;
> - else
> - return __gpio_cansleep(gpio);
> -}
> -EXPORT_SYMBOL(gpio_cansleep);
> -
> static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
> {
> u32 temp;
> @@ -113,13 +64,41 @@ static int ls2f_gpio_direction_output(struct gpio_chip *chip,
>
> static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
> {
> - return gpio_get_value(gpio);
> + u32 val;
> + u32 mask;
> +
> + if (gpio >= STLS2F_N_GPIO)
> + return __gpio_get_value(gpio);
This condition should not be needed. gpiolib will always use the right chip now.
> +
> + mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
> + spin_lock(&gpio_lock);
> + val = LOONGSON_GPIODATA;
> + spin_unlock(&gpio_lock);
> +
> + return (val & mask) != 0;
> }
>
> static void ls2f_gpio_set_value(struct gpio_chip *chip,
> unsigned gpio, int value)
> {
> - gpio_set_value(gpio, value);
> + u32 val;
> + u32 mask;
> +
> + if (gpio >= STLS2F_N_GPIO) {
> + __gpio_set_value(gpio, value);
> + return;
> + }
Same here, this should not be needed at all.
Also, have you tested that this driver still works after being moved
to drivers/gpio? You are including a <loongson.h> that I am not sure
the compiler will find from there. I also suspect the arch_initcall is
not ideal anymore if you compile the driver as a module - you may want
to remove that option if GPIOs are used early in system boot.
^ permalink raw reply [flat|nested] 6+ messages in thread