130e6599dSAnuj Aggarwal /* 230e6599dSAnuj Aggarwal * tps65023-regulator.c 330e6599dSAnuj Aggarwal * 430e6599dSAnuj Aggarwal * Supports TPS65023 Regulator 530e6599dSAnuj Aggarwal * 630e6599dSAnuj Aggarwal * Copyright (C) 2009 Texas Instrument Incorporated - http://www.ti.com/ 730e6599dSAnuj Aggarwal * 830e6599dSAnuj Aggarwal * This program is free software; you can redistribute it and/or 930e6599dSAnuj Aggarwal * modify it under the terms of the GNU General Public License as 1030e6599dSAnuj Aggarwal * published by the Free Software Foundation version 2. 1130e6599dSAnuj Aggarwal * 1230e6599dSAnuj Aggarwal * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 1330e6599dSAnuj Aggarwal * whether express or implied; without even the implied warranty of 1430e6599dSAnuj Aggarwal * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1530e6599dSAnuj Aggarwal * General Public License for more details. 1630e6599dSAnuj Aggarwal */ 1730e6599dSAnuj Aggarwal 1830e6599dSAnuj Aggarwal #include <linux/kernel.h> 1930e6599dSAnuj Aggarwal #include <linux/module.h> 2030e6599dSAnuj Aggarwal #include <linux/init.h> 2130e6599dSAnuj Aggarwal #include <linux/err.h> 2230e6599dSAnuj Aggarwal #include <linux/platform_device.h> 2330e6599dSAnuj Aggarwal #include <linux/regulator/driver.h> 2430e6599dSAnuj Aggarwal #include <linux/regulator/machine.h> 2530e6599dSAnuj Aggarwal #include <linux/i2c.h> 265a0e3ad6STejun Heo #include <linux/slab.h> 2790923351SMark Brown #include <linux/regmap.h> 2830e6599dSAnuj Aggarwal 2930e6599dSAnuj Aggarwal /* Register definitions */ 3030e6599dSAnuj Aggarwal #define TPS65023_REG_VERSION 0 3130e6599dSAnuj Aggarwal #define TPS65023_REG_PGOODZ 1 3230e6599dSAnuj Aggarwal #define TPS65023_REG_MASK 2 3330e6599dSAnuj Aggarwal #define TPS65023_REG_REG_CTRL 3 3430e6599dSAnuj Aggarwal #define TPS65023_REG_CON_CTRL 4 3530e6599dSAnuj Aggarwal #define TPS65023_REG_CON_CTRL2 5 3630e6599dSAnuj Aggarwal #define TPS65023_REG_DEF_CORE 6 3730e6599dSAnuj Aggarwal #define TPS65023_REG_DEFSLEW 7 3830e6599dSAnuj Aggarwal #define TPS65023_REG_LDO_CTRL 8 3930e6599dSAnuj Aggarwal 4030e6599dSAnuj Aggarwal /* PGOODZ bitfields */ 4130e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_PWRFAILZ BIT(7) 4230e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_LOWBATTZ BIT(6) 4330e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_VDCDC1 BIT(5) 4430e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_VDCDC2 BIT(4) 4530e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_VDCDC3 BIT(3) 4630e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_LDO2 BIT(2) 4730e6599dSAnuj Aggarwal #define TPS65023_PGOODZ_LDO1 BIT(1) 4830e6599dSAnuj Aggarwal 4930e6599dSAnuj Aggarwal /* MASK bitfields */ 5030e6599dSAnuj Aggarwal #define TPS65023_MASK_PWRFAILZ BIT(7) 5130e6599dSAnuj Aggarwal #define TPS65023_MASK_LOWBATTZ BIT(6) 5230e6599dSAnuj Aggarwal #define TPS65023_MASK_VDCDC1 BIT(5) 5330e6599dSAnuj Aggarwal #define TPS65023_MASK_VDCDC2 BIT(4) 5430e6599dSAnuj Aggarwal #define TPS65023_MASK_VDCDC3 BIT(3) 5530e6599dSAnuj Aggarwal #define TPS65023_MASK_LDO2 BIT(2) 5630e6599dSAnuj Aggarwal #define TPS65023_MASK_LDO1 BIT(1) 5730e6599dSAnuj Aggarwal 5830e6599dSAnuj Aggarwal /* REG_CTRL bitfields */ 5930e6599dSAnuj Aggarwal #define TPS65023_REG_CTRL_VDCDC1_EN BIT(5) 6030e6599dSAnuj Aggarwal #define TPS65023_REG_CTRL_VDCDC2_EN BIT(4) 6130e6599dSAnuj Aggarwal #define TPS65023_REG_CTRL_VDCDC3_EN BIT(3) 6230e6599dSAnuj Aggarwal #define TPS65023_REG_CTRL_LDO2_EN BIT(2) 6330e6599dSAnuj Aggarwal #define TPS65023_REG_CTRL_LDO1_EN BIT(1) 6430e6599dSAnuj Aggarwal 65fc999b83SMarcus Folkesson /* REG_CTRL2 bitfields */ 66fc999b83SMarcus Folkesson #define TPS65023_REG_CTRL2_GO BIT(7) 67fc999b83SMarcus Folkesson #define TPS65023_REG_CTRL2_CORE_ADJ BIT(6) 68fc999b83SMarcus Folkesson #define TPS65023_REG_CTRL2_DCDC2 BIT(2) 69f068ad8cSMarcus Folkesson #define TPS65023_REG_CTRL2_DCDC1 BIT(1) 70f068ad8cSMarcus Folkesson #define TPS65023_REG_CTRL2_DCDC3 BIT(0) 71f068ad8cSMarcus Folkesson 7230e6599dSAnuj Aggarwal /* Number of step-down converters available */ 7330e6599dSAnuj Aggarwal #define TPS65023_NUM_DCDC 3 7430e6599dSAnuj Aggarwal /* Number of LDO voltage regulators available */ 7530e6599dSAnuj Aggarwal #define TPS65023_NUM_LDO 2 7630e6599dSAnuj Aggarwal /* Number of total regulators available */ 7730e6599dSAnuj Aggarwal #define TPS65023_NUM_REGULATOR (TPS65023_NUM_DCDC + TPS65023_NUM_LDO) 7830e6599dSAnuj Aggarwal 7930e6599dSAnuj Aggarwal /* DCDCs */ 8030e6599dSAnuj Aggarwal #define TPS65023_DCDC_1 0 8130e6599dSAnuj Aggarwal #define TPS65023_DCDC_2 1 8230e6599dSAnuj Aggarwal #define TPS65023_DCDC_3 2 8330e6599dSAnuj Aggarwal /* LDOs */ 8430e6599dSAnuj Aggarwal #define TPS65023_LDO_1 3 8530e6599dSAnuj Aggarwal #define TPS65023_LDO_2 4 8630e6599dSAnuj Aggarwal 8730e6599dSAnuj Aggarwal #define TPS65023_MAX_REG_ID TPS65023_LDO_2 8830e6599dSAnuj Aggarwal 8930e6599dSAnuj Aggarwal /* Supported voltage values for regulators */ 90ba3bd8a3SAxel Lin static const unsigned int VCORE_VSEL_table[] = { 91ba3bd8a3SAxel Lin 800000, 825000, 850000, 875000, 92ba3bd8a3SAxel Lin 900000, 925000, 950000, 975000, 93ba3bd8a3SAxel Lin 1000000, 1025000, 1050000, 1075000, 94ba3bd8a3SAxel Lin 1100000, 1125000, 1150000, 1175000, 95ba3bd8a3SAxel Lin 1200000, 1225000, 1250000, 1275000, 96ba3bd8a3SAxel Lin 1300000, 1325000, 1350000, 1375000, 97ba3bd8a3SAxel Lin 1400000, 1425000, 1450000, 1475000, 98ba3bd8a3SAxel Lin 1500000, 1525000, 1550000, 1600000, 99ba3bd8a3SAxel Lin }; 100ba3bd8a3SAxel Lin 101ba3bd8a3SAxel Lin static const unsigned int DCDC_FIXED_3300000_VSEL_table[] = { 102ba3bd8a3SAxel Lin 3300000, 103ba3bd8a3SAxel Lin }; 104ba3bd8a3SAxel Lin 105ba3bd8a3SAxel Lin static const unsigned int DCDC_FIXED_1800000_VSEL_table[] = { 106ba3bd8a3SAxel Lin 1800000, 10730e6599dSAnuj Aggarwal }; 10830e6599dSAnuj Aggarwal 109437afd2aSMarcus Folkesson /* Supported voltage values for LDO regulators for tps65020 */ 110ba3bd8a3SAxel Lin static const unsigned int TPS65020_LDO1_VSEL_table[] = { 111ba3bd8a3SAxel Lin 1000000, 1050000, 1100000, 1300000, 112ba3bd8a3SAxel Lin 1800000, 2500000, 3000000, 3300000, 113437afd2aSMarcus Folkesson }; 1141c3ede05SMarcus Folkesson 115ba3bd8a3SAxel Lin static const unsigned int TPS65020_LDO2_VSEL_table[] = { 116ba3bd8a3SAxel Lin 1000000, 1050000, 1100000, 1300000, 117ba3bd8a3SAxel Lin 1800000, 2500000, 3000000, 3300000, 118437afd2aSMarcus Folkesson }; 1191c3ede05SMarcus Folkesson 1201c3ede05SMarcus Folkesson /* Supported voltage values for LDO regulators 1211c3ede05SMarcus Folkesson * for tps65021 and tps65023 */ 122ba3bd8a3SAxel Lin static const unsigned int TPS65023_LDO1_VSEL_table[] = { 123ba3bd8a3SAxel Lin 1000000, 1100000, 1300000, 1800000, 124ba3bd8a3SAxel Lin 2200000, 2600000, 2800000, 3150000, 12530e6599dSAnuj Aggarwal }; 12630e6599dSAnuj Aggarwal 127ba3bd8a3SAxel Lin static const unsigned int TPS65023_LDO2_VSEL_table[] = { 128ba3bd8a3SAxel Lin 1050000, 1200000, 1300000, 1800000, 129ba3bd8a3SAxel Lin 2500000, 2800000, 3000000, 3300000, 13030e6599dSAnuj Aggarwal }; 13130e6599dSAnuj Aggarwal 13230e6599dSAnuj Aggarwal /* Regulator specific details */ 13330e6599dSAnuj Aggarwal struct tps_info { 13430e6599dSAnuj Aggarwal const char *name; 13530e6599dSAnuj Aggarwal u8 table_len; 136ba3bd8a3SAxel Lin const unsigned int *table; 13730e6599dSAnuj Aggarwal }; 13830e6599dSAnuj Aggarwal 13930e6599dSAnuj Aggarwal /* PMIC details */ 14030e6599dSAnuj Aggarwal struct tps_pmic { 14130e6599dSAnuj Aggarwal struct regulator_desc desc[TPS65023_NUM_REGULATOR]; 14230e6599dSAnuj Aggarwal struct regulator_dev *rdev[TPS65023_NUM_REGULATOR]; 14330e6599dSAnuj Aggarwal const struct tps_info *info[TPS65023_NUM_REGULATOR]; 14490923351SMark Brown struct regmap *regmap; 1451c3ede05SMarcus Folkesson u8 core_regulator; 1461c3ede05SMarcus Folkesson }; 1471c3ede05SMarcus Folkesson 1481c3ede05SMarcus Folkesson /* Struct passed as driver data */ 1491c3ede05SMarcus Folkesson struct tps_driver_data { 1501c3ede05SMarcus Folkesson const struct tps_info *info; 1511c3ede05SMarcus Folkesson u8 core_regulator; 15230e6599dSAnuj Aggarwal }; 15330e6599dSAnuj Aggarwal 154a133829eSAxel Lin static int tps65023_dcdc_get_voltage_sel(struct regulator_dev *dev) 15530e6599dSAnuj Aggarwal { 15630e6599dSAnuj Aggarwal struct tps_pmic *tps = rdev_get_drvdata(dev); 15743530b69SJonghwan Choi int ret; 15830e6599dSAnuj Aggarwal int data, dcdc = rdev_get_id(dev); 15930e6599dSAnuj Aggarwal 16030e6599dSAnuj Aggarwal if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3) 16130e6599dSAnuj Aggarwal return -EINVAL; 16230e6599dSAnuj Aggarwal 1631c3ede05SMarcus Folkesson if (dcdc == tps->core_regulator) { 16443530b69SJonghwan Choi ret = regmap_read(tps->regmap, TPS65023_REG_DEF_CORE, &data); 16543530b69SJonghwan Choi if (ret != 0) 16643530b69SJonghwan Choi return ret; 16730e6599dSAnuj Aggarwal data &= (tps->info[dcdc]->table_len - 1); 168a133829eSAxel Lin return data; 16930e6599dSAnuj Aggarwal } else 170a133829eSAxel Lin return 0; 17130e6599dSAnuj Aggarwal } 17230e6599dSAnuj Aggarwal 1737061873fSAxel Lin static int tps65023_dcdc_set_voltage_sel(struct regulator_dev *dev, 1747061873fSAxel Lin unsigned selector) 17530e6599dSAnuj Aggarwal { 17630e6599dSAnuj Aggarwal struct tps_pmic *tps = rdev_get_drvdata(dev); 17730e6599dSAnuj Aggarwal int dcdc = rdev_get_id(dev); 178cc17ef3fSMarcus Folkesson int ret; 17930e6599dSAnuj Aggarwal 1801c3ede05SMarcus Folkesson if (dcdc != tps->core_regulator) 18130e6599dSAnuj Aggarwal return -EINVAL; 18230e6599dSAnuj Aggarwal 1837061873fSAxel Lin ret = regmap_write(tps->regmap, TPS65023_REG_DEF_CORE, selector); 1847061873fSAxel Lin if (ret) 1857061873fSAxel Lin goto out; 186cc17ef3fSMarcus Folkesson 187cc17ef3fSMarcus Folkesson /* Tell the chip that we have changed the value in DEFCORE 188cc17ef3fSMarcus Folkesson * and its time to update the core voltage 189cc17ef3fSMarcus Folkesson */ 1907061873fSAxel Lin ret = regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2, 19143530b69SJonghwan Choi TPS65023_REG_CTRL2_GO, TPS65023_REG_CTRL2_GO); 192cc17ef3fSMarcus Folkesson 1937061873fSAxel Lin out: 194cc17ef3fSMarcus Folkesson return ret; 19530e6599dSAnuj Aggarwal } 19630e6599dSAnuj Aggarwal 19730e6599dSAnuj Aggarwal /* Operations permitted on VDCDCx */ 19830e6599dSAnuj Aggarwal static struct regulator_ops tps65023_dcdc_ops = { 199ee7b1914SAxel Lin .is_enabled = regulator_is_enabled_regmap, 200ee7b1914SAxel Lin .enable = regulator_enable_regmap, 201ee7b1914SAxel Lin .disable = regulator_disable_regmap, 202a133829eSAxel Lin .get_voltage_sel = tps65023_dcdc_get_voltage_sel, 2037061873fSAxel Lin .set_voltage_sel = tps65023_dcdc_set_voltage_sel, 204ba3bd8a3SAxel Lin .list_voltage = regulator_list_voltage_table, 20530e6599dSAnuj Aggarwal }; 20630e6599dSAnuj Aggarwal 20730e6599dSAnuj Aggarwal /* Operations permitted on LDOx */ 20830e6599dSAnuj Aggarwal static struct regulator_ops tps65023_ldo_ops = { 209ee7b1914SAxel Lin .is_enabled = regulator_is_enabled_regmap, 210ee7b1914SAxel Lin .enable = regulator_enable_regmap, 211ee7b1914SAxel Lin .disable = regulator_disable_regmap, 212e90a8447SAxel Lin .get_voltage_sel = regulator_get_voltage_sel_regmap, 213e90a8447SAxel Lin .set_voltage_sel = regulator_set_voltage_sel_regmap, 214ba3bd8a3SAxel Lin .list_voltage = regulator_list_voltage_table, 21530e6599dSAnuj Aggarwal }; 21630e6599dSAnuj Aggarwal 21790923351SMark Brown static struct regmap_config tps65023_regmap_config = { 21890923351SMark Brown .reg_bits = 8, 21990923351SMark Brown .val_bits = 8, 22090923351SMark Brown }; 22190923351SMark Brown 22254d13ab1SDmitry Torokhov static int __devinit tps_65023_probe(struct i2c_client *client, 22354d13ab1SDmitry Torokhov const struct i2c_device_id *id) 22430e6599dSAnuj Aggarwal { 2251c3ede05SMarcus Folkesson const struct tps_driver_data *drv_data = (void *)id->driver_data; 2261c3ede05SMarcus Folkesson const struct tps_info *info = drv_data->info; 227c172708dSMark Brown struct regulator_config config = { }; 22830e6599dSAnuj Aggarwal struct regulator_init_data *init_data; 22930e6599dSAnuj Aggarwal struct regulator_dev *rdev; 23030e6599dSAnuj Aggarwal struct tps_pmic *tps; 23130e6599dSAnuj Aggarwal int i; 23254d13ab1SDmitry Torokhov int error; 23330e6599dSAnuj Aggarwal 23430e6599dSAnuj Aggarwal if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 23530e6599dSAnuj Aggarwal return -EIO; 23630e6599dSAnuj Aggarwal 23730e6599dSAnuj Aggarwal /** 23830e6599dSAnuj Aggarwal * init_data points to array of regulator_init structures 23930e6599dSAnuj Aggarwal * coming from the board-evm file. 24030e6599dSAnuj Aggarwal */ 24130e6599dSAnuj Aggarwal init_data = client->dev.platform_data; 24230e6599dSAnuj Aggarwal if (!init_data) 24330e6599dSAnuj Aggarwal return -EIO; 24430e6599dSAnuj Aggarwal 24519a8da21SAxel Lin tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); 24630e6599dSAnuj Aggarwal if (!tps) 24730e6599dSAnuj Aggarwal return -ENOMEM; 24830e6599dSAnuj Aggarwal 24919a8da21SAxel Lin tps->regmap = devm_regmap_init_i2c(client, &tps65023_regmap_config); 25090923351SMark Brown if (IS_ERR(tps->regmap)) { 25190923351SMark Brown error = PTR_ERR(tps->regmap); 25290923351SMark Brown dev_err(&client->dev, "Failed to allocate register map: %d\n", 25390923351SMark Brown error); 25419a8da21SAxel Lin return error; 25590923351SMark Brown } 25630e6599dSAnuj Aggarwal 25730e6599dSAnuj Aggarwal /* common for all regulators */ 2581c3ede05SMarcus Folkesson tps->core_regulator = drv_data->core_regulator; 25930e6599dSAnuj Aggarwal 26030e6599dSAnuj Aggarwal for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) { 26130e6599dSAnuj Aggarwal /* Store regulator specific information */ 26230e6599dSAnuj Aggarwal tps->info[i] = info; 26330e6599dSAnuj Aggarwal 26430e6599dSAnuj Aggarwal tps->desc[i].name = info->name; 26577fa44d0SAxel Lin tps->desc[i].id = i; 2661c3ede05SMarcus Folkesson tps->desc[i].n_voltages = info->table_len; 267ba3bd8a3SAxel Lin tps->desc[i].volt_table = info->table; 26830e6599dSAnuj Aggarwal tps->desc[i].ops = (i > TPS65023_DCDC_3 ? 26930e6599dSAnuj Aggarwal &tps65023_ldo_ops : &tps65023_dcdc_ops); 27030e6599dSAnuj Aggarwal tps->desc[i].type = REGULATOR_VOLTAGE; 27130e6599dSAnuj Aggarwal tps->desc[i].owner = THIS_MODULE; 27230e6599dSAnuj Aggarwal 273ee7b1914SAxel Lin tps->desc[i].enable_reg = TPS65023_REG_REG_CTRL; 274e90a8447SAxel Lin switch (i) { 275e90a8447SAxel Lin case TPS65023_LDO_1: 276e90a8447SAxel Lin tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; 277e90a8447SAxel Lin tps->desc[i].vsel_mask = 0x07; 278ee7b1914SAxel Lin tps->desc[i].enable_mask = 1 << 1; 279e90a8447SAxel Lin break; 280e90a8447SAxel Lin case TPS65023_LDO_2: 281e90a8447SAxel Lin tps->desc[i].vsel_reg = TPS65023_REG_LDO_CTRL; 282e90a8447SAxel Lin tps->desc[i].vsel_mask = 0x70; 283ee7b1914SAxel Lin tps->desc[i].enable_mask = 1 << 2; 284e90a8447SAxel Lin break; 285e90a8447SAxel Lin default: /* DCDCx */ 286ee7b1914SAxel Lin tps->desc[i].enable_mask = 287ee7b1914SAxel Lin 1 << (TPS65023_NUM_REGULATOR - i); 288e90a8447SAxel Lin } 289ee7b1914SAxel Lin 290c172708dSMark Brown config.dev = &client->dev; 291c172708dSMark Brown config.init_data = init_data; 292c172708dSMark Brown config.driver_data = tps; 293ee7b1914SAxel Lin config.regmap = tps->regmap; 294c172708dSMark Brown 29530e6599dSAnuj Aggarwal /* Register the regulators */ 296c172708dSMark Brown rdev = regulator_register(&tps->desc[i], &config); 29730e6599dSAnuj Aggarwal if (IS_ERR(rdev)) { 29830e6599dSAnuj Aggarwal dev_err(&client->dev, "failed to register %s\n", 29930e6599dSAnuj Aggarwal id->name); 30054d13ab1SDmitry Torokhov error = PTR_ERR(rdev); 30154d13ab1SDmitry Torokhov goto fail; 30230e6599dSAnuj Aggarwal } 30330e6599dSAnuj Aggarwal 30430e6599dSAnuj Aggarwal /* Save regulator for cleanup */ 30530e6599dSAnuj Aggarwal tps->rdev[i] = rdev; 30630e6599dSAnuj Aggarwal } 30730e6599dSAnuj Aggarwal 30830e6599dSAnuj Aggarwal i2c_set_clientdata(client, tps); 30930e6599dSAnuj Aggarwal 310fc999b83SMarcus Folkesson /* Enable setting output voltage by I2C */ 31143530b69SJonghwan Choi regmap_update_bits(tps->regmap, TPS65023_REG_CON_CTRL2, 31243530b69SJonghwan Choi TPS65023_REG_CTRL2_CORE_ADJ, TPS65023_REG_CTRL2_CORE_ADJ); 313fc999b83SMarcus Folkesson 31430e6599dSAnuj Aggarwal return 0; 31554d13ab1SDmitry Torokhov 31654d13ab1SDmitry Torokhov fail: 31754d13ab1SDmitry Torokhov while (--i >= 0) 31854d13ab1SDmitry Torokhov regulator_unregister(tps->rdev[i]); 31954d13ab1SDmitry Torokhov return error; 32030e6599dSAnuj Aggarwal } 32130e6599dSAnuj Aggarwal 32230e6599dSAnuj Aggarwal static int __devexit tps_65023_remove(struct i2c_client *client) 32330e6599dSAnuj Aggarwal { 32430e6599dSAnuj Aggarwal struct tps_pmic *tps = i2c_get_clientdata(client); 32530e6599dSAnuj Aggarwal int i; 32630e6599dSAnuj Aggarwal 32730e6599dSAnuj Aggarwal for (i = 0; i < TPS65023_NUM_REGULATOR; i++) 32830e6599dSAnuj Aggarwal regulator_unregister(tps->rdev[i]); 32930e6599dSAnuj Aggarwal return 0; 33030e6599dSAnuj Aggarwal } 33130e6599dSAnuj Aggarwal 332437afd2aSMarcus Folkesson static const struct tps_info tps65020_regs[] = { 333437afd2aSMarcus Folkesson { 334437afd2aSMarcus Folkesson .name = "VDCDC1", 335ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 336ba3bd8a3SAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 337437afd2aSMarcus Folkesson }, 338437afd2aSMarcus Folkesson { 339437afd2aSMarcus Folkesson .name = "VDCDC2", 340ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 341ba3bd8a3SAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 342437afd2aSMarcus Folkesson }, 343437afd2aSMarcus Folkesson { 344437afd2aSMarcus Folkesson .name = "VDCDC3", 345437afd2aSMarcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 346437afd2aSMarcus Folkesson .table = VCORE_VSEL_table, 347437afd2aSMarcus Folkesson }, 348437afd2aSMarcus Folkesson { 349437afd2aSMarcus Folkesson .name = "LDO1", 350437afd2aSMarcus Folkesson .table_len = ARRAY_SIZE(TPS65020_LDO1_VSEL_table), 351437afd2aSMarcus Folkesson .table = TPS65020_LDO1_VSEL_table, 352437afd2aSMarcus Folkesson }, 353437afd2aSMarcus Folkesson { 354437afd2aSMarcus Folkesson .name = "LDO2", 355437afd2aSMarcus Folkesson .table_len = ARRAY_SIZE(TPS65020_LDO2_VSEL_table), 356437afd2aSMarcus Folkesson .table = TPS65020_LDO2_VSEL_table, 357437afd2aSMarcus Folkesson }, 358437afd2aSMarcus Folkesson }; 359437afd2aSMarcus Folkesson 3601c3ede05SMarcus Folkesson static const struct tps_info tps65021_regs[] = { 3611c3ede05SMarcus Folkesson { 3621c3ede05SMarcus Folkesson .name = "VDCDC1", 363ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 364ba3bd8a3SAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 3651c3ede05SMarcus Folkesson }, 3661c3ede05SMarcus Folkesson { 3671c3ede05SMarcus Folkesson .name = "VDCDC2", 368ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 369ba3bd8a3SAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 3701c3ede05SMarcus Folkesson }, 3711c3ede05SMarcus Folkesson { 3721c3ede05SMarcus Folkesson .name = "VDCDC3", 3731c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 3741c3ede05SMarcus Folkesson .table = VCORE_VSEL_table, 3751c3ede05SMarcus Folkesson }, 3761c3ede05SMarcus Folkesson { 3771c3ede05SMarcus Folkesson .name = "LDO1", 3781c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table), 3791c3ede05SMarcus Folkesson .table = TPS65023_LDO1_VSEL_table, 3801c3ede05SMarcus Folkesson }, 3811c3ede05SMarcus Folkesson { 3821c3ede05SMarcus Folkesson .name = "LDO2", 3831c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table), 3841c3ede05SMarcus Folkesson .table = TPS65023_LDO2_VSEL_table, 3851c3ede05SMarcus Folkesson }, 3861c3ede05SMarcus Folkesson }; 3871c3ede05SMarcus Folkesson 38830e6599dSAnuj Aggarwal static const struct tps_info tps65023_regs[] = { 38930e6599dSAnuj Aggarwal { 39030e6599dSAnuj Aggarwal .name = "VDCDC1", 3911c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(VCORE_VSEL_table), 3921c3ede05SMarcus Folkesson .table = VCORE_VSEL_table, 39330e6599dSAnuj Aggarwal }, 39430e6599dSAnuj Aggarwal { 39530e6599dSAnuj Aggarwal .name = "VDCDC2", 396ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_3300000_VSEL_table), 397ba3bd8a3SAxel Lin .table = DCDC_FIXED_3300000_VSEL_table, 39830e6599dSAnuj Aggarwal }, 39930e6599dSAnuj Aggarwal { 40030e6599dSAnuj Aggarwal .name = "VDCDC3", 401ba3bd8a3SAxel Lin .table_len = ARRAY_SIZE(DCDC_FIXED_1800000_VSEL_table), 402ba3bd8a3SAxel Lin .table = DCDC_FIXED_1800000_VSEL_table, 40330e6599dSAnuj Aggarwal }, 40430e6599dSAnuj Aggarwal { 40530e6599dSAnuj Aggarwal .name = "LDO1", 4061c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table), 4071c3ede05SMarcus Folkesson .table = TPS65023_LDO1_VSEL_table, 40830e6599dSAnuj Aggarwal }, 40930e6599dSAnuj Aggarwal { 41030e6599dSAnuj Aggarwal .name = "LDO2", 4111c3ede05SMarcus Folkesson .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table), 4121c3ede05SMarcus Folkesson .table = TPS65023_LDO2_VSEL_table, 41330e6599dSAnuj Aggarwal }, 41430e6599dSAnuj Aggarwal }; 41530e6599dSAnuj Aggarwal 416437afd2aSMarcus Folkesson static struct tps_driver_data tps65020_drv_data = { 417437afd2aSMarcus Folkesson .info = tps65020_regs, 418437afd2aSMarcus Folkesson .core_regulator = TPS65023_DCDC_3, 419437afd2aSMarcus Folkesson }; 420437afd2aSMarcus Folkesson 4211c3ede05SMarcus Folkesson static struct tps_driver_data tps65021_drv_data = { 4221c3ede05SMarcus Folkesson .info = tps65021_regs, 4231c3ede05SMarcus Folkesson .core_regulator = TPS65023_DCDC_3, 4241c3ede05SMarcus Folkesson }; 4251c3ede05SMarcus Folkesson 4261c3ede05SMarcus Folkesson static struct tps_driver_data tps65023_drv_data = { 4271c3ede05SMarcus Folkesson .info = tps65023_regs, 4281c3ede05SMarcus Folkesson .core_regulator = TPS65023_DCDC_1, 4291c3ede05SMarcus Folkesson }; 4301c3ede05SMarcus Folkesson 4319e108d33SLiam Girdwood static const struct i2c_device_id tps_65023_id[] = { 4329e108d33SLiam Girdwood {.name = "tps65023", 4331c3ede05SMarcus Folkesson .driver_data = (unsigned long) &tps65023_drv_data}, 4341880a2fcSMarek Vasut {.name = "tps65021", 4351c3ede05SMarcus Folkesson .driver_data = (unsigned long) &tps65021_drv_data,}, 436437afd2aSMarcus Folkesson {.name = "tps65020", 437437afd2aSMarcus Folkesson .driver_data = (unsigned long) &tps65020_drv_data}, 4389e108d33SLiam Girdwood { }, 43930e6599dSAnuj Aggarwal }; 44030e6599dSAnuj Aggarwal 44130e6599dSAnuj Aggarwal MODULE_DEVICE_TABLE(i2c, tps_65023_id); 44230e6599dSAnuj Aggarwal 44330e6599dSAnuj Aggarwal static struct i2c_driver tps_65023_i2c_driver = { 44430e6599dSAnuj Aggarwal .driver = { 44530e6599dSAnuj Aggarwal .name = "tps65023", 44630e6599dSAnuj Aggarwal .owner = THIS_MODULE, 44730e6599dSAnuj Aggarwal }, 44830e6599dSAnuj Aggarwal .probe = tps_65023_probe, 44930e6599dSAnuj Aggarwal .remove = __devexit_p(tps_65023_remove), 4509e108d33SLiam Girdwood .id_table = tps_65023_id, 45130e6599dSAnuj Aggarwal }; 45230e6599dSAnuj Aggarwal 45330e6599dSAnuj Aggarwal static int __init tps_65023_init(void) 45430e6599dSAnuj Aggarwal { 45530e6599dSAnuj Aggarwal return i2c_add_driver(&tps_65023_i2c_driver); 45630e6599dSAnuj Aggarwal } 45730e6599dSAnuj Aggarwal subsys_initcall(tps_65023_init); 45830e6599dSAnuj Aggarwal 45930e6599dSAnuj Aggarwal static void __exit tps_65023_cleanup(void) 46030e6599dSAnuj Aggarwal { 46130e6599dSAnuj Aggarwal i2c_del_driver(&tps_65023_i2c_driver); 46230e6599dSAnuj Aggarwal } 46330e6599dSAnuj Aggarwal module_exit(tps_65023_cleanup); 46430e6599dSAnuj Aggarwal 46530e6599dSAnuj Aggarwal MODULE_AUTHOR("Texas Instruments"); 46630e6599dSAnuj Aggarwal MODULE_DESCRIPTION("TPS65023 voltage regulator driver"); 46730e6599dSAnuj Aggarwal MODULE_LICENSE("GPL v2"); 468