From 2d581e604771771dd63946cbed17d6b7ec79bd9d Mon Sep 17 00:00:00 2001 From: nbd Date: Sun, 14 Jun 2009 20:42:33 +0000 Subject: add the 'goldfish' target, useful for experimenting with virtual phone hardware (includes the emulator) git-svn-id: svn://svn.openwrt.org/openwrt/trunk@16459 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...dfish-POWER-New-power-supply-driver-for-g.patch | 308 +++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 target/linux/goldfish/patches-2.6.30/0126--ARM-goldfish-POWER-New-power-supply-driver-for-g.patch (limited to 'target/linux/goldfish/patches-2.6.30/0126--ARM-goldfish-POWER-New-power-supply-driver-for-g.patch') diff --git a/target/linux/goldfish/patches-2.6.30/0126--ARM-goldfish-POWER-New-power-supply-driver-for-g.patch b/target/linux/goldfish/patches-2.6.30/0126--ARM-goldfish-POWER-New-power-supply-driver-for-g.patch new file mode 100644 index 000000000..4b5265ab3 --- /dev/null +++ b/target/linux/goldfish/patches-2.6.30/0126--ARM-goldfish-POWER-New-power-supply-driver-for-g.patch @@ -0,0 +1,308 @@ +From 7041346d379e563e9ee66f9dd31277e4fb6b1b1f Mon Sep 17 00:00:00 2001 +From: Mike Lockwood +Date: Wed, 6 Feb 2008 11:37:10 -0500 +Subject: [PATCH 126/134] [ARM] goldfish: POWER: New power supply driver for goldfish. + +Signed-off-by: Mike A. Chan +--- + drivers/power/Kconfig | 5 + + drivers/power/Makefile | 3 +- + drivers/power/goldfish_battery.c | 254 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 261 insertions(+), 1 deletions(-) + create mode 100644 drivers/power/goldfish_battery.c + +diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig +index 33da112..593c616 100644 +--- a/drivers/power/Kconfig ++++ b/drivers/power/Kconfig +@@ -88,4 +88,9 @@ config CHARGER_PCF50633 + help + Say Y to include support for NXP PCF50633 Main Battery Charger. + ++config BATTERY_GOLDFISH ++ tristate "Goldfish battery driver" ++ help ++ Say Y to enable support for the battery and AC power in the Goldfish emulator. ++ + endif # POWER_SUPPLY +diff --git a/drivers/power/Makefile b/drivers/power/Makefile +index 2fcf41d..5be0fbb 100644 +--- a/drivers/power/Makefile ++++ b/drivers/power/Makefile +@@ -19,10 +19,11 @@ obj-$(CONFIG_APM_POWER) += apm_power.o + obj-$(CONFIG_WM8350_POWER) += wm8350_power.o + + obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o ++obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o + obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o + obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o + obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o + obj-$(CONFIG_BATTERY_WM97XX) += wm97xx_battery.o + obj-$(CONFIG_BATTERY_BQ27x00) += bq27x00_battery.o + obj-$(CONFIG_BATTERY_DA9030) += da9030_battery.o +-obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o +\ No newline at end of file ++obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o +diff --git a/drivers/power/goldfish_battery.c b/drivers/power/goldfish_battery.c +new file mode 100644 +index 0000000..868dc83 +--- /dev/null ++++ b/drivers/power/goldfish_battery.c +@@ -0,0 +1,254 @@ ++/* drivers/power/goldfish_battery.c ++ * ++ * Power supply driver for the goldfish emulator ++ * ++ * Copyright (C) 2008 Google, Inc. ++ * Author: Mike Lockwood ++ * ++ * This software is licensed under the terms of the GNU General Public ++ * License version 2, as published by the Free Software Foundation, and ++ * may be copied, distributed, and modified under those terms. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++struct goldfish_battery_data { ++ uint32_t reg_base; ++ int irq; ++ spinlock_t lock; ++ ++ struct power_supply battery; ++ struct power_supply ac; ++}; ++ ++#define GOLDFISH_BATTERY_READ(data, addr) (readl(data->reg_base + addr)) ++#define GOLDFISH_BATTERY_WRITE(data, addr, x) (writel(x, data->reg_base + addr)) ++ ++ ++/* temporary variable used between goldfish_battery_probe() and goldfish_battery_open() */ ++static struct goldfish_battery_data *battery_data; ++ ++enum { ++ /* status register */ ++ BATTERY_INT_STATUS = 0x00, ++ /* set this to enable IRQ */ ++ BATTERY_INT_ENABLE = 0x04, ++ ++ BATTERY_AC_ONLINE = 0x08, ++ BATTERY_STATUS = 0x0C, ++ BATTERY_HEALTH = 0x10, ++ BATTERY_PRESENT = 0x14, ++ BATTERY_CAPACITY = 0x18, ++ ++ BATTERY_STATUS_CHANGED = 1U << 0, ++ AC_STATUS_CHANGED = 1U << 1, ++ BATTERY_INT_MASK = BATTERY_STATUS_CHANGED | AC_STATUS_CHANGED, ++}; ++ ++ ++static int goldfish_ac_get_property(struct power_supply *psy, ++ enum power_supply_property psp, ++ union power_supply_propval *val) ++{ ++ struct goldfish_battery_data *data = container_of(psy, ++ struct goldfish_battery_data, ac); ++ int ret = 0; ++ ++ switch (psp) { ++ case POWER_SUPPLY_PROP_ONLINE: ++ val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_AC_ONLINE); ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ return ret; ++} ++ ++static int goldfish_battery_get_property(struct power_supply *psy, ++ enum power_supply_property psp, ++ union power_supply_propval *val) ++{ ++ struct goldfish_battery_data *data = container_of(psy, ++ struct goldfish_battery_data, battery); ++ int ret = 0; ++ ++ switch (psp) { ++ case POWER_SUPPLY_PROP_STATUS: ++ val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_STATUS); ++ break; ++ case POWER_SUPPLY_PROP_HEALTH: ++ val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_HEALTH); ++ break; ++ case POWER_SUPPLY_PROP_PRESENT: ++ val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_PRESENT); ++ break; ++ case POWER_SUPPLY_PROP_TECHNOLOGY: ++ val->intval = POWER_SUPPLY_TECHNOLOGY_LION; ++ break; ++ case POWER_SUPPLY_PROP_CAPACITY: ++ val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CAPACITY); ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ ++ return ret; ++} ++ ++static enum power_supply_property goldfish_battery_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_HEALTH, ++ POWER_SUPPLY_PROP_PRESENT, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_CAPACITY, ++}; ++ ++static enum power_supply_property goldfish_ac_props[] = { ++ POWER_SUPPLY_PROP_ONLINE, ++}; ++ ++static irqreturn_t goldfish_battery_interrupt(int irq, void *dev_id) ++{ ++ unsigned long irq_flags; ++ struct goldfish_battery_data *data = dev_id; ++ uint32_t status; ++ ++ spin_lock_irqsave(&data->lock, irq_flags); ++ ++ /* read status flags, which will clear the interrupt */ ++ status = GOLDFISH_BATTERY_READ(data, BATTERY_INT_STATUS); ++ status &= BATTERY_INT_MASK; ++ ++ if (status & BATTERY_STATUS_CHANGED) ++ power_supply_changed(&data->battery); ++ if (status & AC_STATUS_CHANGED) ++ power_supply_changed(&data->ac); ++ ++ spin_unlock_irqrestore(&data->lock, irq_flags); ++ return status ? IRQ_HANDLED : IRQ_NONE; ++} ++ ++ ++static int goldfish_battery_probe(struct platform_device *pdev) ++{ ++ int ret; ++ struct resource *r; ++ struct goldfish_battery_data *data; ++ ++ data = kzalloc(sizeof(*data), GFP_KERNEL); ++ if (data == NULL) { ++ ret = -ENOMEM; ++ goto err_data_alloc_failed; ++ } ++ spin_lock_init(&data->lock); ++ ++ data->battery.properties = goldfish_battery_props; ++ data->battery.num_properties = ARRAY_SIZE(goldfish_battery_props); ++ data->battery.get_property = goldfish_battery_get_property; ++ data->battery.name = "battery"; ++ data->battery.type = POWER_SUPPLY_TYPE_BATTERY; ++ ++ data->ac.properties = goldfish_ac_props; ++ data->ac.num_properties = ARRAY_SIZE(goldfish_ac_props); ++ data->ac.get_property = goldfish_ac_get_property; ++ data->ac.name = "ac"; ++ data->ac.type = POWER_SUPPLY_TYPE_MAINS; ++ ++ r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (r == NULL) { ++ printk(KERN_ERR "%s: platform_get_resource failed\n", pdev->name); ++ ret = -ENODEV; ++ goto err_no_io_base; ++ } ++ data->reg_base = IO_ADDRESS(r->start - IO_START); ++ ++ data->irq = platform_get_irq(pdev, 0); ++ if (data->irq < 0) { ++ printk(KERN_ERR "%s: platform_get_irq failed\n", pdev->name); ++ ret = -ENODEV; ++ goto err_no_irq; ++ } ++ ++ ret = request_irq(data->irq, goldfish_battery_interrupt, IRQF_SHARED, pdev->name, data); ++ if (ret) ++ goto err_request_irq_failed; ++ ++ ret = power_supply_register(&pdev->dev, &data->ac); ++ if (ret) ++ goto err_ac_failed; ++ ++ ret = power_supply_register(&pdev->dev, &data->battery); ++ if (ret) ++ goto err_battery_failed; ++ ++ platform_set_drvdata(pdev, data); ++ battery_data = data; ++ ++ GOLDFISH_BATTERY_WRITE(data, BATTERY_INT_ENABLE, BATTERY_INT_MASK); ++ return 0; ++ ++err_battery_failed: ++ power_supply_unregister(&data->ac); ++err_ac_failed: ++ free_irq(data->irq, data); ++err_request_irq_failed: ++err_no_irq: ++err_no_io_base: ++ kfree(data); ++err_data_alloc_failed: ++ return ret; ++} ++ ++static int goldfish_battery_remove(struct platform_device *pdev) ++{ ++ struct goldfish_battery_data *data = platform_get_drvdata(pdev); ++ ++ power_supply_unregister(&data->battery); ++ power_supply_unregister(&data->ac); ++ ++ free_irq(data->irq, data); ++ kfree(data); ++ battery_data = NULL; ++ return 0; ++} ++ ++static struct platform_driver goldfish_battery_device = { ++ .probe = goldfish_battery_probe, ++ .remove = goldfish_battery_remove, ++ .driver = { ++ .name = "goldfish-battery" ++ } ++}; ++ ++static int __init goldfish_battery_init(void) ++{ ++ return platform_driver_register(&goldfish_battery_device); ++} ++ ++static void __exit goldfish_battery_exit(void) ++{ ++ platform_driver_unregister(&goldfish_battery_device); ++} ++ ++module_init(goldfish_battery_init); ++module_exit(goldfish_battery_exit); ++ ++MODULE_AUTHOR("Mike Lockwood lockwood@android.com"); ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("Battery driver for the Goldfish emulator"); +-- +1.6.2 + -- cgit v1.2.3