cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wm8350-regulator.c (33456B)


      1// SPDX-License-Identifier: GPL-2.0+
      2//
      3// wm8350.c  --  Voltage and current regulation for the Wolfson WM8350 PMIC
      4//
      5// Copyright 2007, 2008 Wolfson Microelectronics PLC.
      6//
      7// Author: Liam Girdwood
      8//         linux@wolfsonmicro.com
      9
     10#include <linux/module.h>
     11#include <linux/moduleparam.h>
     12#include <linux/init.h>
     13#include <linux/bitops.h>
     14#include <linux/err.h>
     15#include <linux/i2c.h>
     16#include <linux/mfd/wm8350/core.h>
     17#include <linux/mfd/wm8350/pmic.h>
     18#include <linux/platform_device.h>
     19#include <linux/regulator/driver.h>
     20#include <linux/regulator/machine.h>
     21
     22/* Maximum value possible for VSEL */
     23#define WM8350_DCDC_MAX_VSEL 0x66
     24
     25/* Microamps */
     26static const unsigned int isink_cur[] = {
     27	4,
     28	5,
     29	6,
     30	7,
     31	8,
     32	10,
     33	11,
     34	14,
     35	16,
     36	19,
     37	23,
     38	27,
     39	32,
     40	39,
     41	46,
     42	54,
     43	65,
     44	77,
     45	92,
     46	109,
     47	130,
     48	154,
     49	183,
     50	218,
     51	259,
     52	308,
     53	367,
     54	436,
     55	518,
     56	616,
     57	733,
     58	872,
     59	1037,
     60	1233,
     61	1466,
     62	1744,
     63	2073,
     64	2466,
     65	2933,
     66	3487,
     67	4147,
     68	4932,
     69	5865,
     70	6975,
     71	8294,
     72	9864,
     73	11730,
     74	13949,
     75	16589,
     76	19728,
     77	23460,
     78	27899,
     79	33178,
     80	39455,
     81	46920,
     82	55798,
     83	66355,
     84	78910,
     85	93840,
     86	111596,
     87	132710,
     88	157820,
     89	187681,
     90	223191
     91};
     92
     93/* turn on ISINK followed by DCDC */
     94static int wm8350_isink_enable(struct regulator_dev *rdev)
     95{
     96	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
     97	int isink = rdev_get_id(rdev);
     98
     99	switch (isink) {
    100	case WM8350_ISINK_A:
    101		switch (wm8350->pmic.isink_A_dcdc) {
    102		case WM8350_DCDC_2:
    103		case WM8350_DCDC_5:
    104			wm8350_set_bits(wm8350, WM8350_POWER_MGMT_7,
    105					WM8350_CS1_ENA);
    106			wm8350_set_bits(wm8350, WM8350_CSA_FLASH_CONTROL,
    107					WM8350_CS1_DRIVE);
    108			wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
    109					1 << (wm8350->pmic.isink_A_dcdc -
    110					      WM8350_DCDC_1));
    111			break;
    112		default:
    113			return -EINVAL;
    114		}
    115		break;
    116	case WM8350_ISINK_B:
    117		switch (wm8350->pmic.isink_B_dcdc) {
    118		case WM8350_DCDC_2:
    119		case WM8350_DCDC_5:
    120			wm8350_set_bits(wm8350, WM8350_POWER_MGMT_7,
    121					WM8350_CS2_ENA);
    122			wm8350_set_bits(wm8350, WM8350_CSB_FLASH_CONTROL,
    123					WM8350_CS2_DRIVE);
    124			wm8350_set_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
    125					1 << (wm8350->pmic.isink_B_dcdc -
    126					      WM8350_DCDC_1));
    127			break;
    128		default:
    129			return -EINVAL;
    130		}
    131		break;
    132	default:
    133		return -EINVAL;
    134	}
    135	return 0;
    136}
    137
    138static int wm8350_isink_disable(struct regulator_dev *rdev)
    139{
    140	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    141	int isink = rdev_get_id(rdev);
    142
    143	switch (isink) {
    144	case WM8350_ISINK_A:
    145		switch (wm8350->pmic.isink_A_dcdc) {
    146		case WM8350_DCDC_2:
    147		case WM8350_DCDC_5:
    148			wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
    149					  1 << (wm8350->pmic.isink_A_dcdc -
    150						WM8350_DCDC_1));
    151			wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_7,
    152					  WM8350_CS1_ENA);
    153			break;
    154		default:
    155			return -EINVAL;
    156		}
    157		break;
    158	case WM8350_ISINK_B:
    159		switch (wm8350->pmic.isink_B_dcdc) {
    160		case WM8350_DCDC_2:
    161		case WM8350_DCDC_5:
    162			wm8350_clear_bits(wm8350, WM8350_DCDC_LDO_REQUESTED,
    163					  1 << (wm8350->pmic.isink_B_dcdc -
    164						WM8350_DCDC_1));
    165			wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_7,
    166					  WM8350_CS2_ENA);
    167			break;
    168		default:
    169			return -EINVAL;
    170		}
    171		break;
    172	default:
    173		return -EINVAL;
    174	}
    175	return 0;
    176}
    177
    178static int wm8350_isink_is_enabled(struct regulator_dev *rdev)
    179{
    180	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    181	int isink = rdev_get_id(rdev);
    182
    183	switch (isink) {
    184	case WM8350_ISINK_A:
    185		return wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_A) &
    186		    0x8000;
    187	case WM8350_ISINK_B:
    188		return wm8350_reg_read(wm8350, WM8350_CURRENT_SINK_DRIVER_B) &
    189		    0x8000;
    190	}
    191	return -EINVAL;
    192}
    193
    194static int wm8350_isink_enable_time(struct regulator_dev *rdev)
    195{
    196	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    197	int isink = rdev_get_id(rdev);
    198	int reg;
    199
    200	switch (isink) {
    201	case WM8350_ISINK_A:
    202		reg = wm8350_reg_read(wm8350, WM8350_CSA_FLASH_CONTROL);
    203		break;
    204	case WM8350_ISINK_B:
    205		reg = wm8350_reg_read(wm8350, WM8350_CSB_FLASH_CONTROL);
    206		break;
    207	default:
    208		return -EINVAL;
    209	}
    210
    211	if (reg & WM8350_CS1_FLASH_MODE) {
    212		switch (reg & WM8350_CS1_ON_RAMP_MASK) {
    213		case 0:
    214			return 0;
    215		case 1:
    216			return 1950;
    217		case 2:
    218			return 3910;
    219		case 3:
    220			return 7800;
    221		}
    222	} else {
    223		switch (reg & WM8350_CS1_ON_RAMP_MASK) {
    224		case 0:
    225			return 0;
    226		case 1:
    227			return 250000;
    228		case 2:
    229			return 500000;
    230		case 3:
    231			return 1000000;
    232		}
    233	}
    234
    235	return -EINVAL;
    236}
    237
    238
    239int wm8350_isink_set_flash(struct wm8350 *wm8350, int isink, u16 mode,
    240			   u16 trigger, u16 duration, u16 on_ramp, u16 off_ramp,
    241			   u16 drive)
    242{
    243	switch (isink) {
    244	case WM8350_ISINK_A:
    245		wm8350_reg_write(wm8350, WM8350_CSA_FLASH_CONTROL,
    246				 (mode ? WM8350_CS1_FLASH_MODE : 0) |
    247				 (trigger ? WM8350_CS1_TRIGSRC : 0) |
    248				 duration | on_ramp | off_ramp | drive);
    249		break;
    250	case WM8350_ISINK_B:
    251		wm8350_reg_write(wm8350, WM8350_CSB_FLASH_CONTROL,
    252				 (mode ? WM8350_CS2_FLASH_MODE : 0) |
    253				 (trigger ? WM8350_CS2_TRIGSRC : 0) |
    254				 duration | on_ramp | off_ramp | drive);
    255		break;
    256	default:
    257		return -EINVAL;
    258	}
    259	return 0;
    260}
    261EXPORT_SYMBOL_GPL(wm8350_isink_set_flash);
    262
    263static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV)
    264{
    265	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    266	int sel, volt_reg, dcdc = rdev_get_id(rdev);
    267	u16 val;
    268
    269	dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, uV / 1000);
    270
    271	switch (dcdc) {
    272	case WM8350_DCDC_1:
    273		volt_reg = WM8350_DCDC1_LOW_POWER;
    274		break;
    275	case WM8350_DCDC_3:
    276		volt_reg = WM8350_DCDC3_LOW_POWER;
    277		break;
    278	case WM8350_DCDC_4:
    279		volt_reg = WM8350_DCDC4_LOW_POWER;
    280		break;
    281	case WM8350_DCDC_6:
    282		volt_reg = WM8350_DCDC6_LOW_POWER;
    283		break;
    284	case WM8350_DCDC_2:
    285	case WM8350_DCDC_5:
    286	default:
    287		return -EINVAL;
    288	}
    289
    290	sel = regulator_map_voltage_linear(rdev, uV, uV);
    291	if (sel < 0)
    292		return sel;
    293
    294	/* all DCDCs have same mV bits */
    295	val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK;
    296	wm8350_reg_write(wm8350, volt_reg, val | sel);
    297	return 0;
    298}
    299
    300static int wm8350_dcdc_set_suspend_enable(struct regulator_dev *rdev)
    301{
    302	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    303	int dcdc = rdev_get_id(rdev);
    304	u16 val;
    305
    306	switch (dcdc) {
    307	case WM8350_DCDC_1:
    308		val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER)
    309			& ~WM8350_DCDC_HIB_MODE_MASK;
    310		wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER,
    311			val | wm8350->pmic.dcdc1_hib_mode);
    312		break;
    313	case WM8350_DCDC_3:
    314		val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER)
    315			& ~WM8350_DCDC_HIB_MODE_MASK;
    316		wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER,
    317			val | wm8350->pmic.dcdc3_hib_mode);
    318		break;
    319	case WM8350_DCDC_4:
    320		val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER)
    321			& ~WM8350_DCDC_HIB_MODE_MASK;
    322		wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER,
    323			val | wm8350->pmic.dcdc4_hib_mode);
    324		break;
    325	case WM8350_DCDC_6:
    326		val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER)
    327			& ~WM8350_DCDC_HIB_MODE_MASK;
    328		wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER,
    329			val | wm8350->pmic.dcdc6_hib_mode);
    330		break;
    331	case WM8350_DCDC_2:
    332	case WM8350_DCDC_5:
    333	default:
    334		return -EINVAL;
    335	}
    336
    337	return 0;
    338}
    339
    340static int wm8350_dcdc_set_suspend_disable(struct regulator_dev *rdev)
    341{
    342	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    343	int dcdc = rdev_get_id(rdev);
    344	u16 val;
    345
    346	switch (dcdc) {
    347	case WM8350_DCDC_1:
    348		val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER);
    349		wm8350->pmic.dcdc1_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
    350		wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER,
    351				 val | WM8350_DCDC_HIB_MODE_DIS);
    352		break;
    353	case WM8350_DCDC_3:
    354		val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER);
    355		wm8350->pmic.dcdc3_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
    356		wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER,
    357				 val | WM8350_DCDC_HIB_MODE_DIS);
    358		break;
    359	case WM8350_DCDC_4:
    360		val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER);
    361		wm8350->pmic.dcdc4_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
    362		wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER,
    363				 val | WM8350_DCDC_HIB_MODE_DIS);
    364		break;
    365	case WM8350_DCDC_6:
    366		val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER);
    367		wm8350->pmic.dcdc6_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
    368		wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER,
    369				 val | WM8350_DCDC_HIB_MODE_DIS);
    370		break;
    371	case WM8350_DCDC_2:
    372	case WM8350_DCDC_5:
    373	default:
    374		return -EINVAL;
    375	}
    376
    377	return 0;
    378}
    379
    380static int wm8350_dcdc25_set_suspend_enable(struct regulator_dev *rdev)
    381{
    382	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    383	int dcdc = rdev_get_id(rdev);
    384	u16 val;
    385
    386	switch (dcdc) {
    387	case WM8350_DCDC_2:
    388		val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
    389		    & ~WM8350_DC2_HIB_MODE_MASK;
    390		wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
    391		    (WM8350_DC2_HIB_MODE_ACTIVE << WM8350_DC2_HIB_MODE_SHIFT));
    392		break;
    393	case WM8350_DCDC_5:
    394		val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
    395		    & ~WM8350_DC5_HIB_MODE_MASK;
    396		wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
    397		    (WM8350_DC5_HIB_MODE_ACTIVE << WM8350_DC5_HIB_MODE_SHIFT));
    398		break;
    399	default:
    400		return -EINVAL;
    401	}
    402	return 0;
    403}
    404
    405static int wm8350_dcdc25_set_suspend_disable(struct regulator_dev *rdev)
    406{
    407	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    408	int dcdc = rdev_get_id(rdev);
    409	u16 val;
    410
    411	switch (dcdc) {
    412	case WM8350_DCDC_2:
    413		val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
    414		    & ~WM8350_DC2_HIB_MODE_MASK;
    415		wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
    416		    (WM8350_DC2_HIB_MODE_DISABLE << WM8350_DC2_HIB_MODE_SHIFT));
    417		break;
    418	case WM8350_DCDC_5:
    419		val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
    420		    & ~WM8350_DC5_HIB_MODE_MASK;
    421		wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
    422		    (WM8350_DC5_HIB_MODE_DISABLE << WM8350_DC5_HIB_MODE_SHIFT));
    423		break;
    424	default:
    425		return -EINVAL;
    426	}
    427	return 0;
    428}
    429
    430static int wm8350_dcdc_set_suspend_mode(struct regulator_dev *rdev,
    431	unsigned int mode)
    432{
    433	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    434	int dcdc = rdev_get_id(rdev);
    435	u16 *hib_mode;
    436
    437	switch (dcdc) {
    438	case WM8350_DCDC_1:
    439		hib_mode = &wm8350->pmic.dcdc1_hib_mode;
    440		break;
    441	case WM8350_DCDC_3:
    442		hib_mode = &wm8350->pmic.dcdc3_hib_mode;
    443		break;
    444	case WM8350_DCDC_4:
    445		hib_mode = &wm8350->pmic.dcdc4_hib_mode;
    446		break;
    447	case WM8350_DCDC_6:
    448		hib_mode = &wm8350->pmic.dcdc6_hib_mode;
    449		break;
    450	case WM8350_DCDC_2:
    451	case WM8350_DCDC_5:
    452	default:
    453		return -EINVAL;
    454	}
    455
    456	switch (mode) {
    457	case REGULATOR_MODE_NORMAL:
    458		*hib_mode = WM8350_DCDC_HIB_MODE_IMAGE;
    459		break;
    460	case REGULATOR_MODE_IDLE:
    461		*hib_mode = WM8350_DCDC_HIB_MODE_STANDBY;
    462		break;
    463	case REGULATOR_MODE_STANDBY:
    464		*hib_mode = WM8350_DCDC_HIB_MODE_LDO_IM;
    465		break;
    466	default:
    467		return -EINVAL;
    468	}
    469
    470	return 0;
    471}
    472
    473static const struct linear_range wm8350_ldo_ranges[] = {
    474	REGULATOR_LINEAR_RANGE(900000, 0, 15, 50000),
    475	REGULATOR_LINEAR_RANGE(1800000, 16, 31, 100000),
    476};
    477
    478static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV)
    479{
    480	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    481	int sel, volt_reg, ldo = rdev_get_id(rdev);
    482	u16 val;
    483
    484	dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, uV / 1000);
    485
    486	switch (ldo) {
    487	case WM8350_LDO_1:
    488		volt_reg = WM8350_LDO1_LOW_POWER;
    489		break;
    490	case WM8350_LDO_2:
    491		volt_reg = WM8350_LDO2_LOW_POWER;
    492		break;
    493	case WM8350_LDO_3:
    494		volt_reg = WM8350_LDO3_LOW_POWER;
    495		break;
    496	case WM8350_LDO_4:
    497		volt_reg = WM8350_LDO4_LOW_POWER;
    498		break;
    499	default:
    500		return -EINVAL;
    501	}
    502
    503	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
    504	if (sel < 0)
    505		return sel;
    506
    507	/* all LDOs have same mV bits */
    508	val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
    509	wm8350_reg_write(wm8350, volt_reg, val | sel);
    510	return 0;
    511}
    512
    513static int wm8350_ldo_set_suspend_enable(struct regulator_dev *rdev)
    514{
    515	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    516	int volt_reg, ldo = rdev_get_id(rdev);
    517	u16 val;
    518
    519	switch (ldo) {
    520	case WM8350_LDO_1:
    521		volt_reg = WM8350_LDO1_LOW_POWER;
    522		break;
    523	case WM8350_LDO_2:
    524		volt_reg = WM8350_LDO2_LOW_POWER;
    525		break;
    526	case WM8350_LDO_3:
    527		volt_reg = WM8350_LDO3_LOW_POWER;
    528		break;
    529	case WM8350_LDO_4:
    530		volt_reg = WM8350_LDO4_LOW_POWER;
    531		break;
    532	default:
    533		return -EINVAL;
    534	}
    535
    536	/* all LDOs have same mV bits */
    537	val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK;
    538	wm8350_reg_write(wm8350, volt_reg, val);
    539	return 0;
    540}
    541
    542static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)
    543{
    544	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    545	int volt_reg, ldo = rdev_get_id(rdev);
    546	u16 val;
    547
    548	switch (ldo) {
    549	case WM8350_LDO_1:
    550		volt_reg = WM8350_LDO1_LOW_POWER;
    551		break;
    552	case WM8350_LDO_2:
    553		volt_reg = WM8350_LDO2_LOW_POWER;
    554		break;
    555	case WM8350_LDO_3:
    556		volt_reg = WM8350_LDO3_LOW_POWER;
    557		break;
    558	case WM8350_LDO_4:
    559		volt_reg = WM8350_LDO4_LOW_POWER;
    560		break;
    561	default:
    562		return -EINVAL;
    563	}
    564
    565	/* all LDOs have same mV bits */
    566	val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK;
    567	wm8350_reg_write(wm8350, volt_reg, val | WM8350_LDO1_HIB_MODE_DIS);
    568	return 0;
    569}
    570
    571int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,
    572			 u16 stop, u16 fault)
    573{
    574	int slot_reg;
    575	u16 val;
    576
    577	dev_dbg(wm8350->dev, "%s %d start %d stop %d\n",
    578		__func__, dcdc, start, stop);
    579
    580	/* slot valid ? */
    581	if (start > 15 || stop > 15)
    582		return -EINVAL;
    583
    584	switch (dcdc) {
    585	case WM8350_DCDC_1:
    586		slot_reg = WM8350_DCDC1_TIMEOUTS;
    587		break;
    588	case WM8350_DCDC_2:
    589		slot_reg = WM8350_DCDC2_TIMEOUTS;
    590		break;
    591	case WM8350_DCDC_3:
    592		slot_reg = WM8350_DCDC3_TIMEOUTS;
    593		break;
    594	case WM8350_DCDC_4:
    595		slot_reg = WM8350_DCDC4_TIMEOUTS;
    596		break;
    597	case WM8350_DCDC_5:
    598		slot_reg = WM8350_DCDC5_TIMEOUTS;
    599		break;
    600	case WM8350_DCDC_6:
    601		slot_reg = WM8350_DCDC6_TIMEOUTS;
    602		break;
    603	default:
    604		return -EINVAL;
    605	}
    606
    607	val = wm8350_reg_read(wm8350, slot_reg) &
    608	    ~(WM8350_DC1_ENSLOT_MASK | WM8350_DC1_SDSLOT_MASK |
    609	      WM8350_DC1_ERRACT_MASK);
    610	wm8350_reg_write(wm8350, slot_reg,
    611			 val | (start << WM8350_DC1_ENSLOT_SHIFT) |
    612			 (stop << WM8350_DC1_SDSLOT_SHIFT) |
    613			 (fault << WM8350_DC1_ERRACT_SHIFT));
    614
    615	return 0;
    616}
    617EXPORT_SYMBOL_GPL(wm8350_dcdc_set_slot);
    618
    619int wm8350_ldo_set_slot(struct wm8350 *wm8350, int ldo, u16 start, u16 stop)
    620{
    621	int slot_reg;
    622	u16 val;
    623
    624	dev_dbg(wm8350->dev, "%s %d start %d stop %d\n",
    625		__func__, ldo, start, stop);
    626
    627	/* slot valid ? */
    628	if (start > 15 || stop > 15)
    629		return -EINVAL;
    630
    631	switch (ldo) {
    632	case WM8350_LDO_1:
    633		slot_reg = WM8350_LDO1_TIMEOUTS;
    634		break;
    635	case WM8350_LDO_2:
    636		slot_reg = WM8350_LDO2_TIMEOUTS;
    637		break;
    638	case WM8350_LDO_3:
    639		slot_reg = WM8350_LDO3_TIMEOUTS;
    640		break;
    641	case WM8350_LDO_4:
    642		slot_reg = WM8350_LDO4_TIMEOUTS;
    643		break;
    644	default:
    645		return -EINVAL;
    646	}
    647
    648	val = wm8350_reg_read(wm8350, slot_reg) & ~WM8350_LDO1_SDSLOT_MASK;
    649	wm8350_reg_write(wm8350, slot_reg, val | ((start << 10) | (stop << 6)));
    650	return 0;
    651}
    652EXPORT_SYMBOL_GPL(wm8350_ldo_set_slot);
    653
    654int wm8350_dcdc25_set_mode(struct wm8350 *wm8350, int dcdc, u16 mode,
    655			   u16 ilim, u16 ramp, u16 feedback)
    656{
    657	u16 val;
    658
    659	dev_dbg(wm8350->dev, "%s %d mode: %s %s\n", __func__, dcdc,
    660		mode ? "normal" : "boost", ilim ? "low" : "normal");
    661
    662	switch (dcdc) {
    663	case WM8350_DCDC_2:
    664		val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)
    665		    & ~(WM8350_DC2_MODE_MASK | WM8350_DC2_ILIM_MASK |
    666			WM8350_DC2_RMP_MASK | WM8350_DC2_FBSRC_MASK);
    667		wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val |
    668				 (mode << WM8350_DC2_MODE_SHIFT) |
    669				 (ilim << WM8350_DC2_ILIM_SHIFT) |
    670				 (ramp << WM8350_DC2_RMP_SHIFT) |
    671				 (feedback << WM8350_DC2_FBSRC_SHIFT));
    672		break;
    673	case WM8350_DCDC_5:
    674		val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL)
    675		    & ~(WM8350_DC5_MODE_MASK | WM8350_DC5_ILIM_MASK |
    676			WM8350_DC5_RMP_MASK | WM8350_DC5_FBSRC_MASK);
    677		wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val |
    678				 (mode << WM8350_DC5_MODE_SHIFT) |
    679				 (ilim << WM8350_DC5_ILIM_SHIFT) |
    680				 (ramp << WM8350_DC5_RMP_SHIFT) |
    681				 (feedback << WM8350_DC5_FBSRC_SHIFT));
    682		break;
    683	default:
    684		return -EINVAL;
    685	}
    686
    687	return 0;
    688}
    689EXPORT_SYMBOL_GPL(wm8350_dcdc25_set_mode);
    690
    691static int force_continuous_enable(struct wm8350 *wm8350, int dcdc, int enable)
    692{
    693	int reg = 0, ret;
    694
    695	switch (dcdc) {
    696	case WM8350_DCDC_1:
    697		reg = WM8350_DCDC1_FORCE_PWM;
    698		break;
    699	case WM8350_DCDC_3:
    700		reg = WM8350_DCDC3_FORCE_PWM;
    701		break;
    702	case WM8350_DCDC_4:
    703		reg = WM8350_DCDC4_FORCE_PWM;
    704		break;
    705	case WM8350_DCDC_6:
    706		reg = WM8350_DCDC6_FORCE_PWM;
    707		break;
    708	default:
    709		return -EINVAL;
    710	}
    711
    712	if (enable)
    713		ret = wm8350_set_bits(wm8350, reg,
    714			WM8350_DCDC1_FORCE_PWM_ENA);
    715	else
    716		ret = wm8350_clear_bits(wm8350, reg,
    717			WM8350_DCDC1_FORCE_PWM_ENA);
    718	return ret;
    719}
    720
    721static int wm8350_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
    722{
    723	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    724	int dcdc = rdev_get_id(rdev);
    725	u16 val;
    726
    727	if (dcdc < WM8350_DCDC_1 || dcdc > WM8350_DCDC_6)
    728		return -EINVAL;
    729
    730	if (dcdc == WM8350_DCDC_2 || dcdc == WM8350_DCDC_5)
    731		return -EINVAL;
    732
    733	val = 1 << (dcdc - WM8350_DCDC_1);
    734
    735	switch (mode) {
    736	case REGULATOR_MODE_FAST:
    737		/* force continuous mode */
    738		wm8350_set_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
    739		wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
    740		force_continuous_enable(wm8350, dcdc, 1);
    741		break;
    742	case REGULATOR_MODE_NORMAL:
    743		/* active / pulse skipping */
    744		wm8350_set_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
    745		wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
    746		force_continuous_enable(wm8350, dcdc, 0);
    747		break;
    748	case REGULATOR_MODE_IDLE:
    749		/* standby mode */
    750		force_continuous_enable(wm8350, dcdc, 0);
    751		wm8350_clear_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
    752		wm8350_clear_bits(wm8350, WM8350_DCDC_ACTIVE_OPTIONS, val);
    753		break;
    754	case REGULATOR_MODE_STANDBY:
    755		/* LDO mode */
    756		force_continuous_enable(wm8350, dcdc, 0);
    757		wm8350_set_bits(wm8350, WM8350_DCDC_SLEEP_OPTIONS, val);
    758		break;
    759	}
    760
    761	return 0;
    762}
    763
    764static unsigned int wm8350_dcdc_get_mode(struct regulator_dev *rdev)
    765{
    766	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
    767	int dcdc = rdev_get_id(rdev);
    768	u16 mask, sleep, active, force;
    769	int mode = REGULATOR_MODE_NORMAL;
    770	int reg;
    771
    772	switch (dcdc) {
    773	case WM8350_DCDC_1:
    774		reg = WM8350_DCDC1_FORCE_PWM;
    775		break;
    776	case WM8350_DCDC_3:
    777		reg = WM8350_DCDC3_FORCE_PWM;
    778		break;
    779	case WM8350_DCDC_4:
    780		reg = WM8350_DCDC4_FORCE_PWM;
    781		break;
    782	case WM8350_DCDC_6:
    783		reg = WM8350_DCDC6_FORCE_PWM;
    784		break;
    785	default:
    786		return -EINVAL;
    787	}
    788
    789	mask = 1 << (dcdc - WM8350_DCDC_1);
    790	active = wm8350_reg_read(wm8350, WM8350_DCDC_ACTIVE_OPTIONS) & mask;
    791	force = wm8350_reg_read(wm8350, reg) & WM8350_DCDC1_FORCE_PWM_ENA;
    792	sleep = wm8350_reg_read(wm8350, WM8350_DCDC_SLEEP_OPTIONS) & mask;
    793
    794	dev_dbg(wm8350->dev, "mask %x active %x sleep %x force %x",
    795		mask, active, sleep, force);
    796
    797	if (active && !sleep) {
    798		if (force)
    799			mode = REGULATOR_MODE_FAST;
    800		else
    801			mode = REGULATOR_MODE_NORMAL;
    802	} else if (!active && !sleep)
    803		mode = REGULATOR_MODE_IDLE;
    804	else if (sleep)
    805		mode = REGULATOR_MODE_STANDBY;
    806
    807	return mode;
    808}
    809
    810static unsigned int wm8350_ldo_get_mode(struct regulator_dev *rdev)
    811{
    812	return REGULATOR_MODE_NORMAL;
    813}
    814
    815struct wm8350_dcdc_efficiency {
    816	int uA_load_min;
    817	int uA_load_max;
    818	unsigned int mode;
    819};
    820
    821static const struct wm8350_dcdc_efficiency dcdc1_6_efficiency[] = {
    822	{0, 10000, REGULATOR_MODE_STANDBY},       /* 0 - 10mA - LDO */
    823	{10000, 100000, REGULATOR_MODE_IDLE},     /* 10mA - 100mA - Standby */
    824	{100000, 1000000, REGULATOR_MODE_NORMAL}, /* > 100mA - Active */
    825	{-1, -1, REGULATOR_MODE_NORMAL},
    826};
    827
    828static const struct wm8350_dcdc_efficiency dcdc3_4_efficiency[] = {
    829	{0, 10000, REGULATOR_MODE_STANDBY},      /* 0 - 10mA - LDO */
    830	{10000, 100000, REGULATOR_MODE_IDLE},    /* 10mA - 100mA - Standby */
    831	{100000, 800000, REGULATOR_MODE_NORMAL}, /* > 100mA - Active */
    832	{-1, -1, REGULATOR_MODE_NORMAL},
    833};
    834
    835static unsigned int get_mode(int uA, const struct wm8350_dcdc_efficiency *eff)
    836{
    837	int i = 0;
    838
    839	while (eff[i].uA_load_min != -1) {
    840		if (uA >= eff[i].uA_load_min && uA <= eff[i].uA_load_max)
    841			return eff[i].mode;
    842		i++;
    843	}
    844	return REGULATOR_MODE_NORMAL;
    845}
    846
    847/* Query the regulator for it's most efficient mode @ uV,uA
    848 * WM8350 regulator efficiency is pretty similar over
    849 * different input and output uV.
    850 */
    851static unsigned int wm8350_dcdc_get_optimum_mode(struct regulator_dev *rdev,
    852						 int input_uV, int output_uV,
    853						 int output_uA)
    854{
    855	int dcdc = rdev_get_id(rdev), mode;
    856
    857	switch (dcdc) {
    858	case WM8350_DCDC_1:
    859	case WM8350_DCDC_6:
    860		mode = get_mode(output_uA, dcdc1_6_efficiency);
    861		break;
    862	case WM8350_DCDC_3:
    863	case WM8350_DCDC_4:
    864		mode = get_mode(output_uA, dcdc3_4_efficiency);
    865		break;
    866	default:
    867		mode = REGULATOR_MODE_NORMAL;
    868		break;
    869	}
    870	return mode;
    871}
    872
    873static const struct regulator_ops wm8350_dcdc_ops = {
    874	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    875	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    876	.list_voltage = regulator_list_voltage_linear,
    877	.map_voltage = regulator_map_voltage_linear,
    878	.enable = regulator_enable_regmap,
    879	.disable = regulator_disable_regmap,
    880	.is_enabled = regulator_is_enabled_regmap,
    881	.get_mode = wm8350_dcdc_get_mode,
    882	.set_mode = wm8350_dcdc_set_mode,
    883	.get_optimum_mode = wm8350_dcdc_get_optimum_mode,
    884	.set_suspend_voltage = wm8350_dcdc_set_suspend_voltage,
    885	.set_suspend_enable = wm8350_dcdc_set_suspend_enable,
    886	.set_suspend_disable = wm8350_dcdc_set_suspend_disable,
    887	.set_suspend_mode = wm8350_dcdc_set_suspend_mode,
    888};
    889
    890static const struct regulator_ops wm8350_dcdc2_5_ops = {
    891	.enable = regulator_enable_regmap,
    892	.disable = regulator_disable_regmap,
    893	.is_enabled = regulator_is_enabled_regmap,
    894	.set_suspend_enable = wm8350_dcdc25_set_suspend_enable,
    895	.set_suspend_disable = wm8350_dcdc25_set_suspend_disable,
    896};
    897
    898static const struct regulator_ops wm8350_ldo_ops = {
    899	.map_voltage = regulator_map_voltage_linear_range,
    900	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    901	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    902	.list_voltage = regulator_list_voltage_linear_range,
    903	.enable = regulator_enable_regmap,
    904	.disable = regulator_disable_regmap,
    905	.is_enabled = regulator_is_enabled_regmap,
    906	.get_mode = wm8350_ldo_get_mode,
    907	.set_suspend_voltage = wm8350_ldo_set_suspend_voltage,
    908	.set_suspend_enable = wm8350_ldo_set_suspend_enable,
    909	.set_suspend_disable = wm8350_ldo_set_suspend_disable,
    910};
    911
    912static const struct regulator_ops wm8350_isink_ops = {
    913	.set_current_limit = regulator_set_current_limit_regmap,
    914	.get_current_limit = regulator_get_current_limit_regmap,
    915	.enable = wm8350_isink_enable,
    916	.disable = wm8350_isink_disable,
    917	.is_enabled = wm8350_isink_is_enabled,
    918	.enable_time = wm8350_isink_enable_time,
    919};
    920
    921static const struct regulator_desc wm8350_reg[NUM_WM8350_REGULATORS] = {
    922	{
    923		.name = "DCDC1",
    924		.id = WM8350_DCDC_1,
    925		.ops = &wm8350_dcdc_ops,
    926		.irq = WM8350_IRQ_UV_DC1,
    927		.type = REGULATOR_VOLTAGE,
    928		.n_voltages = WM8350_DCDC_MAX_VSEL + 1,
    929		.min_uV = 850000,
    930		.uV_step = 25000,
    931		.vsel_reg = WM8350_DCDC1_CONTROL,
    932		.vsel_mask = WM8350_DC1_VSEL_MASK,
    933		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    934		.enable_mask = WM8350_DC1_ENA,
    935		.owner = THIS_MODULE,
    936	},
    937	{
    938		.name = "DCDC2",
    939		.id = WM8350_DCDC_2,
    940		.ops = &wm8350_dcdc2_5_ops,
    941		.irq = WM8350_IRQ_UV_DC2,
    942		.type = REGULATOR_VOLTAGE,
    943		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    944		.enable_mask = WM8350_DC2_ENA,
    945		.owner = THIS_MODULE,
    946	},
    947	{
    948		.name = "DCDC3",
    949		.id = WM8350_DCDC_3,
    950		.ops = &wm8350_dcdc_ops,
    951		.irq = WM8350_IRQ_UV_DC3,
    952		.type = REGULATOR_VOLTAGE,
    953		.n_voltages = WM8350_DCDC_MAX_VSEL + 1,
    954		.min_uV = 850000,
    955		.uV_step = 25000,
    956		.vsel_reg = WM8350_DCDC3_CONTROL,
    957		.vsel_mask = WM8350_DC3_VSEL_MASK,
    958		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    959		.enable_mask = WM8350_DC3_ENA,
    960		.owner = THIS_MODULE,
    961	},
    962	{
    963		.name = "DCDC4",
    964		.id = WM8350_DCDC_4,
    965		.ops = &wm8350_dcdc_ops,
    966		.irq = WM8350_IRQ_UV_DC4,
    967		.type = REGULATOR_VOLTAGE,
    968		.n_voltages = WM8350_DCDC_MAX_VSEL + 1,
    969		.min_uV = 850000,
    970		.uV_step = 25000,
    971		.vsel_reg = WM8350_DCDC4_CONTROL,
    972		.vsel_mask = WM8350_DC4_VSEL_MASK,
    973		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    974		.enable_mask = WM8350_DC4_ENA,
    975		.owner = THIS_MODULE,
    976	},
    977	{
    978		.name = "DCDC5",
    979		.id = WM8350_DCDC_5,
    980		.ops = &wm8350_dcdc2_5_ops,
    981		.irq = WM8350_IRQ_UV_DC5,
    982		.type = REGULATOR_VOLTAGE,
    983		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    984		.enable_mask = WM8350_DC5_ENA,
    985		.owner = THIS_MODULE,
    986	 },
    987	{
    988		.name = "DCDC6",
    989		.id = WM8350_DCDC_6,
    990		.ops = &wm8350_dcdc_ops,
    991		.irq = WM8350_IRQ_UV_DC6,
    992		.type = REGULATOR_VOLTAGE,
    993		.n_voltages = WM8350_DCDC_MAX_VSEL + 1,
    994		.min_uV = 850000,
    995		.uV_step = 25000,
    996		.vsel_reg = WM8350_DCDC6_CONTROL,
    997		.vsel_mask = WM8350_DC6_VSEL_MASK,
    998		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
    999		.enable_mask = WM8350_DC6_ENA,
   1000		.owner = THIS_MODULE,
   1001	},
   1002	{
   1003		.name = "LDO1",
   1004		.id = WM8350_LDO_1,
   1005		.ops = &wm8350_ldo_ops,
   1006		.irq = WM8350_IRQ_UV_LDO1,
   1007		.type = REGULATOR_VOLTAGE,
   1008		.n_voltages = WM8350_LDO1_VSEL_MASK + 1,
   1009		.linear_ranges = wm8350_ldo_ranges,
   1010		.n_linear_ranges = ARRAY_SIZE(wm8350_ldo_ranges),
   1011		.vsel_reg = WM8350_LDO1_CONTROL,
   1012		.vsel_mask = WM8350_LDO1_VSEL_MASK,
   1013		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
   1014		.enable_mask = WM8350_LDO1_ENA,
   1015		.owner = THIS_MODULE,
   1016	},
   1017	{
   1018		.name = "LDO2",
   1019		.id = WM8350_LDO_2,
   1020		.ops = &wm8350_ldo_ops,
   1021		.irq = WM8350_IRQ_UV_LDO2,
   1022		.type = REGULATOR_VOLTAGE,
   1023		.n_voltages = WM8350_LDO2_VSEL_MASK + 1,
   1024		.linear_ranges = wm8350_ldo_ranges,
   1025		.n_linear_ranges = ARRAY_SIZE(wm8350_ldo_ranges),
   1026		.vsel_reg = WM8350_LDO2_CONTROL,
   1027		.vsel_mask = WM8350_LDO2_VSEL_MASK,
   1028		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
   1029		.enable_mask = WM8350_LDO2_ENA,
   1030		.owner = THIS_MODULE,
   1031	},
   1032	{
   1033		.name = "LDO3",
   1034		.id = WM8350_LDO_3,
   1035		.ops = &wm8350_ldo_ops,
   1036		.irq = WM8350_IRQ_UV_LDO3,
   1037		.type = REGULATOR_VOLTAGE,
   1038		.n_voltages = WM8350_LDO3_VSEL_MASK + 1,
   1039		.linear_ranges = wm8350_ldo_ranges,
   1040		.n_linear_ranges = ARRAY_SIZE(wm8350_ldo_ranges),
   1041		.vsel_reg = WM8350_LDO3_CONTROL,
   1042		.vsel_mask = WM8350_LDO3_VSEL_MASK,
   1043		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
   1044		.enable_mask = WM8350_LDO3_ENA,
   1045		.owner = THIS_MODULE,
   1046	},
   1047	{
   1048		.name = "LDO4",
   1049		.id = WM8350_LDO_4,
   1050		.ops = &wm8350_ldo_ops,
   1051		.irq = WM8350_IRQ_UV_LDO4,
   1052		.type = REGULATOR_VOLTAGE,
   1053		.n_voltages = WM8350_LDO4_VSEL_MASK + 1,
   1054		.linear_ranges = wm8350_ldo_ranges,
   1055		.n_linear_ranges = ARRAY_SIZE(wm8350_ldo_ranges),
   1056		.vsel_reg = WM8350_LDO4_CONTROL,
   1057		.vsel_mask = WM8350_LDO4_VSEL_MASK,
   1058		.enable_reg = WM8350_DCDC_LDO_REQUESTED,
   1059		.enable_mask = WM8350_LDO4_ENA,
   1060		.owner = THIS_MODULE,
   1061	},
   1062	{
   1063		.name = "ISINKA",
   1064		.id = WM8350_ISINK_A,
   1065		.ops = &wm8350_isink_ops,
   1066		.irq = WM8350_IRQ_CS1,
   1067		.type = REGULATOR_CURRENT,
   1068		.owner = THIS_MODULE,
   1069		.curr_table = isink_cur,
   1070		.n_current_limits = ARRAY_SIZE(isink_cur),
   1071		.csel_reg = WM8350_CURRENT_SINK_DRIVER_A,
   1072		.csel_mask = WM8350_CS1_ISEL_MASK,
   1073	 },
   1074	{
   1075		.name = "ISINKB",
   1076		.id = WM8350_ISINK_B,
   1077		.ops = &wm8350_isink_ops,
   1078		.irq = WM8350_IRQ_CS2,
   1079		.type = REGULATOR_CURRENT,
   1080		.owner = THIS_MODULE,
   1081		.curr_table = isink_cur,
   1082		.n_current_limits = ARRAY_SIZE(isink_cur),
   1083		.csel_reg = WM8350_CURRENT_SINK_DRIVER_B,
   1084		.csel_mask = WM8350_CS2_ISEL_MASK,
   1085	 },
   1086};
   1087
   1088static irqreturn_t pmic_uv_handler(int irq, void *data)
   1089{
   1090	struct regulator_dev *rdev = (struct regulator_dev *)data;
   1091
   1092	if (irq == WM8350_IRQ_CS1 || irq == WM8350_IRQ_CS2)
   1093		regulator_notifier_call_chain(rdev,
   1094					      REGULATOR_EVENT_REGULATION_OUT,
   1095					      NULL);
   1096	else
   1097		regulator_notifier_call_chain(rdev,
   1098					      REGULATOR_EVENT_UNDER_VOLTAGE,
   1099					      NULL);
   1100
   1101	return IRQ_HANDLED;
   1102}
   1103
   1104static int wm8350_regulator_probe(struct platform_device *pdev)
   1105{
   1106	struct wm8350 *wm8350 = dev_get_drvdata(&pdev->dev);
   1107	struct regulator_config config = { };
   1108	struct regulator_dev *rdev;
   1109	int ret;
   1110	u16 val;
   1111
   1112	if (pdev->id < WM8350_DCDC_1 || pdev->id > WM8350_ISINK_B)
   1113		return -ENODEV;
   1114
   1115	/* do any regulator specific init */
   1116	switch (pdev->id) {
   1117	case WM8350_DCDC_1:
   1118		val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER);
   1119		wm8350->pmic.dcdc1_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
   1120		break;
   1121	case WM8350_DCDC_3:
   1122		val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER);
   1123		wm8350->pmic.dcdc3_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
   1124		break;
   1125	case WM8350_DCDC_4:
   1126		val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER);
   1127		wm8350->pmic.dcdc4_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
   1128		break;
   1129	case WM8350_DCDC_6:
   1130		val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER);
   1131		wm8350->pmic.dcdc6_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;
   1132		break;
   1133	}
   1134
   1135	config.dev = &pdev->dev;
   1136	config.init_data = dev_get_platdata(&pdev->dev);
   1137	config.driver_data = dev_get_drvdata(&pdev->dev);
   1138	config.regmap = wm8350->regmap;
   1139
   1140	/* register regulator */
   1141	rdev = devm_regulator_register(&pdev->dev, &wm8350_reg[pdev->id],
   1142				       &config);
   1143	if (IS_ERR(rdev)) {
   1144		dev_err(&pdev->dev, "failed to register %s\n",
   1145			wm8350_reg[pdev->id].name);
   1146		return PTR_ERR(rdev);
   1147	}
   1148
   1149	/* register regulator IRQ */
   1150	ret = wm8350_register_irq(wm8350, wm8350_reg[pdev->id].irq,
   1151				  pmic_uv_handler, 0, "UV", rdev);
   1152	if (ret < 0) {
   1153		dev_err(&pdev->dev, "failed to register regulator %s IRQ\n",
   1154			wm8350_reg[pdev->id].name);
   1155		return ret;
   1156	}
   1157
   1158	return 0;
   1159}
   1160
   1161static int wm8350_regulator_remove(struct platform_device *pdev)
   1162{
   1163	struct regulator_dev *rdev = platform_get_drvdata(pdev);
   1164	struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
   1165
   1166	wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq, rdev);
   1167
   1168	return 0;
   1169}
   1170
   1171int wm8350_register_regulator(struct wm8350 *wm8350, int reg,
   1172			      struct regulator_init_data *initdata)
   1173{
   1174	struct platform_device *pdev;
   1175	int ret;
   1176	if (reg < 0 || reg >= NUM_WM8350_REGULATORS)
   1177		return -EINVAL;
   1178
   1179	if (wm8350->pmic.pdev[reg])
   1180		return -EBUSY;
   1181
   1182	if (reg >= WM8350_DCDC_1 && reg <= WM8350_DCDC_6 &&
   1183	    reg > wm8350->pmic.max_dcdc)
   1184		return -ENODEV;
   1185	if (reg >= WM8350_ISINK_A && reg <= WM8350_ISINK_B &&
   1186	    reg > wm8350->pmic.max_isink)
   1187		return -ENODEV;
   1188
   1189	pdev = platform_device_alloc("wm8350-regulator", reg);
   1190	if (!pdev)
   1191		return -ENOMEM;
   1192
   1193	wm8350->pmic.pdev[reg] = pdev;
   1194
   1195	initdata->driver_data = wm8350;
   1196
   1197	pdev->dev.platform_data = initdata;
   1198	pdev->dev.parent = wm8350->dev;
   1199	platform_set_drvdata(pdev, wm8350);
   1200
   1201	ret = platform_device_add(pdev);
   1202
   1203	if (ret != 0) {
   1204		dev_err(wm8350->dev, "Failed to register regulator %d: %d\n",
   1205			reg, ret);
   1206		platform_device_put(pdev);
   1207		wm8350->pmic.pdev[reg] = NULL;
   1208	}
   1209
   1210	return ret;
   1211}
   1212EXPORT_SYMBOL_GPL(wm8350_register_regulator);
   1213
   1214/**
   1215 * wm8350_register_led - Register a WM8350 LED output
   1216 *
   1217 * @wm8350: The WM8350 device to configure.
   1218 * @lednum: LED device index to create.
   1219 * @dcdc: The DCDC to use for the LED.
   1220 * @isink: The ISINK to use for the LED.
   1221 * @pdata: Configuration for the LED.
   1222 *
   1223 * The WM8350 supports the use of an ISINK together with a DCDC to
   1224 * provide a power-efficient LED driver.  This function registers the
   1225 * regulators and instantiates the platform device for a LED.  The
   1226 * operating modes for the LED regulators must be configured using
   1227 * wm8350_isink_set_flash(), wm8350_dcdc25_set_mode() and
   1228 * wm8350_dcdc_set_slot() prior to calling this function.
   1229 */
   1230int wm8350_register_led(struct wm8350 *wm8350, int lednum, int dcdc, int isink,
   1231			struct wm8350_led_platform_data *pdata)
   1232{
   1233	struct wm8350_led *led;
   1234	struct platform_device *pdev;
   1235	int ret;
   1236
   1237	if (lednum >= ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
   1238		dev_err(wm8350->dev, "Invalid LED index %d\n", lednum);
   1239		return -ENODEV;
   1240	}
   1241
   1242	led = &wm8350->pmic.led[lednum];
   1243
   1244	if (led->pdev) {
   1245		dev_err(wm8350->dev, "LED %d already allocated\n", lednum);
   1246		return -EINVAL;
   1247	}
   1248
   1249	pdev = platform_device_alloc("wm8350-led", lednum);
   1250	if (pdev == NULL) {
   1251		dev_err(wm8350->dev, "Failed to allocate LED %d\n", lednum);
   1252		return -ENOMEM;
   1253	}
   1254
   1255	led->isink_consumer.dev_name = dev_name(&pdev->dev);
   1256	led->isink_consumer.supply = "led_isink";
   1257	led->isink_init.num_consumer_supplies = 1;
   1258	led->isink_init.consumer_supplies = &led->isink_consumer;
   1259	led->isink_init.constraints.min_uA = 0;
   1260	led->isink_init.constraints.max_uA = pdata->max_uA;
   1261	led->isink_init.constraints.valid_ops_mask
   1262		= REGULATOR_CHANGE_CURRENT | REGULATOR_CHANGE_STATUS;
   1263	led->isink_init.constraints.valid_modes_mask = REGULATOR_MODE_NORMAL;
   1264	ret = wm8350_register_regulator(wm8350, isink, &led->isink_init);
   1265	if (ret != 0) {
   1266		platform_device_put(pdev);
   1267		return ret;
   1268	}
   1269
   1270	led->dcdc_consumer.dev_name = dev_name(&pdev->dev);
   1271	led->dcdc_consumer.supply = "led_vcc";
   1272	led->dcdc_init.num_consumer_supplies = 1;
   1273	led->dcdc_init.consumer_supplies = &led->dcdc_consumer;
   1274	led->dcdc_init.constraints.valid_modes_mask = REGULATOR_MODE_NORMAL;
   1275	led->dcdc_init.constraints.valid_ops_mask =  REGULATOR_CHANGE_STATUS;
   1276	ret = wm8350_register_regulator(wm8350, dcdc, &led->dcdc_init);
   1277	if (ret != 0) {
   1278		platform_device_put(pdev);
   1279		return ret;
   1280	}
   1281
   1282	switch (isink) {
   1283	case WM8350_ISINK_A:
   1284		wm8350->pmic.isink_A_dcdc = dcdc;
   1285		break;
   1286	case WM8350_ISINK_B:
   1287		wm8350->pmic.isink_B_dcdc = dcdc;
   1288		break;
   1289	}
   1290
   1291	pdev->dev.platform_data = pdata;
   1292	pdev->dev.parent = wm8350->dev;
   1293	ret = platform_device_add(pdev);
   1294	if (ret != 0) {
   1295		dev_err(wm8350->dev, "Failed to register LED %d: %d\n",
   1296			lednum, ret);
   1297		platform_device_put(pdev);
   1298		return ret;
   1299	}
   1300
   1301	led->pdev = pdev;
   1302
   1303	return 0;
   1304}
   1305EXPORT_SYMBOL_GPL(wm8350_register_led);
   1306
   1307static struct platform_driver wm8350_regulator_driver = {
   1308	.probe = wm8350_regulator_probe,
   1309	.remove = wm8350_regulator_remove,
   1310	.driver		= {
   1311		.name	= "wm8350-regulator",
   1312	},
   1313};
   1314
   1315static int __init wm8350_regulator_init(void)
   1316{
   1317	return platform_driver_register(&wm8350_regulator_driver);
   1318}
   1319subsys_initcall(wm8350_regulator_init);
   1320
   1321static void __exit wm8350_regulator_exit(void)
   1322{
   1323	platform_driver_unregister(&wm8350_regulator_driver);
   1324}
   1325module_exit(wm8350_regulator_exit);
   1326
   1327/* Module information */
   1328MODULE_AUTHOR("Liam Girdwood");
   1329MODULE_DESCRIPTION("WM8350 voltage and current regulator driver");
   1330MODULE_LICENSE("GPL");
   1331MODULE_ALIAS("platform:wm8350-regulator");