tps65023-regulator.c revision a133829e66d25e1ce293a30bcc3fb8eb653a1519
130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/*
230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * tps65023-regulator.c
330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal *
430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * Supports TPS65023 Regulator
530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal *
630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * Copyright (C) 2009 Texas Instrument Incorporated - http://www.ti.com/
730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal *
830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * This program is free software; you can redistribute it and/or
930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * modify it under the terms of the GNU General Public License as
1030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * published by the Free Software Foundation version 2.
1130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal *
1230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
1330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * whether express or implied; without even the implied warranty of
1430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * General Public License for more details.
1630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal */
1730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/kernel.h>
1930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/module.h>
2030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/init.h>
2130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/err.h>
2230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/platform_device.h>
2330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/regulator/driver.h>
2430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/regulator/machine.h>
2530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#include <linux/i2c.h>
265a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
2790923351d480fffd0d24646db83f6f8315eed0d9Mark Brown#include <linux/regmap.h>
2830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
2930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Register definitions */
3030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_VERSION		0
3130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_PGOODZ		1
3230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_MASK		2
3330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_REG_CTRL		3
3430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_CON_CTRL		4
3530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_CON_CTRL2		5
3630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_DEF_CORE		6
3730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_DEFSLEW		7
3830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_REG_LDO_CTRL		8
3930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
4030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* PGOODZ bitfields */
4130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_PWRFAILZ	BIT(7)
4230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_LOWBATTZ	BIT(6)
4330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_VDCDC1		BIT(5)
4430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_VDCDC2		BIT(4)
4530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_VDCDC3		BIT(3)
4630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_LDO2		BIT(2)
4730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_PGOODZ_LDO1		BIT(1)
4830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
4930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* MASK bitfields */
5030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_PWRFAILZ		BIT(7)
5130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_LOWBATTZ		BIT(6)
5230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_VDCDC1		BIT(5)
5330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_VDCDC2		BIT(4)
5430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_VDCDC3		BIT(3)
5530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_LDO2		BIT(2)
5630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define	TPS65023_MASK_LDO1		BIT(1)
5730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
5830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* REG_CTRL bitfields */
5930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_REG_CTRL_VDCDC1_EN	BIT(5)
6030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_REG_CTRL_VDCDC2_EN	BIT(4)
6130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_REG_CTRL_VDCDC3_EN	BIT(3)
6230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_REG_CTRL_LDO2_EN	BIT(2)
6330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_REG_CTRL_LDO1_EN	BIT(1)
6430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
65fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson/* REG_CTRL2 bitfields */
66fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson#define TPS65023_REG_CTRL2_GO		BIT(7)
67fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson#define TPS65023_REG_CTRL2_CORE_ADJ	BIT(6)
68fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson#define TPS65023_REG_CTRL2_DCDC2	BIT(2)
69f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson#define TPS65023_REG_CTRL2_DCDC1	BIT(1)
70f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson#define TPS65023_REG_CTRL2_DCDC3	BIT(0)
71f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson
7230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* LDO_CTRL bitfields */
7330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_LDO_CTRL_LDOx_SHIFT(ldo_id)	((ldo_id)*4)
747061873f709bcecc8e079395567e2c314d21f7aaAxel Lin#define TPS65023_LDO_CTRL_LDOx_MASK(ldo_id)	(0x0F << ((ldo_id)*4))
7530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
7630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Number of step-down converters available */
7730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_DCDC		3
7830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Number of LDO voltage regulators  available */
7930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_LDO		2
8030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Number of total regulators available */
8130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_REGULATOR	(TPS65023_NUM_DCDC + TPS65023_NUM_LDO)
8230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
8330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* DCDCs */
8430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_1			0
8530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_2			1
8630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_3			2
8730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* LDOs */
8830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_LDO_1			3
8930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_LDO_2			4
9030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
9130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_MAX_REG_ID		TPS65023_LDO_2
9230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
9330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Supported voltage values for regulators */
94ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int VCORE_VSEL_table[] = {
95ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	800000, 825000, 850000, 875000,
96ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	900000, 925000, 950000, 975000,
97ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1025000, 1050000, 1075000,
98ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1100000, 1125000, 1150000, 1175000,
99ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1200000, 1225000, 1250000, 1275000,
100ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1300000, 1325000, 1350000, 1375000,
101ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1400000, 1425000, 1450000, 1475000,
102ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1500000, 1525000, 1550000, 1600000,
103ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin};
104ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin
105ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int DCDC_FIXED_3300000_VSEL_table[] = {
106ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	3300000,
107ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin};
108ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin
109ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int DCDC_FIXED_1800000_VSEL_table[] = {
110ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000,
11130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
11230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
113437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson/* Supported voltage values for LDO regulators for tps65020 */
114ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65020_LDO1_VSEL_table[] = {
115ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1050000, 1100000, 1300000,
116ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000, 2500000, 3000000, 3300000,
117437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
1181c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
119ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65020_LDO2_VSEL_table[] = {
120ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1050000, 1100000, 1300000,
121ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000, 2500000, 3000000, 3300000,
122437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
1231c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1241c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Supported voltage values for LDO regulators
1251c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson * for tps65021 and tps65023 */
126ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO1_VSEL_table[] = {
127ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1100000, 1300000, 1800000,
128ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2200000, 2600000, 2800000, 3150000,
12930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
13030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
131ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO2_VSEL_table[] = {
132ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1050000, 1200000, 1300000, 1800000,
133ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2500000, 2800000, 3000000, 3300000,
13430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
13530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
13630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Regulator specific details */
13730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_info {
13830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const char *name;
13930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	u8 table_len;
140ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	const unsigned int *table;
14130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
14230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
14330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* PMIC details */
14430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_pmic {
14530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_desc desc[TPS65023_NUM_REGULATOR];
14630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
14730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const struct tps_info *info[TPS65023_NUM_REGULATOR];
14890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	struct regmap *regmap;
1491c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
1501c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
1511c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1521c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Struct passed as driver data */
1531c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstruct tps_driver_data {
1541c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info;
1551c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
15630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
15730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
158a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Linstatic int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev)
15930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
16030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
16143530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	int ret;
16230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int data, dcdc = rdev_get_id(dev);
16330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
16430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
16530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
16630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1671c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	if (dcdc == tps->core_regulator) {
16843530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi		ret = regmap_read(tps->regmap, TPS65023_REG_DEF_CORE, &data);
16943530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi		if (ret != 0)
17043530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi			return ret;
17130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		data &= (tps->info[dcdc]->table_len - 1);
172a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin		return data;
17330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	} else
174a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin		return 0;
17530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
17630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1777061873f709bcecc8e079395567e2c314d21f7aaAxel Linstatic int tps65023_dcdc_set_voltage_sel(struct regulator_dev *dev,
1787061873f709bcecc8e079395567e2c314d21f7aaAxel Lin					 unsigned selector)
17930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
18030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
18130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int dcdc = rdev_get_id(dev);
182cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	int ret;
18330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1841c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	if (dcdc != tps->core_regulator)
18530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
18630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1877061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	ret = regmap_write(tps->regmap, TPS65023_REG_DEF_CORE, selector);
1887061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	if (ret)
1897061873f709bcecc8e079395567e2c314d21f7aaAxel Lin		goto out;
190cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson
191cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	/* Tell the chip that we have changed the value in DEFCORE
192cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	 * and its time to update the core voltage
193cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	 */
1947061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	ret = regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
1957061873f709bcecc8e079395567e2c314d21f7aaAxel Lin				 TPS65023_REG_CTRL2_GO, TPS65023_REG_CTRL2_GO);
196cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson
1977061873f709bcecc8e079395567e2c314d21f7aaAxel Linout:
198cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	return ret;
19930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
20030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
201a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Linstatic int tps65023_ldo_get_voltage_sel(struct regulator_dev *dev)
20230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
20330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
20430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int data, ldo = rdev_get_id(dev);
20543530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	int ret;
20630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
20730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
20830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
20930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
21043530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	ret = regmap_read(tps->regmap, TPS65023_REG_LDO_CTRL, &data);
21143530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	if (ret != 0)
21243530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi		return ret;
21330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
21430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	data >>= (TPS65023_LDO_CTRL_LDOx_SHIFT(ldo - TPS65023_LDO_1));
21530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	data &= (tps->info[ldo]->table_len - 1);
216a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin	return data;
21730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
21830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
2197061873f709bcecc8e079395567e2c314d21f7aaAxel Linstatic int tps65023_ldo_set_voltage_sel(struct regulator_dev *dev,
2207061873f709bcecc8e079395567e2c314d21f7aaAxel Lin					unsigned selector)
22130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
22230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
2237061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	int ldo_index = rdev_get_id(dev) - TPS65023_LDO_1;
22430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
2257061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	return regmap_update_bits(tps->regmap, TPS65023_REG_LDO_CTRL,
2267061873f709bcecc8e079395567e2c314d21f7aaAxel Lin			TPS65023_LDO_CTRL_LDOx_MASK(ldo_index),
2277061873f709bcecc8e079395567e2c314d21f7aaAxel Lin			selector << TPS65023_LDO_CTRL_LDOx_SHIFT(ldo_index));
22830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
22930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
23030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on VDCDCx */
23130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_dcdc_ops = {
232ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
233ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
234ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
235a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin	.get_voltage_sel = tps65023_dcdc_get_voltage_sel,
2367061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.set_voltage_sel = tps65023_dcdc_set_voltage_sel,
237ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
23830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
23930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
24030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on LDOx */
24130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_ldo_ops = {
242ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
243ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
244ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
245a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin	.get_voltage_sel = tps65023_ldo_get_voltage_sel,
2467061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.set_voltage_sel = tps65023_ldo_set_voltage_sel,
247ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
24830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
24930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
25090923351d480fffd0d24646db83f6f8315eed0d9Mark Brownstatic struct regmap_config tps65023_regmap_config = {
25190923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.reg_bits = 8,
25290923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.val_bits = 8,
25390923351d480fffd0d24646db83f6f8315eed0d9Mark Brown};
25490923351d480fffd0d24646db83f6f8315eed0d9Mark Brown
25554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhovstatic int __devinit tps_65023_probe(struct i2c_client *client,
25654d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov				     const struct i2c_device_id *id)
25730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
2581c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_driver_data *drv_data = (void *)id->driver_data;
2591c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info = drv_data->info;
260c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown	struct regulator_config config = { };
26130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_init_data *init_data;
26230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev;
26330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps;
26430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int i;
26554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	int error;
26630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
26730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
26830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EIO;
26930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
27030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/**
27130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * init_data points to array of regulator_init structures
27230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * coming from the board-evm file.
27330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 */
27430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	init_data = client->dev.platform_data;
27530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!init_data)
27630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EIO;
27730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
27819a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
27930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!tps)
28030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -ENOMEM;
28130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
28219a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config);
28390923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	if (IS_ERR(tps->regmap)) {
28490923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		error = PTR_ERR(tps->regmap);
28590923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		dev_err(&client->dev, "Failed to allocate register map: %d\n",
28690923351d480fffd0d24646db83f6f8315eed0d9Mark Brown			error);
28719a8da2187249c02574ccffaf72637eb224d11c4Axel Lin		return error;
28890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	}
28930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
29030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/* common for all regulators */
2911c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	tps->core_regulator = drv_data->core_regulator;
29230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
29330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) {
29430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Store regulator specific information */
29530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->info[i] = info;
29630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
29730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].name = info->name;
29877fa44d0e10711e899788c58fe53f8f7b18c7f67Axel Lin		tps->desc[i].id = i;
299ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].n_voltages = info->table_len;
300ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].volt_table = info->table;
30130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].ops = (i > TPS65023_DCDC_3 ?
30230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal					&tps65023_ldo_ops : &tps65023_dcdc_ops);
30330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].type = REGULATOR_VOLTAGE;
30430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].owner = THIS_MODULE;
30530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
306ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL;
307ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		if (i == TPS65023_LDO_1)
308ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 1;
309ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		else if (i == TPS65023_LDO_2)
310ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 2;
311ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		else /* DCDCx */
312ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask =
313ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin					1 << (TPS65023_NUM_REGULATOR - i);
314ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin
315c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.dev = &client->dev;
316c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.init_data = init_data;
317c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.driver_data = tps;
318ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		config.regmap = tps->regmap;
319c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown
32030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Register the regulators */
321c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		rdev = regulator_register(&tps->desc[i], &config);
32230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		if (IS_ERR(rdev)) {
32330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal			dev_err(&client->dev, "failed to register %s\n",
32430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal				id->name);
32554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov			error = PTR_ERR(rdev);
32654d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov			goto fail;
32730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		}
32830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
32930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Save regulator for cleanup */
33030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->rdev[i] = rdev;
33130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	}
33230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
33330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_set_clientdata(client, tps);
33430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
335fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson	/* Enable setting output voltage by I2C */
33643530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
33743530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi			TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ);
338f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson
33930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return 0;
34054d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov
34154d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov fail:
34254d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	while (--i >= 0)
34354d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov		regulator_unregister(tps->rdev[i]);
34454d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	return error;
34530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
34630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
34730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __devexit tps_65023_remove(struct i2c_client *client)
34830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
34930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = i2c_get_clientdata(client);
35030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int i;
35130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
35230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	for (i = 0; i < TPS65023_NUM_REGULATOR; i++)
35330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		regulator_unregister(tps->rdev[i]);
35430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return 0;
35530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
35630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
357437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic const struct tps_info tps65020_regs[] = {
358437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
359437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC1",
360ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
361ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
362437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
363437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
364437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC2",
365ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
366ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
367437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
368437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
369437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC3",
370437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
371437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = VCORE_VSEL_table,
372437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
373437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
374437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO1",
375437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(TPS65020_LDO1_VSEL_table),
376437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = TPS65020_LDO1_VSEL_table,
377437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
378437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
379437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO2",
380437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(TPS65020_LDO2_VSEL_table),
381437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = TPS65020_LDO2_VSEL_table,
382437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
383437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
384437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
3851c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic const struct tps_info tps65021_regs[] = {
3861c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3871c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC1",
388ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
389ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
3901c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3911c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3921c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC2",
393ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
394ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
3951c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3961c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3971c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC3",
3981c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
3991c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
4001c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
4011c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
4021c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO1",
4031c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
4041c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
4051c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
4061c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
4071c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO2",
4081c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
4091c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
4101c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
4111c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
4121c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
41330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic const struct tps_info tps65023_regs[] = {
41430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
41530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC1",
4161c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
4171c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
41830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
41930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
42030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC2",
421ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
422ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
42330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
42430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
42530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC3",
426ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
427ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
42830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
42930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
43030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO1",
4311c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
4321c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
43330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
43430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
43530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO2",
4361c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
4371c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
43830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
43930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
44030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
441437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic struct tps_driver_data tps65020_drv_data = {
442437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.info = tps65020_regs,
443437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.core_regulator = TPS65023_DCDC_3,
444437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
445437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
4461c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65021_drv_data = {
4477061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65021_regs,
4487061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_3,
4491c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
4501c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
4511c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65023_drv_data = {
4527061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65023_regs,
4537061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_1,
4541c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
4551c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
4569e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwoodstatic const struct i2c_device_id tps_65023_id[] = {
4579e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{.name = "tps65023",
4581c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65023_drv_data},
4591880a2fc59d2afabc142a311497cf7c320d64506Marek Vasut	{.name = "tps65021",
4601c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65021_drv_data,},
461437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{.name = "tps65020",
462437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.driver_data = (unsigned long) &tps65020_drv_data},
4639e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{ },
46430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
46530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
46630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DEVICE_TABLE(i2c, tps_65023_id);
46730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
46830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct i2c_driver tps_65023_i2c_driver = {
46930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.driver = {
47030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "tps65023",
47130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.owner = THIS_MODULE,
47230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
47330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.probe = tps_65023_probe,
47430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.remove = __devexit_p(tps_65023_remove),
4759e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	.id_table = tps_65023_id,
47630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
47730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
47830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __init tps_65023_init(void)
47930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
48030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return i2c_add_driver(&tps_65023_i2c_driver);
48130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
48230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalsubsys_initcall(tps_65023_init);
48330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
48430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic void __exit tps_65023_cleanup(void)
48530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
48630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_del_driver(&tps_65023_i2c_driver);
48730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
48830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalmodule_exit(tps_65023_cleanup);
48930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
49030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_AUTHOR("Texas Instruments");
49130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DESCRIPTION("TPS65023 voltage regulator driver");
4929e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam GirdwoodMODULE_LICENSE("GPL v2");
493