blob: f5486cce86f4a8ff1bf04473b12e818e0759f9b2 [file] [log] [blame]
David Brownella603a7f2008-10-15 12:15:39 +02001/*
2 * twl4030_core.c - driver for TWL4030/TPS659x0 PM and audio CODEC devices
3 *
4 * Copyright (C) 2005-2006 Texas Instruments, Inc.
5 *
6 * Modifications to defer interrupt handling to a kernel thread:
7 * Copyright (C) 2006 MontaVista Software, Inc.
8 *
9 * Based on tlv320aic23.c:
10 * Copyright (c) by Kai Svahn <kai.svahn@nokia.com>
11 *
12 * Code cleanup and modifications to IRQ handler.
13 * by syed khasim <x0khasim@ti.com>
14 *
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.
19 *
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.
24 *
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
28 */
29
David Brownella603a7f2008-10-15 12:15:39 +020030#include <linux/init.h>
31#include <linux/mutex.h>
David Brownella603a7f2008-10-15 12:15:39 +020032#include <linux/platform_device.h>
33#include <linux/clk.h>
David Brownella30d46c2008-10-20 23:46:28 +020034#include <linux/err.h>
David Brownella603a7f2008-10-15 12:15:39 +020035
36#include <linux/i2c.h>
37#include <linux/i2c/twl4030.h>
38
39
40/*
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.
45 *
46 * This driver core provides genirq support for the interrupts emitted,
47 * by the various modules, and exports register access primitives.
48 *
49 * FIXME this driver currently requires use of the first interrupt line
50 * (and associated registers).
51 */
52
53#define DRIVER_NAME "twl4030"
54
55#if defined(CONFIG_TWL4030_BCI_BATTERY) || \
56 defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
57#define twl_has_bci() true
58#else
59#define twl_has_bci() false
60#endif
61
62#if defined(CONFIG_KEYBOARD_TWL4030) || defined(CONFIG_KEYBOARD_TWL4030_MODULE)
63#define twl_has_keypad() true
64#else
65#define twl_has_keypad() false
66#endif
67
68#if defined(CONFIG_GPIO_TWL4030) || defined(CONFIG_GPIO_TWL4030_MODULE)
69#define twl_has_gpio() true
70#else
71#define twl_has_gpio() false
72#endif
73
74#if defined(CONFIG_TWL4030_MADC) || defined(CONFIG_TWL4030_MADC_MODULE)
75#define twl_has_madc() true
76#else
77#define twl_has_madc() false
78#endif
79
80#if defined(CONFIG_RTC_DRV_TWL4030) || defined(CONFIG_RTC_DRV_TWL4030_MODULE)
81#define twl_has_rtc() true
82#else
83#define twl_has_rtc() false
84#endif
85
86#if defined(CONFIG_TWL4030_USB) || defined(CONFIG_TWL4030_USB_MODULE)
87#define twl_has_usb() true
88#else
89#define twl_has_usb() false
90#endif
91
David Brownella603a7f2008-10-15 12:15:39 +020092
93/* Triton Core internal information (BEGIN) */
94
95/* Last - for index max*/
96#define TWL4030_MODULE_LAST TWL4030_MODULE_SECURED_REG
97
98#define TWL4030_NUM_SLAVES 4
99
100
101/* Base Address defns for twl4030_map[] */
102
103/* subchip/slave 0 - USB ID */
104#define TWL4030_BASEADD_USB 0x0000
105
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
112
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
124
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
132
133/* Triton Core internal information (END) */
134
135
136/* Few power values */
137#define R_CFG_BOOT 0x05
138#define R_PROTECT_KEY 0x0E
139
140/* access control values for R_PROTECT_KEY */
141#define KEY_UNLOCK1 0xce
142#define KEY_UNLOCK2 0xec
143#define KEY_LOCK 0x00
144
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)
150
151
152/*----------------------------------------------------------------------*/
153
David Brownella603a7f2008-10-15 12:15:39 +0200154/* is driver active, bound to a chip? */
155static bool inuse;
156
157/* Structure for each TWL4030 Slave */
158struct twl4030_client {
159 struct i2c_client *client;
160 u8 address;
161
162 /* max numb of i2c_msg required is for read =2 */
163 struct i2c_msg xfer_msg[2];
164
165 /* To lock access to xfer_msg */
166 struct mutex xfer_lock;
167};
168
169static struct twl4030_client twl4030_modules[TWL4030_NUM_SLAVES];
170
171
172/* mapping the module id to slave id and base address */
173struct twl4030mapping {
174 unsigned char sid; /* Slave ID */
175 unsigned char base; /* base address */
176};
177
178static struct twl4030mapping twl4030_map[TWL4030_MODULE_LAST + 1] = {
179 /*
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.
183 */
184
185 { 0, TWL4030_BASEADD_USB },
186
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 },
192
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 },
203
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 },
210};
211
212/*----------------------------------------------------------------------*/
213
David Brownella603a7f2008-10-15 12:15:39 +0200214/* Exported Functions */
215
216/**
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
222 *
223 * IMPORTANT: for 'value' parameter: Allocate value num_bytes+1 and
224 * valid data starts at Offset 1.
225 *
226 * Returns the result of operation - 0 is success
227 */
David Brownell3fba19e2008-11-08 01:13:16 +0100228int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
David Brownella603a7f2008-10-15 12:15:39 +0200229{
230 int ret;
231 int sid;
232 struct twl4030_client *twl;
233 struct i2c_msg *msg;
234
235 if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
236 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
237 return -EPERM;
238 }
239 sid = twl4030_map[mod_no].sid;
240 twl = &twl4030_modules[sid];
241
242 if (unlikely(!inuse)) {
243 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
244 return -EPERM;
245 }
246 mutex_lock(&twl->xfer_lock);
247 /*
248 * [MSG1]: fill the register address data
249 * fill the data Tx buffer
250 */
251 msg = &twl->xfer_msg[0];
252 msg->addr = twl->address;
253 msg->len = num_bytes + 1;
254 msg->flags = 0;
255 msg->buf = value;
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);
260
261 /* i2cTransfer returns num messages.translate it pls.. */
262 if (ret >= 0)
263 ret = 0;
264 return ret;
265}
266EXPORT_SYMBOL(twl4030_i2c_write);
267
268/**
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
274 *
275 * Returns result of operation - num_bytes is success else failure.
276 */
David Brownell3fba19e2008-11-08 01:13:16 +0100277int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
David Brownella603a7f2008-10-15 12:15:39 +0200278{
279 int ret;
280 u8 val;
281 int sid;
282 struct twl4030_client *twl;
283 struct i2c_msg *msg;
284
285 if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
286 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
287 return -EPERM;
288 }
289 sid = twl4030_map[mod_no].sid;
290 twl = &twl4030_modules[sid];
291
292 if (unlikely(!inuse)) {
293 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
294 return -EPERM;
295 }
296 mutex_lock(&twl->xfer_lock);
297 /* [MSG1] fill the register address data */
298 msg = &twl->xfer_msg[0];
299 msg->addr = twl->address;
300 msg->len = 1;
301 msg->flags = 0; /* Read the register value */
302 val = twl4030_map[mod_no].base + reg;
303 msg->buf = &val;
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 */
309 msg->buf = value;
310 ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 2);
311 mutex_unlock(&twl->xfer_lock);
312
313 /* i2cTransfer returns num messages.translate it pls.. */
314 if (ret >= 0)
315 ret = 0;
316 return ret;
317}
318EXPORT_SYMBOL(twl4030_i2c_read);
319
320/**
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)
325 *
326 * Returns result of operation - 0 is success
327 */
328int twl4030_i2c_write_u8(u8 mod_no, u8 value, u8 reg)
329{
330
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);
336}
337EXPORT_SYMBOL(twl4030_i2c_write_u8);
338
339/**
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)
344 *
345 * Returns result of operation - 0 is success
346 */
347int twl4030_i2c_read_u8(u8 mod_no, u8 *value, u8 reg)
348{
349 return twl4030_i2c_read(mod_no, value, reg, 1);
350}
351EXPORT_SYMBOL(twl4030_i2c_read_u8);
352
353/*----------------------------------------------------------------------*/
354
David Brownell5725d662008-12-01 00:31:04 +0100355static struct device *add_child(unsigned chip, const char *name,
356 void *pdata, unsigned pdata_len,
357 bool can_wakeup, int irq0, int irq1)
358{
359 struct platform_device *pdev;
360 struct twl4030_client *twl = &twl4030_modules[chip];
361 int status;
362
363 pdev = platform_device_alloc(name, -1);
364 if (!pdev) {
365 dev_dbg(&twl->client->dev, "can't alloc dev\n");
366 status = -ENOMEM;
367 goto err;
368 }
369
370 device_init_wakeup(&pdev->dev, can_wakeup);
371 pdev->dev.parent = &twl->client->dev;
372
373 if (pdata) {
374 status = platform_device_add_data(pdev, pdata, pdata_len);
375 if (status < 0) {
376 dev_dbg(&pdev->dev, "can't add platform_data\n");
377 goto err;
378 }
379 }
380
381 if (irq0) {
382 struct resource r[2] = {
383 { .start = irq0, .flags = IORESOURCE_IRQ, },
384 { .start = irq1, .flags = IORESOURCE_IRQ, },
385 };
386
387 status = platform_device_add_resources(pdev, r, irq1 ? 2 : 1);
388 if (status < 0) {
389 dev_dbg(&pdev->dev, "can't add irqs\n");
390 goto err;
391 }
392 }
393
394 status = platform_device_add(pdev);
395
396err:
397 if (status < 0) {
398 platform_device_put(pdev);
399 dev_err(&twl->client->dev, "can't add %s dev\n", name);
400 return ERR_PTR(status);
401 }
402 return &pdev->dev;
403}
404
David Brownella603a7f2008-10-15 12:15:39 +0200405/*
David Brownella30d46c2008-10-20 23:46:28 +0200406 * NOTE: We know the first 8 IRQs after pdata->base_irq are
407 * for the PIH, and the next are for the PWR_INT SIH, since
408 * that's how twl_init_irq() sets things up.
David Brownella603a7f2008-10-15 12:15:39 +0200409 */
David Brownella603a7f2008-10-15 12:15:39 +0200410
411static int add_children(struct twl4030_platform_data *pdata)
412{
David Brownell5725d662008-12-01 00:31:04 +0100413 struct device *child;
David Brownella603a7f2008-10-15 12:15:39 +0200414
415 if (twl_has_bci() && pdata->bci) {
David Brownell5725d662008-12-01 00:31:04 +0100416 child = add_child(3, "twl4030_bci",
417 pdata->bci, sizeof(*pdata->bci),
418 false,
419 /* irq0 = CHG_PRES, irq1 = BCI */
420 pdata->irq_base + 8 + 1, pdata->irq_base + 2);
421 if (IS_ERR(child))
422 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200423 }
424
425 if (twl_has_gpio() && pdata->gpio) {
David Brownell5725d662008-12-01 00:31:04 +0100426 child = add_child(1, "twl4030_gpio",
427 pdata->gpio, sizeof(*pdata->gpio),
428 false, pdata->irq_base + 0, 0);
429 if (IS_ERR(child))
430 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200431 }
432
433 if (twl_has_keypad() && pdata->keypad) {
David Brownell5725d662008-12-01 00:31:04 +0100434 child = add_child(2, "twl4030_keypad",
435 pdata->keypad, sizeof(*pdata->keypad),
436 true, pdata->irq_base + 1, 0);
437 if (IS_ERR(child))
438 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200439 }
440
441 if (twl_has_madc() && pdata->madc) {
David Brownell5725d662008-12-01 00:31:04 +0100442 child = add_child(2, "twl4030_madc",
443 pdata->madc, sizeof(*pdata->madc),
444 true, pdata->irq_base + 3, 0);
445 if (IS_ERR(child))
446 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200447 }
448
449 if (twl_has_rtc()) {
David Brownella603a7f2008-10-15 12:15:39 +0200450 /*
David Brownell5725d662008-12-01 00:31:04 +0100451 * REVISIT platform_data here currently might expose the
David Brownella603a7f2008-10-15 12:15:39 +0200452 * "msecure" line ... but for now we just expect board
David Brownell5725d662008-12-01 00:31:04 +0100453 * setup to tell the chip "it's always ok to SET_TIME".
David Brownella603a7f2008-10-15 12:15:39 +0200454 * Eventually, Linux might become more aware of such
455 * HW security concerns, and "least privilege".
456 */
David Brownell5725d662008-12-01 00:31:04 +0100457 child = add_child(3, "twl4030_rtc",
458 NULL, 0,
459 true, pdata->irq_base + 8 + 3, 0);
460 if (IS_ERR(child))
461 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200462 }
463
464 if (twl_has_usb() && pdata->usb) {
David Brownell5725d662008-12-01 00:31:04 +0100465 child = add_child(0, "twl4030_usb",
466 pdata->usb, sizeof(*pdata->usb),
467 true,
468 /* irq0 = USB_PRES, irq1 = USB */
469 pdata->irq_base + 8 + 2, pdata->irq_base + 4);
470 if (IS_ERR(child))
471 return PTR_ERR(child);
David Brownella603a7f2008-10-15 12:15:39 +0200472 }
473
David Brownell5725d662008-12-01 00:31:04 +0100474 return 0;
David Brownella603a7f2008-10-15 12:15:39 +0200475}
476
477/*----------------------------------------------------------------------*/
478
479/*
480 * These three functions initialize the on-chip clock framework,
481 * letting it generate the right frequencies for USB, MADC, and
482 * other purposes.
483 */
484static inline int __init protect_pm_master(void)
485{
486 int e = 0;
487
488 e = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_LOCK,
489 R_PROTECT_KEY);
490 return e;
491}
492
493static inline int __init unprotect_pm_master(void)
494{
495 int e = 0;
496
497 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK1,
498 R_PROTECT_KEY);
499 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK2,
500 R_PROTECT_KEY);
501 return e;
502}
503
504static void __init clocks_init(void)
505{
506 int e = 0;
507 struct clk *osc;
508 u32 rate;
509 u8 ctrl = HFCLK_FREQ_26_MHZ;
510
511#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
512 if (cpu_is_omap2430())
513 osc = clk_get(NULL, "osc_ck");
514 else
515 osc = clk_get(NULL, "osc_sys_ck");
516#else
517 /* REVISIT for non-OMAP systems, pass the clock rate from
518 * board init code, using platform_data.
519 */
520 osc = ERR_PTR(-EIO);
521#endif
522 if (IS_ERR(osc)) {
523 printk(KERN_WARNING "Skipping twl4030 internal clock init and "
524 "using bootloader value (unknown osc rate)\n");
525 return;
526 }
527
528 rate = clk_get_rate(osc);
529 clk_put(osc);
530
531 switch (rate) {
532 case 19200000:
533 ctrl = HFCLK_FREQ_19p2_MHZ;
534 break;
535 case 26000000:
536 ctrl = HFCLK_FREQ_26_MHZ;
537 break;
538 case 38400000:
539 ctrl = HFCLK_FREQ_38p4_MHZ;
540 break;
541 }
542
543 ctrl |= HIGH_PERF_SQ;
544 e |= unprotect_pm_master();
545 /* effect->MADC+USB ck en */
546 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, ctrl, R_CFG_BOOT);
547 e |= protect_pm_master();
548
549 if (e < 0)
550 pr_err("%s: clock init err [%d]\n", DRIVER_NAME, e);
551}
552
553/*----------------------------------------------------------------------*/
554
David Brownella30d46c2008-10-20 23:46:28 +0200555int twl_init_irq(int irq_num, unsigned irq_base, unsigned irq_end);
556int twl_exit_irq(void);
David Brownella603a7f2008-10-15 12:15:39 +0200557
558static int twl4030_remove(struct i2c_client *client)
559{
560 unsigned i;
David Brownella30d46c2008-10-20 23:46:28 +0200561 int status;
David Brownella603a7f2008-10-15 12:15:39 +0200562
David Brownella30d46c2008-10-20 23:46:28 +0200563 status = twl_exit_irq();
564 if (status < 0)
565 return status;
David Brownella603a7f2008-10-15 12:15:39 +0200566
567 for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
568 struct twl4030_client *twl = &twl4030_modules[i];
569
570 if (twl->client && twl->client != client)
571 i2c_unregister_device(twl->client);
572 twl4030_modules[i].client = NULL;
573 }
574 inuse = false;
575 return 0;
576}
577
578/* NOTE: this driver only handles a single twl4030/tps659x0 chip */
579static int
580twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id)
581{
582 int status;
583 unsigned i;
584 struct twl4030_platform_data *pdata = client->dev.platform_data;
585
586 if (!pdata) {
587 dev_dbg(&client->dev, "no platform data?\n");
588 return -EINVAL;
589 }
590
591 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
592 dev_dbg(&client->dev, "can't talk I2C?\n");
593 return -EIO;
594 }
595
David Brownella30d46c2008-10-20 23:46:28 +0200596 if (inuse) {
David Brownella603a7f2008-10-15 12:15:39 +0200597 dev_dbg(&client->dev, "driver is already in use\n");
598 return -EBUSY;
599 }
600
601 for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
602 struct twl4030_client *twl = &twl4030_modules[i];
603
604 twl->address = client->addr + i;
605 if (i == 0)
606 twl->client = client;
607 else {
608 twl->client = i2c_new_dummy(client->adapter,
609 twl->address);
610 if (!twl->client) {
611 dev_err(&twl->client->dev,
612 "can't attach client %d\n", i);
613 status = -ENOMEM;
614 goto fail;
615 }
616 strlcpy(twl->client->name, id->name,
617 sizeof(twl->client->name));
618 }
619 mutex_init(&twl->xfer_lock);
620 }
621 inuse = true;
622
623 /* setup clock framework */
624 clocks_init();
625
626 /* Maybe init the T2 Interrupt subsystem */
627 if (client->irq
628 && pdata->irq_base
629 && pdata->irq_end > pdata->irq_base) {
David Brownella30d46c2008-10-20 23:46:28 +0200630 status = twl_init_irq(client->irq, pdata->irq_base, pdata->irq_end);
631 if (status < 0)
632 goto fail;
David Brownella603a7f2008-10-15 12:15:39 +0200633 }
634
635 status = add_children(pdata);
636fail:
637 if (status < 0)
638 twl4030_remove(client);
639 return status;
640}
641
642static const struct i2c_device_id twl4030_ids[] = {
643 { "twl4030", 0 }, /* "Triton 2" */
644 { "tps65950", 0 }, /* catalog version of twl4030 */
645 { "tps65930", 0 }, /* fewer LDOs and DACs; no charger */
646 { "tps65920", 0 }, /* fewer LDOs; no codec or charger */
647 { "twl5030", 0 }, /* T2 updated */
648 { /* end of list */ },
649};
650MODULE_DEVICE_TABLE(i2c, twl4030_ids);
651
652/* One Client Driver , 4 Clients */
653static struct i2c_driver twl4030_driver = {
654 .driver.name = DRIVER_NAME,
655 .id_table = twl4030_ids,
656 .probe = twl4030_probe,
657 .remove = twl4030_remove,
658};
659
660static int __init twl4030_init(void)
661{
662 return i2c_add_driver(&twl4030_driver);
663}
664subsys_initcall(twl4030_init);
665
666static void __exit twl4030_exit(void)
667{
668 i2c_del_driver(&twl4030_driver);
669}
670module_exit(twl4030_exit);
671
672MODULE_AUTHOR("Texas Instruments, Inc.");
673MODULE_DESCRIPTION("I2C Core interface for TWL4030");
674MODULE_LICENSE("GPL");