diff options
Diffstat (limited to 'target/linux/omap24xx')
-rw-r--r-- | target/linux/omap24xx/patches-3.1/900-n810-battery-management.patch | 118 |
1 files changed, 58 insertions, 60 deletions
diff --git a/target/linux/omap24xx/patches-3.1/900-n810-battery-management.patch b/target/linux/omap24xx/patches-3.1/900-n810-battery-management.patch index 65cbe5042..ffd057728 100644 --- a/target/linux/omap24xx/patches-3.1/900-n810-battery-management.patch +++ b/target/linux/omap24xx/patches-3.1/900-n810-battery-management.patch @@ -1,7 +1,7 @@ Index: linux-3.1/drivers/cbus/Kconfig =================================================================== ---- linux-3.1.orig/drivers/cbus/Kconfig 2011-10-30 19:14:57.000000000 +0100 -+++ linux-3.1/drivers/cbus/Kconfig 2011-10-30 19:32:58.263510754 +0100 +--- linux-3.1.orig/drivers/cbus/Kconfig 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/Kconfig 2011-11-05 15:02:39.177041045 +0100 @@ -83,4 +83,12 @@ config CBUS_RETU_HEADSET endif # CBUS_RETU @@ -17,8 +17,8 @@ Index: linux-3.1/drivers/cbus/Kconfig endmenu Index: linux-3.1/drivers/cbus/Makefile =================================================================== ---- linux-3.1.orig/drivers/cbus/Makefile 2011-10-30 19:14:57.000000000 +0100 -+++ linux-3.1/drivers/cbus/Makefile 2011-10-30 19:32:58.263510754 +0100 +--- linux-3.1.orig/drivers/cbus/Makefile 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/Makefile 2011-11-05 15:02:39.177041045 +0100 @@ -11,3 +11,6 @@ obj-$(CONFIG_CBUS_RETU_POWERBUTTON) += r obj-$(CONFIG_CBUS_RETU_RTC) += retu-rtc.o obj-$(CONFIG_CBUS_RETU_WDT) += retu-wdt.o @@ -29,8 +29,8 @@ Index: linux-3.1/drivers/cbus/Makefile Index: linux-3.1/drivers/cbus/n810bm_main.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-3.1/drivers/cbus/n810bm_main.c 2011-10-30 19:32:58.263510754 +0100 -@@ -0,0 +1,1586 @@ ++++ linux-3.1/drivers/cbus/n810bm_main.c 2011-11-05 16:42:53.033998545 +0100 +@@ -0,0 +1,1572 @@ +/* + * Nokia n810 battery management + * @@ -63,6 +63,7 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c +#include <linux/bitops.h> +#include <linux/workqueue.h> +#include <linux/delay.h> ++#include <linux/interrupt.h> + +#include "cbus.h" +#include "retu.h" @@ -165,6 +166,9 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c +}; + +struct n810bm { ++ int tahvo_irq; ++ bool tahvo_irq_enabled; ++ + bool battery_present; /* A battery is inserted */ + bool charger_present; /* The charger is connected */ + enum n810bm_capacity capacity; /* The capacity of the inserted battery (if any) */ @@ -181,7 +185,6 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + + unsigned long notify_flags; + struct work_struct notify_work; -+ struct work_struct currmeas_irq_work; + struct delayed_work periodic_check_work; + + bool initialized; /* The hardware was initialized */ @@ -221,31 +224,27 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + +static u16 tahvo_read(struct n810bm *bm, unsigned int reg) +{ -+ return tahvo_read_reg(reg); ++ return tahvo_read_reg(&n810bm_tahvo_device->dev, reg); +} + +static void tahvo_maskset(struct n810bm *bm, unsigned int reg, u16 mask, u16 set) +{ -+ tahvo_set_clear_reg_bits(reg, set, mask); ++ tahvo_set_clear_reg_bits(&n810bm_tahvo_device->dev, reg, set, mask); +} + +static inline void tahvo_write(struct n810bm *bm, unsigned int reg, u16 value) +{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&tahvo_lock, flags); -+ tahvo_write_reg(reg, value); -+ spin_unlock_irqrestore(&tahvo_lock, flags); ++ tahvo_write_reg(&n810bm_tahvo_device->dev, reg, value); +} + +static inline void tahvo_set(struct n810bm *bm, unsigned int reg, u16 mask) +{ -+ tahvo_set_clear_reg_bits(reg, mask, mask); ++ tahvo_set_clear_reg_bits(&n810bm_tahvo_device->dev, reg, mask, mask); +} + +static inline void tahvo_clear(struct n810bm *bm, unsigned int reg, u16 mask) +{ -+ tahvo_set_clear_reg_bits(reg, 0, mask); ++ tahvo_set_clear_reg_bits(&n810bm_tahvo_device->dev, reg, 0, mask); +} + +static u16 retu_read(struct n810bm *bm, unsigned int reg) @@ -677,10 +676,17 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + tahvo_clear(bm, TAHVO_REG_CHGCTL, + TAHVO_REG_CHGCTL_CURTIMRST); + -+ if (millisec_interval) -+ tahvo_enable_irq(TAHVO_INT_BATCURR); -+ else -+ tahvo_disable_irq(TAHVO_INT_BATCURR); ++ if (millisec_interval) { ++ if (!bm->tahvo_irq_enabled) { ++ bm->tahvo_irq_enabled = 1; ++ enable_irq(bm->tahvo_irq); ++ } ++ } else { ++ if (bm->tahvo_irq_enabled) { ++ bm->tahvo_irq_enabled = 0; ++ disable_irq_nosync(bm->tahvo_irq); ++ } ++ } + + //TODO also do a software timer for safety. +} @@ -1036,9 +1042,9 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c +} +*/ + -+static void n810bm_tahvo_current_measure_work(struct work_struct *work) ++static irqreturn_t n810bm_tahvo_current_measure_irq_handler(int irq, void *data) +{ -+ struct n810bm *bm = container_of(work, struct n810bm, currmeas_irq_work); ++ struct n810bm *bm = data; + int res, ma, mv, temp; + + mutex_lock(&bm->mutex); @@ -1081,14 +1087,8 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + } +out_unlock: + mutex_unlock(&bm->mutex); -+} + -+static void n810bm_tahvo_current_measure_irq_handler(unsigned long data) -+{ -+ struct n810bm *bm = (struct n810bm *)data; -+ -+ tahvo_ack_irq(TAHVO_INT_BATCURR); -+ schedule_work(&bm->currmeas_irq_work); ++ return IRQ_HANDLED; +} + +#define DEFINE_ATTR_NOTIFY(attr_name) \ @@ -1366,7 +1366,6 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c +{ + cancel_delayed_work_sync(&bm->periodic_check_work); + cancel_work_sync(&bm->notify_work); -+ cancel_work_sync(&bm->currmeas_irq_work); + flush_scheduled_work(); +} + @@ -1397,12 +1396,14 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + if (err) + goto err_unwind_attrs; +*/ -+ err = tahvo_request_irq(TAHVO_INT_BATCURR, -+ n810bm_tahvo_current_measure_irq_handler, -+ (unsigned long)bm, "n810bm"); ++ bm->tahvo_irq = platform_get_irq(n810bm_tahvo_device, 0); ++ err = request_threaded_irq(bm->tahvo_irq, NULL, ++ n810bm_tahvo_current_measure_irq_handler, ++ IRQF_ONESHOT, "tahvo-n810bm", bm); + if (err) + goto err_free_retu_irq; -+ tahvo_disable_irq(TAHVO_INT_BATCURR); ++ disable_irq_nosync(bm->tahvo_irq); ++ bm->tahvo_irq_enabled = 0; + + schedule_delayed_work(&bm->periodic_check_work, + round_jiffies_relative(N810BM_CHECK_INTERVAL)); @@ -1433,7 +1434,7 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + return; + + lipocharge_exit(&bm->charger); -+ tahvo_free_irq(TAHVO_INT_BATCURR); ++ free_irq(bm->tahvo_irq, bm); +//XXX retu_free_irq(RETU_INT_ADCS); + for (i = 0; i < ARRAY_SIZE(n810bm_attrs); i++) + device_remove_file(&bm->pdev->dev, n810bm_attrs[i]); @@ -1498,7 +1499,6 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + mutex_init(&bm->mutex); + INIT_DELAYED_WORK(&bm->periodic_check_work, n810bm_periodic_check_work); + INIT_WORK(&bm->notify_work, n810bm_notify_work); -+ INIT_WORK(&bm->currmeas_irq_work, n810bm_tahvo_current_measure_work); + + dev_info(&bm->pdev->dev, "Requesting CAL BME PMM block firmware file " + N810BM_PMM_BLOCK_FILENAME); @@ -1575,21 +1575,10 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + } +}; + -+/* FIXME: for now alloc the device here... */ -+static struct platform_device n810bm_tahvo_dev = { -+ .name = "tahvo-n810bm", -+ .id = -1, -+}; -+ +static int __init n810bm_modinit(void) +{ + int err; + -+ //FIXME -+ err = platform_device_register(&n810bm_tahvo_dev); -+ if (err) -+ return err; -+ + err = platform_driver_probe(&n810bm_retu_driver, n810bm_retu_probe); + if (err) + return err; @@ -1605,9 +1594,6 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c + +static void __exit n810bm_modexit(void) +{ -+ //FIXME -+ platform_device_unregister(&n810bm_tahvo_dev); -+ + platform_driver_unregister(&n810bm_tahvo_driver); + platform_driver_unregister(&n810bm_retu_driver); +} @@ -1620,7 +1606,7 @@ Index: linux-3.1/drivers/cbus/n810bm_main.c Index: linux-3.1/drivers/cbus/lipocharge.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-3.1/drivers/cbus/lipocharge.c 2011-10-30 19:32:58.263510754 +0100 ++++ linux-3.1/drivers/cbus/lipocharge.c 2011-11-05 15:02:39.177041045 +0100 @@ -0,0 +1,183 @@ +/* + * Generic LIPO battery charger @@ -1808,7 +1794,7 @@ Index: linux-3.1/drivers/cbus/lipocharge.c Index: linux-3.1/drivers/cbus/lipocharge.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-3.1/drivers/cbus/lipocharge.h 2011-10-30 19:32:58.263510754 +0100 ++++ linux-3.1/drivers/cbus/lipocharge.h 2011-11-05 15:02:39.177041045 +0100 @@ -0,0 +1,60 @@ +#ifndef LIPOCHARGE_H_ +#define LIPOCHARGE_H_ @@ -1872,8 +1858,8 @@ Index: linux-3.1/drivers/cbus/lipocharge.h +#endif /* LIPOCHARGE_H_ */ Index: linux-3.1/drivers/cbus/cbus.c =================================================================== ---- linux-3.1.orig/drivers/cbus/cbus.c 2011-10-30 19:31:35.000000000 +0100 -+++ linux-3.1/drivers/cbus/cbus.c 2011-10-30 19:33:12.107254808 +0100 +--- linux-3.1.orig/drivers/cbus/cbus.c 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/cbus.c 2011-11-05 15:02:39.177041045 +0100 @@ -34,6 +34,7 @@ #include <linux/gpio.h> #include <linux/platform_device.h> @@ -1898,8 +1884,8 @@ Index: linux-3.1/drivers/cbus/cbus.c MODULE_AUTHOR("Juha Yrjölä"); Index: linux-3.1/drivers/cbus/cbus.h =================================================================== ---- linux-3.1.orig/drivers/cbus/cbus.h 2011-10-30 19:14:57.000000000 +0100 -+++ linux-3.1/drivers/cbus/cbus.h 2011-10-30 19:32:58.263510754 +0100 +--- linux-3.1.orig/drivers/cbus/cbus.h 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/cbus.h 2011-11-05 15:02:39.177041045 +0100 @@ -27,4 +27,6 @@ extern int cbus_read_reg(struct device * extern int cbus_write_reg(struct device *, unsigned dev, unsigned reg, unsigned val); @@ -1909,8 +1895,8 @@ Index: linux-3.1/drivers/cbus/cbus.h #endif /* __DRIVERS_CBUS_CBUS_H */ Index: linux-3.1/drivers/cbus/retu.c =================================================================== ---- linux-3.1.orig/drivers/cbus/retu.c 2011-10-30 19:31:35.000000000 +0100 -+++ linux-3.1/drivers/cbus/retu.c 2011-10-30 19:32:58.263510754 +0100 +--- linux-3.1.orig/drivers/cbus/retu.c 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/retu.c 2011-11-05 15:02:39.177041045 +0100 @@ -417,6 +417,11 @@ static int retu_allocate_children(struct if (!child) return -ENOMEM; @@ -1925,8 +1911,8 @@ Index: linux-3.1/drivers/cbus/retu.c Index: linux-3.1/drivers/cbus/tahvo.c =================================================================== ---- linux-3.1.orig/drivers/cbus/tahvo.c 2011-10-30 19:31:35.000000000 +0100 -+++ linux-3.1/drivers/cbus/tahvo.c 2011-10-30 19:32:58.263510754 +0100 +--- linux-3.1.orig/drivers/cbus/tahvo.c 2011-11-05 15:02:39.041041166 +0100 ++++ linux-3.1/drivers/cbus/tahvo.c 2011-11-05 16:23:10.694222186 +0100 @@ -129,6 +129,7 @@ void tahvo_set_clear_reg_bits(struct dev __tahvo_write_reg(tahvo, reg, w); mutex_unlock(&tahvo->mutex); @@ -1935,3 +1921,15 @@ Index: linux-3.1/drivers/cbus/tahvo.c static irqreturn_t tahvo_irq_handler(int irq, void *_tahvo) { +@@ -305,6 +306,11 @@ static int tahvo_allocate_children(struc + if (!child) + return -ENOMEM; + ++ child = tahvo_allocate_child("tahvo-n810bm", parent, ++ irq_base + TAHVO_INT_BATCURR); ++ if (!child) ++ return -ENOMEM; ++ + return 0; + } + |