[PATCH 2/4]-V2 Make room for other tps6507x drivers to have board specific initialization data.

Previous thread: [PATCH] hwmon:applesmc: Add support for iMac 9. by Justin P. Mattock on Friday, April 2, 2010 - 2:07 pm. (1 message)

Next thread: Re: [PATCH] ext4: allow defrag (EXT4_IOC_MOVE_EXT) in 32bit compat mode by tytso on Friday, April 2, 2010 - 2:48 pm. (1 message)
From: Todd Fischer
Date: Friday, April 2, 2010 - 2:37 pm

This is the second posting of the TPS6507x driver set.  I have
incorporated Mark Brown's feedback and retested.  Patches 3 and
5 have been combined so there are only 4 patches in the series now.

The TPS6507x family of Texas Instruments power management ICs (pmic) are
multi-function chips that include voltage regulation and touch screen
controller capabilities.  This patch set adds a TPS6507x multi-function
device driver and change the TPS6507x regulator driver to use the
TPS6507x MFD driver instead of interacting with the chip directly.  The
changes are needed before a touch screen driver can be added.

The patch set applies cleanly to the MFD repository:
git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6.git  If the
MFD and voltage regulator maintainer would prefer I post patches for a
different repository, please let me know.

The TPS6507x touch screen input driver will be posted to
linux-input@vger.kernel.org list.
--

From: Todd Fischer
Date: Friday, April 2, 2010 - 2:37 pm

Other sub-drivers for the TPS6507x chip will need to use register 
definition so move it out of the source file and into a header file.

Signed-off-by: Todd Fischer <todd.fischer@ridgerun.com>
---
 drivers/regulator/tps6507x-regulator.c |   60 +--------------
 include/linux/mfd/tps6507x.h           |  134 ++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+), 59 deletions(-)
 create mode 100644 include/linux/mfd/tps6507x.h

diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c
index c2a9539..91172e3 100644
--- a/drivers/regulator/tps6507x-regulator.c
+++ b/drivers/regulator/tps6507x-regulator.c
@@ -24,65 +24,7 @@
 #include <linux/regulator/machine.h>
 #include <linux/i2c.h>
 #include <linux/delay.h>
-
-/* Register definitions */
-#define	TPS6507X_REG_PPATH1				0X01
-#define	TPS6507X_REG_INT				0X02
-#define	TPS6507X_REG_CHGCONFIG0				0X03
-#define	TPS6507X_REG_CHGCONFIG1				0X04
-#define	TPS6507X_REG_CHGCONFIG2				0X05
-#define	TPS6507X_REG_CHGCONFIG3				0X06
-#define	TPS6507X_REG_REG_ADCONFIG			0X07
-#define	TPS6507X_REG_TSCMODE				0X08
-#define	TPS6507X_REG_ADRESULT_1				0X09
-#define	TPS6507X_REG_ADRESULT_2				0X0A
-#define	TPS6507X_REG_PGOOD				0X0B
-#define	TPS6507X_REG_PGOODMASK				0X0C
-#define	TPS6507X_REG_CON_CTRL1				0X0D
-#define	TPS6507X_REG_CON_CTRL2				0X0E
-#define	TPS6507X_REG_CON_CTRL3				0X0F
-#define	TPS6507X_REG_DEFDCDC1				0X10
-#define	TPS6507X_REG_DEFDCDC2_LOW			0X11
-#define	TPS6507X_REG_DEFDCDC2_HIGH			0X12
-#define	TPS6507X_REG_DEFDCDC3_LOW			0X13
-#define	TPS6507X_REG_DEFDCDC3_HIGH			0X14
-#define	TPS6507X_REG_DEFSLEW				0X15
-#define	TPS6507X_REG_LDO_CTRL1				0X16
-#define	TPS6507X_REG_DEFLDO2				0X17
-#define	TPS6507X_REG_WLED_CTRL1				0X18
-#define	TPS6507X_REG_WLED_CTRL2				0X19
-
-/* CON_CTRL1 bitfields ...
From: Todd Fischer
Date: Friday, April 2, 2010 - 2:37 pm

Add mfd structure which refrences sub-driver initialization data. For example,
for a giving hardware implementation, the voltage regulator sub-driver
initialization data provides the mapping betten a voltage regulator and what
the output voltage is being used for.

Signed-off-by: Todd Fischer <todd.fischer@ridgerun.com>
---
 arch/arm/mach-davinci/board-da850-evm.c |    7 ++++++-
 drivers/regulator/tps6507x-regulator.c  |   14 ++++++++++++--
 include/linux/mfd/tps6507x.h            |   11 +++++++++++
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index 411284d..d059924 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -17,6 +17,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c/at24.h>
 #include <linux/i2c/pca953x.h>
+#include <linux/mfd/tps6507x.h>
 #include <linux/gpio.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
@@ -533,10 +534,14 @@ struct regulator_init_data tps65070_regulator_data[] = {
 	},
 };
 
+static struct tps6507x_board tps_board = {
+	.tps6507x_pmic_init_data = &tps65070_regulator_data[0],
+};
+
 static struct i2c_board_info __initdata da850evm_tps65070_info[] = {
 	{
 		I2C_BOARD_INFO("tps6507x", 0x48),
-		.platform_data = &tps65070_regulator_data[0],
+		.platform_data = &tps_board,
 	},
 };
 
diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c
index 91172e3..becf652 100644
--- a/drivers/regulator/tps6507x-regulator.c
+++ b/drivers/regulator/tps6507x-regulator.c
@@ -488,6 +488,7 @@ static int __devinit tps_6507x_probe(struct i2c_client *client,
 	struct regulator_init_data *init_data;
 	struct regulator_dev *rdev;
 	struct tps_pmic *tps;
+	struct tps6507x_board *tps_board;
 	int i;
 	int error;
 
@@ -496,12 +497,21 @@ static int __devinit tps_6507x_probe(struct i2c_client *client,
 		return -EIO;
 
 	/**
+	 * tps_board points to ...
From: Todd Fischer
Date: Friday, April 2, 2010 - 2:37 pm

Move from using tps or tsp6507x to tps6057x_pmic in a consistent manner.

Signed-off-by: Todd Fischer <todd.fischer@ridgerun.com>
---
 drivers/regulator/tps6507x-regulator.c |  172 ++++++++++++++++----------------
 1 files changed, 87 insertions(+), 85 deletions(-)

diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c
index becf652..86f2e05 100644
--- a/drivers/regulator/tps6507x-regulator.c
+++ b/drivers/regulator/tps6507x-regulator.c
@@ -103,7 +103,7 @@ struct tps_info {
 	const u16 *table;
 };
 
-struct tps_pmic {
+struct tps6507x_pmic {
 	struct regulator_desc desc[TPS6507X_NUM_REGULATOR];
 	struct i2c_client *client;
 	struct regulator_dev *rdev[TPS6507X_NUM_REGULATOR];
@@ -111,23 +111,23 @@ struct tps_pmic {
 	struct mutex io_lock;
 };
 
-static inline int tps_6507x_read(struct tps_pmic *tps, u8 reg)
+static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg)
 {
 	return i2c_smbus_read_byte_data(tps->client, reg);
 }
 
-static inline int tps_6507x_write(struct tps_pmic *tps, u8 reg, u8 val)
+static inline int tps6507x_pmic_write(struct tps6507x_pmic *tps, u8 reg, u8 val)
 {
 	return i2c_smbus_write_byte_data(tps->client, reg, val);
 }
 
-static int tps_6507x_set_bits(struct tps_pmic *tps, u8 reg, u8 mask)
+static int tps6507x_pmic_set_bits(struct tps6507x_pmic *tps, u8 reg, u8 mask)
 {
 	int err, data;
 
 	mutex_lock(&tps->io_lock);
 
-	data = tps_6507x_read(tps, reg);
+	data = tps6507x_pmic_read(tps, reg);
 	if (data < 0) {
 		dev_err(&tps->client->dev, "Read from reg 0x%x failed\n", reg);
 		err = data;
@@ -135,7 +135,7 @@ static int tps_6507x_set_bits(struct tps_pmic *tps, u8 reg, u8 mask)
 	}
 
 	data |= mask;
-	err = tps_6507x_write(tps, reg, data);
+	err = tps6507x_pmic_write(tps, reg, data);
 	if (err)
 		dev_err(&tps->client->dev, "Write for reg 0x%x failed\n", reg);
 
@@ -144,13 +144,13 @@ out:
 	return err;
 }
 
-static int tps_6507x_clear_bits(struct tps_pmic *tps, u8 reg, u8 ...

Add MFD driver for TPS6507x family of multi-function chips.  Move TPS6507x 
regulator driver from being stand-alone driver to using the MFD TPS6507x driver.

Signed-off-by: Todd Fischer <todd.fischer@ridgerun.com>
---
 drivers/mfd/Kconfig                    |   12 +++
 drivers/mfd/Makefile                   |    3 +-
 drivers/mfd/tps6507x.c                 |  145 ++++++++++++++++++++++++++++++
 drivers/regulator/tps6507x-regulator.c |  153 +++++++++++++++----------------
 include/linux/mfd/tps6507x.h           |   22 +++++
 5 files changed, 255 insertions(+), 80 deletions(-)
 create mode 100644 drivers/mfd/tps6507x.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 2a5a0b7..1e301ad 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -111,6 +111,18 @@ config TPS65010
 	  This driver can also be built as a module.  If so, the module
 	  will be called tps65010.
 
+config TPS6507X
+	tristate "TPS6507x Power Management / Touch Screen chips"
+	select MFD_CORE
+	depends on I2C
+	help
+	  If you say yes here you get support for the TPS6507x series of
+	  Power Management / Touch Screen chips.  These include voltage
+	  regulators, lithium ion/polymer battery charging, touch screen
+	  and other features that are often used in portable devices.
+	  This driver can also be built as a module.  If so, the module
+	  will be called tps6507x.
+
 config MENELAUS
 	bool "Texas Instruments TWL92330/Menelaus PM chip"
 	depends on I2C=y && ARCH_OMAP2
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 22715ad..2bebc95 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_MFD_WM8350_I2C)	+= wm8350-i2c.o
 obj-$(CONFIG_MFD_WM8994)	+= wm8994-core.o
 
 obj-$(CONFIG_TPS65010)		+= tps65010.o
+obj-$(CONFIG_TPS6507X)		+= tps6507x.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 
 obj-$(CONFIG_TWL4030_CORE)	+= twl-core.o twl4030-irq.o twl6030-irq.o
@@ -62,4 +63,4 @@ obj-$(CONFIG_AB3100_OTP)	+= ab3100-otp.o
 ...

Your register I/O functions don't have anything protecting them against
concurrent access.  This isn't really an issue for the writes by
themselves since they do a single transaction on the I2C bus so the I2C
layer concurrency protection ought to be enough but for reads you need
to send the register address first then read back the data, opening up
an issue.  A simple mutex in the read and write functions ought to cover
this.
--

From: Mark Brown
Date: Monday, April 5, 2010 - 6:49 am

Acked-by: Mark Brown <broonie@opensource.wolfsonicro.com>
--

From: Mark Brown
Date: Monday, April 5, 2010 - 6:48 am

Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
--

From: Mark Brown
Date: Monday, April 5, 2010 - 6:46 am

Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
--

Previous thread: [PATCH] hwmon:applesmc: Add support for iMac 9. by Justin P. Mattock on Friday, April 2, 2010 - 2:07 pm. (1 message)

Next thread: Re: [PATCH] ext4: allow defrag (EXT4_IOC_MOVE_EXT) in 32bit compat mode by tytso on Friday, April 2, 2010 - 2:48 pm. (1 message)