This is the third posting of the TPS6507x driver set. I have resolved the concurrent access issue identified by Mark Brown. Instead of using a mutex, I used the i2c_transfer() as done in the similar routine in the wm8400-core.c file. 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. --
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 | 155 ++++++++++++++++++++++++++++++++ drivers/regulator/tps6507x-regulator.c | 153 +++++++++++++++---------------- include/linux/mfd/tps6507x.h | 22 +++++ 5 files changed, 265 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 ...
[...] Not sure whose tree this is queued in currently, but testing with Need an #include <linux/slab.h> here for kfree and kzalloc Kevin --
Hi Kevin, This is fixed in the MFD tree. Cheers, Samuel. -- Intel Open Source Technology Centre http://oss.intel.com/ --
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 ...
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 ...All Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> When reposting a patch series that has previously been reviewed it's useful to record any acks and similar that were given for patches that have been reposted unmodified - this makes life easier for reviewers since it saves having to re-review previously posted patches. --
Hi Samuel, Please feel free to upstream via MFD. Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk> -- Freelance Developer, SlimLogic Ltd ASoC and Voltage Regulator Maintainer. http://www.slimlogic.co.uk --
Hi Todd, All 4 patches applied to my for-next branch. Some nit picking advices for your future patches: - Include the Signed-off-by and Acked-by you collect along the review cycles. - Have shorter patch subject, they typically are less than 80 chars. - Describe the changes when moving from patchset vN to patchset vN+1. Also we prefer "[PATCH vN]" to "[PATCH]-vN", it makes our life easier when applying your patches. Thanks a lot for your work. Cheers, Samuel. -- Intel Open Source Technology Centre http://oss.intel.com/ --
