twl-core.c 27.8 KB
Newer Older
D
David Brownell 已提交
1
/*
B
Balaji T K 已提交
2 3
 * twl_core.c - driver for TWL4030/TWL5030/TWL60X0/TPS659x0 PM
 * and audio CODEC devices
D
David Brownell 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *
 * Copyright (C) 2005-2006 Texas Instruments, Inc.
 *
 * Modifications to defer interrupt handling to a kernel thread:
 * Copyright (C) 2006 MontaVista Software, Inc.
 *
 * Based on tlv320aic23.c:
 * Copyright (c) by Kai Svahn <kai.svahn@nokia.com>
 *
 * Code cleanup and modifications to IRQ handler.
 * by syed khasim <x0khasim@ti.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
D
David Brownell 已提交
35
#include <linux/err.h>
D
David Brownell 已提交
36

37 38
#include <linux/regulator/machine.h>

D
David Brownell 已提交
39
#include <linux/i2c.h>
40
#include <linux/i2c/twl.h>
D
David Brownell 已提交
41

42
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
43
#include <plat/cpu.h>
S
Samuel Ortiz 已提交
44
#endif
D
David Brownell 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58

/*
 * The TWL4030 "Triton 2" is one of a family of a multi-function "Power
 * Management and System Companion Device" chips originally designed for
 * use in OMAP2 and OMAP 3 based systems.  Its control interfaces use I2C,
 * often at around 3 Mbit/sec, including for interrupt handling.
 *
 * This driver core provides genirq support for the interrupts emitted,
 * by the various modules, and exports register access primitives.
 *
 * FIXME this driver currently requires use of the first interrupt line
 * (and associated registers).
 */

B
Balaji T K 已提交
59
#define DRIVER_NAME			"twl"
D
David Brownell 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

#if defined(CONFIG_TWL4030_BCI_BATTERY) || \
	defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
#define twl_has_bci()		true
#else
#define twl_has_bci()		false
#endif

#if defined(CONFIG_KEYBOARD_TWL4030) || defined(CONFIG_KEYBOARD_TWL4030_MODULE)
#define twl_has_keypad()	true
#else
#define twl_has_keypad()	false
#endif

#if defined(CONFIG_GPIO_TWL4030) || defined(CONFIG_GPIO_TWL4030_MODULE)
#define twl_has_gpio()	true
#else
#define twl_has_gpio()	false
#endif

80 81 82 83 84 85 86
#if defined(CONFIG_REGULATOR_TWL4030) \
	|| defined(CONFIG_REGULATOR_TWL4030_MODULE)
#define twl_has_regulator()	true
#else
#define twl_has_regulator()	false
#endif

D
David Brownell 已提交
87 88 89 90 91 92
#if defined(CONFIG_TWL4030_MADC) || defined(CONFIG_TWL4030_MADC_MODULE)
#define twl_has_madc()	true
#else
#define twl_has_madc()	false
#endif

93 94 95 96 97 98
#ifdef CONFIG_TWL4030_POWER
#define twl_has_power()        true
#else
#define twl_has_power()        false
#endif

D
David Brownell 已提交
99 100 101 102 103 104 105 106 107 108 109 110
#if defined(CONFIG_RTC_DRV_TWL4030) || defined(CONFIG_RTC_DRV_TWL4030_MODULE)
#define twl_has_rtc()	true
#else
#define twl_has_rtc()	false
#endif

#if defined(CONFIG_TWL4030_USB) || defined(CONFIG_TWL4030_USB_MODULE)
#define twl_has_usb()	true
#else
#define twl_has_usb()	false
#endif

111 112 113 114 115 116
#if defined(CONFIG_TWL4030_WATCHDOG) || \
	defined(CONFIG_TWL4030_WATCHDOG_MODULE)
#define twl_has_watchdog()        true
#else
#define twl_has_watchdog()        false
#endif
D
David Brownell 已提交
117

118 119 120 121 122 123
#if defined(CONFIG_TWL4030_CODEC) || defined(CONFIG_TWL4030_CODEC_MODULE)
#define twl_has_codec()	true
#else
#define twl_has_codec()	false
#endif

D
David Brownell 已提交
124 125 126 127 128
/* Triton Core internal information (BEGIN) */

/* Last - for index max*/
#define TWL4030_MODULE_LAST		TWL4030_MODULE_SECURED_REG

B
Balaji T K 已提交
129
#define TWL_NUM_SLAVES		4
D
David Brownell 已提交
130

131 132 133 134 135 136
#if defined(CONFIG_INPUT_TWL4030_PWRBUTTON) \
	|| defined(CONFIG_INPUT_TWL4030_PWBUTTON_MODULE)
#define twl_has_pwrbutton()	true
#else
#define twl_has_pwrbutton()	false
#endif
D
David Brownell 已提交
137

B
Balaji T K 已提交
138 139 140 141 142 143 144
#define SUB_CHIP_ID0 0
#define SUB_CHIP_ID1 1
#define SUB_CHIP_ID2 2
#define SUB_CHIP_ID3 3

#define TWL_MODULE_LAST TWL4030_MODULE_LAST

D
David Brownell 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
/* Base Address defns for twl4030_map[] */

/* subchip/slave 0 - USB ID */
#define TWL4030_BASEADD_USB		0x0000

/* subchip/slave 1 - AUD ID */
#define TWL4030_BASEADD_AUDIO_VOICE	0x0000
#define TWL4030_BASEADD_GPIO		0x0098
#define TWL4030_BASEADD_INTBR		0x0085
#define TWL4030_BASEADD_PIH		0x0080
#define TWL4030_BASEADD_TEST		0x004C

/* subchip/slave 2 - AUX ID */
#define TWL4030_BASEADD_INTERRUPTS	0x00B9
#define TWL4030_BASEADD_LED		0x00EE
#define TWL4030_BASEADD_MADC		0x0000
#define TWL4030_BASEADD_MAIN_CHARGE	0x0074
#define TWL4030_BASEADD_PRECHARGE	0x00AA
#define TWL4030_BASEADD_PWM0		0x00F8
#define TWL4030_BASEADD_PWM1		0x00FB
#define TWL4030_BASEADD_PWMA		0x00EF
#define TWL4030_BASEADD_PWMB		0x00F1
#define TWL4030_BASEADD_KEYPAD		0x00D2

I
Ilkka Koskinen 已提交
169 170 171 172
#define TWL5031_BASEADD_ACCESSORY	0x0074 /* Replaces Main Charge */
#define TWL5031_BASEADD_INTERRUPTS	0x00B9 /* Different than TWL4030's
						  one */

D
David Brownell 已提交
173 174 175 176 177 178 179 180 181 182 183
/* subchip/slave 3 - POWER ID */
#define TWL4030_BASEADD_BACKUP		0x0014
#define TWL4030_BASEADD_INT		0x002E
#define TWL4030_BASEADD_PM_MASTER	0x0036
#define TWL4030_BASEADD_PM_RECEIVER	0x005B
#define TWL4030_BASEADD_RTC		0x001C
#define TWL4030_BASEADD_SECURED_REG	0x0000

/* Triton Core internal information (END) */


184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
/* subchip/slave 0 0x48 - POWER */
#define TWL6030_BASEADD_RTC		0x0000
#define TWL6030_BASEADD_MEM		0x0017
#define TWL6030_BASEADD_PM_MASTER	0x001F
#define TWL6030_BASEADD_PM_SLAVE_MISC	0x0030 /* PM_RECEIVER */
#define TWL6030_BASEADD_PM_MISC		0x00E2
#define TWL6030_BASEADD_PM_PUPD		0x00F0

/* subchip/slave 1 0x49 - FEATURE */
#define TWL6030_BASEADD_USB		0x0000
#define TWL6030_BASEADD_GPADC_CTRL	0x002E
#define TWL6030_BASEADD_AUX		0x0090
#define TWL6030_BASEADD_PWM		0x00BA
#define TWL6030_BASEADD_GASGAUGE	0x00C0
#define TWL6030_BASEADD_PIH		0x00D0
#define TWL6030_BASEADD_CHARGER		0x00E0

/* subchip/slave 2 0x4A - DFT */
#define TWL6030_BASEADD_DIEID		0x00C0

/* subchip/slave 3 0x4B - AUDIO */
#define TWL6030_BASEADD_AUDIO		0x0000
#define TWL6030_BASEADD_RSV		0x0000

D
David Brownell 已提交
208 209 210 211 212 213 214 215 216 217 218 219 220 221
/* Few power values */
#define R_CFG_BOOT			0x05
#define R_PROTECT_KEY			0x0E

/* access control values for R_PROTECT_KEY */
#define KEY_UNLOCK1			0xce
#define KEY_UNLOCK2			0xec
#define KEY_LOCK			0x00

/* some fields in R_CFG_BOOT */
#define HFCLK_FREQ_19p2_MHZ		(1 << 0)
#define HFCLK_FREQ_26_MHZ		(2 << 0)
#define HFCLK_FREQ_38p4_MHZ		(3 << 0)
#define HIGH_PERF_SQ			(1 << 3)
222
#define CK32K_LOWPWR_EN			(1 << 7)
D
David Brownell 已提交
223 224


225 226 227
/* chip-specific feature flags, for i2c_device_id.driver_data */
#define TWL4030_VAUX2		BIT(0)	/* pre-5030 voltage ranges */
#define TPS_SUBSET		BIT(1)	/* tps659[23]0 have fewer LDOs */
I
Ilkka Koskinen 已提交
228
#define TWL5031			BIT(2)  /* twl5031 has different registers */
229
#define TWL6030_CLASS		BIT(3)	/* TWL6030 class */
230

D
David Brownell 已提交
231 232 233 234 235
/*----------------------------------------------------------------------*/

/* is driver active, bound to a chip? */
static bool inuse;

236 237 238 239 240 241 242 243
static unsigned int twl_id;
unsigned int twl_rev(void)
{
	return twl_id;
}
EXPORT_SYMBOL(twl_rev);

/* Structure for each TWL4030/TWL6030 Slave */
B
Balaji T K 已提交
244
struct twl_client {
D
David Brownell 已提交
245 246 247 248 249 250 251 252 253 254
	struct i2c_client *client;
	u8 address;

	/* max numb of i2c_msg required is for read =2 */
	struct i2c_msg xfer_msg[2];

	/* To lock access to xfer_msg */
	struct mutex xfer_lock;
};

B
Balaji T K 已提交
255
static struct twl_client twl_modules[TWL_NUM_SLAVES];
D
David Brownell 已提交
256 257 258


/* mapping the module id to slave id and base address */
B
Balaji T K 已提交
259
struct twl_mapping {
D
David Brownell 已提交
260 261 262
	unsigned char sid;	/* Slave ID */
	unsigned char base;	/* base address */
};
263
struct twl_mapping *twl_map;
D
David Brownell 已提交
264

B
Balaji T K 已提交
265
static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = {
D
David Brownell 已提交
266 267
	/*
	 * NOTE:  don't change this table without updating the
268
	 * <linux/i2c/twl.h> defines for TWL4030_MODULE_*
D
David Brownell 已提交
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
	 * so they continue to match the order in this table.
	 */

	{ 0, TWL4030_BASEADD_USB },

	{ 1, TWL4030_BASEADD_AUDIO_VOICE },
	{ 1, TWL4030_BASEADD_GPIO },
	{ 1, TWL4030_BASEADD_INTBR },
	{ 1, TWL4030_BASEADD_PIH },
	{ 1, TWL4030_BASEADD_TEST },

	{ 2, TWL4030_BASEADD_KEYPAD },
	{ 2, TWL4030_BASEADD_MADC },
	{ 2, TWL4030_BASEADD_INTERRUPTS },
	{ 2, TWL4030_BASEADD_LED },
	{ 2, TWL4030_BASEADD_MAIN_CHARGE },
	{ 2, TWL4030_BASEADD_PRECHARGE },
	{ 2, TWL4030_BASEADD_PWM0 },
	{ 2, TWL4030_BASEADD_PWM1 },
	{ 2, TWL4030_BASEADD_PWMA },
	{ 2, TWL4030_BASEADD_PWMB },
I
Ilkka Koskinen 已提交
290 291
	{ 2, TWL5031_BASEADD_ACCESSORY },
	{ 2, TWL5031_BASEADD_INTERRUPTS },
D
David Brownell 已提交
292 293 294 295 296 297 298 299 300

	{ 3, TWL4030_BASEADD_BACKUP },
	{ 3, TWL4030_BASEADD_INT },
	{ 3, TWL4030_BASEADD_PM_MASTER },
	{ 3, TWL4030_BASEADD_PM_RECEIVER },
	{ 3, TWL4030_BASEADD_RTC },
	{ 3, TWL4030_BASEADD_SECURED_REG },
};

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
static struct twl_mapping twl6030_map[] = {
	/*
	 * NOTE:  don't change this table without updating the
	 * <linux/i2c/twl.h> defines for TWL4030_MODULE_*
	 * so they continue to match the order in this table.
	 */
	{ SUB_CHIP_ID1, TWL6030_BASEADD_USB },
	{ SUB_CHIP_ID3, TWL6030_BASEADD_AUDIO },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_DIEID },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID1, TWL6030_BASEADD_PIH },

	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID1, TWL6030_BASEADD_GPADC_CTRL },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },

	{ SUB_CHIP_ID1, TWL6030_BASEADD_CHARGER },
	{ SUB_CHIP_ID1, TWL6030_BASEADD_GASGAUGE },
	{ SUB_CHIP_ID1, TWL6030_BASEADD_PWM },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },

	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID2, TWL6030_BASEADD_RSV },
	{ SUB_CHIP_ID0, TWL6030_BASEADD_PM_MASTER },
	{ SUB_CHIP_ID0, TWL6030_BASEADD_PM_SLAVE_MISC },

	{ SUB_CHIP_ID0, TWL6030_BASEADD_RTC },
	{ SUB_CHIP_ID0, TWL6030_BASEADD_MEM },
};

D
David Brownell 已提交
335 336 337 338 339
/*----------------------------------------------------------------------*/

/* Exported Functions */

/**
B
Balaji T K 已提交
340
 * twl_i2c_write - Writes a n bit register in TWL4030/TWL5030/TWL60X0
D
David Brownell 已提交
341 342 343 344 345 346 347 348 349 350
 * @mod_no: module number
 * @value: an array of num_bytes+1 containing data to write
 * @reg: register address (just offset will do)
 * @num_bytes: number of bytes to transfer
 *
 * IMPORTANT: for 'value' parameter: Allocate value num_bytes+1 and
 * valid data starts at Offset 1.
 *
 * Returns the result of operation - 0 is success
 */
B
Balaji T K 已提交
351
int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
D
David Brownell 已提交
352 353 354
{
	int ret;
	int sid;
B
Balaji T K 已提交
355
	struct twl_client *twl;
D
David Brownell 已提交
356 357
	struct i2c_msg *msg;

B
Balaji T K 已提交
358
	if (unlikely(mod_no > TWL_MODULE_LAST)) {
D
David Brownell 已提交
359 360 361
		pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
		return -EPERM;
	}
362
	sid = twl_map[mod_no].sid;
B
Balaji T K 已提交
363
	twl = &twl_modules[sid];
D
David Brownell 已提交
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379

	if (unlikely(!inuse)) {
		pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
		return -EPERM;
	}
	mutex_lock(&twl->xfer_lock);
	/*
	 * [MSG1]: fill the register address data
	 * fill the data Tx buffer
	 */
	msg = &twl->xfer_msg[0];
	msg->addr = twl->address;
	msg->len = num_bytes + 1;
	msg->flags = 0;
	msg->buf = value;
	/* over write the first byte of buffer with the register address */
380
	*value = twl_map[mod_no].base + reg;
D
David Brownell 已提交
381 382 383
	ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 1);
	mutex_unlock(&twl->xfer_lock);

384 385 386 387 388 389 390 391 392 393 394
	/* i2c_transfer returns number of messages transferred */
	if (ret != 1) {
		pr_err("%s: i2c_write failed to transfer all messages\n",
			DRIVER_NAME);
		if (ret < 0)
			return ret;
		else
			return -EIO;
	} else {
		return 0;
	}
D
David Brownell 已提交
395
}
B
Balaji T K 已提交
396
EXPORT_SYMBOL(twl_i2c_write);
D
David Brownell 已提交
397 398

/**
B
Balaji T K 已提交
399
 * twl_i2c_read - Reads a n bit register in TWL4030/TWL5030/TWL60X0
D
David Brownell 已提交
400 401 402 403 404 405 406
 * @mod_no: module number
 * @value: an array of num_bytes containing data to be read
 * @reg: register address (just offset will do)
 * @num_bytes: number of bytes to transfer
 *
 * Returns result of operation - num_bytes is success else failure.
 */
B
Balaji T K 已提交
407
int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes)
D
David Brownell 已提交
408 409 410 411
{
	int ret;
	u8 val;
	int sid;
B
Balaji T K 已提交
412
	struct twl_client *twl;
D
David Brownell 已提交
413 414
	struct i2c_msg *msg;

B
Balaji T K 已提交
415
	if (unlikely(mod_no > TWL_MODULE_LAST)) {
D
David Brownell 已提交
416 417 418
		pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no);
		return -EPERM;
	}
419
	sid = twl_map[mod_no].sid;
B
Balaji T K 已提交
420
	twl = &twl_modules[sid];
D
David Brownell 已提交
421 422 423 424 425 426 427 428 429 430 431

	if (unlikely(!inuse)) {
		pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid);
		return -EPERM;
	}
	mutex_lock(&twl->xfer_lock);
	/* [MSG1] fill the register address data */
	msg = &twl->xfer_msg[0];
	msg->addr = twl->address;
	msg->len = 1;
	msg->flags = 0;	/* Read the register value */
432
	val = twl_map[mod_no].base + reg;
D
David Brownell 已提交
433 434 435 436 437 438 439 440 441 442
	msg->buf = &val;
	/* [MSG2] fill the data rx buffer */
	msg = &twl->xfer_msg[1];
	msg->addr = twl->address;
	msg->flags = I2C_M_RD;	/* Read the register value */
	msg->len = num_bytes;	/* only n bytes */
	msg->buf = value;
	ret = i2c_transfer(twl->client->adapter, twl->xfer_msg, 2);
	mutex_unlock(&twl->xfer_lock);

443 444 445 446 447 448 449 450 451 452 453
	/* i2c_transfer returns number of messages transferred */
	if (ret != 2) {
		pr_err("%s: i2c_read failed to transfer all messages\n",
			DRIVER_NAME);
		if (ret < 0)
			return ret;
		else
			return -EIO;
	} else {
		return 0;
	}
D
David Brownell 已提交
454
}
B
Balaji T K 已提交
455
EXPORT_SYMBOL(twl_i2c_read);
D
David Brownell 已提交
456 457

/**
B
Balaji T K 已提交
458
 * twl_i2c_write_u8 - Writes a 8 bit register in TWL4030/TWL5030/TWL60X0
D
David Brownell 已提交
459 460 461 462 463 464
 * @mod_no: module number
 * @value: the value to be written 8 bit
 * @reg: register address (just offset will do)
 *
 * Returns result of operation - 0 is success
 */
B
Balaji T K 已提交
465
int twl_i2c_write_u8(u8 mod_no, u8 value, u8 reg)
D
David Brownell 已提交
466 467 468 469 470 471
{

	/* 2 bytes offset 1 contains the data offset 0 is used by i2c_write */
	u8 temp_buffer[2] = { 0 };
	/* offset 1 contains the data */
	temp_buffer[1] = value;
B
Balaji T K 已提交
472
	return twl_i2c_write(mod_no, temp_buffer, reg, 1);
D
David Brownell 已提交
473
}
B
Balaji T K 已提交
474
EXPORT_SYMBOL(twl_i2c_write_u8);
D
David Brownell 已提交
475 476

/**
B
Balaji T K 已提交
477
 * twl_i2c_read_u8 - Reads a 8 bit register from TWL4030/TWL5030/TWL60X0
D
David Brownell 已提交
478 479 480 481 482 483
 * @mod_no: module number
 * @value: the value read 8 bit
 * @reg: register address (just offset will do)
 *
 * Returns result of operation - 0 is success
 */
B
Balaji T K 已提交
484
int twl_i2c_read_u8(u8 mod_no, u8 *value, u8 reg)
D
David Brownell 已提交
485
{
B
Balaji T K 已提交
486
	return twl_i2c_read(mod_no, value, reg, 1);
D
David Brownell 已提交
487
}
B
Balaji T K 已提交
488
EXPORT_SYMBOL(twl_i2c_read_u8);
D
David Brownell 已提交
489 490 491

/*----------------------------------------------------------------------*/

492 493
static struct device *
add_numbered_child(unsigned chip, const char *name, int num,
494 495
		void *pdata, unsigned pdata_len,
		bool can_wakeup, int irq0, int irq1)
D
David Brownell 已提交
496
{
497
	struct platform_device	*pdev;
B
Balaji T K 已提交
498
	struct twl_client	*twl = &twl_modules[chip];
499 500
	int			status;

501
	pdev = platform_device_alloc(name, num);
502 503 504 505 506
	if (!pdev) {
		dev_dbg(&twl->client->dev, "can't alloc dev\n");
		status = -ENOMEM;
		goto err;
	}
D
David Brownell 已提交
507

508 509
	device_init_wakeup(&pdev->dev, can_wakeup);
	pdev->dev.parent = &twl->client->dev;
D
David Brownell 已提交
510

511 512 513 514
	if (pdata) {
		status = platform_device_add_data(pdev, pdata, pdata_len);
		if (status < 0) {
			dev_dbg(&pdev->dev, "can't add platform_data\n");
D
David Brownell 已提交
515 516
			goto err;
		}
517
	}
D
David Brownell 已提交
518

519 520 521 522 523
	if (irq0) {
		struct resource r[2] = {
			{ .start = irq0, .flags = IORESOURCE_IRQ, },
			{ .start = irq1, .flags = IORESOURCE_IRQ, },
		};
D
David Brownell 已提交
524

525
		status = platform_device_add_resources(pdev, r, irq1 ? 2 : 1);
D
David Brownell 已提交
526
		if (status < 0) {
527
			dev_dbg(&pdev->dev, "can't add irqs\n");
D
David Brownell 已提交
528 529 530 531
			goto err;
		}
	}

532
	status = platform_device_add(pdev);
D
David Brownell 已提交
533

534 535 536 537 538 539 540 541
err:
	if (status < 0) {
		platform_device_put(pdev);
		dev_err(&twl->client->dev, "can't add %s dev\n", name);
		return ERR_PTR(status);
	}
	return &pdev->dev;
}
D
David Brownell 已提交
542

543 544 545 546 547 548 549 550 551 552 553 554 555
static inline struct device *add_child(unsigned chip, const char *name,
		void *pdata, unsigned pdata_len,
		bool can_wakeup, int irq0, int irq1)
{
	return add_numbered_child(chip, name, -1, pdata, pdata_len,
		can_wakeup, irq0, irq1);
}

static struct device *
add_regulator_linked(int num, struct regulator_init_data *pdata,
		struct regulator_consumer_supply *consumers,
		unsigned num_consumers)
{
556
	unsigned sub_chip_id;
557 558 559 560
	/* regulator framework demands init_data ... */
	if (!pdata)
		return NULL;

561
	if (consumers) {
562 563 564 565 566
		pdata->consumer_supplies = consumers;
		pdata->num_consumer_supplies = num_consumers;
	}

	/* NOTE:  we currently ignore regulator IRQs, e.g. for short circuits */
567 568
	sub_chip_id = twl_map[TWL_MODULE_PM_MASTER].sid;
	return add_numbered_child(sub_chip_id, "twl_reg", num,
569 570 571 572 573 574 575 576 577
		pdata, sizeof(*pdata), false, 0, 0);
}

static struct device *
add_regulator(int num, struct regulator_init_data *pdata)
{
	return add_regulator_linked(num, pdata, NULL, 0);
}

578 579 580 581 582
/*
 * NOTE:  We know the first 8 IRQs after pdata->base_irq are
 * for the PIH, and the next are for the PWR_INT SIH, since
 * that's how twl_init_irq() sets things up.
 */
D
David Brownell 已提交
583

584 585
static int
add_children(struct twl4030_platform_data *pdata, unsigned long features)
586 587
{
	struct device	*child;
588
	unsigned sub_chip_id;
D
David Brownell 已提交
589

I
Ilkka Koskinen 已提交
590 591
	if (twl_has_bci() && pdata->bci &&
	    !(features & (TPS_SUBSET | TWL5031))) {
592 593 594 595
		child = add_child(3, "twl4030_bci",
				pdata->bci, sizeof(*pdata->bci),
				false,
				/* irq0 = CHG_PRES, irq1 = BCI */
B
Balaji T K 已提交
596 597
				pdata->irq_base + BCI_PRES_INTR_OFFSET,
				pdata->irq_base + BCI_INTR_OFFSET);
598 599 600
		if (IS_ERR(child))
			return PTR_ERR(child);
	}
D
David Brownell 已提交
601

602
	if (twl_has_gpio() && pdata->gpio) {
B
Balaji T K 已提交
603
		child = add_child(SUB_CHIP_ID1, "twl4030_gpio",
604
				pdata->gpio, sizeof(*pdata->gpio),
B
Balaji T K 已提交
605
				false, pdata->irq_base + GPIO_INTR_OFFSET, 0);
606 607
		if (IS_ERR(child))
			return PTR_ERR(child);
D
David Brownell 已提交
608 609 610
	}

	if (twl_has_keypad() && pdata->keypad) {
B
Balaji T K 已提交
611
		child = add_child(SUB_CHIP_ID2, "twl4030_keypad",
612
				pdata->keypad, sizeof(*pdata->keypad),
B
Balaji T K 已提交
613
				true, pdata->irq_base + KEYPAD_INTR_OFFSET, 0);
614 615
		if (IS_ERR(child))
			return PTR_ERR(child);
D
David Brownell 已提交
616 617 618
	}

	if (twl_has_madc() && pdata->madc) {
619 620
		child = add_child(2, "twl4030_madc",
				pdata->madc, sizeof(*pdata->madc),
B
Balaji T K 已提交
621
				true, pdata->irq_base + MADC_INTR_OFFSET, 0);
622 623
		if (IS_ERR(child))
			return PTR_ERR(child);
D
David Brownell 已提交
624 625 626 627
	}

	if (twl_has_rtc()) {
		/*
628
		 * REVISIT platform_data here currently might expose the
D
David Brownell 已提交
629
		 * "msecure" line ... but for now we just expect board
630
		 * setup to tell the chip "it's always ok to SET_TIME".
D
David Brownell 已提交
631 632 633
		 * Eventually, Linux might become more aware of such
		 * HW security concerns, and "least privilege".
		 */
634 635
		sub_chip_id = twl_map[TWL_MODULE_RTC].sid;
		child = add_child(sub_chip_id, "twl_rtc",
636
				NULL, 0,
B
Balaji T K 已提交
637
				true, pdata->irq_base + RTC_INTR_OFFSET, 0);
638 639
		if (IS_ERR(child))
			return PTR_ERR(child);
D
David Brownell 已提交
640 641
	}

642
	if (twl_has_usb() && pdata->usb && twl_class_is_4030()) {
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682

		static struct regulator_consumer_supply usb1v5 = {
			.supply =	"usb1v5",
		};
		static struct regulator_consumer_supply usb1v8 = {
			.supply =	"usb1v8",
		};
		static struct regulator_consumer_supply usb3v1 = {
			.supply =	"usb3v1",
		};

	/* First add the regulators so that they can be used by transceiver */
		if (twl_has_regulator()) {
			/* this is a template that gets copied */
			struct regulator_init_data usb_fixed = {
				.constraints.valid_modes_mask =
					REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
				.constraints.valid_ops_mask =
					REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
			};

			child = add_regulator_linked(TWL4030_REG_VUSB1V5,
						      &usb_fixed, &usb1v5, 1);
			if (IS_ERR(child))
				return PTR_ERR(child);

			child = add_regulator_linked(TWL4030_REG_VUSB1V8,
						      &usb_fixed, &usb1v8, 1);
			if (IS_ERR(child))
				return PTR_ERR(child);

			child = add_regulator_linked(TWL4030_REG_VUSB3V1,
						      &usb_fixed, &usb3v1, 1);
			if (IS_ERR(child))
				return PTR_ERR(child);

		}

683 684 685 686
		child = add_child(0, "twl4030_usb",
				pdata->usb, sizeof(*pdata->usb),
				true,
				/* irq0 = USB_PRES, irq1 = USB */
B
Balaji T K 已提交
687 688
				pdata->irq_base + USB_PRES_INTR_OFFSET,
				pdata->irq_base + USB_INTR_OFFSET);
689

690 691
		if (IS_ERR(child))
			return PTR_ERR(child);
692 693

		/* we need to connect regulators to this transceiver */
694 695 696 697 698
		if (twl_has_regulator() && child) {
			usb1v5.dev = child;
			usb1v8.dev = child;
			usb3v1.dev = child;
		}
699 700
	}

701 702 703
	if (twl_has_watchdog()) {
		child = add_child(0, "twl4030_wdt", NULL, 0, false, 0, 0);
		if (IS_ERR(child))
704 705 706 707 708 709 710
			return PTR_ERR(child);
	}

	if (twl_has_pwrbutton()) {
		child = add_child(1, "twl4030_pwrbutton",
				NULL, 0, true, pdata->irq_base + 8 + 0, 0);
		if (IS_ERR(child))
711 712 713
			return PTR_ERR(child);
	}

714 715 716 717 718 719 720 721
	if (twl_has_codec() && pdata->codec) {
		child = add_child(1, "twl4030_codec",
				pdata->codec, sizeof(*pdata->codec),
				false, 0, 0);
		if (IS_ERR(child))
			return PTR_ERR(child);
	}

722 723
	/* twl4030 regulators */
	if (twl_has_regulator() && twl_class_is_4030()) {
724 725 726
		child = add_regulator(TWL4030_REG_VPLL1, pdata->vpll1);
		if (IS_ERR(child))
			return PTR_ERR(child);
727 728 729 730 731 732 733 734 735 736 737 738

		child = add_regulator(TWL4030_REG_VIO, pdata->vio);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VDD1, pdata->vdd1);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VDD2, pdata->vdd2);
		if (IS_ERR(child))
			return PTR_ERR(child);
739 740 741 742 743 744 745 746 747 748 749 750 751 752 753

		child = add_regulator(TWL4030_REG_VMMC1, pdata->vmmc1);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VDAC, pdata->vdac);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator((features & TWL4030_VAUX2)
					? TWL4030_REG_VAUX2_4030
					: TWL4030_REG_VAUX2,
				pdata->vaux2);
		if (IS_ERR(child))
			return PTR_ERR(child);
754 755 756 757 758 759 760 761 762 763 764 765

		child = add_regulator(TWL4030_REG_VINTANA1, pdata->vintana1);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VINTANA2, pdata->vintana2);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VINTDIG, pdata->vintdig);
		if (IS_ERR(child))
			return PTR_ERR(child);
766 767 768
	}

	/* maybe add LDOs that are omitted on cost-reduced parts */
769 770
	if (twl_has_regulator() && !(features & TPS_SUBSET)
	  && twl_class_is_4030()) {
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
		child = add_regulator(TWL4030_REG_VPLL2, pdata->vpll2);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VMMC2, pdata->vmmc2);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VSIM, pdata->vsim);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VAUX1, pdata->vaux1);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VAUX3, pdata->vaux3);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL4030_REG_VAUX4, pdata->vaux4);
		if (IS_ERR(child))
			return PTR_ERR(child);
D
David Brownell 已提交
794 795
	}

796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838
	/* twl6030 regulators */
	if (twl_has_regulator() && twl_class_is_6030()) {
		child = add_regulator(TWL6030_REG_VMMC, pdata->vmmc);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VPP, pdata->vpp);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VUSIM, pdata->vusim);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VANA, pdata->vana);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VCXIO, pdata->vcxio);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VDAC, pdata->vdac);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VUSB, pdata->vusb);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VAUX1_6030, pdata->vaux1);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VAUX2_6030, pdata->vaux2);
		if (IS_ERR(child))
			return PTR_ERR(child);

		child = add_regulator(TWL6030_REG_VAUX3_6030, pdata->vaux3);
		if (IS_ERR(child))
			return PTR_ERR(child);
	}

839
	return 0;
D
David Brownell 已提交
840 841 842 843 844 845 846 847 848 849 850 851 852
}

/*----------------------------------------------------------------------*/

/*
 * These three functions initialize the on-chip clock framework,
 * letting it generate the right frequencies for USB, MADC, and
 * other purposes.
 */
static inline int __init protect_pm_master(void)
{
	int e = 0;

B
Balaji T K 已提交
853
	e = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_LOCK,
D
David Brownell 已提交
854 855 856 857 858 859 860 861
			R_PROTECT_KEY);
	return e;
}

static inline int __init unprotect_pm_master(void)
{
	int e = 0;

B
Balaji T K 已提交
862
	e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK1,
D
David Brownell 已提交
863
			R_PROTECT_KEY);
B
Balaji T K 已提交
864
	e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK2,
D
David Brownell 已提交
865 866 867 868
			R_PROTECT_KEY);
	return e;
}

869 870
static void clocks_init(struct device *dev,
			struct twl4030_clock_init_data *clock)
D
David Brownell 已提交
871 872 873 874 875 876 877 878
{
	int e = 0;
	struct clk *osc;
	u32 rate;
	u8 ctrl = HFCLK_FREQ_26_MHZ;

#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
	if (cpu_is_omap2430())
R
Russell King 已提交
879
		osc = clk_get(dev, "osc_ck");
D
David Brownell 已提交
880
	else
R
Russell King 已提交
881
		osc = clk_get(dev, "osc_sys_ck");
882

D
David Brownell 已提交
883
	if (IS_ERR(osc)) {
B
Balaji T K 已提交
884
		printk(KERN_WARNING "Skipping twl internal clock init and "
D
David Brownell 已提交
885 886 887 888 889 890 891
				"using bootloader value (unknown osc rate)\n");
		return;
	}

	rate = clk_get_rate(osc);
	clk_put(osc);

892 893 894 895 896 897
#else
	/* REVISIT for non-OMAP systems, pass the clock rate from
	 * board init code, using platform_data.
	 */
	osc = ERR_PTR(-EIO);

B
Balaji T K 已提交
898
	printk(KERN_WARNING "Skipping twl internal clock init and "
899 900 901 902 903
	       "using bootloader value (unknown osc rate)\n");

	return;
#endif

D
David Brownell 已提交
904 905 906 907 908 909 910 911 912 913 914 915 916
	switch (rate) {
	case 19200000:
		ctrl = HFCLK_FREQ_19p2_MHZ;
		break;
	case 26000000:
		ctrl = HFCLK_FREQ_26_MHZ;
		break;
	case 38400000:
		ctrl = HFCLK_FREQ_38p4_MHZ;
		break;
	}

	ctrl |= HIGH_PERF_SQ;
917 918 919
	if (clock && clock->ck32k_lowpwr_enable)
		ctrl |= CK32K_LOWPWR_EN;

D
David Brownell 已提交
920 921
	e |= unprotect_pm_master();
	/* effect->MADC+USB ck en */
B
Balaji T K 已提交
922
	e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, ctrl, R_CFG_BOOT);
D
David Brownell 已提交
923 924 925 926 927 928 929 930
	e |= protect_pm_master();

	if (e < 0)
		pr_err("%s: clock init err [%d]\n", DRIVER_NAME, e);
}

/*----------------------------------------------------------------------*/

931 932 933 934 935
int twl4030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end);
int twl4030_exit_irq(void);
int twl4030_init_chip_irq(const char *chip);
int twl6030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end);
int twl6030_exit_irq(void);
D
David Brownell 已提交
936

B
Balaji T K 已提交
937
static int twl_remove(struct i2c_client *client)
D
David Brownell 已提交
938 939
{
	unsigned i;
D
David Brownell 已提交
940
	int status;
D
David Brownell 已提交
941

942 943 944 945 946
	if (twl_class_is_4030())
		status = twl4030_exit_irq();
	else
		status = twl6030_exit_irq();

D
David Brownell 已提交
947 948
	if (status < 0)
		return status;
D
David Brownell 已提交
949

B
Balaji T K 已提交
950 951
	for (i = 0; i < TWL_NUM_SLAVES; i++) {
		struct twl_client	*twl = &twl_modules[i];
D
David Brownell 已提交
952 953 954

		if (twl->client && twl->client != client)
			i2c_unregister_device(twl->client);
B
Balaji T K 已提交
955
		twl_modules[i].client = NULL;
D
David Brownell 已提交
956 957 958 959 960 961
	}
	inuse = false;
	return 0;
}

/* NOTE:  this driver only handles a single twl4030/tps659x0 chip */
962
static int __init
B
Balaji T K 已提交
963
twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
D
David Brownell 已提交
964 965 966 967 968 969 970 971 972 973 974 975 976 977 978
{
	int				status;
	unsigned			i;
	struct twl4030_platform_data	*pdata = client->dev.platform_data;

	if (!pdata) {
		dev_dbg(&client->dev, "no platform data?\n");
		return -EINVAL;
	}

	if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
		dev_dbg(&client->dev, "can't talk I2C?\n");
		return -EIO;
	}

D
David Brownell 已提交
979
	if (inuse) {
D
David Brownell 已提交
980 981 982 983
		dev_dbg(&client->dev, "driver is already in use\n");
		return -EBUSY;
	}

B
Balaji T K 已提交
984 985
	for (i = 0; i < TWL_NUM_SLAVES; i++) {
		struct twl_client	*twl = &twl_modules[i];
D
David Brownell 已提交
986 987 988 989 990 991 992 993

		twl->address = client->addr + i;
		if (i == 0)
			twl->client = client;
		else {
			twl->client = i2c_new_dummy(client->adapter,
					twl->address);
			if (!twl->client) {
994
				dev_err(&client->dev,
D
David Brownell 已提交
995 996 997 998 999 1000 1001 1002
					"can't attach client %d\n", i);
				status = -ENOMEM;
				goto fail;
			}
		}
		mutex_init(&twl->xfer_lock);
	}
	inuse = true;
1003 1004 1005 1006 1007 1008 1009
	if ((id->driver_data) & TWL6030_CLASS) {
		twl_id = TWL6030_CLASS_ID;
		twl_map = &twl6030_map[0];
	} else {
		twl_id = TWL4030_CLASS_ID;
		twl_map = &twl4030_map[0];
	}
D
David Brownell 已提交
1010 1011

	/* setup clock framework */
1012
	clocks_init(&client->dev, pdata->clock);
D
David Brownell 已提交
1013

1014 1015 1016 1017
	/* load power event scripts */
	if (twl_has_power() && pdata->power)
		twl4030_power_init(pdata->power);

D
David Brownell 已提交
1018 1019 1020 1021
	/* Maybe init the T2 Interrupt subsystem */
	if (client->irq
			&& pdata->irq_base
			&& pdata->irq_end > pdata->irq_base) {
1022 1023 1024 1025 1026 1027 1028 1029 1030
		if (twl_class_is_4030()) {
			twl4030_init_chip_irq(id->name);
			status = twl4030_init_irq(client->irq, pdata->irq_base,
			pdata->irq_end);
		} else {
			status = twl6030_init_irq(client->irq, pdata->irq_base,
			pdata->irq_end);
		}

D
David Brownell 已提交
1031 1032
		if (status < 0)
			goto fail;
D
David Brownell 已提交
1033 1034
	}

1035
	status = add_children(pdata, id->driver_data);
D
David Brownell 已提交
1036 1037
fail:
	if (status < 0)
B
Balaji T K 已提交
1038
		twl_remove(client);
D
David Brownell 已提交
1039 1040 1041
	return status;
}

B
Balaji T K 已提交
1042
static const struct i2c_device_id twl_ids[] = {
1043 1044
	{ "twl4030", TWL4030_VAUX2 },	/* "Triton 2" */
	{ "twl5030", 0 },		/* T2 updated */
I
Ilkka Koskinen 已提交
1045
	{ "twl5031", TWL5031 },		/* TWL5030 updated */
1046 1047 1048
	{ "tps65950", 0 },		/* catalog version of twl5030 */
	{ "tps65930", TPS_SUBSET },	/* fewer LDOs and DACs; no charger */
	{ "tps65920", TPS_SUBSET },	/* fewer LDOs; no codec or charger */
1049
	{ "twl6030", TWL6030_CLASS },	/* "Phoenix power chip" */
D
David Brownell 已提交
1050 1051
	{ /* end of list */ },
};
B
Balaji T K 已提交
1052
MODULE_DEVICE_TABLE(i2c, twl_ids);
D
David Brownell 已提交
1053 1054

/* One Client Driver , 4 Clients */
B
Balaji T K 已提交
1055
static struct i2c_driver twl_driver = {
D
David Brownell 已提交
1056
	.driver.name	= DRIVER_NAME,
B
Balaji T K 已提交
1057 1058 1059
	.id_table	= twl_ids,
	.probe		= twl_probe,
	.remove		= twl_remove,
D
David Brownell 已提交
1060 1061
};

B
Balaji T K 已提交
1062
static int __init twl_init(void)
D
David Brownell 已提交
1063
{
B
Balaji T K 已提交
1064
	return i2c_add_driver(&twl_driver);
D
David Brownell 已提交
1065
}
B
Balaji T K 已提交
1066
subsys_initcall(twl_init);
D
David Brownell 已提交
1067

B
Balaji T K 已提交
1068
static void __exit twl_exit(void)
D
David Brownell 已提交
1069
{
B
Balaji T K 已提交
1070
	i2c_del_driver(&twl_driver);
D
David Brownell 已提交
1071
}
B
Balaji T K 已提交
1072
module_exit(twl_exit);
D
David Brownell 已提交
1073 1074

MODULE_AUTHOR("Texas Instruments, Inc.");
B
Balaji T K 已提交
1075
MODULE_DESCRIPTION("I2C Core interface for TWL");
D
David Brownell 已提交
1076
MODULE_LICENSE("GPL");