Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24d01c06 authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Input: sh_keysc - allow modifying keymap from userspace



Adjust the driver so EVIOCGKEYCODE/EVIOCSKEYCODE work.

Acked-by: default avatarMagnus Damm <damm@igel.co.jp>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 99fde513
Loading
Loading
Loading
Loading
+14 −8
Original line number Original line Diff line number Diff line
@@ -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;
}
}