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> 2555f4fa4eSRobert Jarzmik #include <linux/regulator/max1586.h> 2655f4fa4eSRobert Jarzmik 2755f4fa4eSRobert Jarzmik #define MAX1586_V3_MAX_VSEL 31 2855f4fa4eSRobert Jarzmik #define MAX1586_V6_MAX_VSEL 3 2955f4fa4eSRobert Jarzmik 3055f4fa4eSRobert Jarzmik #define MAX1586_V3_MIN_UV 700000 3155f4fa4eSRobert Jarzmik #define MAX1586_V3_MAX_UV 1475000 3255f4fa4eSRobert Jarzmik 3355f4fa4eSRobert Jarzmik #define MAX1586_V6_MIN_UV 0 3455f4fa4eSRobert Jarzmik #define MAX1586_V6_MAX_UV 3000000 3555f4fa4eSRobert Jarzmik 3655f4fa4eSRobert Jarzmik #define I2C_V3_SELECT (0 << 5) 3755f4fa4eSRobert Jarzmik #define I2C_V6_SELECT (1 << 5) 3855f4fa4eSRobert Jarzmik 39b110a8fbSPhilipp Zabel struct max1586_data { 40b110a8fbSPhilipp Zabel struct i2c_client *client; 41b110a8fbSPhilipp Zabel 42b110a8fbSPhilipp Zabel /* min/max V3 voltage */ 43c8f1e502SPhilipp Zabel unsigned int min_uV; 44c8f1e502SPhilipp Zabel unsigned int max_uV; 45b110a8fbSPhilipp Zabel 46b110a8fbSPhilipp Zabel struct regulator_dev *rdev[0]; 47b110a8fbSPhilipp Zabel }; 48b110a8fbSPhilipp Zabel 4955f4fa4eSRobert Jarzmik /* 5055f4fa4eSRobert Jarzmik * V3 voltage 5155f4fa4eSRobert Jarzmik * On I2C bus, sending a "x" byte to the max1586 means : 5255f4fa4eSRobert Jarzmik * set V3 to 0.700V + (x & 0x1f) * 0.025V 53b110a8fbSPhilipp Zabel * This voltage can be increased by external resistors 54b110a8fbSPhilipp Zabel * R24 and R25=100kOhm as described in the data sheet. 55b110a8fbSPhilipp Zabel * The gain is approximately: 1 + R24/R25 + R24/185.5kOhm 5655f4fa4eSRobert Jarzmik */ 57b110a8fbSPhilipp Zabel static int max1586_v3_calc_voltage(struct max1586_data *max1586, 58b110a8fbSPhilipp Zabel unsigned selector) 5955f4fa4eSRobert Jarzmik { 60b110a8fbSPhilipp Zabel unsigned range_uV = max1586->max_uV - max1586->min_uV; 61b110a8fbSPhilipp Zabel 62b110a8fbSPhilipp Zabel return max1586->min_uV + (selector * range_uV / MAX1586_V3_MAX_VSEL); 6355f4fa4eSRobert Jarzmik } 6455f4fa4eSRobert Jarzmik 6555f4fa4eSRobert Jarzmik static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV) 6655f4fa4eSRobert Jarzmik { 67b110a8fbSPhilipp Zabel struct max1586_data *max1586 = rdev_get_drvdata(rdev); 68b110a8fbSPhilipp Zabel struct i2c_client *client = max1586->client; 69b110a8fbSPhilipp Zabel unsigned range_uV = max1586->max_uV - max1586->min_uV; 7055f4fa4eSRobert Jarzmik unsigned selector; 7155f4fa4eSRobert Jarzmik u8 v3_prog; 7255f4fa4eSRobert Jarzmik 73b110a8fbSPhilipp Zabel if (min_uV > max1586->max_uV || max_uV < max1586->min_uV) 7455f4fa4eSRobert Jarzmik return -EINVAL; 75b110a8fbSPhilipp Zabel if (min_uV < max1586->min_uV) 76b110a8fbSPhilipp Zabel min_uV = max1586->min_uV; 7755f4fa4eSRobert Jarzmik 78b110a8fbSPhilipp Zabel selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL + 79b110a8fbSPhilipp Zabel range_uV - 1) / range_uV; 80b110a8fbSPhilipp Zabel if (max1586_v3_calc_voltage(max1586, selector) > max_uV) 8155f4fa4eSRobert Jarzmik return -EINVAL; 8255f4fa4eSRobert Jarzmik 8355f4fa4eSRobert Jarzmik dev_dbg(&client->dev, "changing voltage v3 to %dmv\n", 84b110a8fbSPhilipp Zabel max1586_v3_calc_voltage(max1586, selector) / 1000); 8555f4fa4eSRobert Jarzmik 8655f4fa4eSRobert Jarzmik v3_prog = I2C_V3_SELECT | (u8) selector; 8755f4fa4eSRobert Jarzmik return i2c_smbus_write_byte(client, v3_prog); 8855f4fa4eSRobert Jarzmik } 8955f4fa4eSRobert Jarzmik 9055f4fa4eSRobert Jarzmik static int max1586_v3_list(struct regulator_dev *rdev, unsigned selector) 9155f4fa4eSRobert Jarzmik { 92b110a8fbSPhilipp Zabel struct max1586_data *max1586 = rdev_get_drvdata(rdev); 93b110a8fbSPhilipp Zabel 9455f4fa4eSRobert Jarzmik if (selector > MAX1586_V3_MAX_VSEL) 9555f4fa4eSRobert Jarzmik return -EINVAL; 96b110a8fbSPhilipp Zabel return max1586_v3_calc_voltage(max1586, selector); 9755f4fa4eSRobert Jarzmik } 9855f4fa4eSRobert Jarzmik 9955f4fa4eSRobert Jarzmik /* 10055f4fa4eSRobert Jarzmik * V6 voltage 10155f4fa4eSRobert Jarzmik * On I2C bus, sending a "x" byte to the max1586 means : 10255f4fa4eSRobert Jarzmik * set V6 to either 0V, 1.8V, 2.5V, 3V depending on (x & 0x3) 10355f4fa4eSRobert Jarzmik * As regulator framework doesn't accept voltages to be 0V, we use 1uV. 10455f4fa4eSRobert Jarzmik */ 10555f4fa4eSRobert Jarzmik static int max1586_v6_calc_voltage(unsigned selector) 10655f4fa4eSRobert Jarzmik { 10755f4fa4eSRobert Jarzmik static int voltages_uv[] = { 1, 1800000, 2500000, 3000000 }; 10855f4fa4eSRobert Jarzmik 10955f4fa4eSRobert Jarzmik return voltages_uv[selector]; 11055f4fa4eSRobert Jarzmik } 11155f4fa4eSRobert Jarzmik 11255f4fa4eSRobert Jarzmik static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV) 11355f4fa4eSRobert Jarzmik { 11455f4fa4eSRobert Jarzmik struct i2c_client *client = rdev_get_drvdata(rdev); 11555f4fa4eSRobert Jarzmik unsigned selector; 11655f4fa4eSRobert Jarzmik u8 v6_prog; 11755f4fa4eSRobert Jarzmik 11855f4fa4eSRobert Jarzmik if (min_uV < MAX1586_V6_MIN_UV || min_uV > MAX1586_V6_MAX_UV) 11955f4fa4eSRobert Jarzmik return -EINVAL; 12055f4fa4eSRobert Jarzmik if (max_uV < MAX1586_V6_MIN_UV || max_uV > MAX1586_V6_MAX_UV) 12155f4fa4eSRobert Jarzmik return -EINVAL; 12255f4fa4eSRobert Jarzmik 12355f4fa4eSRobert Jarzmik if (min_uV >= 3000000) 12455f4fa4eSRobert Jarzmik selector = 3; 12555f4fa4eSRobert Jarzmik if (min_uV < 3000000) 12655f4fa4eSRobert Jarzmik selector = 2; 12755f4fa4eSRobert Jarzmik if (min_uV < 2500000) 12855f4fa4eSRobert Jarzmik selector = 1; 12955f4fa4eSRobert Jarzmik if (min_uV < 1800000) 13055f4fa4eSRobert Jarzmik selector = 0; 13155f4fa4eSRobert Jarzmik 13255f4fa4eSRobert Jarzmik if (max1586_v6_calc_voltage(selector) > max_uV) 13355f4fa4eSRobert Jarzmik return -EINVAL; 13455f4fa4eSRobert Jarzmik 13555f4fa4eSRobert Jarzmik dev_dbg(&client->dev, "changing voltage v6 to %dmv\n", 13655f4fa4eSRobert Jarzmik max1586_v6_calc_voltage(selector) / 1000); 13755f4fa4eSRobert Jarzmik 13855f4fa4eSRobert Jarzmik v6_prog = I2C_V6_SELECT | (u8) selector; 13955f4fa4eSRobert Jarzmik return i2c_smbus_write_byte(client, v6_prog); 14055f4fa4eSRobert Jarzmik } 14155f4fa4eSRobert Jarzmik 14255f4fa4eSRobert Jarzmik static int max1586_v6_list(struct regulator_dev *rdev, unsigned selector) 14355f4fa4eSRobert Jarzmik { 14455f4fa4eSRobert Jarzmik if (selector > MAX1586_V6_MAX_VSEL) 14555f4fa4eSRobert Jarzmik return -EINVAL; 14655f4fa4eSRobert Jarzmik return max1586_v6_calc_voltage(selector); 14755f4fa4eSRobert Jarzmik } 14855f4fa4eSRobert Jarzmik 14955f4fa4eSRobert Jarzmik /* 15055f4fa4eSRobert Jarzmik * The Maxim 1586 controls V3 and V6 voltages, but offers no way of reading back 15155f4fa4eSRobert Jarzmik * the set up value. 15255f4fa4eSRobert Jarzmik */ 15355f4fa4eSRobert Jarzmik static struct regulator_ops max1586_v3_ops = { 15455f4fa4eSRobert Jarzmik .set_voltage = max1586_v3_set, 15555f4fa4eSRobert Jarzmik .list_voltage = max1586_v3_list, 15655f4fa4eSRobert Jarzmik }; 15755f4fa4eSRobert Jarzmik 15855f4fa4eSRobert Jarzmik static struct regulator_ops max1586_v6_ops = { 15955f4fa4eSRobert Jarzmik .set_voltage = max1586_v6_set, 16055f4fa4eSRobert Jarzmik .list_voltage = max1586_v6_list, 16155f4fa4eSRobert Jarzmik }; 16255f4fa4eSRobert Jarzmik 16355f4fa4eSRobert Jarzmik static struct regulator_desc max1586_reg[] = { 16455f4fa4eSRobert Jarzmik { 16555f4fa4eSRobert Jarzmik .name = "Output_V3", 16655f4fa4eSRobert Jarzmik .id = MAX1586_V3, 16755f4fa4eSRobert Jarzmik .ops = &max1586_v3_ops, 16855f4fa4eSRobert Jarzmik .type = REGULATOR_VOLTAGE, 16955f4fa4eSRobert Jarzmik .n_voltages = MAX1586_V3_MAX_VSEL + 1, 17055f4fa4eSRobert Jarzmik .owner = THIS_MODULE, 17155f4fa4eSRobert Jarzmik }, 17255f4fa4eSRobert Jarzmik { 17355f4fa4eSRobert Jarzmik .name = "Output_V6", 17455f4fa4eSRobert Jarzmik .id = MAX1586_V6, 17555f4fa4eSRobert Jarzmik .ops = &max1586_v6_ops, 17655f4fa4eSRobert Jarzmik .type = REGULATOR_VOLTAGE, 17755f4fa4eSRobert Jarzmik .n_voltages = MAX1586_V6_MAX_VSEL + 1, 17855f4fa4eSRobert Jarzmik .owner = THIS_MODULE, 17955f4fa4eSRobert Jarzmik }, 18055f4fa4eSRobert Jarzmik }; 18155f4fa4eSRobert Jarzmik 182bd88c9b2SDmitry Torokhov static int __devinit max1586_pmic_probe(struct i2c_client *client, 18355f4fa4eSRobert Jarzmik const struct i2c_device_id *i2c_id) 18455f4fa4eSRobert Jarzmik { 18555f4fa4eSRobert Jarzmik struct regulator_dev **rdev; 18655f4fa4eSRobert Jarzmik struct max1586_platform_data *pdata = client->dev.platform_data; 187b110a8fbSPhilipp Zabel struct max1586_data *max1586; 188b110a8fbSPhilipp Zabel int i, id, ret = -ENOMEM; 18955f4fa4eSRobert Jarzmik 190b110a8fbSPhilipp Zabel max1586 = kzalloc(sizeof(struct max1586_data) + 191b110a8fbSPhilipp Zabel sizeof(struct regulator_dev *) * (MAX1586_V6 + 1), 19255f4fa4eSRobert Jarzmik GFP_KERNEL); 193b110a8fbSPhilipp Zabel if (!max1586) 194b110a8fbSPhilipp Zabel goto out; 19555f4fa4eSRobert Jarzmik 196b110a8fbSPhilipp Zabel max1586->client = client; 197b110a8fbSPhilipp Zabel 198b110a8fbSPhilipp Zabel if (!pdata->v3_gain) { 19955f4fa4eSRobert Jarzmik ret = -EINVAL; 200b110a8fbSPhilipp Zabel goto out_unmap; 201b110a8fbSPhilipp Zabel } 202c8f1e502SPhilipp Zabel max1586->min_uV = MAX1586_V3_MIN_UV / 1000 * pdata->v3_gain / 1000; 203c8f1e502SPhilipp Zabel max1586->max_uV = MAX1586_V3_MAX_UV / 1000 * pdata->v3_gain / 1000; 204b110a8fbSPhilipp Zabel 205b110a8fbSPhilipp Zabel rdev = max1586->rdev; 20655f4fa4eSRobert Jarzmik for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) { 20755f4fa4eSRobert Jarzmik id = pdata->subdevs[i].id; 20855f4fa4eSRobert Jarzmik if (!pdata->subdevs[i].platform_data) 20955f4fa4eSRobert Jarzmik continue; 21055f4fa4eSRobert Jarzmik if (id < MAX1586_V3 || id > MAX1586_V6) { 21155f4fa4eSRobert Jarzmik dev_err(&client->dev, "invalid regulator id %d\n", id); 21255f4fa4eSRobert Jarzmik goto err; 21355f4fa4eSRobert Jarzmik } 21455f4fa4eSRobert Jarzmik rdev[i] = regulator_register(&max1586_reg[id], &client->dev, 21555f4fa4eSRobert Jarzmik pdata->subdevs[i].platform_data, 216b110a8fbSPhilipp Zabel max1586); 21755f4fa4eSRobert Jarzmik if (IS_ERR(rdev[i])) { 21855f4fa4eSRobert Jarzmik ret = PTR_ERR(rdev[i]); 21955f4fa4eSRobert Jarzmik dev_err(&client->dev, "failed to register %s\n", 22055f4fa4eSRobert Jarzmik max1586_reg[id].name); 22155f4fa4eSRobert Jarzmik goto err; 22255f4fa4eSRobert Jarzmik } 22355f4fa4eSRobert Jarzmik } 22455f4fa4eSRobert Jarzmik 22555f4fa4eSRobert Jarzmik i2c_set_clientdata(client, rdev); 22655f4fa4eSRobert Jarzmik dev_info(&client->dev, "Maxim 1586 regulator driver loaded\n"); 22755f4fa4eSRobert Jarzmik return 0; 22855f4fa4eSRobert Jarzmik 22955f4fa4eSRobert Jarzmik err: 23055f4fa4eSRobert Jarzmik while (--i >= 0) 23155f4fa4eSRobert Jarzmik regulator_unregister(rdev[i]); 232b110a8fbSPhilipp Zabel out_unmap: 233b110a8fbSPhilipp Zabel kfree(max1586); 234b110a8fbSPhilipp Zabel out: 23555f4fa4eSRobert Jarzmik return ret; 23655f4fa4eSRobert Jarzmik } 23755f4fa4eSRobert Jarzmik 238bd88c9b2SDmitry Torokhov static int __devexit max1586_pmic_remove(struct i2c_client *client) 23955f4fa4eSRobert Jarzmik { 24055f4fa4eSRobert Jarzmik struct regulator_dev **rdev = i2c_get_clientdata(client); 24155f4fa4eSRobert Jarzmik int i; 24255f4fa4eSRobert Jarzmik 24355f4fa4eSRobert Jarzmik for (i = 0; i <= MAX1586_V6; i++) 24455f4fa4eSRobert Jarzmik if (rdev[i]) 24555f4fa4eSRobert Jarzmik regulator_unregister(rdev[i]); 24655f4fa4eSRobert Jarzmik kfree(rdev); 24755f4fa4eSRobert Jarzmik i2c_set_clientdata(client, NULL); 24855f4fa4eSRobert Jarzmik 24955f4fa4eSRobert Jarzmik return 0; 25055f4fa4eSRobert Jarzmik } 25155f4fa4eSRobert Jarzmik 25255f4fa4eSRobert Jarzmik static const struct i2c_device_id max1586_id[] = { 25355f4fa4eSRobert Jarzmik { "max1586", 0 }, 25455f4fa4eSRobert Jarzmik { } 25555f4fa4eSRobert Jarzmik }; 25655f4fa4eSRobert Jarzmik MODULE_DEVICE_TABLE(i2c, max1586_id); 25755f4fa4eSRobert Jarzmik 25855f4fa4eSRobert Jarzmik static struct i2c_driver max1586_pmic_driver = { 25955f4fa4eSRobert Jarzmik .probe = max1586_pmic_probe, 260bd88c9b2SDmitry Torokhov .remove = __devexit_p(max1586_pmic_remove), 26155f4fa4eSRobert Jarzmik .driver = { 26255f4fa4eSRobert Jarzmik .name = "max1586", 263bd88c9b2SDmitry Torokhov .owner = THIS_MODULE, 26455f4fa4eSRobert Jarzmik }, 26555f4fa4eSRobert Jarzmik .id_table = max1586_id, 26655f4fa4eSRobert Jarzmik }; 26755f4fa4eSRobert Jarzmik 26855f4fa4eSRobert Jarzmik static int __init max1586_pmic_init(void) 26955f4fa4eSRobert Jarzmik { 27055f4fa4eSRobert Jarzmik return i2c_add_driver(&max1586_pmic_driver); 27155f4fa4eSRobert Jarzmik } 27255f4fa4eSRobert Jarzmik subsys_initcall(max1586_pmic_init); 27355f4fa4eSRobert Jarzmik 27455f4fa4eSRobert Jarzmik static void __exit max1586_pmic_exit(void) 27555f4fa4eSRobert Jarzmik { 27655f4fa4eSRobert Jarzmik i2c_del_driver(&max1586_pmic_driver); 27755f4fa4eSRobert Jarzmik } 27855f4fa4eSRobert Jarzmik module_exit(max1586_pmic_exit); 27955f4fa4eSRobert Jarzmik 28055f4fa4eSRobert Jarzmik /* Module information */ 28155f4fa4eSRobert Jarzmik MODULE_DESCRIPTION("MAXIM 1586 voltage regulator driver"); 28255f4fa4eSRobert Jarzmik MODULE_AUTHOR("Robert Jarzmik"); 28355f4fa4eSRobert Jarzmik MODULE_LICENSE("GPL"); 284