* [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver
@ 2014-12-28 4:57 Huacai Chen
2014-12-28 4:57 ` [PATCH V6 4/8] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Huacai Chen @ 2014-12-28 4:57 UTC (permalink / raw)
To: Ralf Baechle
Cc: John Crispin, Steven J. Hill, linux-mips, Fuxin Zhang,
Zhangjin Wu, linux-gpio, Huacai Chen
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
/* 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);
+
+ 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;
+ }
+
+ mask = 1 << gpio;
+
+ spin_lock(&gpio_lock);
+ val = LOONGSON_GPIODATA;
+ if (value)
+ val |= mask;
+ else
+ val &= (~mask);
+ LOONGSON_GPIODATA = val;
+ spin_unlock(&gpio_lock);
}
static struct gpio_chip ls2f_chip = {
@@ -130,6 +109,7 @@ static struct gpio_chip ls2f_chip = {
.set = ls2f_gpio_set_value,
.base = 0,
.ngpio = STLS2F_N_GPIO,
+ .can_sleep = false,
};
static int __init ls2f_gpio_setup(void)
--
1.7.7.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH V6 4/8] MIPS: Move Loongson GPIO driver to drivers/gpio
2014-12-28 4:57 [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
@ 2014-12-28 4:57 ` Huacai Chen
2014-12-28 4:57 ` [PATCH V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
2015-01-19 6:17 ` [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
2 siblings, 0 replies; 6+ messages in thread
From: Huacai Chen @ 2014-12-28 4:57 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 633ec21..3ac5473 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -475,6 +475,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 81755f1..caccfad 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -41,6 +41,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 V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support
2014-12-28 4:57 [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
2014-12-28 4:57 ` [PATCH V6 4/8] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
@ 2014-12-28 4:57 ` Huacai Chen
2015-01-19 6:21 ` Alexandre Courbot
2015-01-19 6:17 ` [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
2 siblings, 1 reply; 6+ messages in thread
From: Huacai Chen @ 2014-12-28 4:57 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 b40b9f1..1600907 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1236,6 +1236,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 3ac5473..2e19f39 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -476,10 +476,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 V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver
2014-12-28 4:57 [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
2014-12-28 4:57 ` [PATCH V6 4/8] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
2014-12-28 4:57 ` [PATCH V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
@ 2015-01-19 6:17 ` Alexandre Courbot
2015-01-23 7:15 ` Huacai Chen
2 siblings, 1 reply; 6+ messages in thread
From: Alexandre Courbot @ 2015-01-19 6:17 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 Sun, Dec 28, 2014 at 1:57 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
>
> /* 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);
> +
> + mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
> + spin_lock(&gpio_lock);
> + val = LOONGSON_GPIODATA;
> + spin_unlock(&gpio_lock);
Careful, you are not anymore dealing with absolute GPIO numbers like
your former custom gpio_get_value() function did.
This function will be called by the gpiolib core after it has matched
the GPIO to your chip. So testing for gpio >= STLS2F_N_GPIO is not
needed.
Furthermore, the passed GPIO number will be relative to the chip's
base index. In your case it seems like the base is 0, so this doesn't
change anything, but be aware of this fact.
> +
> + 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;
> + }
> +
> + mask = 1 << gpio;
> +
> + spin_lock(&gpio_lock);
> + val = LOONGSON_GPIODATA;
> + if (value)
> + val |= mask;
> + else
> + val &= (~mask);
> + LOONGSON_GPIODATA = val;
Same thing here.
Since this is a potentially dangerous refactoring of this driver, I'd
like a statement that confirms it is still working properly after
patches 3, 4, and 5 of this series. IOW, please test your driver after
each of these patches to ensure the refactoring is done properly.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support
2014-12-28 4:57 ` [PATCH V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
@ 2015-01-19 6:21 ` Alexandre Courbot
0 siblings, 0 replies; 6+ messages in thread
From: Alexandre Courbot @ 2015-01-19 6:21 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 Sun, Dec 28, 2014 at 1:57 PM, Huacai Chen <chenhc@lemote.com> wrote:
> Improve Loongson-2's GPIO driver to support Loongson-3A/3B, and update
> Loongson-3's default config file.
This looks ok at first sight, but I will make a more complete review
on the next revision of this series with the comments of patches 3
addressed and the assurance that these patches have been tested
individually.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver
2015-01-19 6:17 ` [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
@ 2015-01-23 7:15 ` Huacai Chen
0 siblings, 0 replies; 6+ messages in thread
From: Huacai Chen @ 2015-01-23 7:15 UTC (permalink / raw)
To: Alexandre Courbot
Cc: Ralf Baechle, John Crispin, Steven J. Hill, linux-mips,
Fuxin Zhang, Zhangjin Wu, linux-gpio@vger.kernel.org
Hi, Alexandre
I think all "(gpio >= STLS2F_N_GPIO)" can be removed in this file, not
only ls2f_gpio_get_value() and ls2f_gpio_set_value(), am I right?
Huacai
On Mon, Jan 19, 2015 at 2:17 PM, Alexandre Courbot <gnurou@gmail.com> wrote:
> On Sun, Dec 28, 2014 at 1:57 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
>>
>> /* 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);
>> +
>> + mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
>> + spin_lock(&gpio_lock);
>> + val = LOONGSON_GPIODATA;
>> + spin_unlock(&gpio_lock);
>
> Careful, you are not anymore dealing with absolute GPIO numbers like
> your former custom gpio_get_value() function did.
>
> This function will be called by the gpiolib core after it has matched
> the GPIO to your chip. So testing for gpio >= STLS2F_N_GPIO is not
> needed.
>
> Furthermore, the passed GPIO number will be relative to the chip's
> base index. In your case it seems like the base is 0, so this doesn't
> change anything, but be aware of this fact.
>
>> +
>> + 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;
>> + }
>> +
>> + mask = 1 << gpio;
>> +
>> + spin_lock(&gpio_lock);
>> + val = LOONGSON_GPIODATA;
>> + if (value)
>> + val |= mask;
>> + else
>> + val &= (~mask);
>> + LOONGSON_GPIODATA = val;
>
> Same thing here.
>
> Since this is a potentially dangerous refactoring of this driver, I'd
> like a statement that confirms it is still working properly after
> patches 3, 4, and 5 of this series. IOW, please test your driver after
> each of these patches to ensure the refactoring is done properly.
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-23 7:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-28 4:57 [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Huacai Chen
2014-12-28 4:57 ` [PATCH V6 4/8] MIPS: Move Loongson GPIO driver to drivers/gpio Huacai Chen
2014-12-28 4:57 ` [PATCH V6 5/8] GPIO: Add Loongson-3A/3B GPIO driver support Huacai Chen
2015-01-19 6:21 ` Alexandre Courbot
2015-01-19 6:17 ` [PATCH V6 3/8] MIPS: Cleanup Loongson-2F's gpio driver Alexandre Courbot
2015-01-23 7:15 ` Huacai Chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).