diff mbox

[U-Boot] gpio: Add PCA9698 40-bit I2C I/O port

Message ID 1319101940-780-1-git-send-email-eibach@gdsys.de
State Accepted
Headers show

Commit Message

Dirk Eibach Oct. 20, 2011, 9:12 a.m. UTC
Signed-off-by: Dirk Eibach <eibach@gdsys.de>
---
 drivers/gpio/Makefile  |    1 +
 drivers/gpio/pca9698.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/pca9698.h      |   34 +++++++++++
 3 files changed, 178 insertions(+), 0 deletions(-)
 create mode 100644 drivers/gpio/pca9698.c
 create mode 100644 include/pca9698.h

Comments

Stefan Roese Oct. 20, 2011, 9:31 a.m. UTC | #1
On Thursday 20 October 2011 11:12:20 Dirk Eibach wrote:
> Signed-off-by: Dirk Eibach <eibach@gdsys.de>

Next time please update the patch version in the subject and add the changes 
below the "---" line. Other than this:

Acked-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan

--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office@denx.de
Dirk Eibach Oct. 20, 2011, 9:40 a.m. UTC | #2
> Next time please update the patch version in the subject and 
> add the changes below the "---" line. Other than this:

Oops, wrong serialization of save / git-send-email. I did a resend.

Cheers
Dirk
Wolfgang Denk Oct. 23, 2011, 7:01 p.m. UTC | #3
Dear Dirk Eibach,

In message <1319101940-780-1-git-send-email-eibach@gdsys.de> you wrote:
> Signed-off-by: Dirk Eibach <eibach@gdsys.de>
> ---
>  drivers/gpio/Makefile  |    1 +
>  drivers/gpio/pca9698.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/pca9698.h      |   34 +++++++++++
>  3 files changed, 178 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/gpio/pca9698.c
>  create mode 100644 include/pca9698.h

is this some v3 of the patch?  If so, where is the change log?  What
has been changes?

Best regards,

Wolfgang Denk
Dirk Eibach Oct. 26, 2011, 6:44 a.m. UTC | #4
Dear Wolfgang, 

> In message <1319101940-780-1-git-send-email-eibach@gdsys.de> 
> you wrote:
> > Signed-off-by: Dirk Eibach <eibach@gdsys.de>
> > ---
> >  drivers/gpio/Makefile  |    1 +
> >  drivers/gpio/pca9698.c |  143 
> ++++++++++++++++++++++++++++++++++++++++++++++++
> >  include/pca9698.h      |   34 +++++++++++
> >  3 files changed, 178 insertions(+), 0 deletions(-)  create mode 
> > 100644 drivers/gpio/pca9698.c  create mode 100644 include/pca9698.h
> 
> is this some v3 of the patch?  If so, where is the change 
> log?  What has been changes?

As you can see in http://patchwork.ozlabs.org/patch/120771/ message
archive I did a send without v3 tag and changelog by mistake.
The latest version with tag and changelog is
http://patchwork.ozlabs.org/patch/120777/.

Cheers
Dirk
Stefan Roese Oct. 28, 2011, 6:25 a.m. UTC | #5
Hi Dirk,

On Wednesday 26 October 2011 08:44:56 Eibach, Dirk wrote:
> > is this some v3 of the patch?  If so, where is the change
> > log?  What has been changes?
> 
> As you can see in http://patchwork.ozlabs.org/patch/120771/ message
> archive I did a send without v3 tag and changelog by mistake.
> The latest version with tag and changelog is
> http://patchwork.ozlabs.org/patch/120777/.

Perhaps its easiest if you could send an incremental patch, to bring the 
upstream source to the latest one. As your new PPC4xx board support depends on 
the new API.

Otherwise Wolfgang would need to revert the patch 
486cad03be46114d726df56721ee27cba52c38e3 and apply the new one.

Wolfgang, what would you prefer? Should Dirk just send an incremental patch?

Best regards,
Stefan

--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office@denx.de
Wolfgang Denk Oct. 28, 2011, 8:14 p.m. UTC | #6
Dear Stefan Roese,

In message <201110280825.08189.sr@denx.de> you wrote:
> 
> Wolfgang, what would you prefer? Should Dirk just send an incremental patch?

Yes, please.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 62ec97d..38a62c3 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -30,6 +30,7 @@  COBJS-$(CONFIG_KIRKWOOD_GPIO)	+= kw_gpio.o
 COBJS-$(CONFIG_MARVELL_MFP)	+= mvmfp.o
 COBJS-$(CONFIG_MXC_GPIO)	+= mxc_gpio.o
 COBJS-$(CONFIG_PCA953X)		+= pca953x.o
+COBJS-$(CONFIG_PCA9698)		+= pca9698.o
 COBJS-$(CONFIG_S5P)		+= s5p_gpio.o
 COBJS-$(CONFIG_TEGRA2_GPIO)	+= tegra2_gpio.o
 COBJS-$(CONFIG_DA8XX_GPIO)	+= da8xx_gpio.o
diff --git a/drivers/gpio/pca9698.c b/drivers/gpio/pca9698.c
new file mode 100644
index 0000000..fe6d2c6
--- /dev/null
+++ b/drivers/gpio/pca9698.c
@@ -0,0 +1,143 @@ 
+/*
+ * (C) Copyright 2011
+ * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * Driver for NXP's pca9698 40 bit I2C gpio expander
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/errno.h>
+#include <pca9698.h>
+
+/*
+ * The pca9698 registers
+ */
+
+#define PCA9698_REG_INPUT		0x00
+#define PCA9698_REG_OUTPUT		0x08
+#define PCA9698_REG_POLARITY		0x10
+#define PCA9698_REG_CONFIG		0x18
+
+#define PCA9698_BUFFER_SIZE		5
+#define PCA9698_GPIO_COUNT		40
+
+static int pca9698_read40(u8 addr, u8 offset, u8 *buffer)
+{
+	u8 command = offset | 0x80;  /* autoincrement */
+
+	return i2c_read(addr, command, 1, buffer, PCA9698_BUFFER_SIZE);
+}
+
+static int pca9698_write40(u8 addr, u8 offset, u8 *buffer)
+{
+	u8 command = offset | 0x80;  /* autoincrement */
+
+	return i2c_write(addr, command, 1, buffer, PCA9698_BUFFER_SIZE);
+}
+
+static void pca9698_set_bit(unsigned gpio, u8 *buffer, unsigned value)
+{
+	unsigned byte = gpio / 8;
+	unsigned bit = gpio % 8;
+
+	if (value)
+		buffer[byte] |= (1 << bit);
+	else
+		buffer[byte] &= ~(1 << bit);
+}
+
+int pca9698_request(unsigned gpio, const char *label)
+{
+	if (gpio >= PCA9698_GPIO_COUNT)
+		return -EINVAL;
+
+	return 0;
+}
+
+void pca9698_free(unsigned gpio)
+{
+}
+
+int pca9698_direction_input(u8 addr, unsigned gpio)
+{
+	u8 data[PCA9698_BUFFER_SIZE];
+	int res;
+
+	res = pca9698_read40(addr, PCA9698_REG_CONFIG, data);
+	if (res)
+		return res;
+
+	pca9698_set_bit(gpio, data, 1);
+
+	return pca9698_write40(addr, PCA9698_REG_CONFIG, data);
+}
+
+int pca9698_direction_output(u8 addr, unsigned gpio, int value)
+{
+	u8 data[PCA9698_BUFFER_SIZE];
+	int res;
+
+	res = pca9698_set_value(addr, gpio, value);
+	if (res)
+		return res;
+
+	res = pca9698_read40(addr, PCA9698_REG_CONFIG, data);
+	if (res)
+		return res;
+
+	pca9698_set_bit(gpio, data, 0);
+
+	return pca9698_write40(addr, PCA9698_REG_CONFIG, data);
+}
+
+int pca9698_get_value(u8 addr, unsigned gpio)
+{
+	unsigned config_byte = gpio / 8;
+	unsigned config_bit = gpio % 8;
+	unsigned value;
+	u8 data[PCA9698_BUFFER_SIZE];
+	int res;
+
+	res = pca9698_read40(addr, PCA9698_REG_INPUT, data);
+	if (res)
+		return -1;
+
+	value = data[config_byte] & (1 << config_bit);
+
+	return !!value;
+}
+
+int pca9698_set_value(u8 addr, unsigned gpio, int value)
+{
+	u8 data[PCA9698_BUFFER_SIZE];
+	int res;
+
+	res = pca9698_read40(addr, PCA9698_REG_OUTPUT, data);
+	if (res)
+		return res;
+
+	pca9698_set_bit(gpio, data, value);
+
+	return pca9698_write40(addr, PCA9698_REG_OUTPUT, data);
+}
diff --git a/include/pca9698.h b/include/pca9698.h
new file mode 100644
index 0000000..67b364e
--- /dev/null
+++ b/include/pca9698.h
@@ -0,0 +1,34 @@ 
+/*
+ * (C) Copyright 2011
+ * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __PCA9698_H_
+#define __PCA9698_H_
+
+int pca9698_request(unsigned gpio, const char *label);
+void pca9698_free(unsigned gpio);
+int pca9698_direction_input(u8 addr, unsigned gpio);
+int pca9698_direction_output(u8 addr, unsigned gpio, int value);
+int pca9698_get_value(u8 addr, unsigned gpio);
+int pca9698_set_value(u8 addr, unsigned gpio, int value);
+
+#endif /* __PCA9698_H_ */