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 */
1102040541afb4c623d628e714a412160c53694b7f1Axel Linstatic const unsigned int TPS65020_LDO_VSEL_table[] = {
111ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1050000, 1100000, 1300000,
112ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1800000, 2500000, 3000000, 3300000,
113437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
1141c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1151c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Supported voltage values for LDO regulators
1161c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson * for tps65021 and tps65023 */
117ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO1_VSEL_table[] = {
118ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1000000, 1100000, 1300000, 1800000,
119ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2200000, 2600000, 2800000, 3150000,
12030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
12130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
122ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Linstatic const unsigned int TPS65023_LDO2_VSEL_table[] = {
123ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	1050000, 1200000, 1300000, 1800000,
124ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	2500000, 2800000, 3000000, 3300000,
12530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
12630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
12730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Regulator specific details */
12830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_info {
12930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const char *name;
13030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	u8 table_len;
131ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	const unsigned int *table;
13230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
13330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
13430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* PMIC details */
13530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstruct tps_pmic {
13630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_desc desc[TPS65023_NUM_REGULATOR];
13730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
13830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	const struct tps_info *info[TPS65023_NUM_REGULATOR];
13990923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	struct regmap *regmap;
1401c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
1411c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
1421c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
1431c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson/* Struct passed as driver data */
1441c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstruct tps_driver_data {
1451c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info;
1461c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	u8 core_regulator;
14730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
14830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
149a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Linstatic int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev)
15030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
15130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
15246bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin	int dcdc = rdev_get_id(dev);
15330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
15430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
15530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
15630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
15746bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin	if (dcdc != tps->core_regulator)
158a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin		return 0;
15946bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin
16046bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin	return regulator_get_voltage_sel_regmap(dev);
16130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
16230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1637061873f709bcecc8e079395567e2c314d21f7aaAxel Linstatic int tps65023_dcdc_set_voltage_sel(struct regulator_dev *dev,
1647061873f709bcecc8e079395567e2c314d21f7aaAxel Lin					 unsigned selector)
16530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
16630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps = rdev_get_drvdata(dev);
16730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int dcdc = rdev_get_id(dev);
16830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
1691c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	if (dcdc != tps->core_regulator)
17030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EINVAL;
17130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
17246bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin	return regulator_set_voltage_sel_regmap(dev, selector);
17330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
17430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
17530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on VDCDCx */
17630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_dcdc_ops = {
177ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
178ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
179ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
180a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin	.get_voltage_sel = tps65023_dcdc_get_voltage_sel,
1817061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.set_voltage_sel = tps65023_dcdc_set_voltage_sel,
182ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
183c4bbfbd548671e1aaf92c6dd974790f29b887e0dAxel Lin	.map_voltage = regulator_map_voltage_ascend,
18430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
18530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
18630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on LDOx */
18730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_ldo_ops = {
188ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.is_enabled = regulator_is_enabled_regmap,
189ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.enable = regulator_enable_regmap,
190ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin	.disable = regulator_disable_regmap,
191e90a84473ee941c0056c773923e9cc90a550c266Axel Lin	.get_voltage_sel = regulator_get_voltage_sel_regmap,
192e90a84473ee941c0056c773923e9cc90a550c266Axel Lin	.set_voltage_sel = regulator_set_voltage_sel_regmap,
193ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin	.list_voltage = regulator_list_voltage_table,
194c4bbfbd548671e1aaf92c6dd974790f29b887e0dAxel Lin	.map_voltage = regulator_map_voltage_ascend,
19530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
19630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
19790923351d480fffd0d24646db83f6f8315eed0d9Mark Brownstatic struct regmap_config tps65023_regmap_config = {
19890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.reg_bits = 8,
19990923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	.val_bits = 8,
20090923351d480fffd0d24646db83f6f8315eed0d9Mark Brown};
20190923351d480fffd0d24646db83f6f8315eed0d9Mark Brown
202a5023574d120ca3b9337cedd4e27de90cae9aff7Bill Pembertonstatic int tps_65023_probe(struct i2c_client *client,
20354d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov				     const struct i2c_device_id *id)
20430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
2051c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_driver_data *drv_data = (void *)id->driver_data;
2061c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	const struct tps_info *info = drv_data->info;
207c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown	struct regulator_config config = { };
20830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_init_data *init_data;
20930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct regulator_dev *rdev;
21030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	struct tps_pmic *tps;
21130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	int i;
21254d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov	int error;
21330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
21430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/**
21530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * init_data points to array of regulator_init structures
21630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 * coming from the board-evm file.
21730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	 */
218dff91d0b721bf8f036c1071a8f16a7effaa87514Jingoo Han	init_data = dev_get_platdata(&client->dev);
21930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!init_data)
22030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -EIO;
22130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
22219a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
22330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	if (!tps)
22430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		return -ENOMEM;
22530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
22619a8da2187249c02574ccffaf72637eb224d11c4Axel Lin	tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config);
22790923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	if (IS_ERR(tps->regmap)) {
22890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		error = PTR_ERR(tps->regmap);
22990923351d480fffd0d24646db83f6f8315eed0d9Mark Brown		dev_err(&client->dev, "Failed to allocate register map: %d\n",
23090923351d480fffd0d24646db83f6f8315eed0d9Mark Brown			error);
23119a8da2187249c02574ccffaf72637eb224d11c4Axel Lin		return error;
23290923351d480fffd0d24646db83f6f8315eed0d9Mark Brown	}
23330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
23430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	/* common for all regulators */
2351c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	tps->core_regulator = drv_data->core_regulator;
23630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
23730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) {
23830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Store regulator specific information */
23930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->info[i] = info;
24030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
24130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].name = info->name;
24277fa44d0e10711e899788c58fe53f8f7b18c7f67Axel Lin		tps->desc[i].id = i;
243ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].n_voltages = info->table_len;
244ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		tps->desc[i].volt_table = info->table;
24530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].ops = (i > TPS65023_DCDC_3 ?
24630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal					&tps65023_ldo_ops : &tps65023_dcdc_ops);
24730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].type = REGULATOR_VOLTAGE;
24830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->desc[i].owner = THIS_MODULE;
24930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
250ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL;
251e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		switch (i) {
252e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		case TPS65023_LDO_1:
253e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL;
254e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_mask = 0x07;
255ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 1;
256e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			break;
257e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		case TPS65023_LDO_2:
258e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL;
259e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			tps->desc[i].vsel_mask = 0x70;
260ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask = 1 << 2;
261e90a84473ee941c0056c773923e9cc90a550c266Axel Lin			break;
262e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		default: /* DCDCx */
263ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin			tps->desc[i].enable_mask =
264ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin					1 << (TPS65023_NUM_REGULATOR - i);
26546bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin			tps->desc[i].vsel_reg = TPS65023_REG_DEF_CORE;
26646bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin			tps->desc[i].vsel_mask = info->table_len - 1;
26746bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin			tps->desc[i].apply_reg = TPS65023_REG_CON_CTRL2;
26846bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin			tps->desc[i].apply_bit = TPS65023_REG_CTRL2_GO;
269e90a84473ee941c0056c773923e9cc90a550c266Axel Lin		}
270ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin
271c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.dev = &client->dev;
272c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.init_data = init_data;
273c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown		config.driver_data = tps;
274ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin		config.regmap = tps->regmap;
275c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown
27630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Register the regulators */
2779c7c9eae5f7ac57465c0ac6adc8e3ad3afad2544Sachin Kamat		rdev = devm_regulator_register(&client->dev, &tps->desc[i],
2789c7c9eae5f7ac57465c0ac6adc8e3ad3afad2544Sachin Kamat					       &config);
27930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		if (IS_ERR(rdev)) {
28030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal			dev_err(&client->dev, "failed to register %s\n",
28130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal				id->name);
2829c7c9eae5f7ac57465c0ac6adc8e3ad3afad2544Sachin Kamat			return PTR_ERR(rdev);
28330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		}
28430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
28530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		/* Save regulator for cleanup */
28630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		tps->rdev[i] = rdev;
28730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	}
28830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
28930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_set_clientdata(client, tps);
29030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
291fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson	/* Enable setting output voltage by I2C */
29243530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi	regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2,
2935ee034e614a9e115763fa8d50ae18bf6a13b21d1Jingoo Han					TPS65023_REG_CTRL2_CORE_ADJ,
2945ee034e614a9e115763fa8d50ae18bf6a13b21d1Jingoo Han					TPS65023_REG_CTRL2_CORE_ADJ);
295f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson
29630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return 0;
29730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
29830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
299437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic const struct tps_info tps65020_regs[] = {
300437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
301437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC1",
302ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
303ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
304437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
305437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
306437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC2",
307ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
308ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
309437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
310437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
311437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "VDCDC3",
312437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
313437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.table = VCORE_VSEL_table,
314437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
315437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
316437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO1",
3172040541afb4c623d628e714a412160c53694b7f1Axel Lin		.table_len = ARRAY_SIZE(TPS65020_LDO_VSEL_table),
3182040541afb4c623d628e714a412160c53694b7f1Axel Lin		.table = TPS65020_LDO_VSEL_table,
319437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
320437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{
321437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson		.name = "LDO2",
3222040541afb4c623d628e714a412160c53694b7f1Axel Lin		.table_len = ARRAY_SIZE(TPS65020_LDO_VSEL_table),
3232040541afb4c623d628e714a412160c53694b7f1Axel Lin		.table = TPS65020_LDO_VSEL_table,
324437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	},
325437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
326437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
3271c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic const struct tps_info tps65021_regs[] = {
3281c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3291c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC1",
330ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
331ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
3321c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3331c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3341c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC2",
335ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
336ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
3371c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3381c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3391c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "VDCDC3",
3401c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
3411c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
3421c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3431c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3441c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO1",
3451c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
3461c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
3471c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3481c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	{
3491c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.name = "LDO2",
3501c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
3511c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
3521c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	},
3531c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
3541c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
35530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic const struct tps_info tps65023_regs[] = {
35630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
35730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC1",
3581c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(VCORE_VSEL_table),
3591c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = VCORE_VSEL_table,
36030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
36130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
36230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC2",
363ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table),
364ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_3300000_VSEL_table,
36530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
36630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
36730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "VDCDC3",
368ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table),
369ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin		.table = DCDC_FIXED_1800000_VSEL_table,
37030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
37130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
37230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO1",
3731c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
3741c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO1_VSEL_table,
37530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
37630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	{
37730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "LDO2",
3781c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
3791c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson		.table = TPS65023_LDO2_VSEL_table,
38030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
38130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
38230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
383437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic struct tps_driver_data tps65020_drv_data = {
384437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.info = tps65020_regs,
385437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.core_regulator = TPS65023_DCDC_3,
386437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson};
387437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson
3881c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65021_drv_data = {
3897061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65021_regs,
3907061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_3,
3911c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
3921c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
3931c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65023_drv_data = {
3947061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.info = tps65023_regs,
3957061873f709bcecc8e079395567e2c314d21f7aaAxel Lin	.core_regulator = TPS65023_DCDC_1,
3961c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson};
3971c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson
3989e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwoodstatic const struct i2c_device_id tps_65023_id[] = {
3999e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{.name = "tps65023",
4001c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65023_drv_data},
4011880a2fc59d2afabc142a311497cf7c320d64506Marek Vasut	{.name = "tps65021",
4021c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson	.driver_data = (unsigned long) &tps65021_drv_data,},
403437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	{.name = "tps65020",
404437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson	.driver_data = (unsigned long) &tps65020_drv_data},
4059e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	{ },
40630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
40730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
40830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DEVICE_TABLE(i2c, tps_65023_id);
40930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
41030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct i2c_driver tps_65023_i2c_driver = {
41130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.driver = {
41230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.name = "tps65023",
41330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal		.owner = THIS_MODULE,
41430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	},
41530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	.probe = tps_65023_probe,
4169e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood	.id_table = tps_65023_id,
41730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal};
41830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
41930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __init tps_65023_init(void)
42030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
42130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	return i2c_add_driver(&tps_65023_i2c_driver);
42230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
42330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalsubsys_initcall(tps_65023_init);
42430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
42530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic void __exit tps_65023_cleanup(void)
42630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{
42730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal	i2c_del_driver(&tps_65023_i2c_driver);
42830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}
42930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalmodule_exit(tps_65023_cleanup);
43030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal
43130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_AUTHOR("Texas Instruments");
43230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DESCRIPTION("TPS65023 voltage regulator driver");
4339e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam GirdwoodMODULE_LICENSE("GPL v2");
434