mfd: Initial support for twl5031
[deliverable/linux.git] / drivers / mfd / twl4030-core.c
CommitLineData
a603a7fa
DB
1/*
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
a603a7fa
DB
30#include <linux/init.h>
31#include <linux/mutex.h>
a603a7fa
DB
32#include <linux/platform_device.h>
33#include <linux/clk.h>
a30d46c0 34#include <linux/err.h>
a603a7fa 35
dad759ff
DB
36#include <linux/regulator/machine.h>
37
a603a7fa
DB
38#include <linux/i2c.h>
39#include <linux/i2c/twl4030.h>
40
a313d758 41#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
ce491cf8 42#include <plat/cpu.h>
b29c06ae 43#endif
a603a7fa
DB
44
45/*
46 * The TWL4030 "Triton 2" is one of a family of a multi-function "Power
47 * Management and System Companion Device" chips originally designed for
48 * use in OMAP2 and OMAP 3 based systems. Its control interfaces use I2C,
49 * often at around 3 Mbit/sec, including for interrupt handling.
50 *
51 * This driver core provides genirq support for the interrupts emitted,
52 * by the various modules, and exports register access primitives.
53 *
54 * FIXME this driver currently requires use of the first interrupt line
55 * (and associated registers).
56 */
57
58#define DRIVER_NAME "twl4030"
59
60#if defined(CONFIG_TWL4030_BCI_BATTERY) || \
61 defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
62#define twl_has_bci() true
63#else
64#define twl_has_bci() false
65#endif
66
67#if defined(CONFIG_KEYBOARD_TWL4030) || defined(CONFIG_KEYBOARD_TWL4030_MODULE)
68#define twl_has_keypad() true
69#else
70#define twl_has_keypad() false
71#endif
72
73#if defined(CONFIG_GPIO_TWL4030) || defined(CONFIG_GPIO_TWL4030_MODULE)
74#define twl_has_gpio() true
75#else
76#define twl_has_gpio() false
77#endif
78
dad759ff
DB
79#if defined(CONFIG_REGULATOR_TWL4030) \
80 || defined(CONFIG_REGULATOR_TWL4030_MODULE)
81#define twl_has_regulator() true
82#else
83#define twl_has_regulator() false
84#endif
85
a603a7fa
DB
86#if defined(CONFIG_TWL4030_MADC) || defined(CONFIG_TWL4030_MADC_MODULE)
87#define twl_has_madc() true
88#else
89#define twl_has_madc() false
90#endif
91
ebf0bd36
AK
92#ifdef CONFIG_TWL4030_POWER
93#define twl_has_power() true
94#else
95#define twl_has_power() false
96#endif
97
a603a7fa
DB
98#if defined(CONFIG_RTC_DRV_TWL4030) || defined(CONFIG_RTC_DRV_TWL4030_MODULE)
99#define twl_has_rtc() true
100#else
101#define twl_has_rtc() false
102#endif
103
104#if defined(CONFIG_TWL4030_USB) || defined(CONFIG_TWL4030_USB_MODULE)
105#define twl_has_usb() true
106#else
107#define twl_has_usb() false
108#endif
109
80e45b1e
TK
110#if defined(CONFIG_TWL4030_WATCHDOG) || \
111 defined(CONFIG_TWL4030_WATCHDOG_MODULE)
112#define twl_has_watchdog() true
113#else
114#define twl_has_watchdog() false
115#endif
a603a7fa 116
0b83ddeb
PU
117#if defined(CONFIG_TWL4030_CODEC) || defined(CONFIG_TWL4030_CODEC_MODULE)
118#define twl_has_codec() true
119#else
120#define twl_has_codec() false
121#endif
122
a603a7fa
DB
123/* Triton Core internal information (BEGIN) */
124
125/* Last - for index max*/
126#define TWL4030_MODULE_LAST TWL4030_MODULE_SECURED_REG
127
128#define TWL4030_NUM_SLAVES 4
129
9c3664dd
FB
130#if defined(CONFIG_INPUT_TWL4030_PWRBUTTON) \
131 || defined(CONFIG_INPUT_TWL4030_PWBUTTON_MODULE)
132#define twl_has_pwrbutton() true
133#else
134#define twl_has_pwrbutton() false
135#endif
a603a7fa
DB
136
137/* Base Address defns for twl4030_map[] */
138
139/* subchip/slave 0 - USB ID */
140#define TWL4030_BASEADD_USB 0x0000
141
142/* subchip/slave 1 - AUD ID */
143#define TWL4030_BASEADD_AUDIO_VOICE 0x0000
144#define TWL4030_BASEADD_GPIO 0x0098
145#define TWL4030_BASEADD_INTBR 0x0085
146#define TWL4030_BASEADD_PIH 0x0080
147#define TWL4030_BASEADD_TEST 0x004C
148
149/* subchip/slave 2 - AUX ID */
150#define TWL4030_BASEADD_INTERRUPTS 0x00B9
151#define TWL4030_BASEADD_LED 0x00EE
152#define TWL4030_BASEADD_MADC 0x0000
153#define TWL4030_BASEADD_MAIN_CHARGE 0x0074
154#define TWL4030_BASEADD_PRECHARGE 0x00AA
155#define TWL4030_BASEADD_PWM0 0x00F8
156#define TWL4030_BASEADD_PWM1 0x00FB
157#define TWL4030_BASEADD_PWMA 0x00EF
158#define TWL4030_BASEADD_PWMB 0x00F1
159#define TWL4030_BASEADD_KEYPAD 0x00D2
160
1920a61e
IK
161#define TWL5031_BASEADD_ACCESSORY 0x0074 /* Replaces Main Charge */
162#define TWL5031_BASEADD_INTERRUPTS 0x00B9 /* Different than TWL4030's
163 one */
164
a603a7fa
DB
165/* subchip/slave 3 - POWER ID */
166#define TWL4030_BASEADD_BACKUP 0x0014
167#define TWL4030_BASEADD_INT 0x002E
168#define TWL4030_BASEADD_PM_MASTER 0x0036
169#define TWL4030_BASEADD_PM_RECEIVER 0x005B
170#define TWL4030_BASEADD_RTC 0x001C
171#define TWL4030_BASEADD_SECURED_REG 0x0000
172
173/* Triton Core internal information (END) */
174
175
176/* Few power values */
177#define R_CFG_BOOT 0x05
178#define R_PROTECT_KEY 0x0E
179
180/* access control values for R_PROTECT_KEY */
181#define KEY_UNLOCK1 0xce
182#define KEY_UNLOCK2 0xec
183#define KEY_LOCK 0x00
184
185/* some fields in R_CFG_BOOT */
186#define HFCLK_FREQ_19p2_MHZ (1 << 0)
187#define HFCLK_FREQ_26_MHZ (2 << 0)
188#define HFCLK_FREQ_38p4_MHZ (3 << 0)
189#define HIGH_PERF_SQ (1 << 3)
38a68496 190#define CK32K_LOWPWR_EN (1 << 7)
a603a7fa
DB
191
192
dad759ff
DB
193/* chip-specific feature flags, for i2c_device_id.driver_data */
194#define TWL4030_VAUX2 BIT(0) /* pre-5030 voltage ranges */
195#define TPS_SUBSET BIT(1) /* tps659[23]0 have fewer LDOs */
1920a61e 196#define TWL5031 BIT(2) /* twl5031 has different registers */
dad759ff 197
a603a7fa
DB
198/*----------------------------------------------------------------------*/
199
a603a7fa
DB
200/* is driver active, bound to a chip? */
201static bool inuse;
202
203/* Structure for each TWL4030 Slave */
204struct twl4030_client {
205 struct i2c_client *client;
206 u8 address;
207
208 /* max numb of i2c_msg required is for read =2 */
209 struct i2c_msg xfer_msg[2];
210
211 /* To lock access to xfer_msg */
212 struct mutex xfer_lock;
213};
214
215static struct twl4030_client twl4030_modules[TWL4030_NUM_SLAVES];
216
217
218/* mapping the module id to slave id and base address */
219struct twl4030mapping {
220 unsigned char sid; /* Slave ID */
221 unsigned char base; /* base address */
222};
223
224static struct twl4030mapping twl4030_map[TWL4030_MODULE_LAST + 1] = {
225 /*
226 * NOTE: don't change this table without updating the
227 * <linux/i2c/twl4030.h> defines for TWL4030_MODULE_*
228 * so they continue to match the order in this table.
229 */
230
231 { 0, TWL4030_BASEADD_USB },
232
233 { 1, TWL4030_BASEADD_AUDIO_VOICE },
234 { 1, TWL4030_BASEADD_GPIO },
235 { 1, TWL4030_BASEADD_INTBR },
236 { 1, TWL4030_BASEADD_PIH },
237 { 1, TWL4030_BASEADD_TEST },
238
239 { 2, TWL4030_BASEADD_KEYPAD },
240 { 2, TWL4030_BASEADD_MADC },
241 { 2, TWL4030_BASEADD_INTERRUPTS },
242 { 2, TWL4030_BASEADD_LED },
243 { 2, TWL4030_BASEADD_MAIN_CHARGE },
244 { 2, TWL4030_BASEADD_PRECHARGE },
245 { 2, TWL4030_BASEADD_PWM0 },
246 { 2, TWL4030_BASEADD_PWM1 },
247 { 2, TWL4030_BASEADD_PWMA },
248 { 2, TWL4030_BASEADD_PWMB },
1920a61e
IK
249 { 2, TWL5031_BASEADD_ACCESSORY },
250 { 2, TWL5031_BASEADD_INTERRUPTS },
a603a7fa
DB
251
252 { 3, TWL4030_BASEADD_BACKUP },
253 { 3, TWL4030_BASEADD_INT },
254 { 3, TWL4030_BASEADD_PM_MASTER },
255 { 3, TWL4030_BASEADD_PM_RECEIVER },
256 { 3, TWL4030_BASEADD_RTC },
257 { 3, TWL4030_BASEADD_SECURED_REG },
258};
259
260/*----------------------------------------------------------------------*/
261
a603a7fa
DB
262/* Exported Functions */
263
264/**
265 * twl4030_i2c_write - Writes a n bit register in TWL4030
266 * @mod_no: module number
267 * @value: an array of num_bytes+1 containing data to write
268 * @reg: register address (just offset will do)
269 * @num_bytes: number of bytes to transfer
270 *
271 * IMPORTANT: for 'value' parameter: Allocate value num_bytes+1 and
272 * valid data starts at Offset 1.
273 *
274 * Returns the result of operation - 0 is success
275 */
3fba19ec 276int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
a603a7fa
DB
277{
278 int ret;
279 int sid;
280 struct twl4030_client *twl;
281 struct i2c_msg *msg;
282
283 if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
284 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
285 return -EPERM;
286 }
287 sid = twl4030_map[mod_no].sid;
288 twl = &twl4030_modules[sid];
289
290 if (unlikely(!inuse)) {
291 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
292 return -EPERM;
293 }
294 mutex_lock(&twl->xfer_lock);
295 /*
296 * [MSG1]: fill the register address data
297 * fill the data Tx buffer
298 */
299 msg = &twl->xfer_msg[0];
300 msg->addr = twl->address;
301 msg->len = num_bytes + 1;
302 msg->flags = 0;
303 msg->buf = value;
304 /* over write the first byte of buffer with the register address */
305 *value = twl4030_map[mod_no].base + reg;
306 ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 1);
307 mutex_unlock(&twl->xfer_lock);
308
309 /* i2cTransfer returns num messages.translate it pls.. */
310 if (ret >= 0)
311 ret = 0;
312 return ret;
313}
314EXPORT_SYMBOL(twl4030_i2c_write);
315
316/**
317 * twl4030_i2c_read - Reads a n bit register in TWL4030
318 * @mod_no: module number
319 * @value: an array of num_bytes containing data to be read
320 * @reg: register address (just offset will do)
321 * @num_bytes: number of bytes to transfer
322 *
323 * Returns result of operation - num_bytes is success else failure.
324 */
3fba19ec 325int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
a603a7fa
DB
326{
327 int ret;
328 u8 val;
329 int sid;
330 struct twl4030_client *twl;
331 struct i2c_msg *msg;
332
333 if (unlikely(mod_no > TWL4030_MODULE_LAST)) {
334 pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
335 return -EPERM;
336 }
337 sid = twl4030_map[mod_no].sid;
338 twl = &twl4030_modules[sid];
339
340 if (unlikely(!inuse)) {
341 pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
342 return -EPERM;
343 }
344 mutex_lock(&twl->xfer_lock);
345 /* [MSG1] fill the register address data */
346 msg = &twl->xfer_msg[0];
347 msg->addr = twl->address;
348 msg->len = 1;
349 msg->flags = 0; /* Read the register value */
350 val = twl4030_map[mod_no].base + reg;
351 msg->buf = &val;
352 /* [MSG2] fill the data rx buffer */
353 msg = &twl->xfer_msg[1];
354 msg->addr = twl->address;
355 msg->flags = I2C_M_RD; /* Read the register value */
356 msg->len = num_bytes; /* only n bytes */
357 msg->buf = value;
358 ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 2);
359 mutex_unlock(&twl->xfer_lock);
360
361 /* i2cTransfer returns num messages.translate it pls.. */
362 if (ret >= 0)
363 ret = 0;
364 return ret;
365}
366EXPORT_SYMBOL(twl4030_i2c_read);
367
368/**
369 * twl4030_i2c_write_u8 - Writes a 8 bit register in TWL4030
370 * @mod_no: module number
371 * @value: the value to be written 8 bit
372 * @reg: register address (just offset will do)
373 *
374 * Returns result of operation - 0 is success
375 */
376int twl4030_i2c_write_u8(u8 mod_no, u8 value, u8 reg)
377{
378
379 /* 2 bytes offset 1 contains the data offset 0 is used by i2c_write */
380 u8 temp_buffer[2] = { 0 };
381 /* offset 1 contains the data */
382 temp_buffer[1] = value;
383 return twl4030_i2c_write(mod_no, temp_buffer, reg, 1);
384}
385EXPORT_SYMBOL(twl4030_i2c_write_u8);
386
387/**
388 * twl4030_i2c_read_u8 - Reads a 8 bit register from TWL4030
389 * @mod_no: module number
390 * @value: the value read 8 bit
391 * @reg: register address (just offset will do)
392 *
393 * Returns result of operation - 0 is success
394 */
395int twl4030_i2c_read_u8(u8 mod_no, u8 *value, u8 reg)
396{
397 return twl4030_i2c_read(mod_no, value, reg, 1);
398}
399EXPORT_SYMBOL(twl4030_i2c_read_u8);
400
401/*----------------------------------------------------------------------*/
402
dad759ff
DB
403static struct device *
404add_numbered_child(unsigned chip, const char *name, int num,
5725d66b
DB
405 void *pdata, unsigned pdata_len,
406 bool can_wakeup, int irq0, int irq1)
a603a7fa 407{
5725d66b
DB
408 struct platform_device *pdev;
409 struct twl4030_client *twl = &twl4030_modules[chip];
410 int status;
411
dad759ff 412 pdev = platform_device_alloc(name, num);
5725d66b
DB
413 if (!pdev) {
414 dev_dbg(&twl->client->dev, "can't alloc dev\n");
415 status = -ENOMEM;
416 goto err;
417 }
a603a7fa 418
5725d66b
DB
419 device_init_wakeup(&pdev->dev, can_wakeup);
420 pdev->dev.parent = &twl->client->dev;
a603a7fa 421
5725d66b
DB
422 if (pdata) {
423 status = platform_device_add_data(pdev, pdata, pdata_len);
424 if (status < 0) {
425 dev_dbg(&pdev->dev, "can't add platform_data\n");
a603a7fa
DB
426 goto err;
427 }
5725d66b 428 }
a603a7fa 429
5725d66b
DB
430 if (irq0) {
431 struct resource r[2] = {
432 { .start = irq0, .flags = IORESOURCE_IRQ, },
433 { .start = irq1, .flags = IORESOURCE_IRQ, },
434 };
a603a7fa 435
5725d66b 436 status = platform_device_add_resources(pdev, r, irq1 ? 2 : 1);
a603a7fa 437 if (status < 0) {
5725d66b 438 dev_dbg(&pdev->dev, "can't add irqs\n");
a603a7fa
DB
439 goto err;
440 }
441 }
442
5725d66b 443 status = platform_device_add(pdev);
a603a7fa 444
5725d66b
DB
445err:
446 if (status < 0) {
447 platform_device_put(pdev);
448 dev_err(&twl->client->dev, "can't add %s dev\n", name);
449 return ERR_PTR(status);
450 }
451 return &pdev->dev;
452}
a603a7fa 453
dad759ff
DB
454static inline struct device *add_child(unsigned chip, const char *name,
455 void *pdata, unsigned pdata_len,
456 bool can_wakeup, int irq0, int irq1)
457{
458 return add_numbered_child(chip, name, -1, pdata, pdata_len,
459 can_wakeup, irq0, irq1);
460}
461
462static struct device *
463add_regulator_linked(int num, struct regulator_init_data *pdata,
464 struct regulator_consumer_supply *consumers,
465 unsigned num_consumers)
466{
467 /* regulator framework demands init_data ... */
468 if (!pdata)
469 return NULL;
470
b73eac78 471 if (consumers) {
dad759ff
DB
472 pdata->consumer_supplies = consumers;
473 pdata->num_consumer_supplies = num_consumers;
474 }
475
476 /* NOTE: we currently ignore regulator IRQs, e.g. for short circuits */
477 return add_numbered_child(3, "twl4030_reg", num,
478 pdata, sizeof(*pdata), false, 0, 0);
479}
480
481static struct device *
482add_regulator(int num, struct regulator_init_data *pdata)
483{
484 return add_regulator_linked(num, pdata, NULL, 0);
485}
486
5725d66b
DB
487/*
488 * NOTE: We know the first 8 IRQs after pdata->base_irq are
489 * for the PIH, and the next are for the PWR_INT SIH, since
490 * that's how twl_init_irq() sets things up.
491 */
a603a7fa 492
dad759ff
DB
493static int
494add_children(struct twl4030_platform_data *pdata, unsigned long features)
5725d66b
DB
495{
496 struct device *child;
a603a7fa 497
1920a61e
IK
498 if (twl_has_bci() && pdata->bci &&
499 !(features & (TPS_SUBSET | TWL5031))) {
5725d66b
DB
500 child = add_child(3, "twl4030_bci",
501 pdata->bci, sizeof(*pdata->bci),
502 false,
503 /* irq0 = CHG_PRES, irq1 = BCI */
504 pdata->irq_base + 8 + 1, pdata->irq_base + 2);
505 if (IS_ERR(child))
506 return PTR_ERR(child);
507 }
a603a7fa 508
5725d66b
DB
509 if (twl_has_gpio() && pdata->gpio) {
510 child = add_child(1, "twl4030_gpio",
511 pdata->gpio, sizeof(*pdata->gpio),
512 false, pdata->irq_base + 0, 0);
513 if (IS_ERR(child))
514 return PTR_ERR(child);
a603a7fa
DB
515 }
516
517 if (twl_has_keypad() && pdata->keypad) {
5725d66b
DB
518 child = add_child(2, "twl4030_keypad",
519 pdata->keypad, sizeof(*pdata->keypad),
520 true, pdata->irq_base + 1, 0);
521 if (IS_ERR(child))
522 return PTR_ERR(child);
a603a7fa
DB
523 }
524
525 if (twl_has_madc() && pdata->madc) {
5725d66b
DB
526 child = add_child(2, "twl4030_madc",
527 pdata->madc, sizeof(*pdata->madc),
528 true, pdata->irq_base + 3, 0);
529 if (IS_ERR(child))
530 return PTR_ERR(child);
a603a7fa
DB
531 }
532
533 if (twl_has_rtc()) {
a603a7fa 534 /*
5725d66b 535 * REVISIT platform_data here currently might expose the
a603a7fa 536 * "msecure" line ... but for now we just expect board
5725d66b 537 * setup to tell the chip "it's always ok to SET_TIME".
a603a7fa
DB
538 * Eventually, Linux might become more aware of such
539 * HW security concerns, and "least privilege".
540 */
5725d66b
DB
541 child = add_child(3, "twl4030_rtc",
542 NULL, 0,
543 true, pdata->irq_base + 8 + 3, 0);
544 if (IS_ERR(child))
545 return PTR_ERR(child);
a603a7fa
DB
546 }
547
548 if (twl_has_usb() && pdata->usb) {
f8ebdff0
RQ
549
550 static struct regulator_consumer_supply usb1v5 = {
551 .supply = "usb1v5",
552 };
553 static struct regulator_consumer_supply usb1v8 = {
554 .supply = "usb1v8",
555 };
556 static struct regulator_consumer_supply usb3v1 = {
557 .supply = "usb3v1",
558 };
559
560 /* First add the regulators so that they can be used by transceiver */
561 if (twl_has_regulator()) {
562 /* this is a template that gets copied */
563 struct regulator_init_data usb_fixed = {
564 .constraints.valid_modes_mask =
565 REGULATOR_MODE_NORMAL
566 | REGULATOR_MODE_STANDBY,
567 .constraints.valid_ops_mask =
568 REGULATOR_CHANGE_MODE
569 | REGULATOR_CHANGE_STATUS,
570 };
571
572 child = add_regulator_linked(TWL4030_REG_VUSB1V5,
573 &usb_fixed, &usb1v5, 1);
574 if (IS_ERR(child))
575 return PTR_ERR(child);
576
577 child = add_regulator_linked(TWL4030_REG_VUSB1V8,
578 &usb_fixed, &usb1v8, 1);
579 if (IS_ERR(child))
580 return PTR_ERR(child);
581
582 child = add_regulator_linked(TWL4030_REG_VUSB3V1,
583 &usb_fixed, &usb3v1, 1);
584 if (IS_ERR(child))
585 return PTR_ERR(child);
586
587 }
588
5725d66b
DB
589 child = add_child(0, "twl4030_usb",
590 pdata->usb, sizeof(*pdata->usb),
591 true,
592 /* irq0 = USB_PRES, irq1 = USB */
593 pdata->irq_base + 8 + 2, pdata->irq_base + 4);
f8ebdff0 594
5725d66b
DB
595 if (IS_ERR(child))
596 return PTR_ERR(child);
dad759ff
DB
597
598 /* we need to connect regulators to this transceiver */
f8ebdff0
RQ
599 if (twl_has_regulator() && child) {
600 usb1v5.dev = child;
601 usb1v8.dev = child;
602 usb3v1.dev = child;
603 }
dad759ff
DB
604 }
605
80e45b1e
TK
606 if (twl_has_watchdog()) {
607 child = add_child(0, "twl4030_wdt", NULL, 0, false, 0, 0);
608 if (IS_ERR(child))
9c3664dd
FB
609 return PTR_ERR(child);
610 }
611
612 if (twl_has_pwrbutton()) {
613 child = add_child(1, "twl4030_pwrbutton",
614 NULL, 0, true, pdata->irq_base + 8 + 0, 0);
615 if (IS_ERR(child))
80e45b1e
TK
616 return PTR_ERR(child);
617 }
618
0b83ddeb
PU
619 if (twl_has_codec() && pdata->codec) {
620 child = add_child(1, "twl4030_codec",
621 pdata->codec, sizeof(*pdata->codec),
622 false, 0, 0);
623 if (IS_ERR(child))
624 return PTR_ERR(child);
625 }
626
dad759ff
DB
627 if (twl_has_regulator()) {
628 /*
629 child = add_regulator(TWL4030_REG_VPLL1, pdata->vpll1);
630 if (IS_ERR(child))
631 return PTR_ERR(child);
632 */
633
634 child = add_regulator(TWL4030_REG_VMMC1, pdata->vmmc1);
635 if (IS_ERR(child))
636 return PTR_ERR(child);
637
638 child = add_regulator(TWL4030_REG_VDAC, pdata->vdac);
639 if (IS_ERR(child))
640 return PTR_ERR(child);
641
642 child = add_regulator((features & TWL4030_VAUX2)
643 ? TWL4030_REG_VAUX2_4030
644 : TWL4030_REG_VAUX2,
645 pdata->vaux2);
646 if (IS_ERR(child))
647 return PTR_ERR(child);
648 }
649
dad759ff
DB
650 /* maybe add LDOs that are omitted on cost-reduced parts */
651 if (twl_has_regulator() && !(features & TPS_SUBSET)) {
dad759ff
DB
652 child = add_regulator(TWL4030_REG_VPLL2, pdata->vpll2);
653 if (IS_ERR(child))
654 return PTR_ERR(child);
dad759ff
DB
655
656 child = add_regulator(TWL4030_REG_VMMC2, pdata->vmmc2);
657 if (IS_ERR(child))
658 return PTR_ERR(child);
659
660 child = add_regulator(TWL4030_REG_VSIM, pdata->vsim);
661 if (IS_ERR(child))
662 return PTR_ERR(child);
663
664 child = add_regulator(TWL4030_REG_VAUX1, pdata->vaux1);
665 if (IS_ERR(child))
666 return PTR_ERR(child);
667
668 child = add_regulator(TWL4030_REG_VAUX3, pdata->vaux3);
669 if (IS_ERR(child))
670 return PTR_ERR(child);
671
672 child = add_regulator(TWL4030_REG_VAUX4, pdata->vaux4);
673 if (IS_ERR(child))
674 return PTR_ERR(child);
a603a7fa
DB
675 }
676
5725d66b 677 return 0;
a603a7fa
DB
678}
679
680/*----------------------------------------------------------------------*/
681
682/*
683 * These three functions initialize the on-chip clock framework,
684 * letting it generate the right frequencies for USB, MADC, and
685 * other purposes.
686 */
687static inline int __init protect_pm_master(void)
688{
689 int e = 0;
690
691 e = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_LOCK,
692 R_PROTECT_KEY);
693 return e;
694}
695
696static inline int __init unprotect_pm_master(void)
697{
698 int e = 0;
699
700 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK1,
701 R_PROTECT_KEY);
702 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, KEY_UNLOCK2,
703 R_PROTECT_KEY);
704 return e;
705}
706
38a68496
IK
707static void clocks_init(struct device *dev,
708 struct twl4030_clock_init_data *clock)
a603a7fa
DB
709{
710 int e = 0;
711 struct clk *osc;
712 u32 rate;
713 u8 ctrl = HFCLK_FREQ_26_MHZ;
714
715#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
716 if (cpu_is_omap2430())
e6b50c8d 717 osc = clk_get(dev, "osc_ck");
a603a7fa 718 else
e6b50c8d 719 osc = clk_get(dev, "osc_sys_ck");
6354ab5c 720
a603a7fa
DB
721 if (IS_ERR(osc)) {
722 printk(KERN_WARNING "Skipping twl4030 internal clock init and "
723 "using bootloader value (unknown osc rate)\n");
724 return;
725 }
726
727 rate = clk_get_rate(osc);
728 clk_put(osc);
729
6354ab5c
SO
730#else
731 /* REVISIT for non-OMAP systems, pass the clock rate from
732 * board init code, using platform_data.
733 */
734 osc = ERR_PTR(-EIO);
735
736 printk(KERN_WARNING "Skipping twl4030 internal clock init and "
737 "using bootloader value (unknown osc rate)\n");
738
739 return;
740#endif
741
a603a7fa
DB
742 switch (rate) {
743 case 19200000:
744 ctrl = HFCLK_FREQ_19p2_MHZ;
745 break;
746 case 26000000:
747 ctrl = HFCLK_FREQ_26_MHZ;
748 break;
749 case 38400000:
750 ctrl = HFCLK_FREQ_38p4_MHZ;
751 break;
752 }
753
754 ctrl |= HIGH_PERF_SQ;
38a68496
IK
755 if (clock && clock->ck32k_lowpwr_enable)
756 ctrl |= CK32K_LOWPWR_EN;
757
a603a7fa
DB
758 e |= unprotect_pm_master();
759 /* effect->MADC+USB ck en */
760 e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, ctrl, R_CFG_BOOT);
761 e |= protect_pm_master();
762
763 if (e < 0)
764 pr_err("%s: clock init err [%d]\n", DRIVER_NAME, e);
765}
766
767/*----------------------------------------------------------------------*/
768
a30d46c0
DB
769int twl_init_irq(int irq_num, unsigned irq_base, unsigned irq_end);
770int twl_exit_irq(void);
1920a61e 771int twl_init_chip_irq(const char *chip);
a603a7fa
DB
772
773static int twl4030_remove(struct i2c_client *client)
774{
775 unsigned i;
a30d46c0 776 int status;
a603a7fa 777
a30d46c0
DB
778 status = twl_exit_irq();
779 if (status < 0)
780 return status;
a603a7fa
DB
781
782 for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
783 struct twl4030_client *twl = &twl4030_modules[i];
784
785 if (twl->client && twl->client != client)
786 i2c_unregister_device(twl->client);
787 twl4030_modules[i].client = NULL;
788 }
789 inuse = false;
790 return 0;
791}
792
793/* NOTE: this driver only handles a single twl4030/tps659x0 chip */
b5e102cd 794static int __init
a603a7fa
DB
795twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id)
796{
797 int status;
798 unsigned i;
799 struct twl4030_platform_data *pdata = client->dev.platform_data;
800
801 if (!pdata) {
802 dev_dbg(&client->dev, "no platform data?\n");
803 return -EINVAL;
804 }
805
806 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
807 dev_dbg(&client->dev, "can't talk I2C?\n");
808 return -EIO;
809 }
810
a30d46c0 811 if (inuse) {
a603a7fa
DB
812 dev_dbg(&client->dev, "driver is already in use\n");
813 return -EBUSY;
814 }
815
816 for (i = 0; i < TWL4030_NUM_SLAVES; i++) {
817 struct twl4030_client *twl = &twl4030_modules[i];
818
819 twl->address = client->addr + i;
820 if (i == 0)
821 twl->client = client;
822 else {
823 twl->client = i2c_new_dummy(client->adapter,
824 twl->address);
825 if (!twl->client) {
a8643430 826 dev_err(&client->dev,
a603a7fa
DB
827 "can't attach client %d\n", i);
828 status = -ENOMEM;
829 goto fail;
830 }
a603a7fa
DB
831 }
832 mutex_init(&twl->xfer_lock);
833 }
834 inuse = true;
835
836 /* setup clock framework */
38a68496 837 clocks_init(&client->dev, pdata->clock);
a603a7fa 838
ebf0bd36
AK
839 /* load power event scripts */
840 if (twl_has_power() && pdata->power)
841 twl4030_power_init(pdata->power);
842
a603a7fa
DB
843 /* Maybe init the T2 Interrupt subsystem */
844 if (client->irq
845 && pdata->irq_base
846 && pdata->irq_end > pdata->irq_base) {
1920a61e 847 twl_init_chip_irq(id->name);
a30d46c0
DB
848 status = twl_init_irq(client->irq, pdata->irq_base, pdata->irq_end);
849 if (status < 0)
850 goto fail;
a603a7fa
DB
851 }
852
dad759ff 853 status = add_children(pdata, id->driver_data);
a603a7fa
DB
854fail:
855 if (status < 0)
856 twl4030_remove(client);
857 return status;
858}
859
860static const struct i2c_device_id twl4030_ids[] = {
dad759ff
DB
861 { "twl4030", TWL4030_VAUX2 }, /* "Triton 2" */
862 { "twl5030", 0 }, /* T2 updated */
1920a61e 863 { "twl5031", TWL5031 }, /* TWL5030 updated */
dad759ff
DB
864 { "tps65950", 0 }, /* catalog version of twl5030 */
865 { "tps65930", TPS_SUBSET }, /* fewer LDOs and DACs; no charger */
866 { "tps65920", TPS_SUBSET }, /* fewer LDOs; no codec or charger */
a603a7fa
DB
867 { /* end of list */ },
868};
869MODULE_DEVICE_TABLE(i2c, twl4030_ids);
870
871/* One Client Driver , 4 Clients */
872static struct i2c_driver twl4030_driver = {
873 .driver.name = DRIVER_NAME,
874 .id_table = twl4030_ids,
875 .probe = twl4030_probe,
876 .remove = twl4030_remove,
877};
878
879static int __init twl4030_init(void)
880{
881 return i2c_add_driver(&twl4030_driver);
882}
883subsys_initcall(twl4030_init);
884
885static void __exit twl4030_exit(void)
886{
887 i2c_del_driver(&twl4030_driver);
888}
889module_exit(twl4030_exit);
890
891MODULE_AUTHOR("Texas Instruments, Inc.");
892MODULE_DESCRIPTION("I2C Core interface for TWL4030");
893MODULE_LICENSE("GPL");
This page took 0.148167 seconds and 5 git commands to generate.