[PATCH 03/13] add twl4030 support

Michael Grzeschik m.grzeschik at pengutronix.de
Wed Aug 4 05:59:07 EDT 2010


From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/i2c/Kconfig   |    4 +
 drivers/i2c/Makefile  |    1 +
 drivers/i2c/twl4030.c |  186 ++++++++++++++++++++
 include/i2c/twl4030.h |  461 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 652 insertions(+), 0 deletions(-)
 create mode 100644 drivers/i2c/twl4030.c
 create mode 100644 include/i2c/twl4030.h

diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
index 147ea49..66a7cf7 100644
--- a/drivers/i2c/Kconfig
+++ b/drivers/i2c/Kconfig
@@ -23,4 +23,8 @@ config DRIVER_I2C_MC9SDZ60
 config DRIVER_I2C_LP3972
 	bool "LP3972 driver"
 
+config DRIVER_I2C_TWL4030
+	bool "TWL4030 driver"
+	select GPIO
+
 endif
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 9be8ab2..7d07cf0 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_DRIVER_I2C_MC13892) += mc13892.o
 obj-$(CONFIG_DRIVER_I2C_MC34704) += mc34704.o
 obj-$(CONFIG_DRIVER_I2C_MC9SDZ60) += mc9sdz60.o
 obj-$(CONFIG_DRIVER_I2C_LP3972) += lp3972.o
+obj-$(CONFIG_DRIVER_I2C_TWL4030) += twl4030.o
diff --git a/drivers/i2c/twl4030.c b/drivers/i2c/twl4030.c
new file mode 100644
index 0000000..4d47fc8
--- /dev/null
+++ b/drivers/i2c/twl4030.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+#include <xfuncs.h>
+#include <errno.h>
+
+#include <i2c/i2c.h>
+#include <i2c/twl4030.h>
+
+#define DRIVERNAME		"twl4030"
+
+#define to_twl4030(a)		container_of(a, struct twl4030, cdev)
+
+static struct twl4030 *twl_dev;
+
+struct twl4030 *twl4030_get(void)
+{
+	if (!twl_dev)
+		return NULL;
+
+	return twl_dev;
+}
+EXPORT_SYMBOL(twl4030_get);
+
+int twl4030_reg_read(struct twl4030 *twl4030, u16 reg, u8 *val)
+{
+	int ret;
+	struct i2c_msg xfer_msg[2];
+	struct i2c_msg *msg;
+	int i2c_addr;
+	unsigned char buf = reg & 0xff;
+
+	i2c_addr = twl4030->client->addr + (reg / 0x100);
+
+	/* [MSG1] fill the register address data */
+	msg = &xfer_msg[0];
+	msg->addr = i2c_addr;
+	msg->len = 1;
+	msg->flags = 0;	/* Read the register value */
+	msg->buf = &buf;
+	/* [MSG2] fill the data rx buffer */
+	msg = &xfer_msg[1];
+	msg->addr = i2c_addr;
+	msg->flags = I2C_M_RD;	/* Read the register value */
+	msg->len = 1;	/* only n bytes */
+	msg->buf = val;
+	ret = i2c_transfer(twl4030->client->adapter, &xfer_msg, 2);
+
+	/* i2c_transfer returns number of messages transferred */
+	if (ret < 0) {
+		pr_err("%s: failed to transfer all messages: %s\n", __func__, strerror(-ret));
+		return ret;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(twl4030_reg_read)
+
+int twl4030_reg_write(struct twl4030 *twl4030, u16 reg, u8 val)
+{
+	int ret;
+	struct i2c_msg xfer_msg[1];
+	struct i2c_msg *msg;
+	int i2c_addr;
+	u8 buf[2];
+
+	buf[0] = reg & 0xff;
+	buf[1] = val;
+
+	i2c_addr = twl4030->client->addr + (reg / 0x100);
+
+	/*
+	 * [MSG1]: fill the register address data
+	 * fill the data Tx buffer
+	 */
+	msg = xfer_msg;
+	msg->addr = i2c_addr;
+	msg->len = 2;
+	msg->flags = 0;
+	msg->buf = buf;
+	/* over write the first byte of buffer with the register address */
+	ret = i2c_transfer(twl4030->client->adapter, xfer_msg, 1);
+
+	/* i2c_transfer returns number of messages transferred */
+	if (ret < 0) {
+		pr_err("%s: failed to transfer all messages: %s\n", __func__, strerror(-ret));
+		return ret;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(twl4030_reg_write)
+
+int twl4030_set_bits(struct twl4030 *twl4030, enum twl4030_reg reg, u32 mask, u32 val)
+{
+	u32 tmp;
+	int err;
+
+	err = twl4030_reg_read(twl4030, reg, &tmp);
+	tmp = (tmp & ~mask) | val;
+
+	if (!err)
+		err = twl4030_reg_write(twl4030, reg, tmp);
+
+	return err;
+}
+EXPORT_SYMBOL(twl4030_set_bits);
+
+static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
+{
+	struct twl4030 *priv = to_twl4030(cdev);
+	u8 *buf = _buf;
+	size_t i = count;
+	int err;
+
+	while (i) {
+		err = twl4030_reg_read(priv, offset, buf);
+		if (err)
+			return (ssize_t)err;
+		buf++;
+		i--;
+		offset++;
+	}
+
+	return count;
+}
+
+static ssize_t twl_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
+{
+	struct twl4030 *twl4030 = to_twl4030(cdev);
+	const u8 *buf = _buf;
+	size_t i = count;
+	int err;
+
+	while (i) {
+		err = twl4030_reg_write(twl4030, offset, *buf);
+		if (err)
+			return (ssize_t)err;
+		buf++;
+		i--;
+		offset++;
+	}
+
+	return count;
+}
+
+static struct file_operations twl_fops = {
+	.lseek	= dev_lseek_default,
+	.read	= twl_read,
+	.write	= twl_write,
+};
+
+static int twl_probe(struct device_d *dev)
+{
+	if (twl_dev)
+		return -EBUSY;
+
+	twl_dev = xzalloc(sizeof(struct twl4030));
+	twl_dev->cdev.name = DRIVERNAME;
+	twl_dev->client = to_i2c_client(dev);
+	twl_dev->cdev.size = 1024;
+	twl_dev->cdev.dev = dev;
+	twl_dev->cdev.ops = &twl_fops;
+
+	devfs_create(&twl_dev->cdev);
+
+	return 0;
+}
+
+static struct driver_d twl_driver = {
+	.name  = DRIVERNAME,
+	.probe = twl_probe,
+};
+
+static int twl_init(void)
+{
+        register_driver(&twl_driver);
+        return 0;
+}
+
+device_initcall(twl_init);
diff --git a/include/i2c/twl4030.h b/include/i2c/twl4030.h
new file mode 100644
index 0000000..c9fbae0
--- /dev/null
+++ b/include/i2c/twl4030.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ * Copyright (C) 2010 Sascha Hauer <sha at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#ifndef __I2C_TWL4030_H
+#define __I2C_TWL4030_H
+
+#include <common.h>
+#include <i2c/i2c.h>
+#include <linux/err.h>
+
+/* LED */
+#define TWL4030_LED_LEDEN_LEDAON			(1 << 0)
+#define TWL4030_LED_LEDEN_LEDBON			(1 << 1)
+#define TWL4030_LED_LEDEN_LEDAPWM			(1 << 4)
+#define TWL4030_LED_LEDEN_LEDBPWM			(1 << 5)
+
+/* KEYPAD */
+#define TWL4030_KEYPAD_CTRL_KBD_ON			(1 << 6)
+#define TWL4030_KEYPAD_CTRL_RP_EN			(1 << 5)
+#define TWL4030_KEYPAD_CTRL_TOLE_EN			(1 << 4)
+#define TWL4030_KEYPAD_CTRL_TOE_EN			(1 << 3)
+#define TWL4030_KEYPAD_CTRL_LK_EN			(1 << 2)
+#define TWL4030_KEYPAD_CTRL_SOFTMODEN			(1 << 1)
+#define TWL4030_KEYPAD_CTRL_SOFT_NRST			(1 << 0)
+
+/* P[1-3]_SW_EVENTS */
+#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON	(1 << 6)
+#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_SYSEN	(1 << 5)
+#define TWL4030_PM_MASTER_SW_EVENTS_ENABLE_WARMRESET	(1 << 4)
+#define TWL4030_PM_MASTER_SW_EVENTS_LVL_WAKEUP		(1 << 3)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVACT		(1 << 2)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVSLP		(1 << 1)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVOFF		(1 << 0)
+
+
+enum twl4030_reg {
+	/* Register base addresses */
+	/* USB */
+	TWL4030_BASEADD_USB			= 0x0000,
+	/* AUD */
+	TWL4030_BASEADD_AUDIO_VOICE		= 0x0100,
+	TWL4030_BASEADD_GPIO			= 0x0198,
+	TWL4030_BASEADD_INTBR			= 0x0185,
+	TWL4030_BASEADD_PIH			= 0x0180,
+	TWL4030_BASEADD_TEST			= 0x014C,
+	/* AUX */
+	TWL4030_BASEADD_INTERRUPTS		= 0x02B9,
+	TWL4030_BASEADD_LED			= 0x02EE,
+	TWL4030_BASEADD_MADC			= 0x0200,
+	TWL4030_BASEADD_MAIN_CHARGE		= 0x0274,
+	TWL4030_BASEADD_PRECHARGE		= 0x02AA,
+	TWL4030_BASEADD_PWM0			= 0x02F8,
+	TWL4030_BASEADD_PWM1			= 0x02FB,
+	TWL4030_BASEADD_PWMA			= 0x02EF,
+	TWL4030_BASEADD_PWMB			= 0x02F1,
+	TWL4030_BASEADD_KEYPAD			= 0x02D2,
+	/* POWER */
+	TWL4030_BASEADD_BACKUP			= 0x0314,
+	TWL4030_BASEADD_INT			= 0x032E,
+	TWL4030_BASEADD_PM_MASTER		= 0x0336,
+	TWL4030_BASEADD_PM_RECIEVER		= 0x035B,
+	TWL4030_BASEADD_RTC			= 0x031C,
+	TWL4030_BASEADD_SECURED_REG		= 0x0300,
+
+	/* LED */
+	TWL4030_LED_LEDEN			= 0x02EE,
+
+	/*
+	 * Voltage Selection in PM Receiver Module
+	 */
+	TWL4030_PM_RECEIVER_VAUX2_VSEL_18	= 0x05,
+	TWL4030_PM_RECEIVER_VAUX3_VSEL_28	= 0x03,
+	TWL4030_PM_RECEIVER_VPLL2_VSEL_18	= 0x05,
+	TWL4030_PM_RECEIVER_VDAC_VSEL_18 	= 0x03,
+	TWL4030_PM_RECEIVER_VMMC1_VSEL_30	= 0x02,
+
+	/*
+	 * Device Selection in PM Receiver Module
+	 */
+	TWL4030_PM_RECEIVER_DEV_GRP_P1		= 0x20,
+	TWL4030_PM_RECEIVER_DEV_GRP_ALL		= 0xE0,
+
+	/*
+	* Power Management Master
+	*/
+	TWL4030_PM_MASTER_CFG_P1_TRANSITION	= 0x0336,
+	TWL4030_PM_MASTER_CFG_P2_TRANSITION	= 0x0337,
+	TWL4030_PM_MASTER_CFG_P3_TRANSITION	= 0x0338,
+	TWL4030_PM_MASTER_CFG_P123_TRANSITION	= 0x0339,
+	TWL4030_PM_MASTER_STS_BOOT		= 0x033A,
+	TWL4030_PM_MASTER_CFG_BOOT		= 0x033B,
+	TWL4030_PM_MASTER_SHUNDAN		= 0x033C,
+	TWL4030_PM_MASTER_BOOT_BCI		= 0x033D,
+	TWL4030_PM_MASTER_CFG_PWRANA1		= 0x033E,
+	TWL4030_PM_MASTER_CFG_PWRANA2		= 0x033F,
+	TWL4030_PM_MASTER_BGAP_TRIM		= 0x0340,
+	TWL4030_PM_MASTER_BACKUP_MISC_STS	= 0x0341,
+	TWL4030_PM_MASTER_BACKUP_MISC_CFG	= 0x0342,
+	TWL4030_PM_MASTER_BACKUP_MISC_TST	= 0x0343,
+	TWL4030_PM_MASTER_PROTECT_KEY		= 0x0344,
+	TWL4030_PM_MASTER_STS_HW_CONDITIONS	= 0x0345,
+	TWL4030_PM_MASTER_P1_SW_EVENTS		= 0x0346,
+	TWL4030_PM_MASTER_P2_SW_EVENTS		= 0x0347,
+	TWL4030_PM_MASTER_P3_SW_EVENTS		= 0x0348,
+	TWL4030_PM_MASTER_STS_P123_STATE	= 0x0349,
+	TWL4030_PM_MASTER_PB_CFG		= 0x034A,
+	TWL4030_PM_MASTER_PB_WORD_MSB		= 0x034B,
+	TWL4030_PM_MASTER_PB_WORD_LSB		= 0x034C,
+	TWL4030_PM_MASTER_SEQ_ADD_W2P		= 0x0352,
+	TWL4030_PM_MASTER_SEQ_ADD_P2A		= 0x0353,
+	TWL4030_PM_MASTER_SEQ_ADD_A2W		= 0x0354,
+	TWL4030_PM_MASTER_SEQ_ADD_A2S		= 0x0355,
+	TWL4030_PM_MASTER_SEQ_ADD_S2A12		= 0x0356,
+	TWL4030_PM_MASTER_SEQ_ADD_S2A3		= 0x0357,
+	TWL4030_PM_MASTER_SEQ_ADD_WARM		= 0x0358,
+	TWL4030_PM_MASTER_MEMORY_ADDRESS	= 0x0359,
+	TWL4030_PM_MASTER_MEMORY_DATA		= 0x035A,
+	TWL4030_PM_MASTER_SC_CONFIG		= 0x035B,
+	TWL4030_PM_MASTER_SC_DETECT1		= 0x035C,
+	TWL4030_PM_MASTER_SC_DETECT2		= 0x035D,
+	TWL4030_PM_MASTER_WATCHDOG_CFG		= 0x035E,
+	TWL4030_PM_MASTER_IT_CHECK_CFG		= 0x035F,
+	TWL4030_PM_MASTER_VIBRATOR_CFG		= 0x0360,
+	TWL4030_PM_MASTER_DCDC_GLOBAL_CFG	= 0x0361,
+	TWL4030_PM_MASTER_VDD1_TRIM1		= 0x0362,
+	TWL4030_PM_MASTER_VDD1_TRIM2		= 0x0363,
+	TWL4030_PM_MASTER_VDD2_TRIM1		= 0x0364,
+	TWL4030_PM_MASTER_VDD2_TRIM2		= 0x0365,
+	TWL4030_PM_MASTER_VIO_TRIM1		= 0x0366,
+	TWL4030_PM_MASTER_VIO_TRIM2		= 0x0367,
+	TWL4030_PM_MASTER_MISC_CFG		= 0x0368,
+	TWL4030_PM_MASTER_LS_TST_A		= 0x0369,
+	TWL4030_PM_MASTER_LS_TST_B		= 0x036A,
+	TWL4030_PM_MASTER_LS_TST_C		= 0x036B,
+	TWL4030_PM_MASTER_LS_TST_D		= 0x036C,
+	TWL4030_PM_MASTER_BB_CFG		= 0x036D,
+	TWL4030_PM_MASTER_MISC_TST		= 0x036E,
+	TWL4030_PM_MASTER_TRIM1			= 0x036F,
+
+	/* Power Managment Receiver */
+	TWL4030_PM_RECEIVER_SC_CONFIG		= 0x035B,
+	TWL4030_PM_RECEIVER_SC_DETECT1		= 0x035C,
+	TWL4030_PM_RECEIVER_SC_DETECT2		= 0x035D,
+	TWL4030_PM_RECEIVER_WATCHDOG_CFG	= 0x035E,
+	TWL4030_PM_RECEIVER_IT_CHECK_CFG	= 0x035F,
+	TWL4030_PM_RECEIVER_VIBRATOR_CFG	= 0x035F,
+	TWL4030_PM_RECEIVER_DC_TO_DC_CFG	= 0x0361,
+	TWL4030_PM_RECEIVER_VDD1_TRIM1		= 0x0362,
+	TWL4030_PM_RECEIVER_VDD1_TRIM2		= 0x0363,
+	TWL4030_PM_RECEIVER_VDD2_TRIM1		= 0x0364,
+	TWL4030_PM_RECEIVER_VDD2_TRIM2		= 0x0365,
+	TWL4030_PM_RECEIVER_VIO_TRIM1		= 0x0366,
+	TWL4030_PM_RECEIVER_VIO_TRIM2		= 0x0367,
+	TWL4030_PM_RECEIVER_MISC_CFG		= 0x0368,
+	TWL4030_PM_RECEIVER_LS_TST_A		= 0x0369,
+	TWL4030_PM_RECEIVER_LS_TST_B		= 0x036A,
+	TWL4030_PM_RECEIVER_LS_TST_C		= 0x036B,
+	TWL4030_PM_RECEIVER_LS_TST_D		= 0x036C,
+	TWL4030_PM_RECEIVER_BB_CFG		= 0x036D,
+	TWL4030_PM_RECEIVER_MISC_TST		= 0x036E,
+	TWL4030_PM_RECEIVER_TRIM1		= 0x036F,
+	TWL4030_PM_RECEIVER_TRIM2		= 0x0370,
+	TWL4030_PM_RECEIVER_DC_DC_TIMEOUT	= 0x0371,
+	TWL4030_PM_RECEIVER_VAUX1_DEV_GRP	= 0x0372,
+	TWL4030_PM_RECEIVER_VAUX1_TYPE		= 0x0373,
+	TWL4030_PM_RECEIVER_VAUX1_REMAP		= 0x0374,
+	TWL4030_PM_RECEIVER_VAUX1_DEDICATED	= 0x0375,
+	TWL4030_PM_RECEIVER_VAUX2_DEV_GRP	= 0x0376,
+	TWL4030_PM_RECEIVER_VAUX2_TYPE		= 0x0377,
+	TWL4030_PM_RECEIVER_VAUX2_REMAP		= 0x0378,
+	TWL4030_PM_RECEIVER_VAUX2_DEDICATED	= 0x0379,
+	TWL4030_PM_RECEIVER_VAUX3_DEV_GRP	= 0x037A,
+	TWL4030_PM_RECEIVER_VAUX3_TYPE		= 0x037B,
+	TWL4030_PM_RECEIVER_VAUX3_REMAP		= 0x037C,
+	TWL4030_PM_RECEIVER_VAUX3_DEDICATED	= 0x037D,
+	TWL4030_PM_RECEIVER_VAUX4_DEV_GRP	= 0x037E,
+	TWL4030_PM_RECEIVER_VAUX4_TYPE		= 0x037F,
+	TWL4030_PM_RECEIVER_VAUX4_REMAP		= 0x0380,
+	TWL4030_PM_RECEIVER_VAUX4_DEDICATED	= 0x0381,
+	TWL4030_PM_RECEIVER_VMMC1_DEV_GRP	= 0x0382,
+	TWL4030_PM_RECEIVER_VMMC1_TYPE		= 0x0383,
+	TWL4030_PM_RECEIVER_VMMC1_REMAP		= 0x0384,
+	TWL4030_PM_RECEIVER_VMMC1_DEDICATED	= 0x0385,
+	TWL4030_PM_RECEIVER_VMMC2_DEV_GRP	= 0x0386,
+	TWL4030_PM_RECEIVER_VMMC2_TYPE		= 0x0387,
+	TWL4030_PM_RECEIVER_VMMC2_REMAP		= 0x0388,
+	TWL4030_PM_RECEIVER_VMMC2_DEDICATED	= 0x0389,
+	TWL4030_PM_RECEIVER_VPLL1_DEV_GRP	= 0x038A,
+	TWL4030_PM_RECEIVER_VPLL1_TYPE		= 0x038B,
+	TWL4030_PM_RECEIVER_VPLL1_REMAP		= 0x038C,
+	TWL4030_PM_RECEIVER_VPLL1_DEDICATED	= 0x038D,
+	TWL4030_PM_RECEIVER_VPLL2_DEV_GRP	= 0x038E,
+	TWL4030_PM_RECEIVER_VPLL2_TYPE		= 0x038F,
+	TWL4030_PM_RECEIVER_VPLL2_REMAP		= 0x0390,
+	TWL4030_PM_RECEIVER_VPLL2_DEDICATED	= 0x0391,
+	TWL4030_PM_RECEIVER_VSIM_DEV_GRP	= 0x0392,
+	TWL4030_PM_RECEIVER_VSIM_TYPE		= 0x0393,
+	TWL4030_PM_RECEIVER_VSIM_REMAP		= 0x0394,
+	TWL4030_PM_RECEIVER_VSIM_DEDICATED	= 0x0395,
+	TWL4030_PM_RECEIVER_VDAC_DEV_GRP	= 0x0396,
+	TWL4030_PM_RECEIVER_VDAC_TYPE		= 0x0397,
+	TWL4030_PM_RECEIVER_VDAC_REMAP		= 0x0398,
+	TWL4030_PM_RECEIVER_VDAC_DEDICATED	= 0x0399,
+	TWL4030_PM_RECEIVER_VINTANA1_DEV_GRP	= 0x039A,
+	TWL4030_PM_RECEIVER_VINTANA1_TYP	= 0x039B,
+	TWL4030_PM_RECEIVER_VINTANA1_REMAP	= 0x039C,
+	TWL4030_PM_RECEIVER_VINTANA1_DEDICATED	= 0x039D,
+	TWL4030_PM_RECEIVER_VINTANA2_DEV_GRP	= 0x039E,
+	TWL4030_PM_RECEIVER_VINTANA2_TYPE	= 0x039F,
+	TWL4030_PM_RECEIVER_VINTANA2_REMAP	= 0x03A0,
+	TWL4030_PM_RECEIVER_VINTANA2_DEDICATED	= 0x03A1,
+	TWL4030_PM_RECEIVER_VINTDIG_DEV_GRP	= 0x03A2,
+	TWL4030_PM_RECEIVER_VINTDIG_TYPE	= 0x03A3,
+	TWL4030_PM_RECEIVER_VINTDIG_REMAP	= 0x03A4,
+	TWL4030_PM_RECEIVER_VINTDIG_DEDICATED	= 0x03A5,
+	TWL4030_PM_RECEIVER_VIO_DEV_GRP		= 0x03A6,
+	TWL4030_PM_RECEIVER_VIO_TYPE		= 0x03A7,
+	TWL4030_PM_RECEIVER_VIO_REMAP		= 0x03A8,
+	TWL4030_PM_RECEIVER_VIO_CFG		= 0x03A9,
+	TWL4030_PM_RECEIVER_VIO_MISC_CFG	= 0x03AA,
+	TWL4030_PM_RECEIVER_VIO_TEST1		= 0x03AB,
+	TWL4030_PM_RECEIVER_VIO_TEST2		= 0x03AC,
+	TWL4030_PM_RECEIVER_VIO_OSC		= 0x03AD,
+	TWL4030_PM_RECEIVER_VIO_RESERVED	= 0x03AE,
+	TWL4030_PM_RECEIVER_VIO_VSEL		= 0x03AF,
+	TWL4030_PM_RECEIVER_VDD1_DEV_GRP	= 0x03B0,
+	TWL4030_PM_RECEIVER_VDD1_TYPE		= 0x03B1,
+	TWL4030_PM_RECEIVER_VDD1_REMAP		= 0x03B2,
+	TWL4030_PM_RECEIVER_VDD1_CFG		= 0x03B3,
+	TWL4030_PM_RECEIVER_VDD1_MISC_CFG	= 0x03B4,
+	TWL4030_PM_RECEIVER_VDD1_TEST1		= 0x03B5,
+	TWL4030_PM_RECEIVER_VDD1_TEST2		= 0x03B6,
+	TWL4030_PM_RECEIVER_VDD1_OSC		= 0x03B7,
+	TWL4030_PM_RECEIVER_VDD1_RESERVED	= 0x03B8,
+	TWL4030_PM_RECEIVER_VDD1_VSEL		= 0x03B9,
+	TWL4030_PM_RECEIVER_VDD1_VMODE_CFG	= 0x03BA,
+	TWL4030_PM_RECEIVER_VDD1_VFLOOR		= 0x03BB,
+	TWL4030_PM_RECEIVER_VDD1_VROOF		= 0x03BC,
+	TWL4030_PM_RECEIVER_VDD1_STEP		= 0x03BD,
+	TWL4030_PM_RECEIVER_VDD2_DEV_GRP	= 0x03BE,
+	TWL4030_PM_RECEIVER_VDD2_TYPE		= 0x03BF,
+	TWL4030_PM_RECEIVER_VDD2_REMAP		= 0x03C0,
+	TWL4030_PM_RECEIVER_VDD2_CFG		= 0x03C1,
+	TWL4030_PM_RECEIVER_VDD2_MISC_CFG	= 0x03C2,
+	TWL4030_PM_RECEIVER_VDD2_TEST1		= 0x03C3,
+	TWL4030_PM_RECEIVER_VDD2_TEST2		= 0x03C4,
+	TWL4030_PM_RECEIVER_VDD2_OSC		= 0x03C5,
+	TWL4030_PM_RECEIVER_VDD2_RESERVED	= 0x03C6,
+	TWL4030_PM_RECEIVER_VDD2_VSEL		= 0x03C7,
+	TWL4030_PM_RECEIVER_VDD2_VMODE_CFG	= 0x03C8,
+	TWL4030_PM_RECEIVER_VDD2_VFLOOR		= 0x03C9,
+	TWL4030_PM_RECEIVER_VDD2_VROOF		= 0x03CA,
+	TWL4030_PM_RECEIVER_VDD2_STEP		= 0x03CB,
+	TWL4030_PM_RECEIVER_VUSB1V5_DEV_GRP	= 0x03CC,
+	TWL4030_PM_RECEIVER_VUSB1V5_TYPE	= 0x03CD,
+	TWL4030_PM_RECEIVER_VUSB1V5_REMAP	= 0x03CE,
+	TWL4030_PM_RECEIVER_VUSB1V8_DEV_GRP	= 0x03CF,
+	TWL4030_PM_RECEIVER_VUSB1V8_TYPE	= 0x03D0,
+	TWL4030_PM_RECEIVER_VUSB1V8_REMAP	= 0x03D1,
+	TWL4030_PM_RECEIVER_VUSB3V1_DEV_GRP	= 0x03D2,
+	TWL4030_PM_RECEIVER_VUSB3V1_TYPE	= 0x03D3,
+	TWL4030_PM_RECEIVER_VUSB3V1_REMAP	= 0x03D4,
+	TWL4030_PM_RECEIVER_VUSBCP_DEV_GRP	= 0x03D5,
+	TWL4030_PM_RECEIVER_VUSBCP_TYPE		= 0x03D6,
+	TWL4030_PM_RECEIVER_VUSBCP_REMAP	= 0x03D7,
+	TWL4030_PM_RECEIVER_VUSB_DEDICATED1	= 0x03D8,
+	TWL4030_PM_RECEIVER_VUSB_DEDICATED2	= 0x03D9,
+	TWL4030_PM_RECEIVER_REGEN_DEV_GRP	= 0x03DA,
+	TWL4030_PM_RECEIVER_REGEN_TYPE		= 0x03DB,
+	TWL4030_PM_RECEIVER_REGEN_REMAP		= 0x03DC,
+	TWL4030_PM_RECEIVER_NRESPWRON_DEV_GRP	= 0x03DD,
+	TWL4030_PM_RECEIVER_NRESPWRON_TYPE	= 0x03DE,
+	TWL4030_PM_RECEIVER_NRESPWRON_REMAP	= 0x03DF,
+	TWL4030_PM_RECEIVER_CLKEN_DEV_GRP	= 0x03E0,
+	TWL4030_PM_RECEIVER_CLKEN_TYPE		= 0x03E1,
+	TWL4030_PM_RECEIVER_CLKEN_REMAP		= 0x03E2,
+	TWL4030_PM_RECEIVER_SYSEN_DEV_GRP	= 0x03E3,
+	TWL4030_PM_RECEIVER_SYSEN_TYPE		= 0x03E4,
+	TWL4030_PM_RECEIVER_SYSEN_REMAP		= 0x03E5,
+	TWL4030_PM_RECEIVER_HFCLKOUT_DEV_GRP	= 0x03E6,
+	TWL4030_PM_RECEIVER_HFCLKOUT_TYPE	= 0x03E7,
+	TWL4030_PM_RECEIVER_HFCLKOUT_REMAP	= 0x03E8,
+	TWL4030_PM_RECEIVER_32KCLKOUT_DEV_GRP	= 0x03E9,
+	TWL4030_PM_RECEIVER_32KCLKOUT_TYPE	= 0x03EA,
+	TWL4030_PM_RECEIVER_32KCLKOUT_REMAP	= 0x03EB,
+	TWL4030_PM_RECEIVER_TRITON_RESET_DEV_GR	= 0x03EC,
+	TWL4030_PM_RECEIVER_TRITON_RESET_TYPE	= 0x03ED,
+	TWL4030_PM_RECEIVER_TRITON_RESET_REMAP	= 0x03EE,
+	TWL4030_PM_RECEIVER_MAINREF_DEV_GRP	= 0x03EF,
+	TWL4030_PM_RECEIVER_MAINREF_TYPE	= 0x03F0,
+	TWL4030_PM_RECEIVER_MAINREF_REMAP	= 0x03F1,
+
+	/* Keypad */
+	TWL4030_KEYPAD_KEYP_CTRL_REG		= 0x02D2,
+	TWL4030_KEYPAD_KEY_DEB_REG		= 0x02D3,
+	TWL4030_KEYPAD_LONG_KEY_REG1		= 0x02D4,
+	TWL4030_KEYPAD_LK_PTV_REG		= 0x02D5,
+	TWL4030_KEYPAD_TIME_OUT_REG1		= 0x02D6,
+	TWL4030_KEYPAD_TIME_OUT_REG2		= 0x02D7,
+	TWL4030_KEYPAD_KBC_REG			= 0x02D8,
+	TWL4030_KEYPAD_KBR_REG			= 0x02D9,
+	TWL4030_KEYPAD_KEYP_SMS			= 0x02DA,
+	TWL4030_KEYPAD_FULL_CODE_7_0		= 0x02DB,
+	TWL4030_KEYPAD_FULL_CODE_15_8		= 0x02DC,
+	TWL4030_KEYPAD_FULL_CODE_23_16		= 0x02DD,
+	TWL4030_KEYPAD_FULL_CODE_31_24		= 0x02DE,
+	TWL4030_KEYPAD_FULL_CODE_39_32		= 0x02DF,
+	TWL4030_KEYPAD_FULL_CODE_47_40		= 0x02E0,
+	TWL4030_KEYPAD_FULL_CODE_55_48		= 0x02E1,
+	TWL4030_KEYPAD_FULL_CODE_63_56		= 0x02E2,
+	TWL4030_KEYPAD_KEYP_ISR1		= 0x02E3,
+	TWL4030_KEYPAD_KEYP_IMR1		= 0x02E4,
+	TWL4030_KEYPAD_KEYP_ISR2		= 0x02E5,
+	TWL4030_KEYPAD_KEYP_IMR2		= 0x02E6,
+	TWL4030_KEYPAD_KEYP_SIR			= 0x02E7,
+	TWL4030_KEYPAD_KEYP_EDR			= 0x02E8,
+	TWL4030_KEYPAD_KEYP_SIH_CTRL		= 0x02E9,
+
+	/* USB */
+	TWL4030_USB_VENDOR_ID_LO		= 0x0000,
+	TWL4030_USB_VENDOR_ID_HI		= 0x0001,
+	TWL4030_USB_PRODUCT_ID_LO		= 0x0002,
+	TWL4030_USB_PRODUCT_ID_HI		= 0x0003,
+	TWL4030_USB_FUNC_CTRL			= 0x0004,
+	TWL4030_USB_FUNC_CTRL_SET		= 0x0005,
+	TWL4030_USB_FUNC_CTRL_CLR		= 0x0006,
+	TWL4030_USB_IFC_CTRL			= 0x0007,
+	TWL4030_USB_IFC_CTRL_SET		= 0x0008,
+	TWL4030_USB_IFC_CTRL_CLR		= 0x0009,
+	TWL4030_USB_OTG_CTRL			= 0x000A,
+	TWL4030_USB_OTG_CTRL_SET		= 0x000B,
+	TWL4030_USB_OTG_CTRL_CLR		= 0x000C,
+	TWL4030_USB_USB_INT_EN_RISE		= 0x000D,
+	TWL4030_USB_USB_INT_EN_RISE_SET		= 0x000E,
+	TWL4030_USB_USB_INT_EN_RISE_CLR		= 0x000F,
+	TWL4030_USB_USB_INT_EN_FALL		= 0x0010,
+	TWL4030_USB_USB_INT_EN_FALL_SET		= 0x0011,
+	TWL4030_USB_USB_INT_EN_FALL_CLR		= 0x0012,
+	TWL4030_USB_USB_INT_STS			= 0x0013,
+	TWL4030_USB_USB_INT_LATCH		= 0x0014,
+	TWL4030_USB_DEBUG			= 0x0015,
+	TWL4030_USB_SCRATCH_REG			= 0x0016,
+	TWL4030_USB_SCRATCH_REG_SET		= 0x0017,
+	TWL4030_USB_SCRATCH_REG_CLR		= 0x0018,
+	TWL4030_USB_CARKIT_CTRL			= 0x0019,
+	TWL4030_USB_CARKIT_CTRL_SET		= 0x001A,
+	TWL4030_USB_CARKIT_CTRL_CLR		= 0x001B,
+	TWL4030_USB_CARKIT_INT_DELAY		= 0x001C,
+	TWL4030_USB_CARKIT_INT_EN		= 0x001D,
+	TWL4030_USB_CARKIT_INT_EN_SET		= 0x001E,
+	TWL4030_USB_CARKIT_INT_EN_CLR		= 0x001F,
+	TWL4030_USB_CARKIT_INT_STS		= 0x0020,
+	TWL4030_USB_CARKIT_INT_LATCH		= 0x0021,
+	TWL4030_USB_CARKIT_PLS_CTRL		= 0x0022,
+	TWL4030_USB_CARKIT_PLS_CTRL_SET		= 0x0023,
+	TWL4030_USB_CARKIT_PLS_CTRL_CLR		= 0x0024,
+	TWL4030_USB_TRANS_POS_WIDTH		= 0x0025,
+	TWL4030_USB_TRANS_NEG_WIDTH		= 0x0026,
+	TWL4030_USB_RCV_PLTY_RECOVERY		= 0x0027,
+	TWL4030_USB_MCPC_CTRL			= 0x0030,
+	TWL4030_USB_MCPC_CTRL_SET		= 0x0031,
+	TWL4030_USB_MCPC_CTRL_CLR		= 0x0032,
+	TWL4030_USB_MCPC_IO_CTRL		= 0x0033,
+	TWL4030_USB_MCPC_IO_CTRL_SET		= 0x0034,
+	TWL4030_USB_MCPC_IO_CTRL_CLR		= 0x0035,
+	TWL4030_USB_MCPC_CTRL2			= 0x0036,
+	TWL4030_USB_MCPC_CTRL2_SET		= 0x0037,
+	TWL4030_USB_MCPC_CTRL2_CLR		= 0x0038,
+	TWL4030_USB_OTHER_FUNC_CTRL		= 0x0080,
+	TWL4030_USB_OTHER_FUNC_CTRL_SET		= 0x0081,
+	TWL4030_USB_OTHER_FUNC_CTRL_CLR		= 0x0082,
+	TWL4030_USB_OTHER_IFC_CTRL		= 0x0083,
+	TWL4030_USB_OTHER_IFC_CTRL_SET		= 0x0084,
+	TWL4030_USB_OTHER_IFC_CTRL_CLR		= 0x0085,
+	TWL4030_USB_OTHER_INT_EN_RISE_SET	= 0x0087,
+	TWL4030_USB_OTHER_INT_EN_RISE_CLR	= 0x0088,
+	TWL4030_USB_OTHER_INT_EN_FALL		= 0x0089,
+	TWL4030_USB_OTHER_INT_EN_FALL_SET	= 0x008A,
+	TWL4030_USB_OTHER_INT_EN_FALL_CLR	= 0x008B,
+	TWL4030_USB_OTHER_INT_STS		= 0x008C,
+	TWL4030_USB_OTHER_INT_LATCH		= 0x008D,
+	TWL4030_USB_ID_STATUS			= 0x0096,
+	TWL4030_USB_CARKIT_SM_1_INT_EN		= 0x0097,
+	TWL4030_USB_CARKIT_SM_1_INT_EN_SET	= 0x0098,
+	TWL4030_USB_CARKIT_SM_1_INT_EN_CLR	= 0x0099,
+	TWL4030_USB_CARKIT_SM_1_INT_STS		= 0x009A,
+	TWL4030_USB_CARKIT_SM_1_INT_LATCH	= 0x009B,
+	TWL4030_USB_CARKIT_SM_2_INT_EN		= 0x009C,
+	TWL4030_USB_CARKIT_SM_2_INT_EN_SET	= 0x009D,
+	TWL4030_USB_CARKIT_SM_2_INT_EN_CLR	= 0x009E,
+	TWL4030_USB_CARKIT_SM_2_INT_STS		= 0x009F,
+	TWL4030_USB_CARKIT_SM_2_INT_LATCH	= 0x00A0,
+	TWL4030_USB_CARKIT_SM_CTRL		= 0x00A1,
+	TWL4030_USB_CARKIT_SM_CTRL_SET		= 0x00A2,
+	TWL4030_USB_CARKIT_SM_CTRL_CLR		= 0x00A3,
+	TWL4030_USB_CARKIT_SM_CMD		= 0x00A4,
+	TWL4030_USB_CARKIT_SM_CMD_SET		= 0x00A5,
+	TWL4030_USB_CARKIT_SM_CMD_CLR		= 0x00A6,
+	TWL4030_USB_CARKIT_SM_CMD_STS		= 0x00A7,
+	TWL4030_USB_CARKIT_SM_STATUS		= 0x00A8,
+	TWL4030_USB_CARKIT_SM_ERR_STATUS	= 0x00AA,
+	TWL4030_USB_CARKIT_SM_CTRL_STATE	= 0x00AB,
+	TWL4030_USB_POWER_CTRL			= 0x00AC,
+	TWL4030_USB_POWER_CTRL_SET		= 0x00AD,
+	TWL4030_USB_POWER_CTRL_CLR		= 0x00AE,
+	TWL4030_USB_OTHER_IFC_CTRL2		= 0x00AF,
+	TWL4030_USB_OTHER_IFC_CTRL2_SET		= 0x00B0,
+	TWL4030_USB_OTHER_IFC_CTRL2_CLR		= 0x00B1,
+	TWL4030_USB_REG_CTRL_EN			= 0x00B2,
+	TWL4030_USB_REG_CTRL_EN_SET		= 0x00B3,
+	TWL4030_USB_REG_CTRL_EN_CLR		= 0x00B4,
+	TWL4030_USB_REG_CTRL_ERROR		= 0x00B5,
+	TWL4030_USB_OTHER_FUNC_CTRL2		= 0x00B8,
+	TWL4030_USB_OTHER_FUNC_CTRL2_SET	= 0x00B9,
+	TWL4030_USB_OTHER_FUNC_CTRL2_CLR	= 0x00BA,
+	TWL4030_USB_CARKIT_ANA_CTRL		= 0x00BB,
+	TWL4030_USB_CARKIT_ANA_CTRL_SET		= 0x00BC,
+	TWL4030_USB_CARKIT_ANA_CTRL_CLR		= 0x00BD,
+	TWL4030_USB_VBUS_DEBOUNCE		= 0x00C0,
+	TWL4030_USB_ID_DEBOUNCE			= 0x00C1,
+	TWL4030_USB_TPH_DP_CON_MIN		= 0x00C2,
+	TWL4030_USB_TPH_DP_CON_MAX		= 0x00C3,
+	TWL4030_USB_TCR_DP_CON_MIN		= 0x00C4,
+	TWL4030_USB_TCR_DP_CON_MAX		= 0x00C5,
+	TWL4030_USB_TPH_DP_PD_SHORT		= 0x00C6,
+	TWL4030_USB_TPH_CMD_DLY			= 0x00C7,
+	TWL4030_USB_TPH_DET_RST			= 0x00C8,
+	TWL4030_USB_TPH_AUD_BIAS		= 0x00C9,
+	TWL4030_USB_TCR_UART_DET_MIN		= 0x00CA,
+	TWL4030_USB_TCR_UART_DET_MAX		= 0x00CB,
+	TWL4030_USB_TPH_ID_INT_PW		= 0x00CD,
+	TWL4030_USB_TACC_ID_INT_WAIT		= 0x00CE,
+	TWL4030_USB_TACC_ID_INT_PW		= 0x00CF,
+	TWL4030_USB_TPH_CMD_WAIT		= 0x00D0,
+	TWL4030_USB_TPH_ACK_WAIT		= 0x00D1,
+	TWL4030_USB_TPH_DP_DISC_DET		= 0x00D2,
+	TWL4030_USB_VBAT_TIMER			= 0x00D3,
+	TWL4030_USB_CARKIT_4W_DEBUG		= 0x00E0,
+	TWL4030_USB_CARKIT_5W_DEBUG		= 0x00E1,
+	TWL4030_USB_PHY_PWR_CTRL		= 0x00FD,
+	TWL4030_USB_PHY_CLK_CTRL		= 0x00FE,
+	TWL4030_USB_PHY_CLK_CTRL_STS		= 0x00FF,
+};
+
+struct twl4030 {
+	struct cdev		cdev;
+	struct i2c_client	*client;
+};
+
+extern struct twl4030 *twl4030_get(void);
+
+extern int twl4030_reg_read(struct twl4030 *twl4030, u16 reg, u8 *val);
+extern int twl4030_reg_write(struct twl4030 *twl4030, u16 reg, u8 val);
+extern int twl4030_set_bits(struct twl4030 *twl4030, enum twl4030_reg reg, u32 mask, u32 val);
+
+#endif /* __I2C_TWL4030_H */
-- 
1.7.1




More information about the barebox mailing list