tps65023-regulator.c revision a5023574d120ca3b9337cedd4e27de90cae9aff7
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/* Number of step-down converters available */
7330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_DCDC		3
7430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Number of LDO voltage regulators  available */
7530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_LDO		2
7630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Number of total regulators available */
7730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_NUM_REGULATOR	(TPS65023_NUM_DCDC + TPS65023_NUM_LDO)
7830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
7930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* DCDCs */
8030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_1			0
8130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_2			1
8230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_DCDC_3			2
8330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* LDOs */
8430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_LDO_1			3
8530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_LDO_2			4
8630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
8730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal#define TPS65023_MAX_REG_ID		TPS65023_LDO_2
8830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
8930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Supported voltage values for regulators */
90ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int VCORE_VSEL_table[] = {
91ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	800000, 825000, 850000, 875000,
92ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	900000, 925000, 950000, 975000,
93ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1025000, 1050000, 1075000,
94ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1100000, 1125000, 1150000, 1175000,
95ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1200000, 1225000, 1250000, 1275000,
96ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1300000, 1325000, 1350000, 1375000,
97ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1400000, 1425000, 1450000, 1475000,
98ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1500000, 1525000, 1550000, 1600000,
99ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin};
100ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin
101ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int DCDC_FIXED_3300000_VSEL_table[] = {
102ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	3300000,
103ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin};
104ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin
105ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int DCDC_FIXED_1800000_VSEL_table[] = {
106ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000,
10730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
10830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
109437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson/* Supported voltage values for LDO regulators for tps65020 */
110ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65020_LDO1_VSEL_table[] = {
111ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1050000, 1100000, 1300000,
112ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000, 2500000, 3000000, 3300000,
113437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
1141c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
115ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65020_LDO2_VSEL_table[] = {
116ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1050000, 1100000, 1300000,
117ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000, 2500000, 3000000, 3300000,
118437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
1191c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1201c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Supported voltage values for LDO regulators
1211c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson * for tps65021 and tps65023 */
122ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO1_VSEL_table[] = {
123ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1100000, 1300000, 1800000,
124ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2200000, 2600000, 2800000, 3150000,
12530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
12630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
127ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO2_VSEL_table[] = {
128ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1050000, 1200000, 1300000, 1800000,
129ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2500000, 2800000, 3000000, 3300000,
13030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
13130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
13230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Regulator specific details */
13330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_info {
13430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const char *name;
13530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	u8 table_len;
136ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	const unsigned int *table;
13730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
13830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
13930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* PMIC details */
14030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_pmic {
14130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_desc desc[TPS65023_NUM_REGULATOR];
14230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
14330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const struct tps_info *info[TPS65023_NUM_REGULATOR];
14490923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	struct regmap *regmap;
1451c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
1461c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
1471c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1481c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Struct passed as driver data */
1491c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstruct tps_driver_data {
1501c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info;
1511c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
15230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
15330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
154a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Linstatic int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev)
15530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
15630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
15743530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	int ret;
15830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int data, dcdc = rdev_get_id(dev);
15930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
16030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
16130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
16230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1631c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	if (dcdc == tps->core_regulator) {
16443530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi		ret = regmap_read(tps->regmap, TPS65023_REG_DEF_CORE, &data);
16543530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi		if (ret != 0)
16643530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi			return ret;
16730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		data &= (tps->info[dcdc]->table_len - 1);
168a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin		return data;
16930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	} else
170a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin		return 0;
17130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
17230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1737061873f709bcecc8e079395567e2c314d21f7aaAxel Linstatic int tps65023_dcdc_set_voltage_sel(struct regulator_dev *dev,
1747061873f709bcecc8e079395567e2c314d21f7aaAxel Lin					 unsigned selector)
17530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
17630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
17730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int dcdc = rdev_get_id(dev);
178cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	int ret;
17930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1801c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	if (dcdc != tps->core_regulator)
18130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
18230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1837061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	ret = regmap_write(tps->regmap, TPS65023_REG_DEF_CORE, selector);
1847061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	if (ret)
1857061873f709bcecc8e079395567e2c314d21f7aaAxel Lin		goto out;
186cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson
187cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	/* Tell the chip that we have changed the value in DEFCORE
188cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	 * and its time to update the core voltage
189cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	 */
1907061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	ret = regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
1917061873f709bcecc8e079395567e2c314d21f7aaAxel Lin				 TPS65023_REG_CTRL2_GO, TPS65023_REG_CTRL2_GO);
192cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson
1937061873f709bcecc8e079395567e2c314d21f7aaAxel Linout:
194cc17ef3f0463ba17c8767578da8c4e5fbdd4b447Marcus Folkesson	return ret;
19530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
19630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
19730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on VDCDCx */
19830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_dcdc_ops = {
199ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
200ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
201ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
202a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin	.get_voltage_sel = tps65023_dcdc_get_voltage_sel,
2037061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.set_voltage_sel = tps65023_dcdc_set_voltage_sel,
204ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
20530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
20630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
20730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on LDOx */
20830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_ldo_ops = {
209ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
210ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
211ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
212e90a84473ee941c0056c773923e9cc90a550c266Axel Lin	.get_voltage_sel = regulator_get_voltage_sel_regmap,
213e90a84473ee941c0056c773923e9cc90a550c266Axel Lin	.set_voltage_sel = regulator_set_voltage_sel_regmap,
214ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
21530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
21630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
21790923351d480fffd0d24646db83f6f8315eed0d9Mark Brownstatic struct regmap_config tps65023_regmap_config = {
21890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.reg_bits = 8,
21990923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.val_bits = 8,
22090923351d480fffd0d24646db83f6f8315eed0d9Mark Brown};
22190923351d480fffd0d24646db83f6f8315eed0d9Mark Brown
222a5023574d120ca3b9337cedd4e27de90cae9aff7Bill Pembertonstatic int tps_65023_probe(struct i2c_client *client,
22354d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov				     const struct i2c_device_id *id)
22430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
2251c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_driver_data *drv_data = (void *)id->driver_data;
2261c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info = drv_data->info;
227c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown	struct regulator_config config = { };
22830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_init_data *init_data;
22930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev;
23030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps;
23130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int i;
23254d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	int error;
23330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
23430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
23530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EIO;
23630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
23730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/**
23830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * init_data points to array of regulator_init structures
23930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * coming from the board-evm file.
24030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 */
24130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	init_data = client->dev.platform_data;
24230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!init_data)
24330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EIO;
24430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
24519a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
24630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!tps)
24730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -ENOMEM;
24830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
24919a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config);
25090923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	if (IS_ERR(tps->regmap)) {
25190923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		error = PTR_ERR(tps->regmap);
25290923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		dev_err(&client->dev, "Failed to allocate register map: %d\n",
25390923351d480fffd0d24646db83f6f8315eed0d9Mark Brown			error);
25419a8da2187249c02574ccffaf72637eb224d11c4Axel Lin		return error;
25590923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	}
25630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
25730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/* common for all regulators */
2581c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	tps->core_regulator = drv_data->core_regulator;
25930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
26030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) {
26130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Store regulator specific information */
26230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->info[i] = info;
26330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
26430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].name = info->name;
26577fa44d0e10711e899788c58fe53f8f7b18c7f67Axel Lin		tps->desc[i].id = i;
266ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].n_voltages = info->table_len;
267ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].volt_table = info->table;
26830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].ops = (i > TPS65023_DCDC_3 ?
26930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal					&tps65023_ldo_ops : &tps65023_dcdc_ops);
27030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].type = REGULATOR_VOLTAGE;
27130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].owner = THIS_MODULE;
27230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
273ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL;
274e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		switch (i) {
275e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		case TPS65023_LDO_1:
276e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL;
277e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_mask = 0x07;
278ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 1;
279e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			break;
280e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		case TPS65023_LDO_2:
281e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL;
282e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_mask = 0x70;
283ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 2;
284e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			break;
285e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		default: /* DCDCx */
286ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask =
287ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin					1 << (TPS65023_NUM_REGULATOR - i);
288e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		}
289ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin
290c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.dev = &client->dev;
291c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.init_data = init_data;
292c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.driver_data = tps;
293ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		config.regmap = tps->regmap;
294c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown
29530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Register the regulators */
296c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		rdev = regulator_register(&tps->desc[i], &config);
29730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		if (IS_ERR(rdev)) {
29830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal			dev_err(&client->dev, "failed to register %s\n",
29930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal				id->name);
30054d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov			error = PTR_ERR(rdev);
30154d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov			goto fail;
30230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		}
30330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
30430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Save regulator for cleanup */
30530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->rdev[i] = rdev;
30630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	}
30730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
30830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_set_clientdata(client, tps);
30930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
310fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson	/* Enable setting output voltage by I2C */
31143530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
31243530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi			TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ);
313f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson
31430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return 0;
31554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov
31654d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov fail:
31754d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	while (--i >= 0)
31854d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov		regulator_unregister(tps->rdev[i]);
31954d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	return error;
32030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
32130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
32230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __devexit tps_65023_remove(struct i2c_client *client)
32330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
32430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = i2c_get_clientdata(client);
32530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int i;
32630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
32730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	for (i = 0; i < TPS65023_NUM_REGULATOR; i++)
32830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		regulator_unregister(tps->rdev[i]);
32930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return 0;
33030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
33130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
332437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic const struct tps_info tps65020_regs[] = {
333437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
334437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC1",
335ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
336ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
337437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
338437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
339437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC2",
340ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
341ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
342437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
343437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
344437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC3",
345437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
346437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = VCORE_VSEL_table,
347437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
348437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
349437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO1",
350437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(TPS65020_LDO1_VSEL_table),
351437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = TPS65020_LDO1_VSEL_table,
352437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
353437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
354437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO2",
355437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(TPS65020_LDO2_VSEL_table),
356437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = TPS65020_LDO2_VSEL_table,
357437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
358437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
359437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
3601c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic const struct tps_info tps65021_regs[] = {
3611c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3621c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC1",
363ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
364ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
3651c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3661c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3671c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC2",
368ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
369ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
3701c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3711c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3721c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC3",
3731c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
3741c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
3751c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3761c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3771c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO1",
3781c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
3791c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
3801c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3811c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3821c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO2",
3831c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
3841c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
3851c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3861c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
3871c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
38830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic const struct tps_info tps65023_regs[] = {
38930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
39030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC1",
3911c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
3921c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
39330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
39430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
39530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC2",
396ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
397ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
39830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
39930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
40030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC3",
401ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
402ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
40330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
40430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
40530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO1",
4061c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
4071c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
40830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
40930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
41030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO2",
4111c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
4121c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
41330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
41430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
41530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
416437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic struct tps_driver_data tps65020_drv_data = {
417437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.info = tps65020_regs,
418437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.core_regulator = TPS65023_DCDC_3,
419437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
420437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
4211c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65021_drv_data = {
4227061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65021_regs,
4237061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_3,
4241c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
4251c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
4261c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65023_drv_data = {
4277061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65023_regs,
4287061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_1,
4291c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
4301c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
4319e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwoodstatic const struct i2c_device_id tps_65023_id[] = {
4329e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{.name = "tps65023",
4331c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65023_drv_data},
4341880a2fc59d2afabc142a311497cf7c320d64506Marek Vasut	{.name = "tps65021",
4351c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65021_drv_data,},
436437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{.name = "tps65020",
437437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.driver_data = (unsigned long) &tps65020_drv_data},
4389e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{ },
43930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
44030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
44130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DEVICE_TABLE(i2c, tps_65023_id);
44230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
44330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct i2c_driver tps_65023_i2c_driver = {
44430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.driver = {
44530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "tps65023",
44630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.owner = THIS_MODULE,
44730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
44830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.probe = tps_65023_probe,
4495eb9f2b96381ac3fa4a5910c37213c1cb62e9c65Bill Pemberton	.remove = tps_65023_remove,
4509e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	.id_table = tps_65023_id,
45130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
45230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
45330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __init tps_65023_init(void)
45430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
45530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return i2c_add_driver(&tps_65023_i2c_driver);
45630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
45730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalsubsys_initcall(tps_65023_init);
45830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
45930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic void __exit tps_65023_cleanup(void)
46030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
46130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_del_driver(&tps_65023_i2c_driver);
46230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
46330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalmodule_exit(tps_65023_cleanup);
46430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
46530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_AUTHOR("Texas Instruments");
46630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DESCRIPTION("TPS65023 voltage regulator driver");
4679e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam GirdwoodMODULE_LICENSE("GPL v2");
468