diff options
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.24/1306--lis302dl-refactor-and-cleanup.patch.patch')
-rw-r--r-- | target/linux/s3c24xx/patches-2.6.24/1306--lis302dl-refactor-and-cleanup.patch.patch | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.24/1306--lis302dl-refactor-and-cleanup.patch.patch b/target/linux/s3c24xx/patches-2.6.24/1306--lis302dl-refactor-and-cleanup.patch.patch new file mode 100644 index 0000000..452b2aa --- /dev/null +++ b/target/linux/s3c24xx/patches-2.6.24/1306--lis302dl-refactor-and-cleanup.patch.patch @@ -0,0 +1,478 @@ +From 3318a7cb3165a33046e122294e1878e3bd6555d8 Mon Sep 17 00:00:00 2001 +From: Simon Kagstrom <simon.kagstrom@gmail.com> +Date: Thu, 16 Oct 2008 01:19:20 +0100 +Subject: [PATCH] : lis302dl-refactor-and-cleanup.patch + +Some code refactoring. + +From: Simon Kagstrom <simon.kagstrom@gmail.com> + +Re-added __reg_read and __reg_write and re-indent the code according to +these. Move some input-related functions to get a more "logical" order, +e.g., in the future we might want to support clicks again and call these +from read_sample. Removed unused function pointer in the structure + +Signed-off-by: Simon Kagstrom <simon.kagstrom@gmail.com> +--- + drivers/input/misc/lis302dl.c | 260 ++++++++++++++++++++--------------------- + include/linux/lis302dl.h | 1 - + 2 files changed, 125 insertions(+), 136 deletions(-) + +diff --git a/drivers/input/misc/lis302dl.c b/drivers/input/misc/lis302dl.c +index 1013f4a..300918d 100644 +--- a/drivers/input/misc/lis302dl.c ++++ b/drivers/input/misc/lis302dl.c +@@ -43,19 +43,58 @@ + + #include <linux/lis302dl.h> + ++/* Utility functions */ ++static u8 __reg_read(struct lis302dl_info *lis, u8 reg) ++{ ++ return (lis->pdata->lis302dl_bitbang_reg_read)(lis, reg); ++} + ++static void __reg_write(struct lis302dl_info *lis, u8 reg, u8 val) ++{ ++ (lis->pdata->lis302dl_bitbang_reg_write)(lis, reg, val); ++} + + static void __reg_set_bit_mask(struct lis302dl_info *lis, u8 reg, u8 mask, +- u8 val) ++ u8 val) + { + u_int8_t tmp; + + val &= mask; + +- tmp = (lis->pdata->lis302dl_bitbang_reg_read)(lis, reg); ++ tmp = __reg_read(lis, reg); + tmp &= ~mask; + tmp |= val; +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, reg, tmp); ++ __reg_write(lis, reg, tmp); ++} ++ ++static int __ms_to_duration(struct lis302dl_info *lis, int ms) ++{ ++ u8 r = __reg_read(lis, LIS302DL_REG_CTRL1); ++ ++ /* If we have 400 ms sampling rate, the stepping is 2.5 ms, ++ * on 100 ms the stepping is 10ms */ ++ if (r & LIS302DL_CTRL1_DR) { ++ /* Too large */ ++ if (ms > 637) ++ return -1; ++ ++ return (ms * 10) / 25; ++ } ++ ++ /* Too large value */ ++ if (ms > 2550) ++ return -1; ++ return ms / 10; ++} ++ ++static int __duration_to_ms(struct lis302dl_info *lis, int duration) ++{ ++ u8 r = __reg_read(lis, LIS302DL_REG_CTRL1); ++ ++ if (r & LIS302DL_CTRL1_DR) ++ return (duration * 25) / 10; ++ ++ return duration * 10; + } + + /* interrupt handling related */ +@@ -69,30 +108,6 @@ enum lis302dl_intmode { + LIS302DL_INTMODE_CLICK = 0x07, + }; + +-#define MG_PER_SAMPLE 18 +- +-static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis) +-{ +- u8 data = 0xc0 | LIS302DL_REG_OUT_X; /* read, autoincrement */ +- u8 read[5]; +- unsigned long flags; +- +- local_irq_save(flags); +- +- (lis->pdata->lis302dl_bitbang)(lis, &data, 1, &read[0], 5); +- +- local_irq_restore(flags); +- +- input_report_rel(lis->input_dev, REL_X, MG_PER_SAMPLE * (s8)read[0]); +- input_report_rel(lis->input_dev, REL_Y, MG_PER_SAMPLE * (s8)read[2]); +- input_report_rel(lis->input_dev, REL_Z, MG_PER_SAMPLE * (s8)read[4]); +- +- input_sync(lis->input_dev); +- +- /* Reset the HP filter */ +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, +- LIS302DL_REG_HP_FILTER_RESET); +-} + + static void __lis302dl_int_mode(struct device *dev, int int_pin, + enum lis302dl_intmode mode) +@@ -110,6 +125,7 @@ static void __lis302dl_int_mode(struct device *dev, int int_pin, + BUG(); + } + } ++ + #if 0 + static void _report_btn_single(struct input_dev *inp, int btn) + { +@@ -130,6 +146,29 @@ static void _report_btn_double(struct input_dev *inp, int btn) + } + #endif + ++#define MG_PER_SAMPLE 18 ++ ++static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis) ++{ ++ u8 data = 0xc0 | LIS302DL_REG_OUT_X; /* read, autoincrement */ ++ u8 read[5]; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ ++ (lis->pdata->lis302dl_bitbang)(lis, &data, 1, &read[0], 5); ++ ++ local_irq_restore(flags); ++ ++ input_report_rel(lis->input_dev, REL_X, MG_PER_SAMPLE * (s8)read[0]); ++ input_report_rel(lis->input_dev, REL_Y, MG_PER_SAMPLE * (s8)read[2]); ++ input_report_rel(lis->input_dev, REL_Z, MG_PER_SAMPLE * (s8)read[4]); ++ ++ input_sync(lis->input_dev); ++ ++ /* Reset the HP filter */ ++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); ++} + + static irqreturn_t lis302dl_interrupt(int irq, void *_lis) + { +@@ -149,8 +188,7 @@ static ssize_t show_rate(struct device *dev, struct device_attribute *attr, + unsigned long flags; + + local_irq_save(flags); +- ctrl1 = (lis->pdata->lis302dl_bitbang_reg_read) +- (lis, LIS302DL_REG_CTRL1); ++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); + local_irq_restore(flags); + + return sprintf(buf, "%d\n", ctrl1 & LIS302DL_CTRL1_DR ? 400 : 100); +@@ -185,8 +223,7 @@ static ssize_t show_scale(struct device *dev, struct device_attribute *attr, + unsigned long flags; + + local_irq_save(flags); +- ctrl1 = (lis->pdata->lis302dl_bitbang_reg_read)(lis, +- LIS302DL_REG_CTRL1); ++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1); + local_irq_restore(flags); + + return sprintf(buf, "%s\n", ctrl1 & LIS302DL_CTRL1_FS ? "9.2" : "2.3"); +@@ -236,8 +273,7 @@ static ssize_t set_threshold(struct device *dev, struct device_attribute *attr, + /* Set the threshold and write it out if the device is used */ + lis->threshold = val; + if (lis->flags & LIS302DL_F_INPUT_OPEN) +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_THS_1, lis->threshold); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, lis->threshold); + + return count; + } +@@ -256,7 +292,7 @@ static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr, + local_irq_save(flags); + + for (n = 0; n < sizeof(reg); n++) +- reg[n] = (lis->pdata->lis302dl_bitbang_reg_read)(lis, n); ++ reg[n] = __reg_read(lis, n); + + local_irq_restore(flags); + +@@ -271,36 +307,6 @@ static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr, + } + static DEVICE_ATTR(dump, S_IRUGO, lis302dl_dump, NULL); + +-static int __freefall_ms_to_duration(struct lis302dl_info *lis, int ms) +-{ +- u8 r = (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CTRL1); +- +- /* If we have 400 ms sampling rate, the stepping is 2.5 ms, +- * on 100 ms the stepping is 10ms */ +- if (r & LIS302DL_CTRL1_DR) { +- /* Too large */ +- if (ms > 637) +- return -1; +- +- return (ms * 10) / 25; +- } +- +- /* Too large value */ +- if (ms > 2550) +- return -1; +- return ms / 10; +-} +- +-static int __freefall_duration_to_ms(struct lis302dl_info *lis, int duration) +-{ +- u8 r = (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CTRL1); +- +- if (r & LIS302DL_CTRL1_DR) +- return (duration * 25) / 10; +- +- return duration * 10; +-} +- + /* Configure freefall/wakeup interrupts */ + static ssize_t set_freefall_common(int which, struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +@@ -342,9 +348,9 @@ static ssize_t set_freefall_common(int which, struct device *dev, + LIS302DL_INTMODE_DATA_READY); + lis->flags &= ~(flag_mask | LIS302DL_F_IRQ_WAKE); + +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_cfg, 0); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_ths, 0); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_duration, 0); ++ __reg_write(lis, r_cfg, 0); ++ __reg_write(lis, r_ths, 0); ++ __reg_write(lis, r_duration, 0); + + /* Power off unless the input subsystem is using the device */ + if (!(lis->flags & LIS302DL_F_INPUT_OPEN)) +@@ -361,7 +367,7 @@ static ssize_t set_freefall_common(int which, struct device *dev, + return -EINVAL; + + local_irq_save(flags); +- duration = __freefall_ms_to_duration(lis, ms); ++ duration = __ms_to_duration(lis, ms); + local_irq_save(flags); + + if (duration < 0) +@@ -382,13 +388,12 @@ static ssize_t set_freefall_common(int which, struct device *dev, + /* Setup the configuration registers */ + local_irq_save(flags); + /* First zero to get to a known state */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_cfg, 0); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_cfg, ++ __reg_write(lis, r_cfg, 0); ++ __reg_write(lis, r_cfg, + (and_events ? LIS302DL_FFWUCFG_AOI : 0) | + x_lo | x_hi | y_lo | y_hi | z_lo | z_hi); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_ths, +- threshold & ~LIS302DL_FFWUTHS_DCRM); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, r_duration, duration); ++ __reg_write(lis, r_ths, threshold & ~LIS302DL_FFWUTHS_DCRM); ++ __reg_write(lis, r_duration, duration); + + /* Route the interrupt for wakeup */ + __lis302dl_int_mode(lis->dev, which, intmode); +@@ -443,12 +448,12 @@ static ssize_t show_freefall_common(int which, struct device *dev, + } + + local_irq_save(flags); +- config = (lis->pdata->lis302dl_bitbang_reg_read)(lis, r_cfg); +- threshold = (lis->pdata->lis302dl_bitbang_reg_read)(lis, r_ths); +- duration = (lis->pdata->lis302dl_bitbang_reg_read)(lis, r_duration); +- r4 = (lis->pdata->lis302dl_bitbang_reg_read)(lis, r_src); +- r5 = (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CTRL3); +- ms = __freefall_duration_to_ms(lis, duration); ++ config = __reg_read(lis, r_cfg); ++ threshold = __reg_read(lis, r_ths); ++ duration = __reg_read(lis, r_duration); ++ r4 = __reg_read(lis, r_src); ++ r5 = __reg_read(lis, LIS302DL_REG_CTRL3); ++ ms = __duration_to_ms(lis, duration); + local_irq_restore(flags); + + /* All events off? */ +@@ -519,18 +524,14 @@ static int lis302dl_input_open(struct input_dev *inp) + /* make sure we're powered up and generate data ready */ + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1); + +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL2, ++ __reg_write(lis, LIS302DL_REG_CTRL2, + ctrl2); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_THS_1, lis->threshold); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_DURATION_1, 0); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, lis->threshold); ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0); + + /* Clear the HP filter "starting point" */ +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, +- LIS302DL_REG_HP_FILTER_RESET); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_CFG_1, LIS302DL_FFWUCFG_XHIE | ++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET); ++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, LIS302DL_FFWUCFG_XHIE | + LIS302DL_FFWUCFG_YHIE | LIS302DL_FFWUCFG_ZHIE); + + lis->flags |= LIS302DL_F_INPUT_OPEN; +@@ -576,11 +577,11 @@ static int __lis302dl_reset_device(struct lis302dl_info *lis) + { + int timeout = 10; + +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL2, +- LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS); ++ __reg_write(lis, LIS302DL_REG_CTRL2, ++ LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS); + +- while (((lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CTRL2) +- & LIS302DL_CTRL2_BOOT) && (timeout--)) ++ while ((__reg_read(lis, LIS302DL_REG_CTRL2) ++ & LIS302DL_CTRL2_BOOT) && (timeout--)) + mdelay(1); + + return !!(timeout < 0); +@@ -609,8 +610,7 @@ static int __devinit lis302dl_probe(struct platform_device *pdev) + /* Configure our IO */ + (lis->pdata->lis302dl_suspend_io)(lis, 1); + +- wai = (lis->pdata->lis302dl_bitbang_reg_read)(lis, +- LIS302DL_REG_WHO_AM_I); ++ wai = __reg_read(lis, LIS302DL_REG_WHO_AM_I); + if (wai != LIS302DL_WHO_AM_I_MAGIC) { + dev_err(lis->dev, "unknown who_am_i signature 0x%02x\n", wai); + dev_set_drvdata(lis->dev, NULL); +@@ -659,46 +659,38 @@ static int __devinit lis302dl_probe(struct platform_device *pdev) + dev_err(lis->dev, "device BOOT reload failed\n"); + + /* force us powered */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL1, +- LIS302DL_CTRL1_PD | +- LIS302DL_CTRL1_Xen | +- LIS302DL_CTRL1_Yen | +- LIS302DL_CTRL1_Zen); ++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | ++ LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | ++ LIS302DL_CTRL1_Zen); + mdelay(1); + +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL2, 0); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL3, +- LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_THS_1, 0x0); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_DURATION_1, 0x00); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_FF_WU_CFG_1, 0x0); ++ __reg_write(lis, LIS302DL_REG_CTRL2, 0); ++ __reg_write(lis, LIS302DL_REG_CTRL3, ++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); ++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x0); ++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00); ++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x0); + + /* start off in powered down mode; we power up when someone opens us */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL1, +- LIS302DL_CTRL1_Xen | +- LIS302DL_CTRL1_Yen | +- LIS302DL_CTRL1_Zen); ++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen); + + if (pdata->open_drain) + /* switch interrupt to open collector, active-low */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_CTRL3, LIS302DL_CTRL3_PP_OD | +- LIS302DL_CTRL3_IHL); ++ __reg_write(lis, LIS302DL_REG_CTRL3, ++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL); + else + /* push-pull, active-low */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL); ++ __reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL); + + __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_FF_WU_12); + __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_FF_WU_12); + +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_STATUS); +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_FF_WU_SRC_1); +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_FF_WU_SRC_2); +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CLICK_SRC); ++ __reg_read(lis, LIS302DL_REG_STATUS); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1); ++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2); ++ __reg_read(lis, LIS302DL_REG_CLICK_SRC); + + dev_info(lis->dev, "Found %s\n", pdata->name); + +@@ -733,9 +725,9 @@ static int __devexit lis302dl_remove(struct platform_device *pdev) + + /* Reset and power down the device */ + local_irq_save(flags); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL3, 0x00); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL2, 0x00); +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL1, 0x00); ++ __reg_write(lis, LIS302DL_REG_CTRL3, 0x00); ++ __reg_write(lis, LIS302DL_REG_CTRL2, 0x00); ++ __reg_write(lis, LIS302DL_REG_CTRL1, 0x00); + local_irq_restore(flags); + + /* Cleanup resources */ +@@ -798,13 +790,12 @@ static int lis302dl_suspend(struct platform_device *pdev, pm_message_t state) + /* save registers */ + for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) + lis->regs[regs_to_save[n]] = +- (lis->pdata->lis302dl_bitbang_reg_read)(lis, +- regs_to_save[n]); ++ __reg_read(lis, regs_to_save[n]); + + /* power down */ +- tmp = (lis->pdata->lis302dl_bitbang_reg_read)(lis, LIS302DL_REG_CTRL1); ++ tmp = __reg_read(lis, LIS302DL_REG_CTRL1); + tmp &= ~LIS302DL_CTRL1_PD; +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL1, tmp); ++ __reg_write(lis, LIS302DL_REG_CTRL1, tmp); + + /* place our IO to the device in sleep-compatible states */ + (lis->pdata->lis302dl_suspend_io)(lis, 0); +@@ -830,11 +821,11 @@ static int lis302dl_resume(struct platform_device *pdev) + (lis->pdata->lis302dl_suspend_io)(lis, 1); + + /* resume from powerdown first! */ +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, LIS302DL_REG_CTRL1, +- LIS302DL_CTRL1_PD | +- LIS302DL_CTRL1_Xen | +- LIS302DL_CTRL1_Yen | +- LIS302DL_CTRL1_Zen); ++ __reg_write(lis, LIS302DL_REG_CTRL1, ++ LIS302DL_CTRL1_PD | ++ LIS302DL_CTRL1_Xen | ++ LIS302DL_CTRL1_Yen | ++ LIS302DL_CTRL1_Zen); + mdelay(1); + + if (__lis302dl_reset_device(lis)) +@@ -847,8 +838,7 @@ static int lis302dl_resume(struct platform_device *pdev) + + /* restore registers after resume */ + for (n = 0; n < ARRAY_SIZE(regs_to_save); n++) +- (lis->pdata->lis302dl_bitbang_reg_write)(lis, +- regs_to_save[n], lis->regs[regs_to_save[n]]); ++ __reg_write(lis, regs_to_save[n], lis->regs[regs_to_save[n]]); + + local_irq_restore(flags); + enable_irq(lis->pdata->interrupt); +diff --git a/include/linux/lis302dl.h b/include/linux/lis302dl.h +index f3f994d..a756f55 100644 +--- a/include/linux/lis302dl.h ++++ b/include/linux/lis302dl.h +@@ -18,7 +18,6 @@ struct lis302dl_platform_data { + int interrupt; + void (*lis302dl_bitbang)(struct lis302dl_info *lis, u8 *tx, + int tx_bytes, u8 *rx, int rx_bytes); +- void (*lis302dl_bitbang_read_sample)(struct lis302dl_info *); + void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming); + int (*lis302dl_bitbang_reg_read)(struct lis302dl_info *, u8 reg); + void (*lis302dl_bitbang_reg_write)(struct lis302dl_info *, u8 reg, +-- +1.5.6.5 + |