Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread eric miao
I'd like to create another thread in LKML for the updated version, sorry.

On Dec 15, 2007 11:56 AM, eric miao <[EMAIL PROTECTED]> wrote:
> OK,
>
> Here's the updated version, which
> 1. modify the author info but still preserve Ben's credit in the source head
> 2. Alphabetic order in Kconfig/Makefile
> 3. typo fix and corrected Philips to NXP/TI
> 4. use dev_err instead of printk
> 5. move module_{init,exit} next to the routines
> 6. preserve initial output/direction register settings
>
> Also I'd like to fire another patch to obsolete drivers/i2c/chips/pca9539.c
> as everyone agreed.
>
> From 5ebe07236b99587296cbf603a965d284ceaf Mon Sep 17 00:00:00 2001
> From: eric miao <[EMAIL PROTECTED]>
> Date: Mon, 10 Dec 2007 17:19:12 +0800
> Subject: [PATCH] gpiolib: basic support for 16-bit PCA9539 GPIO expander
>
> 1. use 16-bit register access to simplify the logic, cache OUTPUT
>and DIRECTION registers for fast access
>
> 2. platform code is required to setup
>a) the numbering of GPIO for PCA9539 (base and number)
>c) pass "pca9539_platform_data" within "i2c_board_info"
>
> Derived from drivers/i2c/chips/pca9539.c (which has no current known
> users).
>
> Signed-off-by: eric miao <[EMAIL PROTECTED]>
> ---
>  drivers/gpio/Kconfig|   10 ++
>  drivers/gpio/Makefile   |1 +
>  drivers/gpio/pca9539.c  |  247 
> +++
>  include/linux/i2c/pca9539.h |   18 +++
>  4 files changed, 276 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/gpio/pca9539.c
>  create mode 100644 include/linux/i2c/pca9539.h
>
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index dd9e697..4b54f60 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -9,6 +9,16 @@ menu "GPIO Expanders"
>
>  comment "I2C GPIO expanders:"
>
> +config GPIO_PCA9539
> +   tristate "PCA9539 16-bit I/O port"
> +   depends on I2C
> +   help
> + Say yes here to support the PCA9539 16-bit I/O port. These
> + parts are made by NXP and TI.
> +
> + This driver can also be built as a module.  If so, the module
> + will be called pca9539.
> +
>  config GPIO_PCF857X
> tristate "PCF857x, PCA857x, and PCA967x I2C GPIO expanders"
> depends on I2C
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 575bb57..d14fc1e 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -1,4 +1,5 @@
>  # gpio support: dedicated expander chips, etc
>
>  obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
> +obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
>  obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
> diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
> new file mode 100644
> index 000..955d891
> --- /dev/null
> +++ b/drivers/gpio/pca9539.c
> @@ -0,0 +1,247 @@
> +/*
> + *  pca9539.c - 16-bit I/O port with interrupt and reset
> + *
> + *  Copyright (C) 2005 Ben Gardner <[EMAIL PROTECTED]>
> + *  Copyright (C) 2007 Marvell International Ltd.
> + *
> + *  Derived from drivers/i2c/chips/pca9539.c (which has no current known
> + *  users).
> + *
> + *  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
> + *  the Free Software Foundation; version 2 of the License.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +
> +#define NR_PCA9539_GPIOS   16
> +
> +#define PCA9539_INPUT  0
> +#define PCA9539_OUTPUT 2
> +#define PCA9539_INVERT 4
> +#define PCA9539_DIRECTION  6
> +
> +struct pca9539_chip {
> +   unsigned gpio_start;
> +   uint16_t reg_output;
> +   uint16_t reg_direction;
> +
> +   struct i2c_client *client;
> +   struct gpio_chip gpio_chip;
> +};
> +
> +static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t 
> val)
> +{
> +   return i2c_smbus_write_word_data(chip->client, reg, val);
> +}
> +
> +static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t 
> *val)
> +{
> +   int ret;
> +
> +   ret = i2c_smbus_read_word_data(chip->client, reg);
> +   if (ret < 0) {
> +   dev_err(>client->dev, "failed reading register\n");
>
> +   return ret;
> +   }
> +
> +   *val = (uint16_t)ret;
> +   return 0;
> +}
> +
> +static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
> +{
> +   struct pca9539_chip *chip;
> +   uint16_t reg_val;
> +   int ret;
> +
> +   chip = container_of(gc, struct pca9539_chip, gpio_chip);
> +
> +   reg_val = chip->reg_direction | (1u << off);
> +   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
> +   if (ret)
> +   return ret;
> +
> +   chip->reg_direction = reg_val;
> +   return 0;
> +}
> +
> +static int pca9539_gpio_direction_output(struct gpio_chip *gc,
> +   unsigned off, int val)
> +{
> +   struct pca9539_chip *chip;
> +  

Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread eric miao
OK,

Here's the updated version, which
1. modify the author info but still preserve Ben's credit in the source head
2. Alphabetic order in Kconfig/Makefile
3. typo fix and corrected Philips to NXP/TI
4. use dev_err instead of printk
5. move module_{init,exit} next to the routines
6. preserve initial output/direction register settings

Also I'd like to fire another patch to obsolete drivers/i2c/chips/pca9539.c
as everyone agreed.

>From 5ebe07236b99587296cbf603a965d284ceaf Mon Sep 17 00:00:00 2001
From: eric miao <[EMAIL PROTECTED]>
Date: Mon, 10 Dec 2007 17:19:12 +0800
Subject: [PATCH] gpiolib: basic support for 16-bit PCA9539 GPIO expander

1. use 16-bit register access to simplify the logic, cache OUTPUT
   and DIRECTION registers for fast access

2. platform code is required to setup
   a) the numbering of GPIO for PCA9539 (base and number)
   c) pass "pca9539_platform_data" within "i2c_board_info"

Derived from drivers/i2c/chips/pca9539.c (which has no current known
users).

Signed-off-by: eric miao <[EMAIL PROTECTED]>
---
 drivers/gpio/Kconfig|   10 ++
 drivers/gpio/Makefile   |1 +
 drivers/gpio/pca9539.c  |  247 +++
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 276 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpio/pca9539.c
 create mode 100644 include/linux/i2c/pca9539.h

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index dd9e697..4b54f60 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -9,6 +9,16 @@ menu "GPIO Expanders"

 comment "I2C GPIO expanders:"

+config GPIO_PCA9539
+   tristate "PCA9539 16-bit I/O port"
+   depends on I2C
+   help
+ Say yes here to support the PCA9539 16-bit I/O port. These
+ parts are made by NXP and TI.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 config GPIO_PCF857X
tristate "PCF857x, PCA857x, and PCA967x I2C GPIO expanders"
depends on I2C
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 575bb57..d14fc1e 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -1,4 +1,5 @@
 # gpio support: dedicated expander chips, etc

 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
new file mode 100644
index 000..955d891
--- /dev/null
+++ b/drivers/gpio/pca9539.c
@@ -0,0 +1,247 @@
+/*
+ *  pca9539.c - 16-bit I/O port with interrupt and reset
+ *
+ *  Copyright (C) 2005 Ben Gardner <[EMAIL PROTECTED]>
+ *  Copyright (C) 2007 Marvell International Ltd.
+ *
+ *  Derived from drivers/i2c/chips/pca9539.c (which has no current known
+ *  users).
+ *
+ *  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
+ *  the Free Software Foundation; version 2 of the License.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip->client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip->client, reg);
+   if (ret < 0) {
+   dev_err(>client->dev, "failed reading register\n");
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip->reg_direction | (1u << off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip->reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_direction_output(struct gpio_chip *gc,
+   unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   /* set output level */
+   if (val)
+   reg_val = chip->reg_output | (1u << off);
+   else
+   reg_val = chip->reg_output & ~(1u << off);
+
+   ret = pca9539_write_reg(chip, PCA9539_OUTPUT, reg_val);
+   if (ret)
+   return ret;
+
+   chip->reg_output = reg_val;
+
+   

RE: [i2c] [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread BGardner
Hi,

> -Original Message-
> > > +MODULE_AUTHOR("Ben Gardner <[EMAIL PROTECTED]>");
> > 
> > But not you?
> 
> I'm not even sure if Ben can be said to be an author of this new
> driver, as there is almost no common code between the old driver and
> the new one.

I agree with Jean here.
Please remove me as the author. 
That'll save me from getting questions about code I'm not familiar with.
=)

Thanks,
Ben

This email and any attachments are only for use by the intended recipient(s) 
and may contain legally privileged, confidential, proprietary or otherwise 
private information.  Any unauthorized use, reproduction, dissemination, 
distribution or other disclosure of the contents of this e-mail or its 
attachments is strictly prohibited.  If you have received this email in error, 
please notify the sender immediately and delete the original.


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread Jean Delvare
Hi David,

On Tue, 11 Dec 2007 20:29:49 -0800, David Brownell wrote:
> > +static int __devinit pca9539_probe(struct i2c_client *client)
> > +{
> > +   ...
> > +   /* initialize registers */
> > +   chip->reg_output = 0x;
> > +   chip->reg_direction = 0x;
> > +
> > +   pca9539_write_reg(chip, PCA9539_OUTPUT, chip->reg_output);
> > +   pca9539_write_reg(chip, PCA9539_DIRECTION, chip->reg_direction);
> 
> I thought you were going to change that code to use whatever values
> were previously found in those registers?  What this does is change
> those values to act as if the chip just came from reset.  Which isn't
> the best approach when a bootloader initialized it, or if the values
> were otherwise set up by something ... the previous kernel before a
> kexec, this one before "rmmod pca9539", or something similar.

I fully agree, preserving the initial values as much as possible is
better.

> > +MODULE_AUTHOR("Ben Gardner <[EMAIL PROTECTED]>");
> 
> But not you?

I'm not even sure if Ben can be said to be an author of this new
driver, as there is almost no common code between the old driver and
the new one.

> Here's a slightly cleaned up version ... address the issues above
> and I'd say this one is ready to join the queue (after the other
> gpiolib patches).
> 
> - Dave
> 
>   SNIP
> From: eric miao <[EMAIL PROTECTED]>
> 
> Basic support for 16-bit PCA9539 GPIO expander
> 
>  1. use 16-bit register access to simplify the logic, cache OUTPUT
> and DIRECTION registers for fast access
> 
>  2. platform code is required to setup
>(a) the numbering of GPIO for PCA9539 (base and number)
>(b) pass "pca9539_platform_data" within "i2c_board_info"
> 
> Derived from drivers/i2c/chips/pca9539.c (which has no current known users).
> 
> Signed-off-by: eric miao <[EMAIL PROTECTED]>
> Acked-by: Ben Gardner <[EMAIL PROTECTED]>
> 
>  - Alphabetized Kconfig and Makefile
>  - Corrected description:  not "Philips", but NXP or TI
>  - Use dev_err() not printk
>  - Move module_{init,exit} next to those routines
>  - Did NOT change clobber of output and direction registers

I think you should.

> 
> ---
>  drivers/gpio/Kconfig|   10 +
>  drivers/gpio/Makefile   |1 
>  drivers/gpio/pca9539.c  |  249 
> 
>  include/linux/i2c/pca9539.h |   18 +++
>  4 files changed, 278 insertions(+)
> 
> --- a/drivers/gpio/Kconfig2007-12-11 09:30:43.0 -0800
> +++ b/drivers/gpio/Kconfig2007-12-11 17:16:16.0 -0800
> @@ -9,6 +9,16 @@ menu "GPIO Expanders"
>  
>  comment "I2C GPIO expanders:"
>  
> +config GPIO_PCA9539
> + tristate "PCA9539 16-bit I/O port"
> + depends on I2C
> + help
> +   Say yes here to support the PCA9539 16-bit I/O port.  These
> +   parts are made by NXP and TI.
> +
> +   This driver can also be built as a module.  If so, the module
> +   will be called pca9539.
> +
>  config GPIO_PCF857X
>   tristate "PCF857x, PCA857x, and PCA967x I2C GPIO expanders"
>   depends on I2C
> --- a/drivers/gpio/Makefile   2007-12-11 09:30:43.0 -0800
> +++ b/drivers/gpio/Makefile   2007-12-11 17:15:18.0 -0800
> @@ -1,4 +1,5 @@
>  # gpio support: dedicated expander chips, etc
>  
>  obj-$(CONFIG_GPIO_MCP23S08)  += mcp23s08.o
> +obj-$(CONFIG_GPIO_PCA9539)   += pca9539.o
>  obj-$(CONFIG_GPIO_PCF857X)   += pcf857x.o
> --- /dev/null 1970-01-01 00:00:00.0 +
> +++ b/drivers/gpio/pca9539.c  2007-12-11 19:54:57.0 -0800
> @@ -0,0 +1,249 @@
> +/*
> +pca9539.c - 16-bit I/O port with interrupt and reset
> +
> +Copyright (C) 2005 Ben Gardner <[EMAIL PROTECTED]>
> +Copyright (C) 2007 Marvell Internation Ltd.
> +
> +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
> +the Free Software Foundation; version 2 of the License.
> +*/
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +
> +
> +#define NR_PCA9539_GPIOS 16
> +
> +#define PCA9539_INPUT0
> +#define PCA9539_OUTPUT   2
> +#define PCA9539_INVERT   4
> +#define PCA9539_DIRECTION6
> +
> +struct pca9539_chip {
> + unsigned gpio_start;
> + uint16_t reg_output;
> + uint16_t reg_direction;
> +
> + struct i2c_client *client;
> + struct gpio_chip gpio_chip;
> +};
> +
> +static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t 
> val)
> +{
> + return i2c_smbus_write_word_data(chip->client, reg, val);
> +}
> +
> +static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t 
> *val)
> +{
> + int ret;
> +
> + ret = i2c_smbus_read_word_data(chip->client, reg);
> + if (ret < 0) {
> + dev_err(>client->dev, "read error %d\n", ret);
> + return ret;
> + }
> +
> + *val = (uint16_t)ret;
> + return 0;
> +}
> +
> +static int pca9539_gpio_direction_input(struct 

Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread Jean Delvare
Hi David,

On Tue, 11 Dec 2007 20:29:49 -0800, David Brownell wrote:
  +static int __devinit pca9539_probe(struct i2c_client *client)
  +{
  +   ...
  +   /* initialize registers */
  +   chip-reg_output = 0x;
  +   chip-reg_direction = 0x;
  +
  +   pca9539_write_reg(chip, PCA9539_OUTPUT, chip-reg_output);
  +   pca9539_write_reg(chip, PCA9539_DIRECTION, chip-reg_direction);
 
 I thought you were going to change that code to use whatever values
 were previously found in those registers?  What this does is change
 those values to act as if the chip just came from reset.  Which isn't
 the best approach when a bootloader initialized it, or if the values
 were otherwise set up by something ... the previous kernel before a
 kexec, this one before rmmod pca9539, or something similar.

I fully agree, preserving the initial values as much as possible is
better.

  +MODULE_AUTHOR(Ben Gardner [EMAIL PROTECTED]);
 
 But not you?

I'm not even sure if Ben can be said to be an author of this new
driver, as there is almost no common code between the old driver and
the new one.

 Here's a slightly cleaned up version ... address the issues above
 and I'd say this one is ready to join the queue (after the other
 gpiolib patches).
 
 - Dave
 
   SNIP
 From: eric miao [EMAIL PROTECTED]
 
 Basic support for 16-bit PCA9539 GPIO expander
 
  1. use 16-bit register access to simplify the logic, cache OUTPUT
 and DIRECTION registers for fast access
 
  2. platform code is required to setup
(a) the numbering of GPIO for PCA9539 (base and number)
(b) pass pca9539_platform_data within i2c_board_info
 
 Derived from drivers/i2c/chips/pca9539.c (which has no current known users).
 
 Signed-off-by: eric miao [EMAIL PROTECTED]
 Acked-by: Ben Gardner [EMAIL PROTECTED]
 
  - Alphabetized Kconfig and Makefile
  - Corrected description:  not Philips, but NXP or TI
  - Use dev_err() not printk
  - Move module_{init,exit} next to those routines
  - Did NOT change clobber of output and direction registers

I think you should.

 
 ---
  drivers/gpio/Kconfig|   10 +
  drivers/gpio/Makefile   |1 
  drivers/gpio/pca9539.c  |  249 
 
  include/linux/i2c/pca9539.h |   18 +++
  4 files changed, 278 insertions(+)
 
 --- a/drivers/gpio/Kconfig2007-12-11 09:30:43.0 -0800
 +++ b/drivers/gpio/Kconfig2007-12-11 17:16:16.0 -0800
 @@ -9,6 +9,16 @@ menu GPIO Expanders
  
  comment I2C GPIO expanders:
  
 +config GPIO_PCA9539
 + tristate PCA9539 16-bit I/O port
 + depends on I2C
 + help
 +   Say yes here to support the PCA9539 16-bit I/O port.  These
 +   parts are made by NXP and TI.
 +
 +   This driver can also be built as a module.  If so, the module
 +   will be called pca9539.
 +
  config GPIO_PCF857X
   tristate PCF857x, PCA857x, and PCA967x I2C GPIO expanders
   depends on I2C
 --- a/drivers/gpio/Makefile   2007-12-11 09:30:43.0 -0800
 +++ b/drivers/gpio/Makefile   2007-12-11 17:15:18.0 -0800
 @@ -1,4 +1,5 @@
  # gpio support: dedicated expander chips, etc
  
  obj-$(CONFIG_GPIO_MCP23S08)  += mcp23s08.o
 +obj-$(CONFIG_GPIO_PCA9539)   += pca9539.o
  obj-$(CONFIG_GPIO_PCF857X)   += pcf857x.o
 --- /dev/null 1970-01-01 00:00:00.0 +
 +++ b/drivers/gpio/pca9539.c  2007-12-11 19:54:57.0 -0800
 @@ -0,0 +1,249 @@
 +/*
 +pca9539.c - 16-bit I/O port with interrupt and reset
 +
 +Copyright (C) 2005 Ben Gardner [EMAIL PROTECTED]
 +Copyright (C) 2007 Marvell Internation Ltd.
 +
 +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
 +the Free Software Foundation; version 2 of the License.
 +*/
 +
 +#include linux/module.h
 +#include linux/init.h
 +#include linux/i2c.h
 +#include linux/i2c/pca9539.h
 +
 +#include asm/gpio.h
 +
 +
 +#define NR_PCA9539_GPIOS 16
 +
 +#define PCA9539_INPUT0
 +#define PCA9539_OUTPUT   2
 +#define PCA9539_INVERT   4
 +#define PCA9539_DIRECTION6
 +
 +struct pca9539_chip {
 + unsigned gpio_start;
 + uint16_t reg_output;
 + uint16_t reg_direction;
 +
 + struct i2c_client *client;
 + struct gpio_chip gpio_chip;
 +};
 +
 +static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t 
 val)
 +{
 + return i2c_smbus_write_word_data(chip-client, reg, val);
 +}
 +
 +static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t 
 *val)
 +{
 + int ret;
 +
 + ret = i2c_smbus_read_word_data(chip-client, reg);
 + if (ret  0) {
 + dev_err(chip-client-dev, read error %d\n, ret);
 + return ret;
 + }
 +
 + *val = (uint16_t)ret;
 + return 0;
 +}
 +
 +static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
 +{
 + struct pca9539_chip *chip;
 + uint16_t reg_val;
 + int ret;
 +
 + chip = 

RE: [i2c] [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread BGardner
Hi,

 -Original Message-
   +MODULE_AUTHOR(Ben Gardner [EMAIL PROTECTED]);
  
  But not you?
 
 I'm not even sure if Ben can be said to be an author of this new
 driver, as there is almost no common code between the old driver and
 the new one.

I agree with Jean here.
Please remove me as the author. 
That'll save me from getting questions about code I'm not familiar with.
=)

Thanks,
Ben

This email and any attachments are only for use by the intended recipient(s) 
and may contain legally privileged, confidential, proprietary or otherwise 
private information.  Any unauthorized use, reproduction, dissemination, 
distribution or other disclosure of the contents of this e-mail or its 
attachments is strictly prohibited.  If you have received this email in error, 
please notify the sender immediately and delete the original.


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread eric miao
OK,

Here's the updated version, which
1. modify the author info but still preserve Ben's credit in the source head
2. Alphabetic order in Kconfig/Makefile
3. typo fix and corrected Philips to NXP/TI
4. use dev_err instead of printk
5. move module_{init,exit} next to the routines
6. preserve initial output/direction register settings

Also I'd like to fire another patch to obsolete drivers/i2c/chips/pca9539.c
as everyone agreed.

From 5ebe07236b99587296cbf603a965d284ceaf Mon Sep 17 00:00:00 2001
From: eric miao [EMAIL PROTECTED]
Date: Mon, 10 Dec 2007 17:19:12 +0800
Subject: [PATCH] gpiolib: basic support for 16-bit PCA9539 GPIO expander

1. use 16-bit register access to simplify the logic, cache OUTPUT
   and DIRECTION registers for fast access

2. platform code is required to setup
   a) the numbering of GPIO for PCA9539 (base and number)
   c) pass pca9539_platform_data within i2c_board_info

Derived from drivers/i2c/chips/pca9539.c (which has no current known
users).

Signed-off-by: eric miao [EMAIL PROTECTED]
---
 drivers/gpio/Kconfig|   10 ++
 drivers/gpio/Makefile   |1 +
 drivers/gpio/pca9539.c  |  247 +++
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 276 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpio/pca9539.c
 create mode 100644 include/linux/i2c/pca9539.h

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index dd9e697..4b54f60 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -9,6 +9,16 @@ menu GPIO Expanders

 comment I2C GPIO expanders:

+config GPIO_PCA9539
+   tristate PCA9539 16-bit I/O port
+   depends on I2C
+   help
+ Say yes here to support the PCA9539 16-bit I/O port. These
+ parts are made by NXP and TI.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 config GPIO_PCF857X
tristate PCF857x, PCA857x, and PCA967x I2C GPIO expanders
depends on I2C
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 575bb57..d14fc1e 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -1,4 +1,5 @@
 # gpio support: dedicated expander chips, etc

 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
new file mode 100644
index 000..955d891
--- /dev/null
+++ b/drivers/gpio/pca9539.c
@@ -0,0 +1,247 @@
+/*
+ *  pca9539.c - 16-bit I/O port with interrupt and reset
+ *
+ *  Copyright (C) 2005 Ben Gardner [EMAIL PROTECTED]
+ *  Copyright (C) 2007 Marvell International Ltd.
+ *
+ *  Derived from drivers/i2c/chips/pca9539.c (which has no current known
+ *  users).
+ *
+ *  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
+ *  the Free Software Foundation; version 2 of the License.
+ */
+
+#include linux/module.h
+#include linux/init.h
+#include linux/i2c.h
+#include linux/i2c/pca9539.h
+
+#include asm/gpio.h
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip-client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip-client, reg);
+   if (ret  0) {
+   dev_err(chip-client-dev, failed reading register\n);
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip-reg_direction | (1u  off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip-reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_direction_output(struct gpio_chip *gc,
+   unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   /* set output level */
+   if (val)
+   reg_val = chip-reg_output | (1u  off);
+   else
+   reg_val = chip-reg_output  ~(1u  off);
+
+   ret = pca9539_write_reg(chip, PCA9539_OUTPUT, reg_val);
+   if (ret)
+   return ret;
+
+   

Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-14 Thread eric miao
I'd like to create another thread in LKML for the updated version, sorry.

On Dec 15, 2007 11:56 AM, eric miao [EMAIL PROTECTED] wrote:
 OK,

 Here's the updated version, which
 1. modify the author info but still preserve Ben's credit in the source head
 2. Alphabetic order in Kconfig/Makefile
 3. typo fix and corrected Philips to NXP/TI
 4. use dev_err instead of printk
 5. move module_{init,exit} next to the routines
 6. preserve initial output/direction register settings

 Also I'd like to fire another patch to obsolete drivers/i2c/chips/pca9539.c
 as everyone agreed.

 From 5ebe07236b99587296cbf603a965d284ceaf Mon Sep 17 00:00:00 2001
 From: eric miao [EMAIL PROTECTED]
 Date: Mon, 10 Dec 2007 17:19:12 +0800
 Subject: [PATCH] gpiolib: basic support for 16-bit PCA9539 GPIO expander

 1. use 16-bit register access to simplify the logic, cache OUTPUT
and DIRECTION registers for fast access

 2. platform code is required to setup
a) the numbering of GPIO for PCA9539 (base and number)
c) pass pca9539_platform_data within i2c_board_info

 Derived from drivers/i2c/chips/pca9539.c (which has no current known
 users).

 Signed-off-by: eric miao [EMAIL PROTECTED]
 ---
  drivers/gpio/Kconfig|   10 ++
  drivers/gpio/Makefile   |1 +
  drivers/gpio/pca9539.c  |  247 
 +++
  include/linux/i2c/pca9539.h |   18 +++
  4 files changed, 276 insertions(+), 0 deletions(-)
  create mode 100644 drivers/gpio/pca9539.c
  create mode 100644 include/linux/i2c/pca9539.h

 diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
 index dd9e697..4b54f60 100644
 --- a/drivers/gpio/Kconfig
 +++ b/drivers/gpio/Kconfig
 @@ -9,6 +9,16 @@ menu GPIO Expanders

  comment I2C GPIO expanders:

 +config GPIO_PCA9539
 +   tristate PCA9539 16-bit I/O port
 +   depends on I2C
 +   help
 + Say yes here to support the PCA9539 16-bit I/O port. These
 + parts are made by NXP and TI.
 +
 + This driver can also be built as a module.  If so, the module
 + will be called pca9539.
 +
  config GPIO_PCF857X
 tristate PCF857x, PCA857x, and PCA967x I2C GPIO expanders
 depends on I2C
 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
 index 575bb57..d14fc1e 100644
 --- a/drivers/gpio/Makefile
 +++ b/drivers/gpio/Makefile
 @@ -1,4 +1,5 @@
  # gpio support: dedicated expander chips, etc

  obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
 +obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
  obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
 diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
 new file mode 100644
 index 000..955d891
 --- /dev/null
 +++ b/drivers/gpio/pca9539.c
 @@ -0,0 +1,247 @@
 +/*
 + *  pca9539.c - 16-bit I/O port with interrupt and reset
 + *
 + *  Copyright (C) 2005 Ben Gardner [EMAIL PROTECTED]
 + *  Copyright (C) 2007 Marvell International Ltd.
 + *
 + *  Derived from drivers/i2c/chips/pca9539.c (which has no current known
 + *  users).
 + *
 + *  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
 + *  the Free Software Foundation; version 2 of the License.
 + */
 +
 +#include linux/module.h
 +#include linux/init.h
 +#include linux/i2c.h
 +#include linux/i2c/pca9539.h
 +
 +#include asm/gpio.h
 +
 +#define NR_PCA9539_GPIOS   16
 +
 +#define PCA9539_INPUT  0
 +#define PCA9539_OUTPUT 2
 +#define PCA9539_INVERT 4
 +#define PCA9539_DIRECTION  6
 +
 +struct pca9539_chip {
 +   unsigned gpio_start;
 +   uint16_t reg_output;
 +   uint16_t reg_direction;
 +
 +   struct i2c_client *client;
 +   struct gpio_chip gpio_chip;
 +};
 +
 +static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t 
 val)
 +{
 +   return i2c_smbus_write_word_data(chip-client, reg, val);
 +}
 +
 +static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t 
 *val)
 +{
 +   int ret;
 +
 +   ret = i2c_smbus_read_word_data(chip-client, reg);
 +   if (ret  0) {
 +   dev_err(chip-client-dev, failed reading register\n);

 +   return ret;
 +   }
 +
 +   *val = (uint16_t)ret;
 +   return 0;
 +}
 +
 +static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
 +{
 +   struct pca9539_chip *chip;
 +   uint16_t reg_val;
 +   int ret;
 +
 +   chip = container_of(gc, struct pca9539_chip, gpio_chip);
 +
 +   reg_val = chip-reg_direction | (1u  off);
 +   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
 +   if (ret)
 +   return ret;
 +
 +   chip-reg_direction = reg_val;
 +   return 0;
 +}
 +
 +static int pca9539_gpio_direction_output(struct gpio_chip *gc,
 +   unsigned off, int val)
 +{
 +   struct pca9539_chip *chip;
 +   uint16_t reg_val;
 +   int ret;
 +
 +   chip = container_of(gc, struct pca9539_chip, gpio_chip);
 +
 +  

Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-11 Thread David Brownell
[ do we need so much crossposting on these patches? ]

On Monday 10 December 2007, eric miao wrote:

> +    Copyright (C) 2007 Marvell Internation Ltd.

"International"?


> +static int __devinit pca9539_probe(struct i2c_client *client)
> +{
> + ...
> + /* initialize registers */
> + chip->reg_output = 0x;
> + chip->reg_direction = 0x;
> +
> + pca9539_write_reg(chip, PCA9539_OUTPUT, chip->reg_output);
> + pca9539_write_reg(chip, PCA9539_DIRECTION, chip->reg_direction);

I thought you were going to change that code to use whatever values
were previously found in those registers?  What this does is change
those values to act as if the chip just came from reset.  Which isn't
the best approach when a bootloader initialized it, or if the values
were otherwise set up by something ... the previous kernel before a
kexec, this one before "rmmod pca9539", or something similar.


> +MODULE_AUTHOR("Ben Gardner <[EMAIL PROTECTED]>");

But not you?


Here's a slightly cleaned up version ... address the issues above
and I'd say this one is ready to join the queue (after the other
gpiolib patches).

- Dave

SNIP
From: eric miao <[EMAIL PROTECTED]>

Basic support for 16-bit PCA9539 GPIO expander

 1. use 16-bit register access to simplify the logic, cache OUTPUT
and DIRECTION registers for fast access

 2. platform code is required to setup
   (a) the numbering of GPIO for PCA9539 (base and number)
   (b) pass "pca9539_platform_data" within "i2c_board_info"

Derived from drivers/i2c/chips/pca9539.c (which has no current known users).

Signed-off-by: eric miao <[EMAIL PROTECTED]>
Acked-by: Ben Gardner <[EMAIL PROTECTED]>

 - Alphabetized Kconfig and Makefile
 - Corrected description:  not "Philips", but NXP or TI
 - Use dev_err() not printk
 - Move module_{init,exit} next to those routines
 - Did NOT change clobber of output and direction registers

---
 drivers/gpio/Kconfig|   10 +
 drivers/gpio/Makefile   |1 
 drivers/gpio/pca9539.c  |  249 
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 278 insertions(+)

--- a/drivers/gpio/Kconfig  2007-12-11 09:30:43.0 -0800
+++ b/drivers/gpio/Kconfig  2007-12-11 17:16:16.0 -0800
@@ -9,6 +9,16 @@ menu "GPIO Expanders"
 
 comment "I2C GPIO expanders:"
 
+config GPIO_PCA9539
+   tristate "PCA9539 16-bit I/O port"
+   depends on I2C
+   help
+ Say yes here to support the PCA9539 16-bit I/O port.  These
+ parts are made by NXP and TI.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 config GPIO_PCF857X
tristate "PCF857x, PCA857x, and PCA967x I2C GPIO expanders"
depends on I2C
--- a/drivers/gpio/Makefile 2007-12-11 09:30:43.0 -0800
+++ b/drivers/gpio/Makefile 2007-12-11 17:15:18.0 -0800
@@ -1,4 +1,5 @@
 # gpio support: dedicated expander chips, etc
 
 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
--- /dev/null   1970-01-01 00:00:00.0 +
+++ b/drivers/gpio/pca9539.c2007-12-11 19:54:57.0 -0800
@@ -0,0 +1,249 @@
+/*
+pca9539.c - 16-bit I/O port with interrupt and reset
+
+Copyright (C) 2005 Ben Gardner <[EMAIL PROTECTED]>
+Copyright (C) 2007 Marvell Internation Ltd.
+
+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
+the Free Software Foundation; version 2 of the License.
+*/
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip->client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip->client, reg);
+   if (ret < 0) {
+   dev_err(>client->dev, "read error %d\n", ret);
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip->reg_direction | (1u << off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   

Re: [PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander[

2007-12-11 Thread David Brownell
[ do we need so much crossposting on these patches? ]

On Monday 10 December 2007, eric miao wrote:

 +    Copyright (C) 2007 Marvell Internation Ltd.

International?


 +static int __devinit pca9539_probe(struct i2c_client *client)
 +{
 + ...
 + /* initialize registers */
 + chip-reg_output = 0x;
 + chip-reg_direction = 0x;
 +
 + pca9539_write_reg(chip, PCA9539_OUTPUT, chip-reg_output);
 + pca9539_write_reg(chip, PCA9539_DIRECTION, chip-reg_direction);

I thought you were going to change that code to use whatever values
were previously found in those registers?  What this does is change
those values to act as if the chip just came from reset.  Which isn't
the best approach when a bootloader initialized it, or if the values
were otherwise set up by something ... the previous kernel before a
kexec, this one before rmmod pca9539, or something similar.


 +MODULE_AUTHOR(Ben Gardner [EMAIL PROTECTED]);

But not you?


Here's a slightly cleaned up version ... address the issues above
and I'd say this one is ready to join the queue (after the other
gpiolib patches).

- Dave

SNIP
From: eric miao [EMAIL PROTECTED]

Basic support for 16-bit PCA9539 GPIO expander

 1. use 16-bit register access to simplify the logic, cache OUTPUT
and DIRECTION registers for fast access

 2. platform code is required to setup
   (a) the numbering of GPIO for PCA9539 (base and number)
   (b) pass pca9539_platform_data within i2c_board_info

Derived from drivers/i2c/chips/pca9539.c (which has no current known users).

Signed-off-by: eric miao [EMAIL PROTECTED]
Acked-by: Ben Gardner [EMAIL PROTECTED]

 - Alphabetized Kconfig and Makefile
 - Corrected description:  not Philips, but NXP or TI
 - Use dev_err() not printk
 - Move module_{init,exit} next to those routines
 - Did NOT change clobber of output and direction registers

---
 drivers/gpio/Kconfig|   10 +
 drivers/gpio/Makefile   |1 
 drivers/gpio/pca9539.c  |  249 
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 278 insertions(+)

--- a/drivers/gpio/Kconfig  2007-12-11 09:30:43.0 -0800
+++ b/drivers/gpio/Kconfig  2007-12-11 17:16:16.0 -0800
@@ -9,6 +9,16 @@ menu GPIO Expanders
 
 comment I2C GPIO expanders:
 
+config GPIO_PCA9539
+   tristate PCA9539 16-bit I/O port
+   depends on I2C
+   help
+ Say yes here to support the PCA9539 16-bit I/O port.  These
+ parts are made by NXP and TI.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 config GPIO_PCF857X
tristate PCF857x, PCA857x, and PCA967x I2C GPIO expanders
depends on I2C
--- a/drivers/gpio/Makefile 2007-12-11 09:30:43.0 -0800
+++ b/drivers/gpio/Makefile 2007-12-11 17:15:18.0 -0800
@@ -1,4 +1,5 @@
 # gpio support: dedicated expander chips, etc
 
 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
--- /dev/null   1970-01-01 00:00:00.0 +
+++ b/drivers/gpio/pca9539.c2007-12-11 19:54:57.0 -0800
@@ -0,0 +1,249 @@
+/*
+pca9539.c - 16-bit I/O port with interrupt and reset
+
+Copyright (C) 2005 Ben Gardner [EMAIL PROTECTED]
+Copyright (C) 2007 Marvell Internation Ltd.
+
+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
+the Free Software Foundation; version 2 of the License.
+*/
+
+#include linux/module.h
+#include linux/init.h
+#include linux/i2c.h
+#include linux/i2c/pca9539.h
+
+#include asm/gpio.h
+
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip-client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip-client, reg);
+   if (ret  0) {
+   dev_err(chip-client-dev, read error %d\n, ret);
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip-reg_direction | (1u  off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   

[PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander

2007-12-10 Thread eric miao
1. use 16-bit register access to simplify the logic, cache OUTPUT
   and DIRECTION registers for fast access

2. platform code is required to setup
   a) the numbering of GPIO for PCA9539 (base and number)
   c) pass "pca9539_platform_data" within "i2c_board_info"

Signed-off-by: eric miao <[EMAIL PROTECTED]>
Acked-by: Ben Gardner <[EMAIL PROTECTED]>
---
 drivers/gpio/Kconfig|   10 ++
 drivers/gpio/Makefile   |1 +
 drivers/gpio/pca9539.c  |  248 +++
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 277 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpio/pca9539.c
 create mode 100644 include/linux/i2c/pca9539.h

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index dd9e697..6528fce 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -32,6 +32,16 @@ config GPIO_PCF857X
  This driver provides an in-kernel interface to those GPIOs using
  platform-neutral GPIO calls.

+config GPIO_PCA9539
+   tristate "Philips PCA9539 16-bit I/O port"
+   depends on I2C
+   help
+ If you say yes here you get support for the Philips PCA9539
+ 16-bit I/O port.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 comment "SPI GPIO expanders:"

 config GPIO_MCP23S08
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 575bb57..5f32943 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -2,3 +2,4 @@

 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
new file mode 100644
index 000..0a3ae6a
--- /dev/null
+++ b/drivers/gpio/pca9539.c
@@ -0,0 +1,248 @@
+/*
+pca9539.c - 16-bit I/O port with interrupt and reset
+
+Copyright (C) 2005 Ben Gardner <[EMAIL PROTECTED]>
+Copyright (C) 2007 Marvell Internation Ltd.
+
+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
+the Free Software Foundation; version 2 of the License.
+*/
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip->client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip->client, reg);
+   if (ret < 0) {
+   printk(KERN_ERR "%s: failed to read\n", __FUNCTION__);
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip->reg_direction | (1u << off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip->reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_direction_output(struct gpio_chip *gc,
+   unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   /* set output level */
+   if (val)
+   reg_val = chip->reg_output | (1u << off);
+   else
+   reg_val = chip->reg_output & ~(1u << off);
+
+   ret = pca9539_write_reg(chip, PCA9539_OUTPUT, reg_val);
+   if (ret)
+   return ret;
+
+   chip->reg_output = reg_val;
+
+   /* then direction */
+   reg_val = chip->reg_direction & ~(1u << off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip->reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_get_value(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   ret = pca9539_read_reg(chip, PCA9539_INPUT, _val);
+   if (ret < 0)
+   return ret;
+
+   return (reg_val & (1u << off)) ? 1 : 0;
+}
+
+static void pca9539_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip 

[PATCH 2.6.24-rc4-mm 1/2] gpiolib: basic support for 16-bit PCA9539 GPIO expander

2007-12-10 Thread eric miao
1. use 16-bit register access to simplify the logic, cache OUTPUT
   and DIRECTION registers for fast access

2. platform code is required to setup
   a) the numbering of GPIO for PCA9539 (base and number)
   c) pass pca9539_platform_data within i2c_board_info

Signed-off-by: eric miao [EMAIL PROTECTED]
Acked-by: Ben Gardner [EMAIL PROTECTED]
---
 drivers/gpio/Kconfig|   10 ++
 drivers/gpio/Makefile   |1 +
 drivers/gpio/pca9539.c  |  248 +++
 include/linux/i2c/pca9539.h |   18 +++
 4 files changed, 277 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpio/pca9539.c
 create mode 100644 include/linux/i2c/pca9539.h

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index dd9e697..6528fce 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -32,6 +32,16 @@ config GPIO_PCF857X
  This driver provides an in-kernel interface to those GPIOs using
  platform-neutral GPIO calls.

+config GPIO_PCA9539
+   tristate Philips PCA9539 16-bit I/O port
+   depends on I2C
+   help
+ If you say yes here you get support for the Philips PCA9539
+ 16-bit I/O port.
+
+ This driver can also be built as a module.  If so, the module
+ will be called pca9539.
+
 comment SPI GPIO expanders:

 config GPIO_MCP23S08
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 575bb57..5f32943 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -2,3 +2,4 @@

 obj-$(CONFIG_GPIO_MCP23S08)+= mcp23s08.o
 obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
+obj-$(CONFIG_GPIO_PCA9539) += pca9539.o
diff --git a/drivers/gpio/pca9539.c b/drivers/gpio/pca9539.c
new file mode 100644
index 000..0a3ae6a
--- /dev/null
+++ b/drivers/gpio/pca9539.c
@@ -0,0 +1,248 @@
+/*
+pca9539.c - 16-bit I/O port with interrupt and reset
+
+Copyright (C) 2005 Ben Gardner [EMAIL PROTECTED]
+Copyright (C) 2007 Marvell Internation Ltd.
+
+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
+the Free Software Foundation; version 2 of the License.
+*/
+
+#include linux/module.h
+#include linux/init.h
+#include linux/i2c.h
+#include linux/i2c/pca9539.h
+
+#include asm/gpio.h
+
+#define NR_PCA9539_GPIOS   16
+
+#define PCA9539_INPUT  0
+#define PCA9539_OUTPUT 2
+#define PCA9539_INVERT 4
+#define PCA9539_DIRECTION  6
+
+struct pca9539_chip {
+   unsigned gpio_start;
+   uint16_t reg_output;
+   uint16_t reg_direction;
+
+   struct i2c_client *client;
+   struct gpio_chip gpio_chip;
+};
+
+static int pca9539_write_reg(struct pca9539_chip *chip, int reg, uint16_t val)
+{
+   return i2c_smbus_write_word_data(chip-client, reg, val);
+}
+
+static int pca9539_read_reg(struct pca9539_chip *chip, int reg, uint16_t *val)
+{
+   int ret;
+
+   ret = i2c_smbus_read_word_data(chip-client, reg);
+   if (ret  0) {
+   printk(KERN_ERR %s: failed to read\n, __FUNCTION__);
+   return ret;
+   }
+
+   *val = (uint16_t)ret;
+   return 0;
+}
+
+static int pca9539_gpio_direction_input(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   reg_val = chip-reg_direction | (1u  off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip-reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_direction_output(struct gpio_chip *gc,
+   unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   /* set output level */
+   if (val)
+   reg_val = chip-reg_output | (1u  off);
+   else
+   reg_val = chip-reg_output  ~(1u  off);
+
+   ret = pca9539_write_reg(chip, PCA9539_OUTPUT, reg_val);
+   if (ret)
+   return ret;
+
+   chip-reg_output = reg_val;
+
+   /* then direction */
+   reg_val = chip-reg_direction  ~(1u  off);
+   ret = pca9539_write_reg(chip, PCA9539_DIRECTION, reg_val);
+   if (ret)
+   return ret;
+
+   chip-reg_direction = reg_val;
+   return 0;
+}
+
+static int pca9539_gpio_get_value(struct gpio_chip *gc, unsigned off)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+   int ret;
+
+   chip = container_of(gc, struct pca9539_chip, gpio_chip);
+
+   ret = pca9539_read_reg(chip, PCA9539_INPUT, reg_val);
+   if (ret  0)
+   return ret;
+
+   return (reg_val  (1u  off)) ? 1 : 0;
+}
+
+static void pca9539_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
+{
+   struct pca9539_chip *chip;
+   uint16_t reg_val;
+