From 037db524a2015607031c70a7935153120601b908 Mon Sep 17 00:00:00 2001 From: Vipul Kumar Samar Date: Thu, 22 Nov 2012 23:42:12 -0800 Subject: Input: stmpe-ts - add DT support for stmpe touchscreen This patch allows the STMPE Touchscreen driver to be successfully probed and initialised when Device Tree support is enabled. Bindings are mentioned in Documentation too. Signed-off-by: Vipul Kumar Samar Signed-off-by: Viresh Kumar Signed-off-by: Dmitry Torokhov --- drivers/mfd/stmpe.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/mfd/stmpe.c') diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index c94f521f392c..55c7b9531ad4 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -411,6 +411,7 @@ static struct resource stmpe_ts_resources[] = { static struct mfd_cell stmpe_ts_cell = { .name = "stmpe-ts", + .of_compatible = "st,stmpe-ts", .resources = stmpe_ts_resources, .num_resources = ARRAY_SIZE(stmpe_ts_resources), }; -- cgit v1.2.3 From 6ea32387a0c7fb9ca0213fd22b47c5a1ca4c2972 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Wed, 14 Nov 2012 08:55:21 -0800 Subject: Input: stmpe-keypad - add support for Device Tree bindings This patch allows the STMPE driver to be successfully probed and initialised when Device Tree support is enabled. Besides the usual platform data changes, we also separate the process of filling in the 'in use' pin bitmap, as we have to extract the information from Device Tree in the DT boot case. Acked-by: Arnd Bergmann Acked-by: Linus Walleij Signed-off-by: Lee Jones Signed-off-by: Dmitry Torokhov --- .../devicetree/bindings/input/stmpe-keypad.txt | 39 ++++++++++++++ drivers/input/keyboard/stmpe-keypad.c | 60 ++++++++++++++++++---- drivers/mfd/stmpe.c | 1 + 3 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/stmpe-keypad.txt (limited to 'drivers/mfd/stmpe.c') diff --git a/Documentation/devicetree/bindings/input/stmpe-keypad.txt b/Documentation/devicetree/bindings/input/stmpe-keypad.txt new file mode 100644 index 000000000000..1b97222e8a0b --- /dev/null +++ b/Documentation/devicetree/bindings/input/stmpe-keypad.txt @@ -0,0 +1,39 @@ +* STMPE Keypad + +Required properties: + - compatible : "st,stmpe-keypad" + - linux,keymap : See ./matrix-keymap.txt + +Optional properties: + - debounce-interval : Debouncing interval time in milliseconds + - st,scan-count : Scanning cycles elapsed before key data is updated + - st,no-autorepeat : If specified device will not autorepeat + +Example: + + stmpe_keypad { + compatible = "st,stmpe-keypad"; + + debounce-interval = <64>; + st,scan-count = <8>; + st,no-autorepeat; + + linux,keymap = <0x205006b + 0x4010074 + 0x3050072 + 0x1030004 + 0x502006a + 0x500000a + 0x5008b + 0x706001c + 0x405000b + 0x6070003 + 0x3040067 + 0x303006c + 0x60400e7 + 0x602009e + 0x4020073 + 0x5050002 + 0x4030069 + 0x3020008>; + }; diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c index 7bac0524900a..5cbec56f7720 100644 --- a/drivers/input/keyboard/stmpe-keypad.c +++ b/drivers/input/keyboard/stmpe-keypad.c @@ -257,6 +257,51 @@ static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) (plat->debounce_ms << 1)); } +static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad) +{ + int row, col; + + for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) { + for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) { + int code = MATRIX_SCAN_CODE(row, col, + STMPE_KEYPAD_ROW_SHIFT); + if (keypad->keymap[code] != KEY_RESERVED) { + keypad->rows |= 1 << row; + keypad->cols |= 1 << col; + } + } + } +} + +#ifdef CONFIG_OF +static const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct stmpe_keypad_platform_data *plat; + + if (!np) + return ERR_PTR(-ENODEV); + + plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); + if (!plat) + return ERR_PTR(-ENOMEM); + + of_property_read_u32(np, "debounce-interval", &plat->debounce_ms); + of_property_read_u32(np, "st,scan-count", &plat->scan_count); + + plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); + + return plat; +} +#else +static inline const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ + return ERR_PTR(-EINVAL); +} +#endif + static int stmpe_keypad_probe(struct platform_device *pdev) { struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); @@ -265,11 +310,13 @@ static int stmpe_keypad_probe(struct platform_device *pdev) struct input_dev *input; int error; int irq; - int i; plat = stmpe->pdata->keypad; - if (!plat) - return -ENODEV; + if (!plat) { + plat = stmpe_keypad_of_probe(&pdev->dev); + if (IS_ERR(plat)) + return PTR_ERR(plat); + } irq = platform_get_irq(pdev, 0); if (irq < 0) @@ -299,12 +346,7 @@ static int stmpe_keypad_probe(struct platform_device *pdev) if (!plat->no_autorepeat) __set_bit(EV_REP, input->evbit); - for (i = 0; i < plat->keymap_data->keymap_size; i++) { - unsigned int key = plat->keymap_data->keymap[i]; - - keypad->cols |= 1 << KEY_COL(key); - keypad->rows |= 1 << KEY_ROW(key); - } + stmpe_keypad_fill_used_pins(keypad); keypad->stmpe = stmpe; keypad->plat = plat; diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index 55c7b9531ad4..bf1ba93f43a0 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -324,6 +324,7 @@ static struct resource stmpe_keypad_resources[] = { static struct mfd_cell stmpe_keypad_cell = { .name = "stmpe-keypad", + .of_compatible = "st,stmpe-keypad", .resources = stmpe_keypad_resources, .num_resources = ARRAY_SIZE(stmpe_keypad_resources), }; -- cgit v1.2.3 From 612b95cd7926d1a583e68f12e10b44b7ac80ca17 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 21 Dec 2012 15:03:15 -0800 Subject: Drivers: mfd: remove __dev* attributes. CONFIG_HOTPLUG is going away as an option. As a result, the __dev* markings need to be removed. This change removes the use of __devinit, __devexit_p, __devinitdata, __devinitconst, and __devexit from these drivers. Based on patches originally written by Bill Pemberton, but redone by me in order to handle some of the coding style issues better, by hand. Cc: Bill Pemberton Cc: Samuel Ortiz Signed-off-by: Greg Kroah-Hartman --- drivers/mfd/max8997.c | 2 +- drivers/mfd/retu-mfd.c | 5 ++--- drivers/mfd/rtsx_pcr.c | 8 ++++---- drivers/mfd/sta2x11-mfd.c | 8 ++++---- drivers/mfd/stmpe.c | 15 ++++++--------- drivers/mfd/ti_am335x_tscadc.c | 6 +++--- drivers/mfd/tps80031.c | 11 +++++------ drivers/mfd/twl6040.c | 8 ++++---- drivers/mfd/vexpress-sysreg.c | 2 +- 9 files changed, 30 insertions(+), 35 deletions(-) (limited to 'drivers/mfd/stmpe.c') diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c index abd5c80c7cf5..14714058f2d2 100644 --- a/drivers/mfd/max8997.c +++ b/drivers/mfd/max8997.c @@ -50,7 +50,7 @@ static struct mfd_cell max8997_devs[] = { }; #ifdef CONFIG_OF -static struct of_device_id __devinitdata max8997_pmic_dt_match[] = { +static struct of_device_id max8997_pmic_dt_match[] = { { .compatible = "maxim,max8997-pmic", .data = TYPE_MAX8997 }, {}, }; diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c index 7ff4a37ab0c0..3ba048655bf3 100644 --- a/drivers/mfd/retu-mfd.c +++ b/drivers/mfd/retu-mfd.c @@ -171,8 +171,7 @@ static struct regmap_config retu_config = { .val_bits = 16, }; -static int __devinit retu_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct retu_dev *rdev; int ret; @@ -225,7 +224,7 @@ static int __devinit retu_probe(struct i2c_client *i2c, return 0; } -static int __devexit retu_remove(struct i2c_client *i2c) +static int retu_remove(struct i2c_client *i2c) { struct retu_dev *rdev = i2c_get_clientdata(i2c); diff --git a/drivers/mfd/rtsx_pcr.c b/drivers/mfd/rtsx_pcr.c index 3a44efa29203..7a7b0bda4618 100644 --- a/drivers/mfd/rtsx_pcr.c +++ b/drivers/mfd/rtsx_pcr.c @@ -998,8 +998,8 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr) return 0; } -static int __devinit rtsx_pci_probe(struct pci_dev *pcidev, - const struct pci_device_id *id) +static int rtsx_pci_probe(struct pci_dev *pcidev, + const struct pci_device_id *id) { struct rtsx_pcr *pcr; struct pcr_handle *handle; @@ -1123,7 +1123,7 @@ disable: return ret; } -static void __devexit rtsx_pci_remove(struct pci_dev *pcidev) +static void rtsx_pci_remove(struct pci_dev *pcidev) { struct pcr_handle *handle = pci_get_drvdata(pcidev); struct rtsx_pcr *pcr = handle->pcr; @@ -1241,7 +1241,7 @@ static struct pci_driver rtsx_pci_driver = { .name = DRV_NAME_RTSX_PCI, .id_table = rtsx_pci_ids, .probe = rtsx_pci_probe, - .remove = __devexit_p(rtsx_pci_remove), + .remove = rtsx_pci_remove, .suspend = rtsx_pci_suspend, .resume = rtsx_pci_resume, }; diff --git a/drivers/mfd/sta2x11-mfd.c b/drivers/mfd/sta2x11-mfd.c index 1225dcbcfcfc..9bd33169a111 100644 --- a/drivers/mfd/sta2x11-mfd.c +++ b/drivers/mfd/sta2x11-mfd.c @@ -510,19 +510,19 @@ enum mfd1_bar1_cells { STA2X11_APB_SOC_REGS = 0, }; -static const __devinitconst struct resource vic_resources[] = { +static const struct resource vic_resources[] = { CELL_4K(STA2X11_MFD_VIC_NAME, STA2X11_VIC), }; -static const __devinitconst struct resource apb_soc_regs_resources[] = { +static const struct resource apb_soc_regs_resources[] = { CELL_4K(STA2X11_MFD_APB_SOC_REGS_NAME, STA2X11_APB_SOC_REGS), }; -static __devinitdata struct mfd_cell sta2x11_mfd1_bar0[] = { +static struct mfd_cell sta2x11_mfd1_bar0[] = { DEV(STA2X11_MFD_VIC_NAME, vic_resources), }; -static __devinitdata struct mfd_cell sta2x11_mfd1_bar1[] = { +static struct mfd_cell sta2x11_mfd1_bar1[] = { DEV(STA2X11_MFD_APB_SOC_REGS_NAME, apb_soc_regs_resources), }; diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index 5e8e6927cfcd..4b11202061be 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -892,8 +892,7 @@ static struct irq_domain_ops stmpe_irq_ops = { .xlate = irq_domain_xlate_twocell, }; -static int __devinit stmpe_irq_init(struct stmpe *stmpe, - struct device_node *np) +static int stmpe_irq_init(struct stmpe *stmpe, struct device_node *np) { int base = 0; int num_irqs = stmpe->variant->num_irqs; @@ -911,7 +910,7 @@ static int __devinit stmpe_irq_init(struct stmpe *stmpe, return 0; } -static int __devinit stmpe_chip_init(struct stmpe *stmpe) +static int stmpe_chip_init(struct stmpe *stmpe) { unsigned int irq_trigger = stmpe->pdata->irq_trigger; int autosleep_timeout = stmpe->pdata->autosleep_timeout; @@ -970,14 +969,13 @@ static int __devinit stmpe_chip_init(struct stmpe *stmpe) return stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_ICR_LSB], icr); } -static int __devinit stmpe_add_device(struct stmpe *stmpe, - struct mfd_cell *cell) +static int stmpe_add_device(struct stmpe *stmpe, struct mfd_cell *cell) { return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1, NULL, stmpe->irq_base, stmpe->domain); } -static int __devinit stmpe_devices_init(struct stmpe *stmpe) +static int stmpe_devices_init(struct stmpe *stmpe) { struct stmpe_variant_info *variant = stmpe->variant; unsigned int platform_blocks = stmpe->pdata->blocks; @@ -1013,8 +1011,7 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe) return ret; } -void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata, - struct device_node *np) +void stmpe_of_probe(struct stmpe_platform_data *pdata, struct device_node *np) { struct device_node *child; @@ -1044,7 +1041,7 @@ void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata, } /* Called from client specific probe routines */ -int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum) +int stmpe_probe(struct stmpe_client_info *ci, int partnum) { struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev); struct device_node *np = ci->dev->of_node; diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c index 8ca3bf023fb2..e9f3fb510b44 100644 --- a/drivers/mfd/ti_am335x_tscadc.c +++ b/drivers/mfd/ti_am335x_tscadc.c @@ -58,7 +58,7 @@ static void tscadc_idle_config(struct ti_tscadc_dev *config) tscadc_writel(config, REG_IDLECONFIG, idleconfig); } -static int __devinit ti_tscadc_probe(struct platform_device *pdev) +static int ti_tscadc_probe(struct platform_device *pdev) { struct ti_tscadc_dev *tscadc; struct resource *res; @@ -202,7 +202,7 @@ ret: return err; } -static int __devexit ti_tscadc_remove(struct platform_device *pdev) +static int ti_tscadc_remove(struct platform_device *pdev) { struct ti_tscadc_dev *tscadc = platform_get_drvdata(pdev); @@ -263,7 +263,7 @@ static struct platform_driver ti_tscadc_driver = { .pm = TSCADC_PM_OPS, }, .probe = ti_tscadc_probe, - .remove = __devexit_p(ti_tscadc_remove), + .remove = ti_tscadc_remove, }; diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c index 10b51f7dfff3..c90a2c450f51 100644 --- a/drivers/mfd/tps80031.c +++ b/drivers/mfd/tps80031.c @@ -269,8 +269,7 @@ static int tps80031_init_ext_control(struct tps80031 *tps80031, return ret; } -static int __devinit tps80031_irq_init(struct tps80031 *tps80031, int irq, - int irq_base) +static int tps80031_irq_init(struct tps80031 *tps80031, int irq, int irq_base) { struct device *dev = tps80031->dev; int i, ret; @@ -416,8 +415,8 @@ static const struct regmap_config tps80031_regmap_configs[] = { }, }; -static int __devinit tps80031_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int tps80031_probe(struct i2c_client *client, + const struct i2c_device_id *id) { struct tps80031_platform_data *pdata = client->dev.platform_data; struct tps80031 *tps80031; @@ -519,7 +518,7 @@ fail_client_reg: return ret; } -static int __devexit tps80031_remove(struct i2c_client *client) +static int tps80031_remove(struct i2c_client *client) { struct tps80031 *tps80031 = i2c_get_clientdata(client); int i; @@ -553,7 +552,7 @@ static struct i2c_driver tps80031_driver = { .owner = THIS_MODULE, }, .probe = tps80031_probe, - .remove = __devexit_p(tps80031_remove), + .remove = tps80031_remove, .id_table = tps80031_id_table, }; diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c index 583be76e36a8..f361bf38a0aa 100644 --- a/drivers/mfd/twl6040.c +++ b/drivers/mfd/twl6040.c @@ -517,8 +517,8 @@ static struct regmap_irq_chip twl6040_irq_chip = { .mask_base = TWL6040_REG_INTMR, }; -static int __devinit twl6040_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int twl6040_probe(struct i2c_client *client, + const struct i2c_device_id *id) { struct twl6040_platform_data *pdata = client->dev.platform_data; struct device_node *node = client->dev.of_node; @@ -699,7 +699,7 @@ err: return ret; } -static int __devexit twl6040_remove(struct i2c_client *client) +static int twl6040_remove(struct i2c_client *client) { struct twl6040 *twl6040 = i2c_get_clientdata(client); @@ -735,7 +735,7 @@ static struct i2c_driver twl6040_driver = { .owner = THIS_MODULE, }, .probe = twl6040_probe, - .remove = __devexit_p(twl6040_remove), + .remove = twl6040_remove, .id_table = twl6040_i2c_id, }; diff --git a/drivers/mfd/vexpress-sysreg.c b/drivers/mfd/vexpress-sysreg.c index 733c06bd2d17..e5d8f63b252a 100644 --- a/drivers/mfd/vexpress-sysreg.c +++ b/drivers/mfd/vexpress-sysreg.c @@ -414,7 +414,7 @@ static ssize_t vexpress_sysreg_sys_id_show(struct device *dev, DEVICE_ATTR(sys_id, S_IRUGO, vexpress_sysreg_sys_id_show, NULL); -static int __devinit vexpress_sysreg_probe(struct platform_device *pdev) +static int vexpress_sysreg_probe(struct platform_device *pdev) { int err; struct resource *res = platform_get_resource(pdev, -- cgit v1.2.3