tps65023-regulator.c revision 46bcb006ae92cdd10c39eeaecf2ca4994026943a
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); 15746bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin int dcdc = rdev_get_id(dev); 15830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 15930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3) 16030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return -EINVAL; 16130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 16246bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin if (dcdc != tps->core_regulator) 163a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin return 0; 16446bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin 16546bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin return regulator_get_voltage_sel_regmap(dev); 16630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 16730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 1687061873f709bcecc8e079395567e2c314d21f7aaAxel Linstatic int tps65023_dcdc_set_voltage_sel(struct regulator_dev *dev, 1697061873f709bcecc8e079395567e2c314d21f7aaAxel Lin unsigned selector) 17030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{ 17130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal struct tps_pmic *tps = rdev_get_drvdata(dev); 17230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal int dcdc = rdev_get_id(dev); 17330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 1741c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson if (dcdc != tps->core_regulator) 17530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return -EINVAL; 17630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 17746bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin return regulator_set_voltage_sel_regmap(dev, selector); 17830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 17930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 18030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on VDCDCx */ 18130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_dcdc_ops = { 182ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .is_enabled = regulator_is_enabled_regmap, 183ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .enable = regulator_enable_regmap, 184ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .disable = regulator_disable_regmap, 185a133829e66d25e1ce293a30bcc3fb8eb653a1519Axel Lin .get_voltage_sel = tps65023_dcdc_get_voltage_sel, 1867061873f709bcecc8e079395567e2c314d21f7aaAxel Lin .set_voltage_sel = tps65023_dcdc_set_voltage_sel, 187ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .list_voltage = regulator_list_voltage_table, 18830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}; 18930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 19030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal/* Operations permitted on LDOx */ 19130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct regulator_ops tps65023_ldo_ops = { 192ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .is_enabled = regulator_is_enabled_regmap, 193ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .enable = regulator_enable_regmap, 194ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin .disable = regulator_disable_regmap, 195e90a84473ee941c0056c773923e9cc90a550c266Axel Lin .get_voltage_sel = regulator_get_voltage_sel_regmap, 196e90a84473ee941c0056c773923e9cc90a550c266Axel Lin .set_voltage_sel = regulator_set_voltage_sel_regmap, 197ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .list_voltage = regulator_list_voltage_table, 19830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}; 19930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 20090923351d480fffd0d24646db83f6f8315eed0d9Mark Brownstatic struct regmap_config tps65023_regmap_config = { 20190923351d480fffd0d24646db83f6f8315eed0d9Mark Brown .reg_bits = 8, 20290923351d480fffd0d24646db83f6f8315eed0d9Mark Brown .val_bits = 8, 20390923351d480fffd0d24646db83f6f8315eed0d9Mark Brown}; 20490923351d480fffd0d24646db83f6f8315eed0d9Mark Brown 205a5023574d120ca3b9337cedd4e27de90cae9aff7Bill Pembertonstatic int tps_65023_probe(struct i2c_client *client, 20654d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov const struct i2c_device_id *id) 20730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{ 2081c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson const struct tps_driver_data *drv_data = (void *)id->driver_data; 2091c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson const struct tps_info *info = drv_data->info; 210c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown struct regulator_config config = { }; 21130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal struct regulator_init_data *init_data; 21230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal struct regulator_dev *rdev; 21330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal struct tps_pmic *tps; 21430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal int i; 21554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov int error; 21630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 21730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 21830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return -EIO; 21930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 22030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal /** 22130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * init_data points to array of regulator_init structures 22230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal * coming from the board-evm file. 22330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal */ 22430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal init_data = client->dev.platform_data; 22530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal if (!init_data) 22630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return -EIO; 22730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 22819a8da2187249c02574ccffaf72637eb224d11c4Axel Lin tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); 22930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal if (!tps) 23030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return -ENOMEM; 23130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 23219a8da2187249c02574ccffaf72637eb224d11c4Axel Lin tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config); 23390923351d480fffd0d24646db83f6f8315eed0d9Mark Brown if (IS_ERR(tps->regmap)) { 23490923351d480fffd0d24646db83f6f8315eed0d9Mark Brown error = PTR_ERR(tps->regmap); 23590923351d480fffd0d24646db83f6f8315eed0d9Mark Brown dev_err(&client->dev, "Failed to allocate register map: %d\n", 23690923351d480fffd0d24646db83f6f8315eed0d9Mark Brown error); 23719a8da2187249c02574ccffaf72637eb224d11c4Axel Lin return error; 23890923351d480fffd0d24646db83f6f8315eed0d9Mark Brown } 23930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 24030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal /* common for all regulators */ 2411c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson tps->core_regulator = drv_data->core_regulator; 24230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 24330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) { 24430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal /* Store regulator specific information */ 24530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->info[i] = info; 24630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 24730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->desc[i].name = info->name; 24877fa44d0e10711e899788c58fe53f8f7b18c7f67Axel Lin tps->desc[i].id = i; 249ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin tps->desc[i].n_voltages = info->table_len; 250ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin tps->desc[i].volt_table = info->table; 25130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->desc[i].ops = (i > TPS65023_DCDC_3 ? 25230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal &tps65023_ldo_ops : &tps65023_dcdc_ops); 25330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->desc[i].type = REGULATOR_VOLTAGE; 25430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->desc[i].owner = THIS_MODULE; 25530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 256ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL; 257e90a84473ee941c0056c773923e9cc90a550c266Axel Lin switch (i) { 258e90a84473ee941c0056c773923e9cc90a550c266Axel Lin case TPS65023_LDO_1: 259e90a84473ee941c0056c773923e9cc90a550c266Axel Lin tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; 260e90a84473ee941c0056c773923e9cc90a550c266Axel Lin tps->desc[i].vsel_mask = 0x07; 261ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin tps->desc[i].enable_mask = 1 << 1; 262e90a84473ee941c0056c773923e9cc90a550c266Axel Lin break; 263e90a84473ee941c0056c773923e9cc90a550c266Axel Lin case TPS65023_LDO_2: 264e90a84473ee941c0056c773923e9cc90a550c266Axel Lin tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; 265e90a84473ee941c0056c773923e9cc90a550c266Axel Lin tps->desc[i].vsel_mask = 0x70; 266ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin tps->desc[i].enable_mask = 1 << 2; 267e90a84473ee941c0056c773923e9cc90a550c266Axel Lin break; 268e90a84473ee941c0056c773923e9cc90a550c266Axel Lin default: /* DCDCx */ 269ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin tps->desc[i].enable_mask = 270ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin 1 << (TPS65023_NUM_REGULATOR - i); 27146bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin tps->desc[i].vsel_reg = TPS65023_REG_DEF_CORE; 27246bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin tps->desc[i].vsel_mask = info->table_len - 1; 27346bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin tps->desc[i].apply_reg = TPS65023_REG_CON_CTRL2; 27446bcb006ae92cdd10c39eeaecf2ca4994026943aAxel Lin tps->desc[i].apply_bit = TPS65023_REG_CTRL2_GO; 275e90a84473ee941c0056c773923e9cc90a550c266Axel Lin } 276ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin 277c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown config.dev = &client->dev; 278c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown config.init_data = init_data; 279c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown config.driver_data = tps; 280ee7b19142d0e7b88a981fd50b9b8758f697b459eAxel Lin config.regmap = tps->regmap; 281c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown 28230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal /* Register the regulators */ 283c172708d38a401b2f3f841dfcd862b469fa0b670Mark Brown rdev = regulator_register(&tps->desc[i], &config); 28430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal if (IS_ERR(rdev)) { 28530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal dev_err(&client->dev, "failed to register %s\n", 28630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal id->name); 28754d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov error = PTR_ERR(rdev); 28854d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov goto fail; 28930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal } 29030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 29130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal /* Save regulator for cleanup */ 29230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal tps->rdev[i] = rdev; 29330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal } 29430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 29530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal i2c_set_clientdata(client, tps); 29630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 297fc999b83799074832367d3cfd724c341c849a7daMarcus Folkesson /* Enable setting output voltage by I2C */ 29843530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2, 29943530b69d758328d3ffe6ab98fd640463e8e3667Jonghwan Choi TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ); 300f068ad8cca7532bc42115d61489de00fe57c3909Marcus Folkesson 30130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return 0; 30254d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov 30354d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov fail: 30454d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov while (--i >= 0) 30554d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov regulator_unregister(tps->rdev[i]); 30654d13ab1038911249fc5769efee87fed000623c0Dmitry Torokhov return error; 30730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 30830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 3098dc995f56ef7aedb41873fdeaa1971f3aa166ebdBill Pembertonstatic int tps_65023_remove(struct i2c_client *client) 31030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{ 31130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal struct tps_pmic *tps = i2c_get_clientdata(client); 31230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal int i; 31330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 31430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal for (i = 0; i < TPS65023_NUM_REGULATOR; i++) 31530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal regulator_unregister(tps->rdev[i]); 31630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return 0; 31730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 31830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 319437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic const struct tps_info tps65020_regs[] = { 320437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson { 321437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .name = "VDCDC1", 322ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 323ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 324437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson }, 325437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson { 326437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .name = "VDCDC2", 327ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 328ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 329437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson }, 330437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson { 331437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .name = "VDCDC3", 332437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 333437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table = VCORE_VSEL_table, 334437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson }, 335437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson { 336437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .name = "LDO1", 337437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table_len = ARRAY_SIZE(TPS65020_LDO1_VSEL_table), 338437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table = TPS65020_LDO1_VSEL_table, 339437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson }, 340437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson { 341437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .name = "LDO2", 342437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table_len = ARRAY_SIZE(TPS65020_LDO2_VSEL_table), 343437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .table = TPS65020_LDO2_VSEL_table, 344437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson }, 345437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson}; 346437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson 3471c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic const struct tps_info tps65021_regs[] = { 3481c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson { 3491c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .name = "VDCDC1", 350ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 351ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 3521c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson }, 3531c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson { 3541c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .name = "VDCDC2", 355ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 356ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 3571c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson }, 3581c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson { 3591c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .name = "VDCDC3", 3601c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 3611c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = VCORE_VSEL_table, 3621c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson }, 3631c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson { 3641c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .name = "LDO1", 3651c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table), 3661c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = TPS65023_LDO1_VSEL_table, 3671c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson }, 3681c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson { 3691c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .name = "LDO2", 3701c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table), 3711c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = TPS65023_LDO2_VSEL_table, 3721c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson }, 3731c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson}; 3741c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson 37530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic const struct tps_info tps65023_regs[] = { 37630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal { 37730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "VDCDC1", 3781c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 3791c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = VCORE_VSEL_table, 38030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 38130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal { 38230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "VDCDC2", 383ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 384ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 38530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 38630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal { 38730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "VDCDC3", 388ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 389ba3bd8a301c76838faded10dbe2ecdfdc2eb5d7eAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 39030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 39130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal { 39230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "LDO1", 3931c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table), 3941c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = TPS65023_LDO1_VSEL_table, 39530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 39630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal { 39730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "LDO2", 3981c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table), 3991c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .table = TPS65023_LDO2_VSEL_table, 40030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 40130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}; 40230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 403437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkessonstatic struct tps_driver_data tps65020_drv_data = { 404437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .info = tps65020_regs, 405437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .core_regulator = TPS65023_DCDC_3, 406437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson}; 407437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson 4081c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65021_drv_data = { 4097061873f709bcecc8e079395567e2c314d21f7aaAxel Lin .info = tps65021_regs, 4107061873f709bcecc8e079395567e2c314d21f7aaAxel Lin .core_regulator = TPS65023_DCDC_3, 4111c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson}; 4121c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson 4131c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkessonstatic struct tps_driver_data tps65023_drv_data = { 4147061873f709bcecc8e079395567e2c314d21f7aaAxel Lin .info = tps65023_regs, 4157061873f709bcecc8e079395567e2c314d21f7aaAxel Lin .core_regulator = TPS65023_DCDC_1, 4161c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson}; 4171c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson 4189e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwoodstatic const struct i2c_device_id tps_65023_id[] = { 4199e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood {.name = "tps65023", 4201c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .driver_data = (unsigned long) &tps65023_drv_data}, 4211880a2fc59d2afabc142a311497cf7c320d64506Marek Vasut {.name = "tps65021", 4221c3ede05d123f1484b28fa7c8500a1a29e34e3baMarcus Folkesson .driver_data = (unsigned long) &tps65021_drv_data,}, 423437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson {.name = "tps65020", 424437afd2ad6ba252fdbad9a1ad2610992fea55bd6Marcus Folkesson .driver_data = (unsigned long) &tps65020_drv_data}, 4259e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood { }, 42630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}; 42730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 42830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DEVICE_TABLE(i2c, tps_65023_id); 42930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 43030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic struct i2c_driver tps_65023_i2c_driver = { 43130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .driver = { 43230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .name = "tps65023", 43330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .owner = THIS_MODULE, 43430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal }, 43530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal .probe = tps_65023_probe, 4365eb9f2b96381ac3fa4a5910c37213c1cb62e9c65Bill Pemberton .remove = tps_65023_remove, 4379e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam Girdwood .id_table = tps_65023_id, 43830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal}; 43930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 44030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic int __init tps_65023_init(void) 44130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{ 44230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal return i2c_add_driver(&tps_65023_i2c_driver); 44330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 44430e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalsubsys_initcall(tps_65023_init); 44530e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 44630e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalstatic void __exit tps_65023_cleanup(void) 44730e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal{ 44830e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal i2c_del_driver(&tps_65023_i2c_driver); 44930e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal} 45030e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwalmodule_exit(tps_65023_cleanup); 45130e6599d317ec83c664f341f18b5b2b57b831a6dAnuj Aggarwal 45230e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_AUTHOR("Texas Instruments"); 45330e6599d317ec83c664f341f18b5b2b57b831a6dAnuj AggarwalMODULE_DESCRIPTION("TPS65023 voltage regulator driver"); 4549e108d33edcb88bac3db39ba1683fc2c0591d7d4Liam GirdwoodMODULE_LICENSE("GPL v2"); 455