155f4fa4eSRobert Jarzmik /* 255f4fa4eSRobert Jarzmik * max1586.c -- Voltage and current regulation for the Maxim 1586 355f4fa4eSRobert Jarzmik * 455f4fa4eSRobert Jarzmik * Copyright (C) 2008 Robert Jarzmik 555f4fa4eSRobert Jarzmik * 655f4fa4eSRobert Jarzmik * This program is free software; you can redistribute it and/or modify 755f4fa4eSRobert Jarzmik * it under the terms of the GNU General Public License as published by 855f4fa4eSRobert Jarzmik * the Free Software Foundation; either version 2 of the License, or 955f4fa4eSRobert Jarzmik * (at your option) any later version. 1055f4fa4eSRobert Jarzmik * 1155f4fa4eSRobert Jarzmik * This program is distributed in the hope that it will be useful, 1255f4fa4eSRobert Jarzmik * but WITHOUT ANY WARRANTY; without even the implied warranty of 1355f4fa4eSRobert Jarzmik * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1455f4fa4eSRobert Jarzmik * GNU General Public License for more details. 1555f4fa4eSRobert Jarzmik * 1655f4fa4eSRobert Jarzmik * You should have received a copy of the GNU General Public License 1755f4fa4eSRobert Jarzmik * along with this program; if not, write to the Free Software 1855f4fa4eSRobert Jarzmik * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1955f4fa4eSRobert Jarzmik */ 2055f4fa4eSRobert Jarzmik #include <linux/module.h> 2155f4fa4eSRobert Jarzmik #include <linux/err.h> 2255f4fa4eSRobert Jarzmik #include <linux/i2c.h> 2355f4fa4eSRobert Jarzmik #include <linux/platform_device.h> 2455f4fa4eSRobert Jarzmik #include <linux/regulator/driver.h> 255a0e3ad6STejun Heo #include <linux/slab.h> 2655f4fa4eSRobert Jarzmik #include <linux/regulator/max1586.h> 2755f4fa4eSRobert Jarzmik 2855f4fa4eSRobert Jarzmik #define MAX1586_V3_MAX_VSEL 31 2955f4fa4eSRobert Jarzmik #define MAX1586_V6_MAX_VSEL 3 3055f4fa4eSRobert Jarzmik 3155f4fa4eSRobert Jarzmik #define MAX1586_V3_MIN_UV 700000 3255f4fa4eSRobert Jarzmik #define MAX1586_V3_MAX_UV 1475000 3355f4fa4eSRobert Jarzmik 3455f4fa4eSRobert Jarzmik #define MAX1586_V6_MIN_UV 0 3555f4fa4eSRobert Jarzmik #define MAX1586_V6_MAX_UV 3000000 3655f4fa4eSRobert Jarzmik 3755f4fa4eSRobert Jarzmik #define I2C_V3_SELECT (0 << 5) 3855f4fa4eSRobert Jarzmik #define I2C_V6_SELECT (1 << 5) 3955f4fa4eSRobert Jarzmik 40b110a8fbSPhilipp Zabel struct max1586_data { 41b110a8fbSPhilipp Zabel struct i2c_client *client; 42b110a8fbSPhilipp Zabel 43b110a8fbSPhilipp Zabel /* min/max V3 voltage */ 44c8f1e502SPhilipp Zabel unsigned int min_uV; 45c8f1e502SPhilipp Zabel unsigned int max_uV; 46b110a8fbSPhilipp Zabel 47b110a8fbSPhilipp Zabel struct regulator_dev *rdev[0]; 48b110a8fbSPhilipp Zabel }; 49b110a8fbSPhilipp Zabel 5055f4fa4eSRobert Jarzmik /* 5155f4fa4eSRobert Jarzmik * V3 voltage 5255f4fa4eSRobert Jarzmik * On I2C bus, sending a "x" byte to the max1586 means : 5355f4fa4eSRobert Jarzmik * set V3 to 0.700V + (x & 0x1f) * 0.025V 54b110a8fbSPhilipp Zabel * This voltage can be increased by external resistors 55b110a8fbSPhilipp Zabel * R24 and R25=100kOhm as described in the data sheet. 56b110a8fbSPhilipp Zabel * The gain is approximately: 1 + R24/R25 + R24/185.5kOhm 5755f4fa4eSRobert Jarzmik */ 58b110a8fbSPhilipp Zabel static int max1586_v3_calc_voltage(struct max1586_data *max1586, 59b110a8fbSPhilipp Zabel unsigned selector) 6055f4fa4eSRobert Jarzmik { 61b110a8fbSPhilipp Zabel unsigned range_uV = max1586->max_uV - max1586->min_uV; 62b110a8fbSPhilipp Zabel 63b110a8fbSPhilipp Zabel return max1586->min_uV + (selector * range_uV / MAX1586_V3_MAX_VSEL); 6455f4fa4eSRobert Jarzmik } 6555f4fa4eSRobert Jarzmik 663a93f2a9SMark Brown static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV, 673a93f2a9SMark Brown unsigned *selector) 6855f4fa4eSRobert Jarzmik { 69b110a8fbSPhilipp Zabel struct max1586_data *max1586 = rdev_get_drvdata(rdev); 70b110a8fbSPhilipp Zabel struct i2c_client *client = max1586->client; 71b110a8fbSPhilipp Zabel unsigned range_uV = max1586->max_uV - max1586->min_uV; 7255f4fa4eSRobert Jarzmik u8 v3_prog; 7355f4fa4eSRobert Jarzmik 74b110a8fbSPhilipp Zabel if (min_uV > max1586->max_uV || max_uV < max1586->min_uV) 7555f4fa4eSRobert Jarzmik return -EINVAL; 76b110a8fbSPhilipp Zabel if (min_uV < max1586->min_uV) 77b110a8fbSPhilipp Zabel min_uV = max1586->min_uV; 7855f4fa4eSRobert Jarzmik 797d530d32SAxel Lin *selector = DIV_ROUND_UP((min_uV - max1586->min_uV) * 807d530d32SAxel Lin MAX1586_V3_MAX_VSEL, range_uV); 813a93f2a9SMark Brown if (max1586_v3_calc_voltage(max1586, *selector) > max_uV) 8255f4fa4eSRobert Jarzmik return -EINVAL; 8355f4fa4eSRobert Jarzmik 8455f4fa4eSRobert Jarzmik dev_dbg(&client->dev, "changing voltage v3 to %dmv\n", 853a93f2a9SMark Brown max1586_v3_calc_voltage(max1586, *selector) / 1000); 8655f4fa4eSRobert Jarzmik 873a93f2a9SMark Brown v3_prog = I2C_V3_SELECT | (u8) *selector; 8855f4fa4eSRobert Jarzmik return i2c_smbus_write_byte(client, v3_prog); 8955f4fa4eSRobert Jarzmik } 9055f4fa4eSRobert Jarzmik 9155f4fa4eSRobert Jarzmik static int max1586_v3_list(struct regulator_dev *rdev, unsigned selector) 9255f4fa4eSRobert Jarzmik { 93b110a8fbSPhilipp Zabel struct max1586_data *max1586 = rdev_get_drvdata(rdev); 94b110a8fbSPhilipp Zabel 9555f4fa4eSRobert Jarzmik if (selector > MAX1586_V3_MAX_VSEL) 9655f4fa4eSRobert Jarzmik return -EINVAL; 97b110a8fbSPhilipp Zabel return max1586_v3_calc_voltage(max1586, selector); 9855f4fa4eSRobert Jarzmik } 9955f4fa4eSRobert Jarzmik 10055f4fa4eSRobert Jarzmik /* 10155f4fa4eSRobert Jarzmik * V6 voltage 10255f4fa4eSRobert Jarzmik * On I2C bus, sending a "x" byte to the max1586 means : 10355f4fa4eSRobert Jarzmik * set V6 to either 0V, 1.8V, 2.5V, 3V depending on (x & 0x3) 10455f4fa4eSRobert Jarzmik * As regulator framework doesn't accept voltages to be 0V, we use 1uV. 10555f4fa4eSRobert Jarzmik */ 10655f4fa4eSRobert Jarzmik static int max1586_v6_calc_voltage(unsigned selector) 10755f4fa4eSRobert Jarzmik { 10855f4fa4eSRobert Jarzmik static int voltages_uv[] = { 1, 1800000, 2500000, 3000000 }; 10955f4fa4eSRobert Jarzmik 11055f4fa4eSRobert Jarzmik return voltages_uv[selector]; 11155f4fa4eSRobert Jarzmik } 11255f4fa4eSRobert Jarzmik 1133a93f2a9SMark Brown static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV, 1143a93f2a9SMark Brown unsigned int *selector) 11555f4fa4eSRobert Jarzmik { 11655f4fa4eSRobert Jarzmik struct i2c_client *client = rdev_get_drvdata(rdev); 11755f4fa4eSRobert Jarzmik u8 v6_prog; 11855f4fa4eSRobert Jarzmik 11955f4fa4eSRobert Jarzmik if (min_uV < MAX1586_V6_MIN_UV || min_uV > MAX1586_V6_MAX_UV) 12055f4fa4eSRobert Jarzmik return -EINVAL; 12155f4fa4eSRobert Jarzmik if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV) 12255f4fa4eSRobert Jarzmik return -EINVAL; 12355f4fa4eSRobert Jarzmik 12455f4fa4eSRobert Jarzmik if (min_uV < 1800000) 1253a93f2a9SMark Brown *selector = 0; 1263e352f9eSAxel Lin else if (min_uV < 2500000) 1273a93f2a9SMark Brown *selector = 1; 1283e352f9eSAxel Lin else if (min_uV < 3000000) 1293a93f2a9SMark Brown *selector = 2; 1303e352f9eSAxel Lin else if (min_uV >= 3000000) 1313a93f2a9SMark Brown *selector = 3; 13255f4fa4eSRobert Jarzmik 1333a93f2a9SMark Brown if (max1586_v6_calc_voltage(*selector) > max_uV) 13455f4fa4eSRobert Jarzmik return -EINVAL; 13555f4fa4eSRobert Jarzmik 13655f4fa4eSRobert Jarzmik dev_dbg(&client->dev, "changing voltage v6 to %dmv\n", 1373a93f2a9SMark Brown max1586_v6_calc_voltage(*selector) / 1000); 13855f4fa4eSRobert Jarzmik 1393a93f2a9SMark Brown v6_prog = I2C_V6_SELECT | (u8) *selector; 14055f4fa4eSRobert Jarzmik return i2c_smbus_write_byte(client, v6_prog); 14155f4fa4eSRobert Jarzmik } 14255f4fa4eSRobert Jarzmik 14355f4fa4eSRobert Jarzmik static int max1586_v6_list(struct regulator_dev *rdev, unsigned selector) 14455f4fa4eSRobert Jarzmik { 14555f4fa4eSRobert Jarzmik if (selector > MAX1586_V6_MAX_VSEL) 14655f4fa4eSRobert Jarzmik return -EINVAL; 14755f4fa4eSRobert Jarzmik return max1586_v6_calc_voltage(selector); 14855f4fa4eSRobert Jarzmik } 14955f4fa4eSRobert Jarzmik 15055f4fa4eSRobert Jarzmik /* 15155f4fa4eSRobert Jarzmik * The Maxim 1586 controls V3 and V6 voltages, but offers no way of reading back 15255f4fa4eSRobert Jarzmik * the set up value. 15355f4fa4eSRobert Jarzmik */ 15455f4fa4eSRobert Jarzmik static struct regulator_ops max1586_v3_ops = { 15555f4fa4eSRobert Jarzmik .set_voltage = max1586_v3_set, 15655f4fa4eSRobert Jarzmik .list_voltage = max1586_v3_list, 15755f4fa4eSRobert Jarzmik }; 15855f4fa4eSRobert Jarzmik 15955f4fa4eSRobert Jarzmik static struct regulator_ops max1586_v6_ops = { 16055f4fa4eSRobert Jarzmik .set_voltage = max1586_v6_set, 16155f4fa4eSRobert Jarzmik .list_voltage = max1586_v6_list, 16255f4fa4eSRobert Jarzmik }; 16355f4fa4eSRobert Jarzmik 1640373bcffSAxel Lin static const struct regulator_desc max1586_reg[] = { 16555f4fa4eSRobert Jarzmik { 16655f4fa4eSRobert Jarzmik .name = "Output_V3", 16755f4fa4eSRobert Jarzmik .id = MAX1586_V3, 16855f4fa4eSRobert Jarzmik .ops = &max1586_v3_ops, 16955f4fa4eSRobert Jarzmik .type = REGULATOR_VOLTAGE, 17055f4fa4eSRobert Jarzmik .n_voltages = MAX1586_V3_MAX_VSEL + 1, 17155f4fa4eSRobert Jarzmik .owner = THIS_MODULE, 17255f4fa4eSRobert Jarzmik }, 17355f4fa4eSRobert Jarzmik { 17455f4fa4eSRobert Jarzmik .name = "Output_V6", 17555f4fa4eSRobert Jarzmik .id = MAX1586_V6, 17655f4fa4eSRobert Jarzmik .ops = &max1586_v6_ops, 17755f4fa4eSRobert Jarzmik .type = REGULATOR_VOLTAGE, 17855f4fa4eSRobert Jarzmik .n_voltages = MAX1586_V6_MAX_VSEL + 1, 17955f4fa4eSRobert Jarzmik .owner = THIS_MODULE, 18055f4fa4eSRobert Jarzmik }, 18155f4fa4eSRobert Jarzmik }; 18255f4fa4eSRobert Jarzmik 183bd88c9b2SDmitry Torokhov static int __devinit max1586_pmic_probe(struct i2c_client *client, 18455f4fa4eSRobert Jarzmik const struct i2c_device_id *i2c_id) 18555f4fa4eSRobert Jarzmik { 18655f4fa4eSRobert Jarzmik struct regulator_dev **rdev; 18755f4fa4eSRobert Jarzmik struct max1586_platform_data *pdata = client->dev.platform_data; 188c172708dSMark Brown struct regulator_config config = { }; 189b110a8fbSPhilipp Zabel struct max1586_data *max1586; 190b110a8fbSPhilipp Zabel int i, id, ret = -ENOMEM; 19155f4fa4eSRobert Jarzmik 192b110a8fbSPhilipp Zabel max1586 = kzalloc(sizeof(struct max1586_data) + 193b110a8fbSPhilipp Zabel sizeof(struct regulator_dev *) * (MAX1586_V6 + 1), 19455f4fa4eSRobert Jarzmik GFP_KERNEL); 195b110a8fbSPhilipp Zabel if (!max1586) 196b110a8fbSPhilipp Zabel goto out; 19755f4fa4eSRobert Jarzmik 198b110a8fbSPhilipp Zabel max1586->client = client; 199b110a8fbSPhilipp Zabel 200b110a8fbSPhilipp Zabel if (!pdata->v3_gain) { 20155f4fa4eSRobert Jarzmik ret = -EINVAL; 202b110a8fbSPhilipp Zabel goto out_unmap; 203b110a8fbSPhilipp Zabel } 204c8f1e502SPhilipp Zabel max1586->min_uV = MAX1586_V3_MIN_UV / 1000 * pdata->v3_gain / 1000; 205c8f1e502SPhilipp Zabel max1586->max_uV = MAX1586_V3_MAX_UV / 1000 * pdata->v3_gain / 1000; 206b110a8fbSPhilipp Zabel 207b110a8fbSPhilipp Zabel rdev = max1586->rdev; 20855f4fa4eSRobert Jarzmik for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) { 20955f4fa4eSRobert Jarzmik id = pdata->subdevs[i].id; 21055f4fa4eSRobert Jarzmik if (!pdata->subdevs[i].platform_data) 21155f4fa4eSRobert Jarzmik continue; 21255f4fa4eSRobert Jarzmik if (id < MAX1586_V3 || id > MAX1586_V6) { 21355f4fa4eSRobert Jarzmik dev_err(&client->dev, "invalid regulator id %d\n", id); 21455f4fa4eSRobert Jarzmik goto err; 21555f4fa4eSRobert Jarzmik } 216c172708dSMark Brown 217c172708dSMark Brown config.dev = &client->dev; 218c172708dSMark Brown config.init_data = pdata->subdevs[i].platform_data; 219c172708dSMark Brown config.driver_data = max1586; 220c172708dSMark Brown 221c172708dSMark Brown rdev[i] = regulator_register(&max1586_reg[id], &config); 22255f4fa4eSRobert Jarzmik if (IS_ERR(rdev[i])) { 22355f4fa4eSRobert Jarzmik ret = PTR_ERR(rdev[i]); 22455f4fa4eSRobert Jarzmik dev_err(&client->dev, "failed to register %s\n", 22555f4fa4eSRobert Jarzmik max1586_reg[id].name); 22655f4fa4eSRobert Jarzmik goto err; 22755f4fa4eSRobert Jarzmik } 22855f4fa4eSRobert Jarzmik } 22955f4fa4eSRobert Jarzmik 2307c4c25e4SAxel Lin i2c_set_clientdata(client, max1586); 23155f4fa4eSRobert Jarzmik dev_info(&client->dev, "Maxim 1586 regulator driver loaded\n"); 23255f4fa4eSRobert Jarzmik return 0; 23355f4fa4eSRobert Jarzmik 23455f4fa4eSRobert Jarzmik err: 23555f4fa4eSRobert Jarzmik while (--i >= 0) 23655f4fa4eSRobert Jarzmik regulator_unregister(rdev[i]); 237b110a8fbSPhilipp Zabel out_unmap: 238b110a8fbSPhilipp Zabel kfree(max1586); 239b110a8fbSPhilipp Zabel out: 24055f4fa4eSRobert Jarzmik return ret; 24155f4fa4eSRobert Jarzmik } 24255f4fa4eSRobert Jarzmik 243bd88c9b2SDmitry Torokhov static int __devexit max1586_pmic_remove(struct i2c_client *client) 24455f4fa4eSRobert Jarzmik { 2457c4c25e4SAxel Lin struct max1586_data *max1586 = i2c_get_clientdata(client); 24655f4fa4eSRobert Jarzmik int i; 24755f4fa4eSRobert Jarzmik 24855f4fa4eSRobert Jarzmik for (i = 0; i <= MAX1586_V6; i++) 2497c4c25e4SAxel Lin if (max1586->rdev[i]) 2507c4c25e4SAxel Lin regulator_unregister(max1586->rdev[i]); 2517c4c25e4SAxel Lin kfree(max1586); 25255f4fa4eSRobert Jarzmik 25355f4fa4eSRobert Jarzmik return 0; 25455f4fa4eSRobert Jarzmik } 25555f4fa4eSRobert Jarzmik 25655f4fa4eSRobert Jarzmik static const struct i2c_device_id max1586_id[] = { 25755f4fa4eSRobert Jarzmik { "max1586", 0 }, 25855f4fa4eSRobert Jarzmik { } 25955f4fa4eSRobert Jarzmik }; 26055f4fa4eSRobert Jarzmik MODULE_DEVICE_TABLE(i2c, max1586_id); 26155f4fa4eSRobert Jarzmik 26255f4fa4eSRobert Jarzmik static struct i2c_driver max1586_pmic_driver = { 26355f4fa4eSRobert Jarzmik .probe = max1586_pmic_probe, 264bd88c9b2SDmitry Torokhov .remove = __devexit_p(max1586_pmic_remove), 26555f4fa4eSRobert Jarzmik .driver = { 26655f4fa4eSRobert Jarzmik .name = "max1586", 267bd88c9b2SDmitry Torokhov .owner = THIS_MODULE, 26855f4fa4eSRobert Jarzmik }, 26955f4fa4eSRobert Jarzmik .id_table = max1586_id, 27055f4fa4eSRobert Jarzmik }; 27155f4fa4eSRobert Jarzmik 27255f4fa4eSRobert Jarzmik static int __init max1586_pmic_init(void) 27355f4fa4eSRobert Jarzmik { 27455f4fa4eSRobert Jarzmik return i2c_add_driver(&max1586_pmic_driver); 27555f4fa4eSRobert Jarzmik } 27655f4fa4eSRobert Jarzmik subsys_initcall(max1586_pmic_init); 27755f4fa4eSRobert Jarzmik 27855f4fa4eSRobert Jarzmik static void __exit max1586_pmic_exit(void) 27955f4fa4eSRobert Jarzmik { 28055f4fa4eSRobert Jarzmik i2c_del_driver(&max1586_pmic_driver); 28155f4fa4eSRobert Jarzmik } 28255f4fa4eSRobert Jarzmik module_exit(max1586_pmic_exit); 28355f4fa4eSRobert Jarzmik 28455f4fa4eSRobert Jarzmik /* Module information */ 28555f4fa4eSRobert Jarzmik MODULE_DESCRIPTION("MAXIM 1586 voltage regulator driver"); 28655f4fa4eSRobert Jarzmik MODULE_AUTHOR("Robert Jarzmik"); 28755f4fa4eSRobert Jarzmik MODULE_LICENSE("GPL"); 288