All of lore.kernel.org
 help / color / mirror / Atom feed
From: Florian Fainelli <florian@openwrt.org>
To: Ralf Baechle <ralf@linux-mips.org>,
	linux-mips@linux-mips.org, Maxime Bizon <mbizon@freebox.fr>
Subject: [PATCH 01/10] bcm63xx: convert to use gpiolib
Date: Sun, 31 May 2009 20:25:47 +0200	[thread overview]
Message-ID: <200905312025.48300.florian@openwrt.org> (raw)

This patch converts the existing GPIO
board code to use gpiolib.

Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 08f8e3c..05ee268 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -71,7 +71,7 @@ config BCM63XX
 	select SYS_SUPPORTS_BIG_ENDIAN
 	select SYS_HAS_EARLY_PRINTK
 	select SWAP_IO_SPACE
-	select GENERIC_GPIO
+	select ARCH_REQUIRE_GPIOLIB
 	help
 	 Support for BCM63XX based boards
 
diff --git a/arch/mips/bcm63xx/gpio.c b/arch/mips/bcm63xx/gpio.c
index 2c203a6..b78d3fd 100644
--- a/arch/mips/bcm63xx/gpio.c
+++ b/arch/mips/bcm63xx/gpio.c
@@ -4,26 +4,29 @@
  * for more details.
  *
  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
+ * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
  */
 
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_gpio.h>
 #include <bcm63xx_io.h>
 #include <bcm63xx_regs.h>
 
-static DEFINE_SPINLOCK(bcm63xx_gpio_lock);
-
-void bcm63xx_gpio_set_dataout(int gpio, int val)
+static void bcm63xx_gpio_set(struct gpio_chip *chip,
+				unsigned gpio, int val)
 {
 	u32 reg;
 	u32 mask;
 	u32 tmp;
 	unsigned long flags;
 
-	if (gpio >= BCM63XX_GPIO_COUNT)
+	if (gpio >= chip->ngpio)
 		BUG();
 
 	if (gpio < 32) {
@@ -34,24 +37,22 @@ void bcm63xx_gpio_set_dataout(int gpio, int val)
 		mask = 1 << (gpio - 32);
 	}
 
-	spin_lock_irqsave(&bcm63xx_gpio_lock, flags);
+	local_irq_save(flags);
 	tmp = bcm_gpio_readl(reg);
 	if (val)
 		tmp |= mask;
 	else
 		tmp &= ~mask;
 	bcm_gpio_writel(tmp, reg);
-	spin_unlock_irqrestore(&bcm63xx_gpio_lock, flags);
+	local_irq_restore(flags);
 }
 
-EXPORT_SYMBOL(bcm63xx_gpio_set_dataout);
-
-int bcm63xx_gpio_get_datain(int gpio)
+static int bcm63xx_gpio_get(struct gpio_chip *chip, unsigned gpio)
 {
 	u32 reg;
 	u32 mask;
 
-	if (gpio >= BCM63XX_GPIO_COUNT)
+	if (gpio >= chip->ngpio)
 		BUG();
 
 	if (gpio < 32) {
@@ -65,16 +66,15 @@ int bcm63xx_gpio_get_datain(int gpio)
 	return !!(bcm_gpio_readl(reg) & mask);
 }
 
-EXPORT_SYMBOL(bcm63xx_gpio_get_datain);
-
-void bcm63xx_gpio_set_direction(int gpio, int dir)
+static int bcm63xx_gpio_set_direction(struct gpio_chip *chip,
+					unsigned gpio, int dir)
 {
 	u32 reg;
 	u32 mask;
 	u32 tmp;
 	unsigned long flags;
 
-	if (gpio >= BCM63XX_GPIO_COUNT)
+	if (gpio >= chip->ngpio)
 		BUG();
 
 	if (gpio < 32) {
@@ -85,14 +85,44 @@ void bcm63xx_gpio_set_direction(int gpio, int dir)
 		mask = 1 << (gpio - 32);
 	}
 
-	spin_lock_irqsave(&bcm63xx_gpio_lock, flags);
+	local_irq_save(flags);
 	tmp = bcm_gpio_readl(reg);
 	if (dir == GPIO_DIR_IN)
 		tmp &= ~mask;
 	else
 		tmp |= mask;
 	bcm_gpio_writel(tmp, reg);
-	spin_unlock_irqrestore(&bcm63xx_gpio_lock, flags);
+	local_irq_restore(flags);
+
+	return 0;
+}
+
+static int bcm63xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
+{
+	return bcm63xx_gpio_set_direction(chip, gpio, GPIO_DIR_IN);
 }
 
-EXPORT_SYMBOL(bcm63xx_gpio_set_direction);
+static int bcm63xx_gpio_direction_output(struct gpio_chip *chip,
+					unsigned gpio, int value)
+{
+	bcm63xx_gpio_set(chip, gpio, value);
+	return bcm63xx_gpio_set_direction(chip, gpio, GPIO_DIR_OUT);
+}
+
+
+static struct gpio_chip bcm63xx_gpio_chip = {
+	.label			= "bcm63xx-gpio",
+	.direction_input	= bcm63xx_gpio_direction_input,
+	.direction_output	= bcm63xx_gpio_direction_output,
+	.get			= bcm63xx_gpio_get,
+	.set			= bcm63xx_gpio_set,
+	.base			= 0,
+	.ngpio			= BCM63XX_GPIO_COUNT,
+};
+
+static int __init bcm63xx_gpio_init(void)
+{
+	printk(KERN_INFO "registering %d GPIOs\n", BCM63XX_GPIO_COUNT);
+	return gpiochip_add(&bcm63xx_gpio_chip);
+}
+arch_initcall(bcm63xx_gpio_init);
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
index 31145df..72cee75 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h
@@ -4,10 +4,6 @@
 /* all helpers will BUG() if gpio count is >= 37. */
 #define BCM63XX_GPIO_COUNT	37
 
-void bcm63xx_gpio_set_dataout(int gpio, int val);
-int bcm63xx_gpio_get_datain(int gpio);
-void bcm63xx_gpio_set_direction(int gpio, int dir);
-
 #define GPIO_DIR_OUT	0x0
 #define GPIO_DIR_IN	0x1
 
diff --git a/arch/mips/include/asm/mach-bcm63xx/gpio.h b/arch/mips/include/asm/mach-bcm63xx/gpio.h
index dd2c0f3..033c997 100644
--- a/arch/mips/include/asm/mach-bcm63xx/gpio.h
+++ b/arch/mips/include/asm/mach-bcm63xx/gpio.h
@@ -3,50 +3,15 @@
 
 #include <bcm63xx_gpio.h>
 
-static inline int gpio_is_valid(int number)
-{
-	return (number >= BCM63XX_GPIO_COUNT) ? 0 : 1;
-}
+#define NR_BUILTIN_GPIO		BCM63XX_GPIO_COUNT
 
-static inline int gpio_request(unsigned gpio, const char *label)
-{
-	return 0;
-}
+#define gpio_to_irq(gpio)	NULL
 
-static inline void gpio_free(unsigned gpio)
-{
-}
+#define gpio_get_value __gpio_get_value
+#define gpio_set_value __gpio_set_value
 
-static inline int gpio_direction_input(unsigned gpio)
-{
-	bcm63xx_gpio_set_direction(gpio, GPIO_DIR_IN);
-	return 0;
-}
+#define gpio_cansleep __gpio_cansleep
 
-static inline int gpio_direction_output(unsigned gpio, int value)
-{
-	bcm63xx_gpio_set_direction(gpio, GPIO_DIR_OUT);
-	return 0;
-}
-
-static inline int gpio_get_value(unsigned gpio)
-{
-	return bcm63xx_gpio_get_datain(gpio);
-}
-
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-	bcm63xx_gpio_set_dataout(gpio, value);
-}
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-	return gpio;
-}
-
-static inline int irq_to_gpio(unsigned irq)
-{
-	return irq;
-}
+#include <asm-generic/gpio.h>
 
 #endif /* __ASM_MIPS_MACH_BCM63XX_GPIO_H */

             reply	other threads:[~2009-05-31 18:26 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-31 18:25 Florian Fainelli [this message]
2009-06-01 14:28 ` [PATCH 01/10] bcm63xx: convert to use gpiolib Ralf Baechle

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200905312025.48300.florian@openwrt.org \
    --to=florian@openwrt.org \
    --cc=linux-mips@linux-mips.org \
    --cc=mbizon@freebox.fr \
    --cc=ralf@linux-mips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.