Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.29-rc2 164 lines 4.2 kB view raw
1/* 2 * Support for TI bq24022 (bqTINY-II) Dual Input (USB/AC Adpater) 3 * 1-Cell Li-Ion Charger connected via GPIOs. 4 * 5 * Copyright (c) 2008 Philipp Zabel 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11 */ 12 13#include <linux/kernel.h> 14#include <linux/init.h> 15#include <linux/platform_device.h> 16#include <linux/err.h> 17#include <linux/gpio.h> 18#include <linux/regulator/bq24022.h> 19#include <linux/regulator/driver.h> 20 21 22static int bq24022_set_current_limit(struct regulator_dev *rdev, 23 int min_uA, int max_uA) 24{ 25 struct bq24022_mach_info *pdata = rdev_get_drvdata(rdev); 26 27 dev_dbg(rdev_get_dev(rdev), "setting current limit to %s mA\n", 28 max_uA >= 500000 ? "500" : "100"); 29 30 /* REVISIT: maybe return error if min_uA != 0 ? */ 31 gpio_set_value(pdata->gpio_iset2, max_uA >= 500000); 32 return 0; 33} 34 35static int bq24022_get_current_limit(struct regulator_dev *rdev) 36{ 37 struct bq24022_mach_info *pdata = rdev_get_drvdata(rdev); 38 39 return gpio_get_value(pdata->gpio_iset2) ? 500000 : 100000; 40} 41 42static int bq24022_enable(struct regulator_dev *rdev) 43{ 44 struct bq24022_mach_info *pdata = rdev_get_drvdata(rdev); 45 46 dev_dbg(rdev_get_dev(rdev), "enabling charger\n"); 47 48 gpio_set_value(pdata->gpio_nce, 0); 49 return 0; 50} 51 52static int bq24022_disable(struct regulator_dev *rdev) 53{ 54 struct bq24022_mach_info *pdata = rdev_get_drvdata(rdev); 55 56 dev_dbg(rdev_get_dev(rdev), "disabling charger\n"); 57 58 gpio_set_value(pdata->gpio_nce, 1); 59 return 0; 60} 61 62static int bq24022_is_enabled(struct regulator_dev *rdev) 63{ 64 struct platform_device *pdev = rdev_get_drvdata(rdev); 65 struct bq24022_mach_info *pdata = pdev->dev.platform_data; 66 67 return !gpio_get_value(pdata->gpio_nce); 68} 69 70static struct regulator_ops bq24022_ops = { 71 .set_current_limit = bq24022_set_current_limit, 72 .get_current_limit = bq24022_get_current_limit, 73 .enable = bq24022_enable, 74 .disable = bq24022_disable, 75 .is_enabled = bq24022_is_enabled, 76}; 77 78static struct regulator_desc bq24022_desc = { 79 .name = "bq24022", 80 .ops = &bq24022_ops, 81 .type = REGULATOR_CURRENT, 82}; 83 84static int __init bq24022_probe(struct platform_device *pdev) 85{ 86 struct bq24022_mach_info *pdata = pdev->dev.platform_data; 87 struct regulator_dev *bq24022; 88 int ret; 89 90 if (!pdata || !pdata->gpio_nce || !pdata->gpio_iset2) 91 return -EINVAL; 92 93 ret = gpio_request(pdata->gpio_nce, "ncharge_en"); 94 if (ret) { 95 dev_dbg(&pdev->dev, "couldn't request nCE GPIO: %d\n", 96 pdata->gpio_nce); 97 goto err_ce; 98 } 99 ret = gpio_request(pdata->gpio_iset2, "charge_mode"); 100 if (ret) { 101 dev_dbg(&pdev->dev, "couldn't request ISET2 GPIO: %d\n", 102 pdata->gpio_iset2); 103 goto err_iset2; 104 } 105 ret = gpio_direction_output(pdata->gpio_iset2, 0); 106 ret = gpio_direction_output(pdata->gpio_nce, 1); 107 108 bq24022 = regulator_register(&bq24022_desc, &pdev->dev, pdata); 109 if (IS_ERR(bq24022)) { 110 dev_dbg(&pdev->dev, "couldn't register regulator\n"); 111 ret = PTR_ERR(bq24022); 112 goto err_reg; 113 } 114 platform_set_drvdata(pdev, bq24022); 115 dev_dbg(&pdev->dev, "registered regulator\n"); 116 117 return 0; 118err_reg: 119 gpio_free(pdata->gpio_iset2); 120err_iset2: 121 gpio_free(pdata->gpio_nce); 122err_ce: 123 return ret; 124} 125 126static int __devexit bq24022_remove(struct platform_device *pdev) 127{ 128 struct bq24022_mach_info *pdata = pdev->dev.platform_data; 129 struct regulator_dev *bq24022 = platform_get_drvdata(pdev); 130 131 regulator_unregister(bq24022); 132 gpio_free(pdata->gpio_iset2); 133 gpio_free(pdata->gpio_nce); 134 135 return 0; 136} 137 138static struct platform_driver bq24022_driver = { 139 .driver = { 140 .name = "bq24022", 141 }, 142 .remove = __devexit_p(bq24022_remove), 143}; 144 145static int __init bq24022_init(void) 146{ 147 return platform_driver_probe(&bq24022_driver, bq24022_probe); 148} 149 150static void __exit bq24022_exit(void) 151{ 152 platform_driver_unregister(&bq24022_driver); 153} 154 155/* 156 * make sure this is probed before gpio_vbus and pda_power, 157 * but after asic3 or other GPIO expander drivers. 158 */ 159subsys_initcall(bq24022_init); 160module_exit(bq24022_exit); 161 162MODULE_AUTHOR("Philipp Zabel"); 163MODULE_DESCRIPTION("TI bq24022 Li-Ion Charger driver"); 164MODULE_LICENSE("GPL");