diff options
| author | Balaji T K <balajitk@ti.com> | 2009-12-13 18:25:31 -0500 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2009-12-13 18:25:31 -0500 |
| commit | e8deb28ca8e221de0239eafb3c3d431d8854278e (patch) | |
| tree | 2dffdb207366aa0a8f229775515fc207c16f8574 | |
| parent | c4aa6f314328142974c78377cd9476f8ec6f0eba (diff) | |
mfd: Add support for twl6030 irq framework
This patch adds support for phoenix interrupt framework. New iInterrupt
status register A, B, C are introduced in Phoenix and are cleared on write.
Due to the differences in interrupt handling with respect to TWL4030,
twl6030-irq.c is created for TWL6030 PMIC
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
| -rw-r--r-- | arch/arm/plat-omap/include/plat/irqs.h | 16 | ||||
| -rw-r--r-- | drivers/mfd/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/mfd/Makefile | 2 | ||||
| -rw-r--r-- | drivers/mfd/twl-core.c | 120 | ||||
| -rw-r--r-- | drivers/mfd/twl4030-irq.c | 6 | ||||
| -rw-r--r-- | drivers/mfd/twl6030-irq.c | 299 | ||||
| -rw-r--r-- | include/linux/i2c/twl.h | 64 |
7 files changed, 490 insertions, 21 deletions
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index ce5dd2d1dc21..97d6c50c3dcb 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h | |||
| @@ -472,8 +472,22 @@ | |||
| 472 | #endif | 472 | #endif |
| 473 | #define TWL4030_GPIO_IRQ_END (TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS) | 473 | #define TWL4030_GPIO_IRQ_END (TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS) |
| 474 | 474 | ||
| 475 | #define TWL6030_IRQ_BASE (OMAP_FPGA_IRQ_END) | ||
| 476 | #ifdef CONFIG_TWL4030_CORE | ||
| 477 | #define TWL6030_BASE_NR_IRQS 20 | ||
| 478 | #else | ||
| 479 | #define TWL6030_BASE_NR_IRQS 0 | ||
| 480 | #endif | ||
| 481 | #define TWL6030_IRQ_END (TWL6030_IRQ_BASE + TWL6030_BASE_NR_IRQS) | ||
| 482 | |||
| 475 | /* Total number of interrupts depends on the enabled blocks above */ | 483 | /* Total number of interrupts depends on the enabled blocks above */ |
| 476 | #define NR_IRQS TWL4030_GPIO_IRQ_END | 484 | #if (TWL4030_GPIO_IRQ_END > TWL6030_IRQ_END) |
| 485 | #define TWL_IRQ_END TWL4030_GPIO_IRQ_END | ||
| 486 | #else | ||
| 487 | #define TWL_IRQ_END TWL6030_IRQ_END | ||
| 488 | #endif | ||
| 489 | |||
| 490 | #define NR_IRQS TWL_IRQ_END | ||
| 477 | 491 | ||
| 478 | #define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32)) | 492 | #define OMAP_IRQ_BIT(irq) (1 << ((irq) % 32)) |
| 479 | 493 | ||
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index b23343cdc196..87829789243e 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -103,10 +103,10 @@ config MENELAUS | |||
| 103 | cell phones and PDAs. | 103 | cell phones and PDAs. |
| 104 | 104 | ||
| 105 | config TWL4030_CORE | 105 | config TWL4030_CORE |
| 106 | bool "Texas Instruments TWL4030/TPS659x0 Support" | 106 | bool "Texas Instruments TWL4030/TWL5030/TWL6030/TPS659x0 Support" |
| 107 | depends on I2C=y && GENERIC_HARDIRQS | 107 | depends on I2C=y && GENERIC_HARDIRQS |
| 108 | help | 108 | help |
| 109 | Say yes here if you have TWL4030 family chip on your board. | 109 | Say yes here if you have TWL4030 / TWL6030 family chip on your board. |
| 110 | This core driver provides register access and IRQ handling | 110 | This core driver provides register access and IRQ handling |
| 111 | facilities, and registers devices for the various functions | 111 | facilities, and registers devices for the various functions |
| 112 | so that function-specific drivers can bind to them. | 112 | so that function-specific drivers can bind to them. |
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index f4d14b7589bf..ca2f2c4ff05e 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile | |||
| @@ -26,7 +26,7 @@ obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o | |||
| 26 | obj-$(CONFIG_TPS65010) += tps65010.o | 26 | obj-$(CONFIG_TPS65010) += tps65010.o |
| 27 | obj-$(CONFIG_MENELAUS) += menelaus.o | 27 | obj-$(CONFIG_MENELAUS) += menelaus.o |
| 28 | 28 | ||
| 29 | obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o | 29 | obj-$(CONFIG_TWL4030_CORE) += twl-core.o twl4030-irq.o twl6030-irq.o |
| 30 | obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o | 30 | obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o |
| 31 | obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o | 31 | obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o |
| 32 | 32 | ||
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 79946fe800af..c48a6138c575 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -181,6 +181,30 @@ | |||
| 181 | /* Triton Core internal information (END) */ | 181 | /* Triton Core internal information (END) */ |
| 182 | 182 | ||
| 183 | 183 | ||
| 184 | /* subchip/slave 0 0x48 - POWER */ | ||
| 185 | #define TWL6030_BASEADD_RTC 0x0000 | ||
| 186 | #define TWL6030_BASEADD_MEM 0x0017 | ||
| 187 | #define TWL6030_BASEADD_PM_MASTER 0x001F | ||
| 188 | #define TWL6030_BASEADD_PM_SLAVE_MISC 0x0030 /* PM_RECEIVER */ | ||
| 189 | #define TWL6030_BASEADD_PM_MISC 0x00E2 | ||
| 190 | #define TWL6030_BASEADD_PM_PUPD 0x00F0 | ||
| 191 | |||
| 192 | /* subchip/slave 1 0x49 - FEATURE */ | ||
| 193 | #define TWL6030_BASEADD_USB 0x0000 | ||
| 194 | #define TWL6030_BASEADD_GPADC_CTRL 0x002E | ||
| 195 | #define TWL6030_BASEADD_AUX 0x0090 | ||
| 196 | #define TWL6030_BASEADD_PWM 0x00BA | ||
| 197 | #define TWL6030_BASEADD_GASGAUGE 0x00C0 | ||
| 198 | #define TWL6030_BASEADD_PIH 0x00D0 | ||
| 199 | #define TWL6030_BASEADD_CHARGER 0x00E0 | ||
| 200 | |||
| 201 | /* subchip/slave 2 0x4A - DFT */ | ||
| 202 | #define TWL6030_BASEADD_DIEID 0x00C0 | ||
| 203 | |||
| 204 | /* subchip/slave 3 0x4B - AUDIO */ | ||
| 205 | #define TWL6030_BASEADD_AUDIO 0x0000 | ||
| 206 | #define TWL6030_BASEADD_RSV 0x0000 | ||
| 207 | |||
| 184 | /* Few power values */ | 208 | /* Few power values */ |
| 185 | #define R_CFG_BOOT 0x05 | 209 | #define R_CFG_BOOT 0x05 |
| 186 | #define R_PROTECT_KEY 0x0E | 210 | #define R_PROTECT_KEY 0x0E |
| @@ -202,13 +226,21 @@ | |||
| 202 | #define TWL4030_VAUX2 BIT(0) /* pre-5030 voltage ranges */ | 226 | #define TWL4030_VAUX2 BIT(0) /* pre-5030 voltage ranges */ |
| 203 | #define TPS_SUBSET BIT(1) /* tps659[23]0 have fewer LDOs */ | 227 | #define TPS_SUBSET BIT(1) /* tps659[23]0 have fewer LDOs */ |
| 204 | #define TWL5031 BIT(2) /* twl5031 has different registers */ | 228 | #define TWL5031 BIT(2) /* twl5031 has different registers */ |
| 229 | #define TWL6030_CLASS BIT(3) /* TWL6030 class */ | ||
| 205 | 230 | ||
| 206 | /*----------------------------------------------------------------------*/ | 231 | /*----------------------------------------------------------------------*/ |
| 207 | 232 | ||
| 208 | /* is driver active, bound to a chip? */ | 233 | /* is driver active, bound to a chip? */ |
| 209 | static bool inuse; | 234 | static bool inuse; |
| 210 | 235 | ||
| 211 | /* Structure for each TWL4030 Slave */ | 236 | static unsigned int twl_id; |
| 237 | unsigned int twl_rev(void) | ||
| 238 | { | ||
| 239 | return twl_id; | ||
| 240 | } | ||
| 241 | EXPORT_SYMBOL(twl_rev); | ||
| 242 | |||
| 243 | /* Structure for each TWL4030/TWL6030 Slave */ | ||
| 212 | struct twl_client { | 244 | struct twl_client { |
| 213 | struct i2c_client *client; | 245 | struct i2c_client *client; |
| 214 | u8 address; | 246 | u8 address; |
| @@ -228,11 +260,12 @@ struct twl_mapping { | |||
| 228 | unsigned char sid; /* Slave ID */ | 260 | unsigned char sid; /* Slave ID */ |
| 229 | unsigned char base; /* base address */ | 261 | unsigned char base; /* base address */ |
| 230 | }; | 262 | }; |
| 263 | struct twl_mapping *twl_map; | ||
| 231 | 264 | ||
| 232 | static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = { | 265 | static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = { |
| 233 | /* | 266 | /* |
| 234 | * NOTE: don't change this table without updating the | 267 | * NOTE: don't change this table without updating the |
| 235 | * <linux/i2c/twl4030.h> defines for TWL4030_MODULE_* | 268 | * <linux/i2c/twl.h> defines for TWL4030_MODULE_* |
| 236 | * so they continue to match the order in this table. | 269 | * so they continue to match the order in this table. |
| 237 | */ | 270 | */ |
| 238 | 271 | ||
| @@ -265,6 +298,40 @@ static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = { | |||
| 265 | { 3, TWL4030_BASEADD_SECURED_REG }, | 298 | { 3, TWL4030_BASEADD_SECURED_REG }, |
| 266 | }; | 299 | }; |
| 267 | 300 | ||
| 301 | static struct twl_mapping twl6030_map[] = { | ||
| 302 | /* | ||
| 303 | * NOTE: don't change this table without updating the | ||
| 304 | * <linux/i2c/twl.h> defines for TWL4030_MODULE_* | ||
| 305 | * so they continue to match the order in this table. | ||
| 306 | */ | ||
| 307 | { SUB_CHIP_ID1, TWL6030_BASEADD_USB }, | ||
| 308 | { SUB_CHIP_ID3, TWL6030_BASEADD_AUDIO }, | ||
| 309 | { SUB_CHIP_ID2, TWL6030_BASEADD_DIEID }, | ||
| 310 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 311 | { SUB_CHIP_ID1, TWL6030_BASEADD_PIH }, | ||
| 312 | |||
| 313 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 314 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 315 | { SUB_CHIP_ID1, TWL6030_BASEADD_GPADC_CTRL }, | ||
| 316 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 317 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 318 | |||
| 319 | { SUB_CHIP_ID1, TWL6030_BASEADD_CHARGER }, | ||
| 320 | { SUB_CHIP_ID1, TWL6030_BASEADD_GASGAUGE }, | ||
| 321 | { SUB_CHIP_ID1, TWL6030_BASEADD_PWM }, | ||
| 322 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 323 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 324 | |||
| 325 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 326 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 327 | { SUB_CHIP_ID2, TWL6030_BASEADD_RSV }, | ||
| 328 | { SUB_CHIP_ID0, TWL6030_BASEADD_PM_MASTER }, | ||
| 329 | { SUB_CHIP_ID0, TWL6030_BASEADD_PM_SLAVE_MISC }, | ||
| 330 | |||
| 331 | { SUB_CHIP_ID0, TWL6030_BASEADD_RTC }, | ||
| 332 | { SUB_CHIP_ID0, TWL6030_BASEADD_MEM }, | ||
| 333 | }; | ||
| 334 | |||
| 268 | /*----------------------------------------------------------------------*/ | 335 | /*----------------------------------------------------------------------*/ |
| 269 | |||
