diff options
Diffstat (limited to 'recipes-kernel/linux/linux-yocto-3.14/h3600/0007-power-add-driver-for-battery-reading-on-iPaq-h3xxx.patch')
-rw-r--r-- | recipes-kernel/linux/linux-yocto-3.14/h3600/0007-power-add-driver-for-battery-reading-on-iPaq-h3xxx.patch | 350 |
1 files changed, 0 insertions, 350 deletions
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h3600/0007-power-add-driver-for-battery-reading-on-iPaq-h3xxx.patch b/recipes-kernel/linux/linux-yocto-3.14/h3600/0007-power-add-driver-for-battery-reading-on-iPaq-h3xxx.patch deleted file mode 100644 index fb34e62..0000000 --- a/recipes-kernel/linux/linux-yocto-3.14/h3600/0007-power-add-driver-for-battery-reading-on-iPaq-h3xxx.patch +++ /dev/null @@ -1,350 +0,0 @@ -From e6d787e84661a0bc3992fcf1d0c77075ca9b3b90 Mon Sep 17 00:00:00 2001 -From: Dmitry Artamonow <mad_soft@inbox.ru> -Date: Sat, 21 Mar 2009 16:28:50 +0300 -Subject: [PATCH 7/7] power: add driver for battery reading on iPaq h3xxx - -This adds a driver for reading the battery status of the -battery connected to the Atmel microcontroller on the -iPAQ h3xxx series. - -Based on a driver from handhelds.org 2.6.21 kernel, written -by Alessandro GARDICH. - -Signed-off-by: Dmitry Artamonow <mad_soft@inbox.ru> -Signed-off-by: Linus Walleij <linus.walleij@linaro.org> ---- - drivers/power/Kconfig | 7 + - drivers/power/Makefile | 1 + - drivers/power/ipaq_micro_battery.c | 290 +++++++++++++++++++++++++++++++++++++ - 3 files changed, 298 insertions(+) - create mode 100644 drivers/power/ipaq_micro_battery.c - -diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig -index ba6975123071..73cfcdf28a36 100644 ---- a/drivers/power/Kconfig -+++ b/drivers/power/Kconfig -@@ -137,6 +137,13 @@ config BATTERY_COLLIE - Say Y to enable support for the battery on the Sharp Zaurus - SL-5500 (collie) models. - -+config BATTERY_IPAQ_MICRO -+ tristate "iPAQ Atmel Micro ASIC battery driver" -+ depends on MFD_IPAQ_MICRO -+ help -+ Choose this option if you want to monitor battery status on -+ Compaq/HP iPAQ h3100 and h3600. -+ - config BATTERY_WM97XX - bool "WM97xx generic battery driver" - depends on TOUCHSCREEN_WM97XX=y -diff --git a/drivers/power/Makefile b/drivers/power/Makefile -index ee54a3e4c90a..dfa894273926 100644 ---- a/drivers/power/Makefile -+++ b/drivers/power/Makefile -@@ -25,6 +25,7 @@ obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o - obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o - obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o - obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o -+obj-$(CONFIG_BATTERY_IPAQ_MICRO) += ipaq_micro_battery.o - obj-$(CONFIG_BATTERY_WM97XX) += wm97xx_battery.o - obj-$(CONFIG_BATTERY_SBS) += sbs-battery.o - obj-$(CONFIG_BATTERY_BQ27x00) += bq27x00_battery.o -diff --git a/drivers/power/ipaq_micro_battery.c b/drivers/power/ipaq_micro_battery.c -new file mode 100644 -index 000000000000..f875137e4d9c ---- /dev/null -+++ b/drivers/power/ipaq_micro_battery.c -@@ -0,0 +1,290 @@ -+/* -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * h3xxx atmel micro companion support, battery subdevice -+ * based on previous kernel 2.4 version -+ * Author : Alessandro Gardich <gremlin@gremlin.it> -+ * Author : Linus Walleij <linus.walleij@linaro.org> -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/platform_device.h> -+#include <linux/mfd/ipaq-micro.h> -+#include <linux/power_supply.h> -+#include <linux/workqueue.h> -+ -+#define BATT_PERIOD 100000 /* 10 seconds in milliseconds */ -+ -+#define MICRO_BATT_CHEM_ALKALINE 0x01 -+#define MICRO_BATT_CHEM_NICD 0x02 -+#define MICRO_BATT_CHEM_NIMH 0x03 -+#define MICRO_BATT_CHEM_LION 0x04 -+#define MICRO_BATT_CHEM_LIPOLY 0x05 -+#define MICRO_BATT_CHEM_NOT_INSTALLED 0x06 -+#define MICRO_BATT_CHEM_UNKNOWN 0xff -+ -+#define MICRO_BATT_STATUS_HIGH 0x01 -+#define MICRO_BATT_STATUS_LOW 0x02 -+#define MICRO_BATT_STATUS_CRITICAL 0x04 -+#define MICRO_BATT_STATUS_CHARGING 0x08 -+#define MICRO_BATT_STATUS_CHARGEMAIN 0x10 -+#define MICRO_BATT_STATUS_DEAD 0x20 /* Battery will not charge */ -+#define MICRO_BATT_STATUS_NOTINSTALLED 0x20 /* For expansion pack batteries */ -+#define MICRO_BATT_STATUS_FULL 0x40 /* Battery fully charged */ -+#define MICRO_BATT_STATUS_NOBATTERY 0x80 -+#define MICRO_BATT_STATUS_UNKNOWN 0xff -+ -+struct micro_battery { -+ struct ipaq_micro *micro; -+ struct workqueue_struct *wq; -+ struct delayed_work update; -+ u8 ac; -+ u8 chemistry; -+ unsigned int voltage; -+ u16 temperature; -+ u8 flag; -+}; -+ -+static void micro_battery_work(struct work_struct *work) -+{ -+ struct micro_battery *mb = container_of(work, -+ struct micro_battery, update.work); -+ struct ipaq_micro_msg msg_battery = { -+ .id = MSG_BATTERY, -+ }; -+ struct ipaq_micro_msg msg_sensor = { -+ .id = MSG_THERMAL_SENSOR, -+ }; -+ -+ /* First send battery message */ -+ ipaq_micro_tx_msg_sync(mb->micro, &msg_battery); -+ if (msg_battery.rx_len < 4) -+ pr_info("ERROR"); -+ -+ /* -+ * Returned message format: -+ * byte 0: 0x00 = Not plugged in -+ * 0x01 = AC adapter plugged in -+ * byte 1: chemistry -+ * byte 2: voltage LSB -+ * byte 3: voltage MSB -+ * byte 4: flags -+ * byte 5-9: same for battery 2 -+ */ -+ mb->ac = msg_battery.rx_data[0]; -+ mb->chemistry = msg_battery.rx_data[1]; -+ mb->voltage = ((((unsigned short)msg_battery.rx_data[3] << 8) + -+ msg_battery.rx_data[2]) * 5000L) * 1000 / 1024; -+ mb->flag = msg_battery.rx_data[4]; -+ -+ if (msg_battery.rx_len == 9) -+ pr_debug("second battery ignored\n"); -+ -+ /* Then read the sensor */ -+ ipaq_micro_tx_msg_sync(mb->micro, &msg_sensor); -+ mb->temperature = msg_sensor.rx_data[1] << 8 | msg_sensor.rx_data[0]; -+ -+ queue_delayed_work(mb->wq, &mb->update, msecs_to_jiffies(BATT_PERIOD)); -+} -+ -+static int get_capacity(struct power_supply *b) -+{ -+ struct micro_battery *mb = dev_get_drvdata(b->dev->parent); -+ -+ switch (mb->flag & 0x07) { -+ case MICRO_BATT_STATUS_HIGH: -+ return 100; -+ break; -+ case MICRO_BATT_STATUS_LOW: -+ return 50; -+ break; -+ case MICRO_BATT_STATUS_CRITICAL: -+ return 5; -+ break; -+ default: -+ break; -+ } -+ return 0; -+} -+ -+static int get_status(struct power_supply *b) -+{ -+ struct micro_battery *mb = dev_get_drvdata(b->dev->parent); -+ -+ if (mb->flag == MICRO_BATT_STATUS_UNKNOWN) -+ return POWER_SUPPLY_STATUS_UNKNOWN; -+ -+ if (mb->flag & MICRO_BATT_STATUS_FULL) -+ return POWER_SUPPLY_STATUS_FULL; -+ -+ if ((mb->flag & MICRO_BATT_STATUS_CHARGING) || -+ (mb->flag & MICRO_BATT_STATUS_CHARGEMAIN)) -+ return POWER_SUPPLY_STATUS_CHARGING; -+ -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+} -+ -+static int micro_batt_get_property(struct power_supply *b, -+ enum power_supply_property psp, -+ union power_supply_propval *val) -+{ -+ struct micro_battery *mb = dev_get_drvdata(b->dev->parent); -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_TECHNOLOGY: -+ switch (mb->chemistry) { -+ case MICRO_BATT_CHEM_NICD: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_NiCd; -+ break; -+ case MICRO_BATT_CHEM_NIMH: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_NiMH; -+ break; -+ case MICRO_BATT_CHEM_LION: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_LION; -+ break; -+ case MICRO_BATT_CHEM_LIPOLY: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; -+ break; -+ default: -+ val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; -+ break; -+ }; -+ break; -+ case POWER_SUPPLY_PROP_STATUS: -+ val->intval = get_status(b); -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: -+ val->intval = 4700000; -+ break; -+ case POWER_SUPPLY_PROP_CAPACITY: -+ val->intval = get_capacity(b); -+ break; -+ case POWER_SUPPLY_PROP_TEMP: -+ val->intval = mb->temperature; -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_NOW: -+ val->intval = mb->voltage; -+ break; -+ default: -+ return -EINVAL; -+ }; -+ -+ return 0; -+} -+ -+static int micro_ac_get_property(struct power_supply *b, -+ enum power_supply_property psp, -+ union power_supply_propval *val) -+{ -+ struct micro_battery *mb = dev_get_drvdata(b->dev->parent); -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_ONLINE: -+ val->intval = mb->ac; -+ break; -+ default: -+ return -EINVAL; -+ }; -+ -+ return 0; -+} -+ -+static enum power_supply_property micro_batt_props[] = { -+ POWER_SUPPLY_PROP_TECHNOLOGY, -+ POWER_SUPPLY_PROP_STATUS, -+ POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, -+ POWER_SUPPLY_PROP_CAPACITY, -+ POWER_SUPPLY_PROP_TEMP, -+ POWER_SUPPLY_PROP_VOLTAGE_NOW, -+}; -+ -+static struct power_supply micro_battery = { -+ .name = "main-battery", -+ .type = POWER_SUPPLY_TYPE_BATTERY, -+ .properties = micro_batt_props, -+ .num_properties = ARRAY_SIZE(micro_batt_props), -+ .get_property = micro_batt_get_property, -+ .use_for_apm = 1, -+}; -+ -+static enum power_supply_property micro_ac_props[] = { -+ POWER_SUPPLY_PROP_ONLINE, -+}; -+ -+static struct power_supply micro_ac = { -+ .name = "ac", -+ .type = POWER_SUPPLY_TYPE_MAINS, -+ .properties = micro_ac_props, -+ .num_properties = ARRAY_SIZE(micro_ac_props), -+ .get_property = micro_ac_get_property, -+}; -+ -+static int micro_batt_probe(struct platform_device *pdev) -+{ -+ struct micro_battery *mb; -+ -+ mb = devm_kzalloc(&pdev->dev, sizeof(*mb), GFP_KERNEL); -+ if (!mb) -+ return -ENOMEM; -+ -+ mb->micro = dev_get_drvdata(pdev->dev.parent); -+ mb->wq = create_singlethread_workqueue("ipaq-battery-wq"); -+ INIT_DELAYED_WORK(&mb->update, micro_battery_work); -+ platform_set_drvdata(pdev, mb); -+ queue_delayed_work(mb->wq, &mb->update, 1); -+ power_supply_register(&pdev->dev, µ_battery); -+ power_supply_register(&pdev->dev, µ_ac); -+ -+ dev_info(&pdev->dev, "iPAQ micro battery driver\n"); -+ return 0; -+} -+ -+static int micro_batt_remove(struct platform_device *pdev) -+ -+{ -+ struct micro_battery *mb = platform_get_drvdata(pdev); -+ -+ power_supply_unregister(µ_ac); -+ power_supply_unregister(µ_battery); -+ cancel_delayed_work_sync(&mb->update); -+ -+ return 0; -+} -+ -+static int micro_batt_suspend(struct device *dev) -+{ -+ struct micro_battery *mb = dev_get_drvdata(dev); -+ -+ cancel_delayed_work_sync(&mb->update); -+ return 0; -+} -+ -+static int micro_batt_resume(struct device *dev) -+{ -+ struct micro_battery *mb = dev_get_drvdata(dev); -+ -+ queue_delayed_work(mb->wq, &mb->update, msecs_to_jiffies(BATT_PERIOD)); -+ return 0; -+} -+ -+static const struct dev_pm_ops micro_batt_dev_pm_ops = { -+ SET_SYSTEM_SLEEP_PM_OPS(micro_batt_suspend, micro_batt_resume) -+}; -+ -+struct platform_driver micro_batt_device_driver = { -+ .driver = { -+ .name = "ipaq-micro-battery", -+ .pm = µ_batt_dev_pm_ops, -+ }, -+ .probe = micro_batt_probe, -+ .remove = micro_batt_remove, -+}; -+module_platform_driver(micro_batt_device_driver); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("driver for iPAQ Atmel micro battery"); -+MODULE_ALIAS("platform:battery-ipaq-micro"); --- -1.9.0 - |