Loading Documentation/devicetree/bindings/input/gpio-keys.txt +5 −5 Original line number Diff line number Diff line Loading @@ -32,17 +32,17 @@ Optional subnode-properties: Example nodes: gpio_keys { gpio-keys { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; autorepeat; button@21 { up { label = "GPIO Key UP"; linux,code = <103>; gpios = <&gpio1 0 1>; }; button@22 { down { label = "GPIO Key DOWN"; linux,code = <108>; interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; Loading Documentation/devicetree/bindings/input/touchscreen/brcm,iproc-touchscreen.txt +17 −6 Original line number Diff line number Diff line Loading @@ -2,11 +2,17 @@ Required properties: - compatible: must be "brcm,iproc-touchscreen" - reg: physical base address of the controller and length of memory mapped region. - ts_syscon: handler of syscon node defining physical base address of the controller and length of memory mapped region. If this property is selected please make sure MFD_SYSCON config is enabled in the defconfig file. - clocks: The clock provided by the SOC to driver the tsc - clock-name: name for the clock - clock-names: name for the clock - interrupts: The touchscreen controller's interrupt - address-cells: Specify the number of u32 entries needed in child nodes. Should set to 1. - size-cells: Specify number of u32 entries needed to specify child nodes size in reg property. Should set to 1. Optional properties: - scanning_period: Time between scans. Each step is 1024 us. Valid 1-256. Loading Loading @@ -53,13 +59,18 @@ Optional properties: - touchscreen-inverted-x: X axis is inverted (boolean) - touchscreen-inverted-y: Y axis is inverted (boolean) Example: Example: An example of touchscreen node touchscreen: tsc@0x180A6000 { ts_adc_syscon: ts_adc_syscon@180a6000 { compatible = "brcm,iproc-ts-adc-syscon","syscon"; reg = <0x180a6000 0xc30>; }; touchscreen: touchscreen@180A6000 { compatible = "brcm,iproc-touchscreen"; #address-cells = <1>; #size-cells = <1>; reg = <0x180A6000 0x40>; ts_syscon = <&ts_adc_syscon>; clocks = <&adc_clk>; clock-names = "tsc_clk"; interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>; Loading arch/arm/boot/dts/bcm-cygnus.dtsi +9 −2 Original line number Diff line number Diff line Loading @@ -351,9 +351,16 @@ <&pinctrl 142 10 1>; }; touchscreen: tsc@180a6000 { ts_adc_syscon: ts_adc_syscon@180a6000 { compatible = "brcm,iproc-ts-adc-syscon", "syscon"; reg = <0x180a6000 0xc30>; }; touchscreen: touchscreen@180a6000 { compatible = "brcm,iproc-touchscreen"; reg = <0x180a6000 0x40>; #address-cells = <1>; #size-cells = <1>; ts_syscon = <&ts_adc_syscon>; clocks = <&asiu_clks BCM_CYGNUS_ASIU_ADC_CLK>; clock-names = "tsc_clk"; interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>; Loading drivers/input/keyboard/omap-keypad.c +1 −51 Original line number Diff line number Diff line Loading @@ -64,31 +64,6 @@ static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); static unsigned int *row_gpios; static unsigned int *col_gpios; #ifdef CONFIG_ARCH_OMAP2 static void set_col_gpio_val(struct omap_kp *omap_kp, u8 value) { int col; for (col = 0; col < omap_kp->cols; col++) gpio_set_value(col_gpios[col], value & (1 << col)); } static u8 get_row_gpio_val(struct omap_kp *omap_kp) { int row; u8 value = 0; for (row = 0; row < omap_kp->rows; row++) { if (gpio_get_value(row_gpios[row])) value |= (1 << row); } return value; } #else #define set_col_gpio_val(x, y) do {} while (0) #define get_row_gpio_val(x) 0 #endif static irqreturn_t omap_kp_interrupt(int irq, void *dev_id) { /* disable keyboard interrupt and schedule for handling */ Loading Loading @@ -133,7 +108,6 @@ static void omap_kp_tasklet(unsigned long data) unsigned int row_shift = get_count_order(omap_kp_data->cols); unsigned char new_state[8], changed, key_down = 0; int col, row; int spurious = 0; /* check for any changes */ omap_kp_scan_keypad(omap_kp_data, new_state); Loading Loading @@ -170,12 +144,9 @@ static void omap_kp_tasklet(unsigned long data) memcpy(keypad_state, new_state, sizeof(keypad_state)); if (key_down) { int delay = HZ / 20; /* some key is pressed - keep irq disabled and use timer * to poll the keypad */ if (spurious) delay = 2 * HZ; mod_timer(&omap_kp_data->timer, jiffies + delay); mod_timer(&omap_kp_data->timer, jiffies + HZ / 20); } else { /* enable interrupts */ omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); Loading Loading @@ -216,25 +187,6 @@ static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, omap_kp_enable_show, omap_kp_enable_store); #ifdef CONFIG_PM static int omap_kp_suspend(struct platform_device *dev, pm_message_t state) { /* Nothing yet */ return 0; } static int omap_kp_resume(struct platform_device *dev) { /* Nothing yet */ return 0; } #else #define omap_kp_suspend NULL #define omap_kp_resume NULL #endif static int omap_kp_probe(struct platform_device *pdev) { struct omap_kp *omap_kp; Loading Loading @@ -371,8 +323,6 @@ static int omap_kp_remove(struct platform_device *pdev) static struct platform_driver omap_kp_driver = { .probe = omap_kp_probe, .remove = omap_kp_remove, .suspend = omap_kp_suspend, .resume = omap_kp_resume, .driver = { .name = "omap-keypad", }, Loading drivers/input/keyboard/twl4030_keypad.c +16 −12 Original line number Diff line number Diff line Loading @@ -61,9 +61,9 @@ struct twl4030_keypad { unsigned short keymap[TWL4030_KEYMAP_SIZE]; u16 kp_state[TWL4030_MAX_ROWS]; bool autorepeat; unsigned n_rows; unsigned n_cols; unsigned irq; unsigned int n_rows; unsigned int n_cols; unsigned int irq; struct device *dbg_dev; struct input_dev *input; Loading Loading @@ -110,7 +110,7 @@ struct twl4030_keypad { #define KEYP_CTRL_KBD_ON BIT(6) /* KEYP_DEB, KEYP_LONG_KEY, KEYP_TIMEOUT_x*/ #define KEYP_PERIOD_US(t, prescale) ((t) / (31 << (prescale + 1)) - 1) #define KEYP_PERIOD_US(t, prescale) ((t) / (31 << ((prescale) + 1)) - 1) /* KEYP_LK_PTV_REG Fields */ #define KEYP_LK_PTV_PTV_SHIFT 5 Loading Loading @@ -162,9 +162,10 @@ static int twl4030_kpwrite_u8(struct twl4030_keypad *kp, u8 data, u32 reg) static inline u16 twl4030_col_xlate(struct twl4030_keypad *kp, u8 col) { /* If all bits in a row are active for all coloumns then /* * If all bits in a row are active for all columns then * we have that row line connected to gnd. Mark this * key on as if it was on matrix position n_cols (ie * key on as if it was on matrix position n_cols (i.e. * one higher than the size of the matrix). */ if (col == 0xFF) Loading Loading @@ -209,9 +210,9 @@ static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) u16 new_state[TWL4030_MAX_ROWS]; int col, row; if (release_all) if (release_all) { memset(new_state, 0, sizeof(new_state)); else { } else { /* check for any changes */ int ret = twl4030_read_kp_matrix_state(kp, new_state); Loading Loading @@ -262,8 +263,10 @@ static irqreturn_t do_kp_irq(int irq, void *_kp) /* Read & Clear TWL4030 pending interrupt */ ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); /* Release all keys if I2C has gone bad or * the KEYP has gone to idle state */ /* * Release all keys if I2C has gone bad or * the KEYP has gone to idle state. */ if (ret >= 0 && (reg & KEYP_IMR1_KP)) twl4030_kp_scan(kp, false); else Loading @@ -283,7 +286,8 @@ static int twl4030_kp_program(struct twl4030_keypad *kp) if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) return -EIO; /* NOTE: we could use sih_setup() here to package keypad /* * NOTE: we could use sih_setup() here to package keypad * event sources as four different IRQs ... but we don't. */ Loading Loading @@ -312,7 +316,7 @@ static int twl4030_kp_program(struct twl4030_keypad *kp) /* * Enable Clear-on-Read; disable remembering events that fire * after the IRQ but before our handler acks (reads) them, * after the IRQ but before our handler acks (reads) them. */ reg = TWL4030_SIH_CTRL_COR_MASK | TWL4030_SIH_CTRL_PENDDIS_MASK; if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) Loading Loading
Documentation/devicetree/bindings/input/gpio-keys.txt +5 −5 Original line number Diff line number Diff line Loading @@ -32,17 +32,17 @@ Optional subnode-properties: Example nodes: gpio_keys { gpio-keys { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; autorepeat; button@21 { up { label = "GPIO Key UP"; linux,code = <103>; gpios = <&gpio1 0 1>; }; button@22 { down { label = "GPIO Key DOWN"; linux,code = <108>; interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; Loading
Documentation/devicetree/bindings/input/touchscreen/brcm,iproc-touchscreen.txt +17 −6 Original line number Diff line number Diff line Loading @@ -2,11 +2,17 @@ Required properties: - compatible: must be "brcm,iproc-touchscreen" - reg: physical base address of the controller and length of memory mapped region. - ts_syscon: handler of syscon node defining physical base address of the controller and length of memory mapped region. If this property is selected please make sure MFD_SYSCON config is enabled in the defconfig file. - clocks: The clock provided by the SOC to driver the tsc - clock-name: name for the clock - clock-names: name for the clock - interrupts: The touchscreen controller's interrupt - address-cells: Specify the number of u32 entries needed in child nodes. Should set to 1. - size-cells: Specify number of u32 entries needed to specify child nodes size in reg property. Should set to 1. Optional properties: - scanning_period: Time between scans. Each step is 1024 us. Valid 1-256. Loading Loading @@ -53,13 +59,18 @@ Optional properties: - touchscreen-inverted-x: X axis is inverted (boolean) - touchscreen-inverted-y: Y axis is inverted (boolean) Example: Example: An example of touchscreen node touchscreen: tsc@0x180A6000 { ts_adc_syscon: ts_adc_syscon@180a6000 { compatible = "brcm,iproc-ts-adc-syscon","syscon"; reg = <0x180a6000 0xc30>; }; touchscreen: touchscreen@180A6000 { compatible = "brcm,iproc-touchscreen"; #address-cells = <1>; #size-cells = <1>; reg = <0x180A6000 0x40>; ts_syscon = <&ts_adc_syscon>; clocks = <&adc_clk>; clock-names = "tsc_clk"; interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>; Loading
arch/arm/boot/dts/bcm-cygnus.dtsi +9 −2 Original line number Diff line number Diff line Loading @@ -351,9 +351,16 @@ <&pinctrl 142 10 1>; }; touchscreen: tsc@180a6000 { ts_adc_syscon: ts_adc_syscon@180a6000 { compatible = "brcm,iproc-ts-adc-syscon", "syscon"; reg = <0x180a6000 0xc30>; }; touchscreen: touchscreen@180a6000 { compatible = "brcm,iproc-touchscreen"; reg = <0x180a6000 0x40>; #address-cells = <1>; #size-cells = <1>; ts_syscon = <&ts_adc_syscon>; clocks = <&asiu_clks BCM_CYGNUS_ASIU_ADC_CLK>; clock-names = "tsc_clk"; interrupts = <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>; Loading
drivers/input/keyboard/omap-keypad.c +1 −51 Original line number Diff line number Diff line Loading @@ -64,31 +64,6 @@ static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); static unsigned int *row_gpios; static unsigned int *col_gpios; #ifdef CONFIG_ARCH_OMAP2 static void set_col_gpio_val(struct omap_kp *omap_kp, u8 value) { int col; for (col = 0; col < omap_kp->cols; col++) gpio_set_value(col_gpios[col], value & (1 << col)); } static u8 get_row_gpio_val(struct omap_kp *omap_kp) { int row; u8 value = 0; for (row = 0; row < omap_kp->rows; row++) { if (gpio_get_value(row_gpios[row])) value |= (1 << row); } return value; } #else #define set_col_gpio_val(x, y) do {} while (0) #define get_row_gpio_val(x) 0 #endif static irqreturn_t omap_kp_interrupt(int irq, void *dev_id) { /* disable keyboard interrupt and schedule for handling */ Loading Loading @@ -133,7 +108,6 @@ static void omap_kp_tasklet(unsigned long data) unsigned int row_shift = get_count_order(omap_kp_data->cols); unsigned char new_state[8], changed, key_down = 0; int col, row; int spurious = 0; /* check for any changes */ omap_kp_scan_keypad(omap_kp_data, new_state); Loading Loading @@ -170,12 +144,9 @@ static void omap_kp_tasklet(unsigned long data) memcpy(keypad_state, new_state, sizeof(keypad_state)); if (key_down) { int delay = HZ / 20; /* some key is pressed - keep irq disabled and use timer * to poll the keypad */ if (spurious) delay = 2 * HZ; mod_timer(&omap_kp_data->timer, jiffies + delay); mod_timer(&omap_kp_data->timer, jiffies + HZ / 20); } else { /* enable interrupts */ omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); Loading Loading @@ -216,25 +187,6 @@ static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, omap_kp_enable_show, omap_kp_enable_store); #ifdef CONFIG_PM static int omap_kp_suspend(struct platform_device *dev, pm_message_t state) { /* Nothing yet */ return 0; } static int omap_kp_resume(struct platform_device *dev) { /* Nothing yet */ return 0; } #else #define omap_kp_suspend NULL #define omap_kp_resume NULL #endif static int omap_kp_probe(struct platform_device *pdev) { struct omap_kp *omap_kp; Loading Loading @@ -371,8 +323,6 @@ static int omap_kp_remove(struct platform_device *pdev) static struct platform_driver omap_kp_driver = { .probe = omap_kp_probe, .remove = omap_kp_remove, .suspend = omap_kp_suspend, .resume = omap_kp_resume, .driver = { .name = "omap-keypad", }, Loading
drivers/input/keyboard/twl4030_keypad.c +16 −12 Original line number Diff line number Diff line Loading @@ -61,9 +61,9 @@ struct twl4030_keypad { unsigned short keymap[TWL4030_KEYMAP_SIZE]; u16 kp_state[TWL4030_MAX_ROWS]; bool autorepeat; unsigned n_rows; unsigned n_cols; unsigned irq; unsigned int n_rows; unsigned int n_cols; unsigned int irq; struct device *dbg_dev; struct input_dev *input; Loading Loading @@ -110,7 +110,7 @@ struct twl4030_keypad { #define KEYP_CTRL_KBD_ON BIT(6) /* KEYP_DEB, KEYP_LONG_KEY, KEYP_TIMEOUT_x*/ #define KEYP_PERIOD_US(t, prescale) ((t) / (31 << (prescale + 1)) - 1) #define KEYP_PERIOD_US(t, prescale) ((t) / (31 << ((prescale) + 1)) - 1) /* KEYP_LK_PTV_REG Fields */ #define KEYP_LK_PTV_PTV_SHIFT 5 Loading Loading @@ -162,9 +162,10 @@ static int twl4030_kpwrite_u8(struct twl4030_keypad *kp, u8 data, u32 reg) static inline u16 twl4030_col_xlate(struct twl4030_keypad *kp, u8 col) { /* If all bits in a row are active for all coloumns then /* * If all bits in a row are active for all columns then * we have that row line connected to gnd. Mark this * key on as if it was on matrix position n_cols (ie * key on as if it was on matrix position n_cols (i.e. * one higher than the size of the matrix). */ if (col == 0xFF) Loading Loading @@ -209,9 +210,9 @@ static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) u16 new_state[TWL4030_MAX_ROWS]; int col, row; if (release_all) if (release_all) { memset(new_state, 0, sizeof(new_state)); else { } else { /* check for any changes */ int ret = twl4030_read_kp_matrix_state(kp, new_state); Loading Loading @@ -262,8 +263,10 @@ static irqreturn_t do_kp_irq(int irq, void *_kp) /* Read & Clear TWL4030 pending interrupt */ ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); /* Release all keys if I2C has gone bad or * the KEYP has gone to idle state */ /* * Release all keys if I2C has gone bad or * the KEYP has gone to idle state. */ if (ret >= 0 && (reg & KEYP_IMR1_KP)) twl4030_kp_scan(kp, false); else Loading @@ -283,7 +286,8 @@ static int twl4030_kp_program(struct twl4030_keypad *kp) if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) return -EIO; /* NOTE: we could use sih_setup() here to package keypad /* * NOTE: we could use sih_setup() here to package keypad * event sources as four different IRQs ... but we don't. */ Loading Loading @@ -312,7 +316,7 @@ static int twl4030_kp_program(struct twl4030_keypad *kp) /* * Enable Clear-on-Read; disable remembering events that fire * after the IRQ but before our handler acks (reads) them, * after the IRQ but before our handler acks (reads) them. */ reg = TWL4030_SIH_CTRL_COR_MASK | TWL4030_SIH_CTRL_PENDDIS_MASK; if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) Loading