mirror of
https://github.com/adulau/aha.git
synced 2025-01-01 13:46:24 +00:00
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:
parent
99fde513f5
commit
24d01c0681
1 changed files with 14 additions and 8 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue