Input: sh_keysc - allow modifying keymap from userspace

Adjust the driver so EVIOCGKEYCODE/EVIOCSKEYCODE work.

Acked-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
Dmitry Torokhov 2009-07-21 01:12:12 -07:00
parent 99fde513f5
commit 24d01c0681

View file

@ -128,7 +128,7 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
struct input_dev *input; struct input_dev *input;
char clk_name[8]; char clk_name[8];
int i, k; int i;
int irq, error; int irq, error;
if (!pdev->dev.platform_data) { if (!pdev->dev.platform_data) {
@ -195,17 +195,19 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
input->id.product = 0x0001; input->id.product = 0x0001;
input->id.version = 0x0100; input->id.version = 0x0100;
input->keycode = pdata->keycodes;
input->keycodesize = sizeof(pdata->keycodes[0]);
input->keycodemax = ARRAY_SIZE(pdata->keycodes);
error = request_irq(irq, sh_keysc_isr, 0, pdev->name, pdev); error = request_irq(irq, sh_keysc_isr, 0, pdev->name, pdev);
if (error) { if (error) {
dev_err(&pdev->dev, "failed to request IRQ\n"); dev_err(&pdev->dev, "failed to request IRQ\n");
goto err4; goto err4;
} }
for (i = 0; i < SH_KEYSC_MAXKEYS; i++) { for (i = 0; i < SH_KEYSC_MAXKEYS; i++)
k = pdata->keycodes[i]; __set_bit(pdata->keycodes[i], input->keybit);
if (k) __clear_bit(KEY_RESERVED, input->keybit);
input_set_capability(input, EV_KEY, k);
}
error = input_register_device(input); error = input_register_device(input);
if (error) { if (error) {
@ -221,7 +223,9 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS); iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS);
device_init_wakeup(&pdev->dev, 1); device_init_wakeup(&pdev->dev, 1);
return 0; return 0;
err5: err5:
free_irq(irq, pdev); free_irq(irq, pdev);
err4: err4:
@ -252,6 +256,7 @@ static int __devexit sh_keysc_remove(struct platform_device *pdev)
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
kfree(priv); kfree(priv);
return 0; return 0;
} }
@ -267,11 +272,12 @@ static int sh_keysc_suspend(struct device *dev)
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
value |= 0x80; value |= 0x80;
enable_irq_wake(irq); enable_irq_wake(irq);
} } else {
else
value &= ~0x80; value &= ~0x80;
}
iowrite16(value, priv->iomem_base + KYCR1_OFFS); iowrite16(value, priv->iomem_base + KYCR1_OFFS);
return 0; return 0;
} }