2  * twl4030_core.c - driver for TWL4030/TPS659x0 PM and audio CODEC devices
 
   4  * Copyright (C) 2005-2006 Texas Instruments, Inc.
 
   6  * Modifications to defer interrupt handling to a kernel thread:
 
   7  * Copyright (C) 2006 MontaVista Software, Inc.
 
   9  * Based on tlv320aic23.c:
 
  10  * Copyright (c) by Kai Svahn <kai.svahn@nokia.com>
 
  12  * Code cleanup and modifications to IRQ handler.
 
  13  * by syed khasim <x0khasim@ti.com>
 
  15  * This program is free software; you can redistribute it and/or modify
 
  16  * it under the terms of the GNU General Public License as published by
 
  17  * the Free Software Foundation; either version 2 of the License, or
 
  18  * (at your option) any later version.
 
  20  * This program is distributed in the hope that it will be useful,
 
  21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  23  * GNU General Public License for more details.
 
  25  * You should have received a copy of the GNU General Public License
 
  26  * along with this program; if not, write to the Free Software
 
  27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
  30 #include <linux/init.h>
 
  31 #include <linux/mutex.h>
 
  32 #include <linux/platform_device.h>
 
  33 #include <linux/clk.h>
 
  34 #include <linux/err.h>
 
  36 #include <linux/i2c.h>
 
  37 #include <linux/i2c/twl4030.h>
 
  41  * The TWL4030 "Triton 2" is one of a family of a multi-function "Power
 
  42  * Management and System Companion Device" chips originally designed for
 
  43  * use in OMAP2 and OMAP 3 based systems.  Its control interfaces use I2C,
 
  44  * often at around 3 Mbit/sec, including for interrupt handling.
 
  46  * This driver core provides genirq support for the interrupts emitted,
 
  47  * by the various modules, and exports register access primitives.
 
  49  * FIXME this driver currently requires use of the first interrupt line
 
  50  * (and associated registers).
 
  53 #define DRIVER_NAME                     "twl4030"
 
  55 #if defined(CONFIG_TWL4030_BCI_BATTERY) || \
 
  56         defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
 
  57 #define twl_has_bci()           true
 
  59 #define twl_has_bci()           false
 
  62 #if defined(CONFIG_KEYBOARD_TWL4030) || defined(CONFIG_KEYBOARD_TWL4030_MODULE)
 
  63 #define twl_has_keypad()        true
 
  65 #define twl_has_keypad()        false
 
  68 #if defined(CONFIG_GPIO_TWL4030) || defined(CONFIG_GPIO_TWL4030_MODULE)
 
  69 #define twl_has_gpio()  true
 
  71 #define twl_has_gpio()  false
 
  74 #if defined(CONFIG_TWL4030_MADC) || defined(CONFIG_TWL4030_MADC_MODULE)
 
  75 #define twl_has_madc()  true
 
  77 #define twl_has_madc()  false
 
  80 #if defined(CONFIG_RTC_DRV_TWL4030) || defined(CONFIG_RTC_DRV_TWL4030_MODULE)
 
  81 #define twl_has_rtc()   true
 
  83 #define twl_has_rtc()   false
 
  86 #if defined(CONFIG_TWL4030_USB) || defined(CONFIG_TWL4030_USB_MODULE)
 
  87 #define twl_has_usb()   true
 
  89 #define twl_has_usb()   false
 
  93 /* Triton Core internal information (BEGIN) */
 
  95 /* Last - for index max*/
 
  96 #define TWL4030_MODULE_LAST             TWL4030_MODULE_SECURED_REG
 
  98 #define TWL4030_NUM_SLAVES              4
 
 101 /* Base Address defns for twl4030_map[] */
 
 103 /* subchip/slave 0 - USB ID */
 
 104 #define TWL4030_BASEADD_USB             0x0000
 
 106 /* subchip/slave 1 - AUD ID */
 
 107 #define TWL4030_BASEADD_AUDIO_VOICE     0x0000
 
 108 #define TWL4030_BASEADD_GPIO            0x0098
 
 109 #define TWL4030_BASEADD_INTBR           0x0085
 
 110 #define TWL4030_BASEADD_PIH             0x0080
 
 111 #define TWL4030_BASEADD_TEST            0x004C
 
 113 /* subchip/slave 2 - AUX ID */
 
 114 #define TWL4030_BASEADD_INTERRUPTS      0x00B9
 
 115 #define TWL4030_BASEADD_LED             0x00EE
 
 116 #define TWL4030_BASEADD_MADC            0x0000
 
 117 #define TWL4030_BASEADD_MAIN_CHARGE     0x0074
 
 118 #define TWL4030_BASEADD_PRECHARGE       0x00AA
 
 119 #define TWL4030_BASEADD_PWM0            0x00F8
 
 120 #define TWL4030_BASEADD_PWM1            0x00FB
 
 121 #define TWL4030_BASEADD_PWMA            0x00EF
 
 122 #define TWL4030_BASEADD_PWMB            0x00F1
 
 123 #define TWL4030_BASEADD_KEYPAD          0x00D2
 
 125 /* subchip/slave 3 - POWER ID */
 
 126 #define TWL4030_BASEADD_BACKUP          0x0014
 
 127 #define TWL4030_BASEADD_INT             0x002E
 
 128 #define TWL4030_BASEADD_PM_MASTER       0x0036
 
 129 #define TWL4030_BASEADD_PM_RECEIVER     0x005B
 
 130 #define TWL4030_BASEADD_RTC             0x001C
 
 131 #define TWL4030_BASEADD_SECURED_REG     0x0000
 
 133 /* Triton Core internal information (END) */
 
 136 /* Few power values */
 
 137 #define R_CFG_BOOT                      0x05
 
 138 #define R_PROTECT_KEY                   0x0E
 
 140 /* access control values for R_PROTECT_KEY */
 
 141 #define KEY_UNLOCK1                     0xce
 
 142 #define KEY_UNLOCK2                     0xec
 
 143 #define KEY_LOCK                        0x00
 
 145 /* some fields in R_CFG_BOOT */
 
 146 #define HFCLK_FREQ_19p2_MHZ             (1 << 0)
 
 147 #define HFCLK_FREQ_26_MHZ               (2 << 0)
 
 148 #define HFCLK_FREQ_38p4_MHZ             (3 << 0)
 
 149 #define HIGH_PERF_SQ                    (1 << 3)
 
 152 /*----------------------------------------------------------------------*/
 
 154 /* is driver active, bound to a chip? */
 
 157 /* Structure for each TWL4030 Slave */
 
 158 struct twl4030_client {
 
 159         struct i2c_client *client;
 
 162         /* max numb of i2c_msg required is for read =2 */
 
 163         struct i2c_msg xfer_msg[2];
 
 165         /* To lock access to xfer_msg */
 
 166         struct mutex xfer_lock;
 
 169 static struct twl4030_client twl4030_modules[TWL4030_NUM_SLAVES];
 
 172 /* mapping the module id to slave id and base address */
 
 173 struct twl4030mapping {
 
 174         unsigned char sid;      /* Slave ID */
 
 175         unsigned char base;     /* base address */
 
 178 static struct twl4030mapping twl4030_map[TWL4030_MODULE_LAST + 1] = {
 
 180          * NOTE:  don't change this table without updating the
 
 181          * <linux/i2c/twl4030.h> defines for TWL4030_MODULE_*
 
 182          * so they continue to match the order in this table.
 
 185         { 0, TWL4030_BASEADD_USB },
 
 187         { 1, TWL4030_BASEADD_AUDIO_VOICE },
 
 188         { 1, TWL4030_BASEADD_GPIO },
 
 189         { 1, TWL4030_BASEADD_INTBR },
 
 190         { 1, TWL4030_BASEADD_PIH },
 
 191         { 1, TWL4030_BASEADD_TEST },
 
 193         { 2, TWL4030_BASEADD_KEYPAD },
 
 194         { 2, TWL4030_BASEADD_MADC },
 
 195         { 2, TWL4030_BASEADD_INTERRUPTS },
 
 196         { 2, TWL4030_BASEADD_LED },
 
 197         { 2, TWL4030_BASEADD_MAIN_CHARGE },
 
 198         { 2, TWL4030_BASEADD_PRECHARGE },
 
 199         { 2, TWL4030_BASEADD_PWM0 },
 
 200         { 2, TWL4030_BASEADD_PWM1 },
 
 201         { 2, TWL4030_BASEADD_PWMA },
 
 202         { 2, TWL4030_BASEADD_PWMB },
 
 204         { 3, TWL4030_BASEADD_BACKUP },
 
 205         { 3, TWL4030_BASEADD_INT },
 
 206         { 3, TWL4030_BASEADD_PM_MASTER },
 
 207         { 3, TWL4030_BASEADD_PM_RECEIVER },
 
 208         { 3, TWL4030_BASEADD_RTC },
 
 209         { 3, TWL4030_BASEADD_SECURED_REG },
 
 212 /*----------------------------------------------------------------------*/
 
 214 /* Exported Functions */
 
 217  * twl4030_i2c_write - Writes a n bit register in TWL4030
 
 218  * @mod_no: module number
 
 219  * @value: an array of num_bytes+1 containing data to write
 
 220  * @reg: register address (just offset will do)
 
 221  * @num_bytes: number of bytes to transfer
 
 223  * IMPORTANT: for 'value' parameter: Allocate value num_bytes+1 and
 
 224  * valid data starts at Offset 1.
 
 226  * Returns the result of operation - 0 is success
 
 228 int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, u8 num_bytes)
 
 232         struct twl4030_client *twl;
 
 235         if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
 
 236                 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
 
 239         sid = twl4030_map[mod_no].sid;
 
 240         twl = &twl4030_modules[sid];
 
 242         if (unlikely(!inuse)) {
 
 243                 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
 
 246         mutex_lock(&twl->xfer_lock);
 
 248          * [MSG1]: fill the register address data
 
 249          * fill the data Tx buffer
 
 251         msg = &twl->xfer_msg[0];
 
 252         msg->addr = twl->address;
 
 253         msg->len = num_bytes + 1;
 
 256         /* over write the first byte of buffer with the register address */
 
 257         *value = twl4030_map[mod_no].base + reg;
 
 258         ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 1);
 
 259         mutex_unlock(&twl->xfer_lock);
 
 261         /* i2cTransfer returns num messages.translate it pls.. */
 
 266 EXPORT_SYMBOL(twl4030_i2c_write);
 
 269  * twl4030_i2c_read - Reads a n bit register in TWL4030
 
 270  * @mod_no: module number
 
 271  * @value: an array of num_bytes containing data to be read
 
 272  * @reg: register address (just offset will do)
 
 273  * @num_bytes: number of bytes to transfer
 
 275  * Returns result of operation - num_bytes is success else failure.
 
 277 int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, u8 num_bytes)
 
 282         struct twl4030_client *twl;
 
 285         if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
 
 286                 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
 
 289         sid = twl4030_map[mod_no].sid;
 
 290         twl = &twl4030_modules[sid];
 
 292         if (unlikely(!inuse)) {
 
 293                 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
 
 296         mutex_lock(&twl->xfer_lock);
 
 297         /* [MSG1] fill the register address data */
 
 298         msg = &twl->xfer_msg[0];
 
 299         msg->addr = twl->address;
 
 301         msg->flags = 0; /* Read the register value */
 
 302         val = twl4030_map[mod_no].base + reg;
 
 304         /* [MSG2] fill the data rx buffer */
 
 305         msg = &twl->xfer_msg[1];
 
 306         msg->addr = twl->address;
 
 307         msg->flags = I2C_M_RD;  /* Read the register value */
 
 308         msg->len = num_bytes;   /* only n bytes */
 
 310         ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 2);
 
 311         mutex_unlock(&twl->xfer_lock);
 
 313         /* i2cTransfer returns num messages.translate it pls.. */
 
 318 EXPORT_SYMBOL(twl4030_i2c_read);
 
 321  * twl4030_i2c_write_u8 - Writes a 8 bit register in TWL4030
 
 322  * @mod_no: module number
 
 323  * @value: the value to be written 8 bit
 
 324  * @reg: register address (just offset will do)
 
 326  * Returns result of operation - 0 is success
 
 328 int twl4030_i2c_write_u8(u8 mod_no, u8 value, u8 reg)
 
 331         /* 2 bytes offset 1 contains the data offset 0 is used by i2c_write */
 
 332         u8 temp_buffer[2] = { 0 };
 
 333         /* offset 1 contains the data */
 
 334         temp_buffer[1] = value;
 
 335         return twl4030_i2c_write(mod_no, temp_buffer, reg, 1);
 
 337 EXPORT_SYMBOL(twl4030_i2c_write_u8);
 
 340  * twl4030_i2c_read_u8 - Reads a 8 bit register from TWL4030
 
 341  * @mod_no: module number
 
 342  * @value: the value read 8 bit
 
 343  * @reg: register address (just offset will do)
 
 345  * Returns result of operation - 0 is success
 
 347 int twl4030_i2c_read_u8(u8 mod_no, u8 *value, u8 reg)
 
 349         return twl4030_i2c_read(mod_no, value, reg, 1);
 
 351 EXPORT_SYMBOL(twl4030_i2c_read_u8);
 
 353 /*----------------------------------------------------------------------*/
 
 356  * NOTE:  We know the first 8 IRQs after pdata->base_irq are
 
 357  * for the PIH, and the next are for the PWR_INT SIH, since
 
 358  * that's how twl_init_irq() sets things up.
 
 361 static int add_children(struct twl4030_platform_data *pdata)
 
 363         struct platform_device  *pdev = NULL;
 
 364         struct twl4030_client   *twl = NULL;
 
 367         if (twl_has_bci() && pdata->bci) {
 
 368                 twl = &twl4030_modules[3];
 
 370                 pdev = platform_device_alloc("twl4030_bci", -1);
 
 372                         pr_debug("%s: can't alloc bci dev\n", DRIVER_NAME);
 
 378                         pdev->dev.parent = &twl->client->dev;
 
 379                         status = platform_device_add_data(pdev, pdata->bci,
 
 380                                         sizeof(*pdata->bci));
 
 382                                 dev_dbg(&twl->client->dev,
 
 383                                         "can't add bci data, %d\n",
 
 390                         struct resource r = {
 
 391                                 .start = pdata->irq_base + 8 + 1,
 
 392                                 .flags = IORESOURCE_IRQ,
 
 395                         status = platform_device_add_resources(pdev, &r, 1);
 
 399                         status = platform_device_add(pdev);
 
 402                         platform_device_put(pdev);
 
 403                         dev_dbg(&twl->client->dev,
 
 404                                         "can't create bci dev, %d\n",
 
 410         if (twl_has_gpio() && pdata->gpio) {
 
 411                 twl = &twl4030_modules[1];
 
 413                 pdev = platform_device_alloc("twl4030_gpio", -1);
 
 415                         pr_debug("%s: can't alloc gpio dev\n", DRIVER_NAME);
 
 420                 /* more driver model init */
 
 422                         pdev->dev.parent = &twl->client->dev;
 
 423                         /* device_init_wakeup(&pdev->dev, 1); */
 
 425                         status = platform_device_add_data(pdev, pdata->gpio,
 
 426                                         sizeof(*pdata->gpio));
 
 428                                 dev_dbg(&twl->client->dev,
 
 429                                         "can't add gpio data, %d\n",
 
 435                 /* GPIO module IRQ */
 
 437                         struct resource r = {
 
 438                                 .start = pdata->irq_base + 0,
 
 439                                 .flags = IORESOURCE_IRQ,
 
 442                         status = platform_device_add_resources(pdev, &r, 1);
 
 446                         status = platform_device_add(pdev);
 
 449                         platform_device_put(pdev);
 
 450                         dev_dbg(&twl->client->dev,
 
 451                                         "can't create gpio dev, %d\n",
 
 457         if (twl_has_keypad() && pdata->keypad) {
 
 458                 pdev = platform_device_alloc("twl4030_keypad", -1);
 
 460                         twl = &twl4030_modules[2];
 
 461                         pdev->dev.parent = &twl->client->dev;
 
 462                         device_init_wakeup(&pdev->dev, 1);
 
 463                         status = platform_device_add_data(pdev, pdata->keypad,
 
 464                                         sizeof(*pdata->keypad));
 
 466                                 dev_dbg(&twl->client->dev,
 
 467                                         "can't add keypad data, %d\n",
 
 469                                 platform_device_put(pdev);
 
 472                         status = platform_device_add(pdev);
 
 474                                 platform_device_put(pdev);
 
 475                                 dev_dbg(&twl->client->dev,
 
 476                                                 "can't create keypad dev, %d\n",
 
 481                         pr_debug("%s: can't alloc keypad dev\n", DRIVER_NAME);
 
 487         if (twl_has_madc() && pdata->madc) {
 
 488                 pdev = platform_device_alloc("twl4030_madc", -1);
 
 490                         twl = &twl4030_modules[2];
 
 491                         pdev->dev.parent = &twl->client->dev;
 
 492                         device_init_wakeup(&pdev->dev, 1);
 
 493                         status = platform_device_add_data(pdev, pdata->madc,
 
 494                                         sizeof(*pdata->madc));
 
 496                                 platform_device_put(pdev);
 
 497                                 dev_dbg(&twl->client->dev,
 
 498                                         "can't add madc data, %d\n",
 
 502                         status = platform_device_add(pdev);
 
 504                                 platform_device_put(pdev);
 
 505                                 dev_dbg(&twl->client->dev,
 
 506                                                 "can't create madc dev, %d\n",
 
 511                         pr_debug("%s: can't alloc madc dev\n", DRIVER_NAME);
 
 518                 twl = &twl4030_modules[3];
 
 520                 pdev = platform_device_alloc("twl4030_rtc", -1);
 
 522                         pr_debug("%s: can't alloc rtc dev\n", DRIVER_NAME);
 
 525                         pdev->dev.parent = &twl->client->dev;
 
 526                         device_init_wakeup(&pdev->dev, 1);
 
 530                  * REVISIT platform_data here currently might use of
 
 531                  * "msecure" line ... but for now we just expect board
 
 532                  * setup to tell the chip "we are secure" at all times.
 
 533                  * Eventually, Linux might become more aware of such
 
 534                  * HW security concerns, and "least privilege".
 
 539                         struct resource r = {
 
 540                                 .start = pdata->irq_base + 8 + 3,
 
 541                                 .flags = IORESOURCE_IRQ,
 
 544                         status = platform_device_add_resources(pdev, &r, 1);
 
 548                         status = platform_device_add(pdev);
 
 551                         platform_device_put(pdev);
 
 552                         dev_dbg(&twl->client->dev,
 
 553                                         "can't create rtc dev, %d\n",
 
 559         if (twl_has_usb() && pdata->usb) {
 
 560                 twl = &twl4030_modules[0];
 
 562                 pdev = platform_device_alloc("twl4030_usb", -1);
 
 564                         pr_debug("%s: can't alloc usb dev\n", DRIVER_NAME);
 
 570                         pdev->dev.parent = &twl->client->dev;
 
 571                         device_init_wakeup(&pdev->dev, 1);
 
 572                         status = platform_device_add_data(pdev, pdata->usb,
 
 573                                         sizeof(*pdata->usb));
 
 575                                 platform_device_put(pdev);
 
 576                                 dev_dbg(&twl->client->dev,
 
 577                                         "can't add usb data, %d\n",
 
 584                         struct resource r = {
 
 585                                 .start = pdata->irq_base + 8 + 2,
 
 586                                 .flags = IORESOURCE_IRQ,
 
 589                         status = platform_device_add_resources(pdev, &r, 1);
 
 593                         status = platform_device_add(pdev);
 
 596                         platform_device_put(pdev);
 
 597                         dev_dbg(&twl->client->dev,
 
 598                                         "can't create usb dev, %d\n",
 
 605                 pr_err("failed to add twl4030's children (status %d)\n", status);
 
 609 /*----------------------------------------------------------------------*/
 
 612  * These three functions initialize the on-chip clock framework,
 
 613  * letting it generate the right frequencies for USB, MADC, and
 
 616 static inline int __init protect_pm_master(void)
 
 620         e = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_LOCK,
 
 625 static inline int __init unprotect_pm_master(void)
 
 629         e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK1,
 
 631         e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK2,
 
 636 static void __init clocks_init(void)
 
 641         u8 ctrl = HFCLK_FREQ_26_MHZ;
 
 643 #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
 
 644         if (cpu_is_omap2430())
 
 645                 osc = clk_get(NULL, "osc_ck");
 
 647                 osc = clk_get(NULL, "osc_sys_ck");
 
 649         /* REVISIT for non-OMAP systems, pass the clock rate from
 
 650          * board init code, using platform_data.
 
 655                 printk(KERN_WARNING "Skipping twl4030 internal clock init and "
 
 656                                 "using bootloader value (unknown osc rate)\n");
 
 660         rate = clk_get_rate(osc);
 
 665                 ctrl = HFCLK_FREQ_19p2_MHZ;
 
 668                 ctrl = HFCLK_FREQ_26_MHZ;
 
 671                 ctrl = HFCLK_FREQ_38p4_MHZ;
 
 675         ctrl |= HIGH_PERF_SQ;
 
 676         e |= unprotect_pm_master();
 
 677         /* effect->MADC+USB ck en */
 
 678         e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, ctrl, R_CFG_BOOT);
 
 679         e |= protect_pm_master();
 
 682                 pr_err("%s: clock init err [%d]\n", DRIVER_NAME, e);
 
 685 /*----------------------------------------------------------------------*/
 
 687 int twl_init_irq(int irq_num, unsigned irq_base, unsigned irq_end);
 
 688 int twl_exit_irq(void);
 
 690 static int twl4030_remove(struct i2c_client *client)
 
 695         status = twl_exit_irq();
 
 699         for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
 
 700                 struct twl4030_client   *twl = &twl4030_modules[i];
 
 702                 if (twl->client && twl->client != client)
 
 703                         i2c_unregister_device(twl->client);
 
 704                 twl4030_modules[i].client = NULL;
 
 710 /* NOTE:  this driver only handles a single twl4030/tps659x0 chip */
 
 712 twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id)
 
 716         struct twl4030_platform_data    *pdata = client->dev.platform_data;
 
 719                 dev_dbg(&client->dev, "no platform data?\n");
 
 723         if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
 
 724                 dev_dbg(&client->dev, "can't talk I2C?\n");
 
 729                 dev_dbg(&client->dev, "driver is already in use\n");
 
 733         for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
 
 734                 struct twl4030_client   *twl = &twl4030_modules[i];
 
 736                 twl->address = client->addr + i;
 
 738                         twl->client = client;
 
 740                         twl->client = i2c_new_dummy(client->adapter,
 
 743                                 dev_err(&twl->client->dev,
 
 744                                         "can't attach client %d\n", i);
 
 748                         strlcpy(twl->client->name, id->name,
 
 749                                         sizeof(twl->client->name));
 
 751                 mutex_init(&twl->xfer_lock);
 
 755         /* setup clock framework */
 
 758         /* Maybe init the T2 Interrupt subsystem */
 
 761                         && pdata->irq_end > pdata->irq_base) {
 
 762                 status = twl_init_irq(client->irq, pdata->irq_base, pdata->irq_end);
 
 767         status = add_children(pdata);
 
 770                 twl4030_remove(client);
 
 774 static const struct i2c_device_id twl4030_ids[] = {
 
 775         { "twl4030", 0 },       /* "Triton 2" */
 
 776         { "tps65950", 0 },      /* catalog version of twl4030 */
 
 777         { "tps65930", 0 },      /* fewer LDOs and DACs; no charger */
 
 778         { "tps65920", 0 },      /* fewer LDOs; no codec or charger */
 
 779         { "twl5030", 0 },       /* T2 updated */
 
 780         { /* end of list */ },
 
 782 MODULE_DEVICE_TABLE(i2c, twl4030_ids);
 
 784 /* One Client Driver , 4 Clients */
 
 785 static struct i2c_driver twl4030_driver = {
 
 786         .driver.name    = DRIVER_NAME,
 
 787         .id_table       = twl4030_ids,
 
 788         .probe          = twl4030_probe,
 
 789         .remove         = twl4030_remove,
 
 792 static int __init twl4030_init(void)
 
 794         return i2c_add_driver(&twl4030_driver);
 
 796 subsys_initcall(twl4030_init);
 
 798 static void __exit twl4030_exit(void)
 
 800         i2c_del_driver(&twl4030_driver);
 
 802 module_exit(twl4030_exit);
 
 804 MODULE_AUTHOR("Texas Instruments, Inc.");
 
 805 MODULE_DESCRIPTION("I2C Core interface for TWL4030");
 
 806 MODULE_LICENSE("GPL");