diff options
Diffstat (limited to 'ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625')
3 files changed, 0 insertions, 439 deletions
diff --git a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Kconfig b/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Kconfig deleted file mode 100755 index 38282c65..00000000 --- a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config MP2625_CHARGER
- tristate "MP2625 Charger driver"
- depends on I2C
- help
- Say Y here to enable support for charger with mp2625 chip.
diff --git a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Makefile b/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Makefile deleted file mode 100755 index 9bcfa83d..00000000 --- a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# -# Makefile for MP2625 charger core. -# - -obj-y += mp2625_charger.o - diff --git a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/mp2625_charger.c b/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/mp2625_charger.c deleted file mode 100755 index 581e89d8..00000000 --- a/ANDROID_3.4.5/drivers/power/wmt_battery/charger/mp2625/mp2625_charger.c +++ /dev/null @@ -1,428 +0,0 @@ -/* - * mp2625_charger.c - WonderMedia Charger Driver. - * - * Copyright (C) 2013 WonderMedia Technologies, Inc. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/power_supply.h> -#include <linux/platform_device.h> -#include <mach/wmt_env.h> -#include <mach/hardware.h> -#include <mach/wmt_iomux.h> -#include <linux/gpio.h> -#include <linux/power/wmt_battery.h> - -#define DRVNAME "mp2625-charger" - -#undef pr_err -#undef pr_info -#define pr_err(fmt, args...) printk("[" DRVNAME "] " fmt, ##args) -#define pr_info(fmt, args...) printk("[" DRVNAME "] " fmt, ##args) - -struct mp2625_charger { - struct device *dev; - int ac_online; - int usb_online; - int charger_status; - int sleeping; - - union { - struct { - unsigned int cable_type:4; - unsigned int current_sw_mode:1; - unsigned int pc_charging:1; - }; - uint32_t flag; - }; - - int full_pin; - int full_level; - int current_pin; - int current_large_level; - - struct power_supply psy_ac; - struct power_supply psy_usb; - struct delayed_work dwork; -}; - -static struct mp2625_charger *g_charger; - -static int parse_charger_param(struct mp2625_charger *ch) -{ - static char uboot_env[] = "wmt.charger.param"; - char buf[64]; - size_t l = sizeof(buf); - int ret; - - if (wmt_getsyspara(uboot_env, buf, &l)) - return -ENODEV; - if (prefixcmp(buf, "mp2625:")) - return -ENODEV; - if (!ch) - return 0; - - ret = sscanf(buf + 7, "%x:%d:%d:%d:%d", - &ch->flag, - &ch->full_pin, &ch->full_level, - &ch->current_pin, &ch->current_large_level); - if (ret < 5) { - pr_err("Invalid uboot env: %s\n", uboot_env); - return -EINVAL; - } - - if (ch->cable_type != CABLE_TYPE_DC && - ch->cable_type != CABLE_TYPE_USB) { - pr_err("Invalid type %d\n", ch->cable_type); - return -EINVAL; - } - - if (gpio_is_valid(ch->full_pin)) { - ret = devm_gpio_request(ch->dev, ch->full_pin, "charger full"); - if (ret) { - pr_err("gpio%d request fail %d\n", ch->full_pin, ret); - return ret; - } - wmt_gpio_setpull(ch->full_pin, (ch->full_level) ? - WMT_GPIO_PULL_DOWN : WMT_GPIO_PULL_UP); - gpio_direction_input(ch->full_pin); - } - - if (gpio_is_valid(ch->current_pin)) { - ret = devm_gpio_request(ch->dev, ch->current_pin, "charger current"); - if (ret) { - pr_err("gpio%d request fail %d\n", ch->current_pin, ret); - return ret; - } - gpio_direction_output(ch->current_pin, !ch->current_large_level); - } - - pr_info("charger match " DRVNAME ", %s cable, full %d, current %d\n" - "%s current switch, PC connected is %scharging\n", - (ch->cable_type == CABLE_TYPE_DC) ? "DC" : "USB", - ch->full_pin, ch->current_pin, - (ch->current_sw_mode == CURRENT_SWITCH_DYNAMIC) ? "dynamic" : "sleep", - (ch->pc_charging == PC_CONNECTED_NOT_CHARGING) ? "not " : ""); - return 0; -} - -static inline void set_current(struct mp2625_charger *ch) -{ - int large; - int charging = (ch->charger_status == POWER_SUPPLY_STATUS_CHARGING || - ch->charger_status == POWER_SUPPLY_STATUS_FULL); - - if (ch->current_sw_mode == CURRENT_SWITCH_DYNAMIC) - large = charging; - else - large = ch->sleeping ? 1 : 0; - - if (ch->cable_type == CABLE_TYPE_USB && wmt_is_pc_connected()) - large = 0; - - if (gpio_is_valid(ch->current_pin)) { - gpio_direction_output(ch->current_pin, - large ? ch->current_large_level : - !ch->current_large_level); - printk(KERN_DEBUG "set %s current\n", large ? "large" : "small"); - } -} - -static int ac_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val) -{ - struct mp2625_charger *ch = - container_of(psy, struct mp2625_charger, psy_ac); - switch (psp) { - case POWER_SUPPLY_PROP_ONLINE: - val->intval = ch->ac_online; - break; - case POWER_SUPPLY_PROP_STATUS: - val->intval = ch->charger_status; - break; - default: - return -EINVAL; - } - return 0; -} - -static enum power_supply_property ac_properties[] = { - POWER_SUPPLY_PROP_ONLINE, - POWER_SUPPLY_PROP_STATUS, -}; - -static int usb_get_property(struct power_supply *psy, - enum power_supply_property psp, - union power_supply_propval *val) -{ - struct mp2625_charger *ch = - container_of(psy, struct mp2625_charger, psy_usb); - switch (psp) { - case POWER_SUPPLY_PROP_ONLINE: - val->intval = ch->usb_online; - break; - default: - return -EINVAL; - } - return 0; -} - -static enum power_supply_property usb_properties[] = { - POWER_SUPPLY_PROP_ONLINE, -}; - -static char *power_supplied_to[] = { - "battery", -}; - -static int power_supply_init(struct mp2625_charger *ch) -{ - int ret; - - ch->psy_ac.name = "ac", - ch->psy_ac.type = POWER_SUPPLY_TYPE_MAINS, - ch->psy_ac.supplied_to = power_supplied_to, - ch->psy_ac.num_supplicants = ARRAY_SIZE(power_supplied_to), - ch->psy_ac.properties = ac_properties, - ch->psy_ac.num_properties = ARRAY_SIZE(ac_properties), - ch->psy_ac.get_property = ac_get_property, - ret = power_supply_register(ch->dev, &ch->psy_ac); - if (ret) { - dev_err(ch->dev, "register ac power supply failed.\n"); - return ret; - } - - if (ch->pc_charging == PC_CONNECTED_CHARGING) { - ch->psy_usb.name = "usb", - ch->psy_usb.type = POWER_SUPPLY_TYPE_USB, - ch->psy_usb.supplied_to = power_supplied_to, - ch->psy_usb.num_supplicants = ARRAY_SIZE(power_supplied_to), - ch->psy_usb.properties = usb_properties, - ch->psy_usb.num_properties = ARRAY_SIZE(usb_properties), - ch->psy_usb.get_property = usb_get_property, - ret = power_supply_register(ch->dev, &ch->psy_usb); - if (ret) { - dev_err(ch->dev, "register ac power supply failed.\n"); - return ret; - } - } - - return 0; -} - -static void power_supply_release(struct mp2625_charger *ch) -{ - power_supply_unregister(&ch->psy_ac); - if (ch->pc_charging == PC_CONNECTED_CHARGING) - power_supply_unregister(&ch->psy_usb); -} - -static void mp2625_charger_work(struct work_struct *work) -{ - struct mp2625_charger *ch = - container_of(work, struct mp2625_charger, dwork.work); - int ac_online = 0; - int usb_online = 0; - int charger_status = 0; - - if (wmt_is_dc_plugin()) { - if (ch->cable_type == CABLE_TYPE_USB && wmt_is_pc_connected()) { - if (ch->pc_charging == PC_CONNECTED_CHARGING) { - charger_status = POWER_SUPPLY_STATUS_CHARGING; - usb_online = 1; - } else - charger_status = POWER_SUPPLY_STATUS_NOT_CHARGING; - } else { - charger_status = POWER_SUPPLY_STATUS_CHARGING; - ac_online = 1; - } - - if (charger_status == POWER_SUPPLY_STATUS_CHARGING && - gpio_get_value(ch->full_pin) == ch->full_level) - charger_status = POWER_SUPPLY_STATUS_FULL; - } else - charger_status = POWER_SUPPLY_STATUS_DISCHARGING; - - if (ch->ac_online != ac_online || - ch->charger_status != charger_status) { - ch->ac_online = ac_online; - ch->charger_status = charger_status; - power_supply_changed(&ch->psy_ac); - } - - if (ch->pc_charging == PC_CONNECTED_CHARGING && - ch->usb_online != usb_online) { - ch->usb_online = usb_online; - power_supply_changed(&ch->psy_usb); - } - - set_current(ch); - led_power_enable(charger_status == POWER_SUPPLY_STATUS_CHARGING || - charger_status == POWER_SUPPLY_STATUS_FULL); -} - -void mp2625_pc_connected(void) -{ - if (g_charger) - schedule_delayed_work(&g_charger->dwork, 0); -} - -static irqreturn_t dcdet_irq(int irq, void *data) -{ - struct mp2625_charger *ch = data; - - if (PMCIS_VAL & BIT27) { - pmc_clear_intr_status(WKS_DCDET); - schedule_delayed_work(&ch->dwork, HZ/2); - return IRQ_HANDLED; - } - return IRQ_NONE; -} - -static int irqs_init(struct mp2625_charger *ch) -{ - unsigned long iflag = IRQF_SHARED; - int ret; - - if (REG32_VAL(0xfe120000) == 0x35100101) - iflag |= IRQF_NO_SUSPEND; - - ret = devm_request_irq(ch->dev, IRQ_PMC_WAKEUP, dcdet_irq, - iflag, "WMT-DCDET", ch); - if (ret < 0) { - pr_err("register DCDET irq failed\n"); - return ret; - } - - wmt_dcdet_irq_enable(); - return 0; -} - -static void irqs_release(struct mp2625_charger *ch) -{ - wmt_dcdet_irq_disable(); -} - -static int mp2625_probe(struct platform_device *pdev) -{ - struct mp2625_charger *ch; - int ret; - - ch = devm_kzalloc(&pdev->dev, sizeof(*ch), GFP_KERNEL); - if (!ch) - return -ENOMEM; - - ch->dev = &pdev->dev; - platform_set_drvdata(pdev, ch); - - ret = parse_charger_param(ch); - if (ret) - return ret;; - parse_charger_led(); - - if ((ret = power_supply_init(ch))) - return ret; - - INIT_DELAYED_WORK(&ch->dwork, mp2625_charger_work); - - if ((ret = irqs_init(ch))) { - power_supply_release(ch); - return ret; - } - - g_charger = ch; - schedule_delayed_work(&ch->dwork, 0); - - pr_info(DRVNAME " install success.\n"); - return 0; -} - -static int __devexit mp2625_remove(struct platform_device *pdev) -{ - struct mp2625_charger *ch = platform_get_drvdata(pdev); - irqs_release(ch); - cancel_delayed_work_sync(&ch->dwork); - power_supply_release(ch); - g_charger = NULL; - return 0; -} - -static int mp2625_suspend(struct device *dev) -{ - struct mp2625_charger *ch = dev_get_drvdata(dev); - cancel_delayed_work_sync(&ch->dwork); - ch->sleeping = 1; - set_current(ch); - return 0; -} - -static int mp2625_resume(struct device *dev) -{ - struct mp2625_charger *ch = dev_get_drvdata(dev); - schedule_delayed_work(&ch->dwork, HZ/2); - ch->sleeping = 0; - set_current(ch); - return 0; -} - -static const struct dev_pm_ops mp2625_pm_ops = { - .suspend = mp2625_suspend, - .resume = mp2625_resume, -}; - -static struct platform_driver mp2625_driver = { - .driver = { - .owner = THIS_MODULE, - .name = DRVNAME, - .pm = &mp2625_pm_ops, - }, - .probe = mp2625_probe, - .remove = mp2625_remove, -}; - -static struct platform_device *pdev; - -static int __init mp2625_init(void) -{ - int ret; - - ret = parse_charger_param(NULL); - if (ret) - return ret; - - ret = platform_driver_register(&mp2625_driver); - if (ret) - return ret; - - pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); - if (IS_ERR(pdev)) { - ret = PTR_ERR(pdev); - platform_driver_unregister(&mp2625_driver); - } - return ret; -} - -static void __exit mp2625_exit(void) -{ - platform_device_unregister(pdev); - platform_driver_unregister(&mp2625_driver); -} - -module_init(mp2625_init); -module_exit(mp2625_exit); - -MODULE_AUTHOR("WonderMedia"); -MODULE_DESCRIPTION("MP2625 Charger Driver"); -MODULE_LICENSE("GPL"); - |