1808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick/* 2b595076a180a56d1bb170e6eceda6eb9d76f4cd3Uwe Kleine-König * iPAQ h1930/h1940/rx1950 battery controller driver 3808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * Copyright (c) Vasily Khoruzhick 4808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * Based on h1940_battery.c by Arnaud Patard 5808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * 6808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * This file is subject to the terms and conditions of the GNU General Public 7808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * License. See the file COPYING in the main directory of this archive for 8808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * more details. 9808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick * 10808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick */ 11808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 12808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/interrupt.h> 13808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/platform_device.h> 14808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/power_supply.h> 15808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/leds.h> 16808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/gpio.h> 17808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/err.h> 18808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/timer.h> 19808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/jiffies.h> 20808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/s3c_adc_battery.h> 21808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/errno.h> 22808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <linux/init.h> 23815efa1eab5b0c3e071e5d6df0cc2d7e0c7e6fd7Vasily Khoruzhick#include <linux/module.h> 24808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 25808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#include <plat/adc.h> 26808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 27808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#define BAT_POLL_INTERVAL 10000 /* ms */ 28808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#define JITTER_DELAY 500 /* ms */ 29808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 30808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstruct s3c_adc_bat { 31808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct power_supply psy; 32808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_client *client; 33808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat_pdata *pdata; 34808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int volt_value; 35808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int cur_value; 36808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick unsigned int timestamp; 37808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int level; 38808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int status; 39808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int cable_plugged:1; 40808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 41808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 42808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic struct delayed_work bat_work; 43808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 44808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic void s3c_adc_bat_ext_power_changed(struct power_supply *psy) 45808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 46808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick schedule_delayed_work(&bat_work, 47808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick msecs_to_jiffies(JITTER_DELAY)); 48808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 49808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 5034aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübnerstatic int gather_samples(struct s3c_adc_client *client, int num, int channel) 5134aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner{ 5234aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner int value, i; 5334aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner 5434aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner /* default to 1 if nothing is set */ 5534aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner if (num < 1) 5634aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner num = 1; 5734aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner 5834aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner value = 0; 5934aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner for (i = 0; i < num; i++) 6034aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner value += s3c_adc_read(client, channel); 6134aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner value /= num; 6234aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner 6334aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner return value; 6434aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner} 6534aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner 66808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic enum power_supply_property s3c_adc_backup_bat_props[] = { 67808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_VOLTAGE_NOW, 68808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_VOLTAGE_MIN, 69808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 70808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 71808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 72808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int s3c_adc_backup_bat_get_property(struct power_supply *psy, 73808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick enum power_supply_property psp, 74808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick union power_supply_propval *val) 75808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 76808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy); 77808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 78808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (!bat) { 79808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick dev_err(psy->dev, "%s: no battery infos ?!\n", __func__); 80808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return -EINVAL; 81808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 82808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 83808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->volt_value < 0 || 84808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick jiffies_to_msecs(jiffies - bat->timestamp) > 85808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick BAT_POLL_INTERVAL) { 8634aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->volt_value = gather_samples(bat->client, 8734aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->pdata->backup_volt_samples, 88808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->backup_volt_channel); 89808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->volt_value *= bat->pdata->backup_volt_mult; 90808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->timestamp = jiffies; 91808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 92808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 93808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick switch (psp) { 94808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_VOLTAGE_NOW: 95808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->volt_value; 96808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 97808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_VOLTAGE_MIN: 98808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->pdata->backup_volt_min; 99808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 100808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: 101808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->pdata->backup_volt_max; 102808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 103808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick default: 104808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return -EINVAL; 105808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 106808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 107808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 108808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic struct s3c_adc_bat backup_bat = { 109808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .psy = { 110808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .name = "backup-battery", 111808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .type = POWER_SUPPLY_TYPE_BATTERY, 112808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .properties = s3c_adc_backup_bat_props, 113808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props), 114808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .get_property = s3c_adc_backup_bat_get_property, 115808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .use_for_apm = 1, 116808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick }, 117808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 118808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 119808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic enum power_supply_property s3c_adc_main_bat_props[] = { 120808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_STATUS, 121808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, 122808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN, 123808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_CHARGE_NOW, 124808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_VOLTAGE_NOW, 125808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_PROP_CURRENT_NOW, 126808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 127808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 128808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int calc_full_volt(int volt_val, int cur_val, int impedance) 129808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 130808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return volt_val + cur_val * impedance / 1000; 131808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 132808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 133c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhickstatic int charge_finished(struct s3c_adc_bat *bat) 134c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick{ 135c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick return bat->pdata->gpio_inverted ? 136c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick !gpio_get_value(bat->pdata->gpio_charge_finished) : 137c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick gpio_get_value(bat->pdata->gpio_charge_finished); 138c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick} 139c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick 140808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int s3c_adc_bat_get_property(struct power_supply *psy, 141808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick enum power_supply_property psp, 142808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick union power_supply_propval *val) 143808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 144808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy); 145808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 146808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int new_level; 147808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int full_volt; 148808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick const struct s3c_adc_bat_thresh *lut = bat->pdata->lut_noac; 149808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick unsigned int lut_size = bat->pdata->lut_noac_cnt; 150808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 151808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (!bat) { 152808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick dev_err(psy->dev, "no battery infos ?!\n"); 153808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return -EINVAL; 154808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 155808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 156808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->volt_value < 0 || bat->cur_value < 0 || 157808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick jiffies_to_msecs(jiffies - bat->timestamp) > 158808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick BAT_POLL_INTERVAL) { 15934aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->volt_value = gather_samples(bat->client, 16034aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->pdata->volt_samples, 161808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->volt_channel) * bat->pdata->volt_mult; 16234aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->cur_value = gather_samples(bat->client, 16334aed73df3a9e75e313a7510b201f6755ae3e6bcHeiko Stübner bat->pdata->current_samples, 164808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->current_channel) * bat->pdata->current_mult; 165808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->timestamp = jiffies; 166808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 167808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 168808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->cable_plugged && 169808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ((bat->pdata->gpio_charge_finished < 0) || 170c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick !charge_finished(bat))) { 171808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut = bat->pdata->lut_acin; 172808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut_size = bat->pdata->lut_acin_cnt; 173808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 174808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 175808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick new_level = 100000; 176808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick full_volt = calc_full_volt((bat->volt_value / 1000), 177808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick (bat->cur_value / 1000), bat->pdata->internal_impedance); 178808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 179808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (full_volt < calc_full_volt(lut->volt, lut->cur, 180808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->internal_impedance)) { 181808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut_size--; 182808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick while (lut_size--) { 183808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int lut_volt1; 184808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int lut_volt2; 185808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 186808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut_volt1 = calc_full_volt(lut[0].volt, lut[0].cur, 187808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->internal_impedance); 188808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut_volt2 = calc_full_volt(lut[1].volt, lut[1].cur, 189808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->internal_impedance); 190808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (full_volt < lut_volt1 && full_volt >= lut_volt2) { 191808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick new_level = (lut[1].level + 192808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick (lut[0].level - lut[1].level) * 193808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick (full_volt - lut_volt2) / 194808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick (lut_volt1 - lut_volt2)) * 1000; 195808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick break; 196808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 197808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick new_level = lut[1].level * 1000; 198808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick lut++; 199808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 200808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 201808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 202808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->level = new_level; 203808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 204808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick switch (psp) { 205808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_STATUS: 206808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->pdata->gpio_charge_finished < 0) 207808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->level == 100000 ? 208808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick POWER_SUPPLY_STATUS_FULL : bat->status; 209808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick else 210808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->status; 211808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 212808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: 213808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = 100000; 214808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 215808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN: 216808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = 0; 217808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 218808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_CHARGE_NOW: 219808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->level; 220808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 221808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_VOLTAGE_NOW: 222808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->volt_value; 223808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 224808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick case POWER_SUPPLY_PROP_CURRENT_NOW: 225808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick val->intval = bat->cur_value; 226808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 227808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick default: 228808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return -EINVAL; 229808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 230808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 231808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 232808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic struct s3c_adc_bat main_bat = { 233808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .psy = { 234808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .name = "main-battery", 235808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .type = POWER_SUPPLY_TYPE_BATTERY, 236808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .properties = s3c_adc_main_bat_props, 237808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .num_properties = ARRAY_SIZE(s3c_adc_main_bat_props), 238808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .get_property = s3c_adc_bat_get_property, 239808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .external_power_changed = s3c_adc_bat_ext_power_changed, 240808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .use_for_apm = 1, 241808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick }, 242808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 243808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 244808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic void s3c_adc_bat_work(struct work_struct *work) 245808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 246808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat *bat = &main_bat; 247808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int is_charged; 248808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int is_plugged; 249808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick static int was_plugged; 250808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 251808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick is_plugged = power_supply_am_i_supplied(&bat->psy); 252808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->cable_plugged = is_plugged; 253808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (is_plugged != was_plugged) { 254808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick was_plugged = is_plugged; 255808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (is_plugged) { 256808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->pdata->enable_charger) 257808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->enable_charger(); 258808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->status = POWER_SUPPLY_STATUS_CHARGING; 259808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } else { 260808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->pdata->disable_charger) 261808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->disable_charger(); 262808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->status = POWER_SUPPLY_STATUS_DISCHARGING; 263808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 264808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } else { 265808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if ((bat->pdata->gpio_charge_finished >= 0) && is_plugged) { 266c66ae9bb4dcaac78cc5e30d0ce7ff2bf3dcb48d9Vasily Khoruzhick is_charged = charge_finished(&main_bat); 267808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (is_charged) { 268808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->pdata->disable_charger) 269808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->disable_charger(); 270808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->status = POWER_SUPPLY_STATUS_FULL; 271808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } else { 272808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (bat->pdata->enable_charger) 273808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->pdata->enable_charger(); 274808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick bat->status = POWER_SUPPLY_STATUS_CHARGING; 275808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 276808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 277808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 278808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 279808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick power_supply_changed(&bat->psy); 280808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 281808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 282808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic irqreturn_t s3c_adc_bat_charged(int irq, void *dev_id) 283808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 284808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick schedule_delayed_work(&bat_work, 285808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick msecs_to_jiffies(JITTER_DELAY)); 286808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return IRQ_HANDLED; 287808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 288808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 289f704d45ede331204b6f393ba7cf49353fe7936a7Mark Brownstatic int __devinit s3c_adc_bat_probe(struct platform_device *pdev) 290808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 291808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_client *client; 292808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data; 293808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick int ret; 294808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 295808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick client = s3c_adc_register(pdev, NULL, NULL, 0); 296808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (IS_ERR(client)) { 297808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick dev_err(&pdev->dev, "cannot register adc\n"); 298808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return PTR_ERR(client); 299808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 300808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 301808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick platform_set_drvdata(pdev, client); 302808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 303808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.client = client; 304808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.pdata = pdata; 305808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.volt_value = -1; 306808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.cur_value = -1; 307808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.cable_plugged = 0; 308808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING; 309808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 310808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ret = power_supply_register(&pdev->dev, &main_bat.psy); 311808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (ret) 312808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick goto err_reg_main; 313808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->backup_volt_mult) { 314808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick backup_bat.client = client; 315808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick backup_bat.pdata = pdev->dev.platform_data; 316808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick backup_bat.volt_value = -1; 317808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ret = power_supply_register(&pdev->dev, &backup_bat.psy); 318808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (ret) 319808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick goto err_reg_backup; 320808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 321808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 322808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick INIT_DELAYED_WORK(&bat_work, s3c_adc_bat_work); 323808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 324808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) { 325808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ret = gpio_request(pdata->gpio_charge_finished, "charged"); 326808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (ret) 327808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick goto err_gpio; 328808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 329808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ret = request_irq(gpio_to_irq(pdata->gpio_charge_finished), 330808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick s3c_adc_bat_charged, 331808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 332808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick "battery charged", NULL); 333808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (ret) 334808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick goto err_irq; 335808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 336808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 337808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->init) { 338808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick ret = pdata->init(); 339808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (ret) 340808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick goto err_platform; 341808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 342808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 343808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick dev_info(&pdev->dev, "successfully loaded\n"); 344808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick device_init_wakeup(&pdev->dev, 1); 345808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 346808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick /* Schedule timer to check current status */ 347808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick schedule_delayed_work(&bat_work, 348808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick msecs_to_jiffies(JITTER_DELAY)); 349808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 350808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 351808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 352808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickerr_platform: 353808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) 354808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick free_irq(gpio_to_irq(pdata->gpio_charge_finished), NULL); 355808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickerr_irq: 356808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) 357808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick gpio_free(pdata->gpio_charge_finished); 358808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickerr_gpio: 359808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->backup_volt_mult) 360808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick power_supply_unregister(&backup_bat.psy); 361808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickerr_reg_backup: 362808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick power_supply_unregister(&main_bat.psy); 363808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickerr_reg_main: 364808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return ret; 365808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 366808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 367808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int s3c_adc_bat_remove(struct platform_device *pdev) 368808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 369808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_client *client = platform_get_drvdata(pdev); 370808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data; 371808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 372808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick power_supply_unregister(&main_bat.psy); 373808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->backup_volt_mult) 374808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick power_supply_unregister(&backup_bat.psy); 375808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 376808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick s3c_adc_release(client); 377808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 378808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) { 379808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick free_irq(gpio_to_irq(pdata->gpio_charge_finished), NULL); 380808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick gpio_free(pdata->gpio_charge_finished); 381808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 382808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 383808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick cancel_delayed_work(&bat_work); 384808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 385808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->exit) 386808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick pdata->exit(); 387808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 388808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 389808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 390808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 391808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#ifdef CONFIG_PM 392808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int s3c_adc_bat_suspend(struct platform_device *pdev, 393808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick pm_message_t state) 394808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 395808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data; 396808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 397808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) { 398808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (device_may_wakeup(&pdev->dev)) 399808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick enable_irq_wake( 400808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick gpio_to_irq(pdata->gpio_charge_finished)); 401808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick else { 402808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick disable_irq(gpio_to_irq(pdata->gpio_charge_finished)); 403808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick main_bat.pdata->disable_charger(); 404808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 405808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 406808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 407808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 408808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 409808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 410808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic int s3c_adc_bat_resume(struct platform_device *pdev) 411808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick{ 412808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data; 413808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 414808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (pdata->gpio_charge_finished >= 0) { 415808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick if (device_may_wakeup(&pdev->dev)) 416808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick disable_irq_wake( 417808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick gpio_to_irq(pdata->gpio_charge_finished)); 418808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick else 419808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick enable_irq(gpio_to_irq(pdata->gpio_charge_finished)); 420808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick } 421808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 422808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick /* Schedule timer to check current status */ 423808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick schedule_delayed_work(&bat_work, 424808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick msecs_to_jiffies(JITTER_DELAY)); 425808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 426808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick return 0; 427808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick} 428808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#else 429f8d878ddbb3c08bc2f876975df674484208536acHeiko Stuebner#define s3c_adc_bat_suspend NULL 430f8d878ddbb3c08bc2f876975df674484208536acHeiko Stuebner#define s3c_adc_bat_resume NULL 431808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick#endif 432808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 433808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhickstatic struct platform_driver s3c_adc_bat_driver = { 434808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .driver = { 435808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .name = "s3c-adc-battery", 436808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick }, 437808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .probe = s3c_adc_bat_probe, 438808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .remove = s3c_adc_bat_remove, 439808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .suspend = s3c_adc_bat_suspend, 440808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick .resume = s3c_adc_bat_resume, 441808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick}; 442808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 443300bac7fb85a20b2704dc3645419057992f78565Axel Linmodule_platform_driver(s3c_adc_bat_driver); 444808be4b22f47886d2279852ada3d186fc20909bcVasily Khoruzhick 445808be4b22f47886d2279852ada3d186fc20909bcVasily KhoruzhickMODULE_AUTHOR("Vasily Khoruzhick <anarsoul@gmail.com>"); 446b595076a180a56d1bb170e6eceda6eb9d76f4cd3Uwe Kleine-KönigMODULE_DESCRIPTION("iPAQ H1930/H1940/RX1950 battery controller driver"); 447808be4b22f47886d2279852ada3d186fc20909bcVasily KhoruzhickMODULE_LICENSE("GPL"); 448