diff options
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.26/1049-bq27000-battery-driver.patch.patch')
-rwxr-xr-x | target/linux/s3c24xx/patches-2.6.26/1049-bq27000-battery-driver.patch.patch | 510 |
1 files changed, 0 insertions, 510 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.26/1049-bq27000-battery-driver.patch.patch b/target/linux/s3c24xx/patches-2.6.26/1049-bq27000-battery-driver.patch.patch deleted file mode 100755 index 9e7ae116d3..0000000000 --- a/target/linux/s3c24xx/patches-2.6.26/1049-bq27000-battery-driver.patch.patch +++ /dev/null @@ -1,510 +0,0 @@ -From 2bab304b10f077cb88d5b5f5bd7e50c16aac2132 Mon Sep 17 00:00:00 2001 -From: mokopatches <mokopatches@openmoko.org> -Date: Fri, 25 Jul 2008 22:21:23 +0100 -Subject: [PATCH] bq27000-battery-driver.patch - ---- - arch/arm/mach-s3c2440/Kconfig | 2 + - arch/arm/mach-s3c2440/mach-gta02.c | 21 ++ - drivers/power/Kconfig | 7 +- - drivers/power/Makefile | 1 + - drivers/power/bq27000_battery.c | 375 ++++++++++++++++++++++++++++++++++++ - include/linux/bq27000_battery.h | 12 ++ - 6 files changed, 417 insertions(+), 1 deletions(-) - create mode 100644 drivers/power/bq27000_battery.c - create mode 100644 include/linux/bq27000_battery.h - -diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig -index 3015aaf..b417f8e 100644 ---- a/arch/arm/mach-s3c2440/Kconfig -+++ b/arch/arm/mach-s3c2440/Kconfig -@@ -79,6 +79,8 @@ config MACH_NEO1973_GTA02 - bool "FIC Neo1973 GSM Phone (GTA02 Hardware)" - select CPU_S3C2442 - select SENSORS_PCF50633 -+ select POWER_SUPPLY -+ select GTA02_HDQ - help - Say Y here if you are using the FIC Neo1973 GSM Phone - -diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c -index cea76e7..3816ea5 100644 ---- a/arch/arm/mach-s3c2440/mach-gta02.c -+++ b/arch/arm/mach-s3c2440/mach-gta02.c -@@ -81,6 +81,8 @@ - - #include <asm/arch/fiq_ipc_gta02.h> - #include "fiq_c_isr.h" -+#include <linux/gta02_hdq.h> -+#include <linux/bq27000_battery.h> - - /* arbitrates which sensor IRQ owns the shared SPI bus */ - static spinlock_t motion_irq_lock; -@@ -583,6 +585,24 @@ struct platform_device gta02_hdq_device = { - }; - #endif - -+/* BQ27000 Battery */ -+ -+struct bq27000_platform_data bq27000_pdata = { -+ .name = "bat", -+ .rsense_mohms = 20, -+ .hdq_read = gta02hdq_read, -+ .hdq_write = gta02hdq_write, -+ .hdq_initialized = gta02hdq_initialized, -+}; -+ -+struct platform_device bq27000_battery_device = { -+ .name = "bq27000-battery", -+ .dev = { -+ .platform_data = &bq27000_pdata, -+ }, -+}; -+ -+ - /* NOR Flash */ - - #define GTA02_FLASH_BASE 0x18000000 /* GCS3 */ -@@ -1271,6 +1291,7 @@ static void __init gta02_machine_init(void) - case GTA02v5_SYSTEM_REV: - case GTA02v6_SYSTEM_REV: - platform_device_register(>a02_hdq_device); -+ platform_device_register(&bq27000_battery_device); - break; - default: - break; -diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig -index 0a4515d..feb8b0a 100644 ---- a/drivers/power/Kconfig -+++ b/drivers/power/Kconfig -@@ -49,7 +49,10 @@ config BATTERY_OLPC - help - Say Y to enable support for the battery on the OLPC laptop. - --endif # POWER_SUPPLY -+config BATTERY_BQ27000_HDQ -+ tristate "BQ27000 HDQ battery monitor driver" -+ help -+ Say Y to enable support for the battery on the Neo Freerunner - - config GTA02_HDQ - tristate "Neo Freerunner HDQ" -@@ -58,3 +61,5 @@ config GTA02_HDQ - Say Y to enable support for communicating with an HDQ battery - on the Neo Freerunner. You probably want to select - at least BATTERY_BQ27000_HDQ as well -+ -+endif # POWER_SUPPLY -diff --git a/drivers/power/Makefile b/drivers/power/Makefile -index 88f227f..d7e87ad 100644 ---- a/drivers/power/Makefile -+++ b/drivers/power/Makefile -@@ -20,5 +20,6 @@ obj-$(CONFIG_APM_POWER) += apm_power.o - obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o - obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o - obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o -+obj-$(CONFIG_BATTERY_BQ27000_HDQ) += bq27000_battery.o - - obj-$(CONFIG_GTA02_HDQ) += gta02_hdq.o -diff --git a/drivers/power/bq27000_battery.c b/drivers/power/bq27000_battery.c -new file mode 100644 -index 0000000..d19186a ---- /dev/null -+++ b/drivers/power/bq27000_battery.c -@@ -0,0 +1,375 @@ -+/* -+ * Driver for batteries with bq27000 chips inside via HDQ -+ * -+ * Copyright 2008 Openmoko, Inc -+ * Andy Green <andy@openmoko.com> -+ * -+ * based on ds2760 driver, original copyright notice for that ---> -+ * -+ * Copyright © 2007 Anton Vorontsov -+ * 2004-2007 Matt Reimer -+ * 2004 Szabolcs Gyurko -+ * -+ * Use consistent with the GNU GPL is permitted, -+ * provided that this copyright notice is -+ * preserved in its entirety in all copies and derived works. -+ * -+ * Author: Anton Vorontsov <cbou@mail.ru> -+ * February 2007 -+ * -+ * Matt Reimer <mreimer@vpop.net> -+ * April 2004, 2005, 2007 -+ * -+ * Szabolcs Gyurko <szabolcs.gyurko@tlt.hu> -+ * September 2004 -+ */ -+ -+#include <linux/module.h> -+#include <linux/param.h> -+#include <linux/jiffies.h> -+#include <linux/delay.h> -+#include <linux/pm.h> -+#include <linux/platform_device.h> -+#include <linux/power_supply.h> -+#include <linux/bq27000_battery.h> -+ -+enum bq27000_regs { -+ /* RAM regs */ -+ /* read-write after this */ -+ BQ27000_CTRL = 0, /* Device Control Register */ -+ BQ27000_MODE, /* Device Mode Register */ -+ BQ27000_AR_L, /* At-Rate H L */ -+ BQ27000_AR_H, -+ /* read-only after this */ -+ BQ27000_ARTTE_L, /* At-Rate Time To Empty H L */ -+ BQ27000_ARTTE_H, -+ BQ27000_TEMP_L, /* Reported Temperature H L */ -+ BQ27000_TEMP_H, -+ BQ27000_VOLT_L, /* Reported Voltage H L */ -+ BQ27000_VOLT_H, -+ BQ27000_FLAGS, /* Status Flags */ -+ BQ27000_RSOC, /* Relative State of Charge */ -+ BQ27000_NAC_L, /* Nominal Available Capacity H L */ -+ BQ27000_NAC_H, -+ BQ27000_CACD_L, /* Discharge Compensated H L */ -+ BQ27000_CACD_H, -+ BQ27000_CACT_L, /* Temperature Compensated H L */ -+ BQ27000_CACT_H, -+ BQ27000_LMD_L, /* Last measured discharge H L */ -+ BQ27000_LMD_H, -+ BQ27000_AI_L, /* Average Current H L */ -+ BQ27000_AI_H, -+ BQ27000_TTE_L, /* Time to Empty H L */ -+ BQ27000_TTE_H, -+ BQ27000_TTF_L, /* Time to Full H L */ -+ BQ27000_TTF_H, -+ BQ27000_SI_L, /* Standby Current H L */ -+ BQ27000_SI_H, -+ BQ27000_STTE_L, /* Standby Time To Empty H L */ -+ BQ27000_STTE_H, -+ BQ27000_MLI_L, /* Max Load Current H L */ -+ BQ27000_MLI_H, -+ BQ27000_MLTTE_L, /* Max Load Time To Empty H L */ -+ BQ27000_MLTTE_H, -+ BQ27000_SAE_L, /* Available Energy H L */ -+ BQ27000_SAE_H, -+ BQ27000_AP_L, /* Available Power H L */ -+ BQ27000_AP_H, -+ BQ27000_TTECP_L, /* Time to Empty at Constant Power H L */ -+ BQ27000_TTECP_H, -+ BQ27000_CYCL_L, /* Cycle count since learning cycle H L */ -+ BQ27000_CYCL_H, -+ BQ27000_CYCT_L, /* Cycle Count Total H L */ -+ BQ27000_CYCT_H, -+ BQ27000_CSOC, /* Compensated State Of Charge */ -+ /* EEPROM regs */ -+ /* read-write after this */ -+ BQ27000_EE_EE_EN = 0x6e, /* EEPROM Program Enable */ -+ BQ27000_EE_ILMD = 0x76, /* Initial Last Measured Discharge High Byte */ -+ BQ27000_EE_SEDVF, /* Scaled EDVF Threshold */ -+ BQ27000_EE_SEDV1, /* Scaled EDV1 Threshold */ -+ BQ27000_EE_ISLC, /* Initial Standby Load Current */ -+ BQ27000_EE_DMFSD, /* Digital Magnitude Filter and Self Discharge */ -+ BQ27000_EE_TAPER, /* Aging Estimate Enable, Charge Termination Taper */ -+ BQ27000_EE_PKCFG, /* Pack Configuration Values */ -+ BQ27000_EE_IMLC, /* Initial Max Load Current or ID #3 */ -+ BQ27000_EE_DCOMP, /* Discharge rate compensation constants or ID #2 */ -+ BQ27000_EE_TCOMP, /* Temperature Compensation constants or ID #1 */ -+}; -+ -+enum bq27000_status_flags { -+ BQ27000_STATUS_CHGS = 0x80, /* 1 = being charged */ -+ BQ27000_STATUS_NOACT = 0x40, /* 1 = no activity */ -+ BQ27000_STATUS_IMIN = 0x20, /* 1 = Lion taper current mode */ -+ BQ27000_STATUS_CI = 0x10, /* 1 = capacity likely innacurate */ -+ BQ27000_STATUS_CALIP = 0x08, /* 1 = calibration in progress */ -+ BQ27000_STATUS_VDQ = 0x04, /* 1 = capacity should be accurate */ -+ BQ27000_STATUS_EDV1 = 0x02, /* 1 = end of discharge.. <6% left */ -+ BQ27000_STATUS_EDVF = 0x01, /* 1 = no, it's really empty now */ -+}; -+ -+#define NANOVOLTS_UNIT 3750 -+ -+struct bq27000_device_info { -+ struct device *dev; -+ struct power_supply bat; -+ -+ int rsense_mohms; /* from platform */ -+ -+ int (*hdq_initialized)(void); /* from platform */ -+ int (*hdq_read)(int); /* from platform */ -+ int (*hdq_write)(int, u8); /* from platform */ -+}; -+ -+/* -+ * reading 16 bit values over HDQ has a special hazard where the -+ * hdq device firmware can update the 16-bit register during the time we -+ * read the two halves. TI document SLUS556D recommends the algorithm here -+ * to avoid trouble -+ */ -+ -+static int hdq_read16(struct bq27000_device_info *di, int address) -+{ -+ int acc; -+ int high; -+ int retries = 3; -+ -+ while (retries--) { -+ -+ high = (di->hdq_read)(address + 1); /* high part */ -+ -+ if (high < 0) -+ return high; -+ acc = (di->hdq_read)(address); -+ if (acc < 0) -+ return acc; -+ -+ /* confirm high didn't change between reading it and low */ -+ if (high == (di->hdq_read)(address + 1)) -+ return (high << 8) | acc; -+ } -+ -+ return -ETIME; -+} -+ -+#define to_bq27000_device_info(x) container_of((x), \ -+ struct bq27000_device_info, \ -+ bat); -+ -+static void bq27000_battery_external_power_changed(struct power_supply *psy) -+{ -+ struct bq27000_device_info *di = to_bq27000_device_info(psy); -+ -+ dev_dbg(di->dev, "%s\n", __FUNCTION__); -+} -+ -+static int bq27000_battery_get_property(struct power_supply *psy, -+ enum power_supply_property psp, -+ union power_supply_propval *val) -+{ -+ int v, n; -+ struct bq27000_device_info *di = to_bq27000_device_info(psy); -+ -+ if (!(di->hdq_initialized)()) -+ return -EINVAL; -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_STATUS: -+ val->intval = POWER_SUPPLY_STATUS_UNKNOWN; -+ v = hdq_read16(di, BQ27000_AI_L); -+ if (v < 0) -+ return v; -+ if (v < 2) { /* no real activity on the battery */ -+ if (!hdq_read16(di, BQ27000_TTF_L)) -+ val->intval = POWER_SUPPLY_STATUS_FULL; -+ else -+ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; -+ break; -+ } -+ /* power is actually going in or out... */ -+ v = (di->hdq_read)(BQ27000_FLAGS); -+ if (v < 0) -+ return v; -+ if (v & BQ27000_STATUS_CHGS) -+ val->intval = POWER_SUPPLY_STATUS_CHARGING; -+ else -+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING; -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_NOW: -+ v = hdq_read16(di, BQ27000_VOLT_L); -+ if (v < 0) -+ return v; -+ val->intval = v * 1000; /* mV -> uV */ -+ break; -+ case POWER_SUPPLY_PROP_CURRENT_NOW: -+ v = (di->hdq_read)(BQ27000_FLAGS); -+ if (v < 0) -+ return v; -+ if (v & BQ27000_STATUS_CHGS) -+ n = -NANOVOLTS_UNIT; -+ else -+ n = NANOVOLTS_UNIT; -+ v = hdq_read16(di, BQ27000_AI_L); -+ if (v < 0) -+ return v; -+ val->intval = (v * n) / di->rsense_mohms; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_FULL: -+ v = hdq_read16(di, BQ27000_LMD_L); -+ if (v < 0) -+ return v; -+ val->intval = (v * 3570) / di->rsense_mohms; -+ break; -+ case POWER_SUPPLY_PROP_TEMP: -+ v = hdq_read16(di, BQ27000_TEMP_L); -+ if (v < 0) -+ return v; -+ /* K (in 0.25K units) is 273.15 up from C (in 0.1C)*/ -+ /* 10926 = 27315 * 4 / 10 */ -+ val->intval = (((long)v * 10l) - 10926) / 4; -+ break; -+ case POWER_SUPPLY_PROP_TECHNOLOGY: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_LION; -+ break; -+ case POWER_SUPPLY_PROP_CAPACITY: -+ val->intval = (di->hdq_read)(BQ27000_RSOC); -+ if (val->intval < 0) -+ return val->intval; -+ break; -+ case POWER_SUPPLY_PROP_PRESENT: -+ v = (di->hdq_read)(BQ27000_RSOC); -+ val->intval = !(v < 0); -+ break; -+ case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: -+ v = hdq_read16(di, BQ27000_TTE_L); -+ if (v < 0) -+ return v; -+ val->intval = 60 * v; -+ break; -+ case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW: -+ v = hdq_read16(di, BQ27000_TTF_L); -+ if (v < 0) -+ return v; -+ val->intval = 60 * v; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static enum power_supply_property bq27000_battery_props[] = { -+ POWER_SUPPLY_PROP_STATUS, -+ POWER_SUPPLY_PROP_VOLTAGE_NOW, -+ POWER_SUPPLY_PROP_CURRENT_NOW, -+ POWER_SUPPLY_PROP_CHARGE_FULL, -+ POWER_SUPPLY_PROP_TEMP, -+ POWER_SUPPLY_PROP_TECHNOLOGY, -+ POWER_SUPPLY_PROP_PRESENT, -+ POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, -+ POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, -+ POWER_SUPPLY_PROP_MODEL_NAME, -+ POWER_SUPPLY_PROP_CAPACITY -+}; -+ -+static int bq27000_battery_probe(struct platform_device *pdev) -+{ -+ int retval = 0; -+ struct bq27000_device_info *di; -+ struct bq27000_platform_data *pdata; -+ -+ dev_info(&pdev->dev, "BQ27000 Battery Driver (C) 2008 Openmoko, Inc\n"); -+ -+ di = kzalloc(sizeof(*di), GFP_KERNEL); -+ if (!di) { -+ retval = -ENOMEM; -+ goto di_alloc_failed; -+ } -+ -+ platform_set_drvdata(pdev, di); -+ -+ pdata = pdev->dev.platform_data; -+ di->dev = &pdev->dev; -+ /* di->w1_dev = pdev->dev.parent; */ -+ di->bat.name = pdata->name; -+ di->bat.type = POWER_SUPPLY_TYPE_BATTERY; -+ di->bat.properties = bq27000_battery_props; -+ di->bat.num_properties = ARRAY_SIZE(bq27000_battery_props); -+ di->bat.get_property = bq27000_battery_get_property; -+ di->bat.external_power_changed = -+ bq27000_battery_external_power_changed; -+ di->hdq_read = pdata->hdq_read; -+ di->hdq_write = pdata->hdq_write; -+ di->rsense_mohms = pdata->rsense_mohms; -+ di->hdq_initialized = pdata->hdq_initialized; -+ -+ retval = power_supply_register(&pdev->dev, &di->bat); -+ if (retval) { -+ dev_err(di->dev, "failed to register battery\n"); -+ goto batt_failed; -+ } -+ -+ return 0; -+ -+batt_failed: -+ kfree(di); -+di_alloc_failed: -+ return retval; -+} -+ -+static int bq27000_battery_remove(struct platform_device *pdev) -+{ -+ struct bq27000_device_info *di = platform_get_drvdata(pdev); -+ -+ power_supply_unregister(&di->bat); -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+ -+static int bq27000_battery_suspend(struct platform_device *pdev, -+ pm_message_t state) -+{ -+ return 0; -+} -+ -+static int bq27000_battery_resume(struct platform_device *pdev) -+{ -+ return 0; -+} -+ -+#else -+ -+#define bq27000_battery_suspend NULL -+#define bq27000_battery_resume NULL -+ -+#endif /* CONFIG_PM */ -+ -+static struct platform_driver bq27000_battery_driver = { -+ .driver = { -+ .name = "bq27000-battery", -+ }, -+ .probe = bq27000_battery_probe, -+ .remove = bq27000_battery_remove, -+ .suspend = bq27000_battery_suspend, -+ .resume = bq27000_battery_resume, -+}; -+ -+static int __init bq27000_battery_init(void) -+{ -+ return platform_driver_register(&bq27000_battery_driver); -+} -+ -+static void __exit bq27000_battery_exit(void) -+{ -+ platform_driver_unregister(&bq27000_battery_driver); -+} -+ -+module_init(bq27000_battery_init); -+module_exit(bq27000_battery_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Andy Green <andy@openmoko.com>"); -+MODULE_DESCRIPTION("bq27000 battery driver"); -diff --git a/include/linux/bq27000_battery.h b/include/linux/bq27000_battery.h -new file mode 100644 -index 0000000..36b4f20 ---- /dev/null -+++ b/include/linux/bq27000_battery.h -@@ -0,0 +1,12 @@ -+#ifndef __BQ27000_BATTERY_H__ -+#define __BQ27000_BATTERY_H__ -+ -+struct bq27000_platform_data { -+ const char *name; -+ int rsense_mohms; -+ int (*hdq_read)(int); -+ int (*hdq_write)(int, u8); -+ int (*hdq_initialized)(void); -+}; -+ -+#endif --- -1.5.6.3 - |