Re: [PATCH 1/2] Input: DaVinci Keypad Driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dmitry,

I addressed your comments but I still have a couple of questions.


+CONFIG_KEYBOARD_DAVINCI_DM365=m
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TABLET is not set


If you want to merge the driver through input tree the defconfig chunk
has to go elsewhere.
[MA] Ok, independent patch.


+config KEYBOARD_DAVINCI
+	tristate "TI DaVinci Keypad"
+	depends on ARCH_DAVINCI_DM365
+	help
+	  Say Y to enable keypad module support for the TI DaVinci
+	  platforms (DM365)
+

"To compile this driver as a module..."
[MA] Comment added.


+		keycode = keymap[position];
+		if((new_status >> position) & 0x1) {

bool release = (new_status >> position) & 0x1;
input_report_key(davinci_kp->input, keycode, !release);
dev_dbg(dev, "davinci_keypad: key %d %s\n",
	keycode, release ? "released" : "pressed");

is shorter.

+			/* Report release */
+			dev_dbg(dev, "davinci_keypad: key %d released\n",
+				    keycode);
+			input_report_key(davinci_kp->input, keycode, 0);
+		} else {
+			/* Report press */
+			dev_dbg(dev, "davinci_keypad: key %d pressed\n",
+				    keycode);
+			input_report_key(davinci_kp->input, keycode, 1);
+		}
+		input_sync(davinci_kp->input);
+		ret = IRQ_HANDLED;
+	}
+
+	/* Clearing interrupt */
+	davinci_kp_write(davinci_kp, DAVINCI_KEYPAD_INT_ALL, DAVINCI_KEYPAD_INTCLR);

You return IRQ_HANDLED only if keypad state changed but clear interrupt
regardless. This is suspicious.

+
+	/* Enable interrupts */
+	davinci_kp_write(davinci_kp, 0x1, DAVINCI_KEYPAD_INTENA);
+
+	return ret;
+}

[MA] This is the current irq function:
static irqreturn_t davinci_ks_interrupt(int irq, void *dev_id)
{
	struct davinci_ks *davinci_ks = dev_id;
	struct device *dev = &davinci_ks->input->dev;
	unsigned short *keymap = davinci_ks->keymap;
	u32 prev_status, new_status, changed, position;
	bool release;
	int keycode = KEY_UNKNOWN;
	int ret = IRQ_NONE;

	/* Disable interrupt */
	davinci_ks_write(davinci_ks, 0x0, DAVINCI_KEYSCAN_INTENA);

	/* Reading previous and new status of the key scan */
	prev_status = davinci_ks_read(davinci_ks, DAVINCI_KEYSCAN_PREVSTATE);
	new_status = davinci_ks_read(davinci_ks, DAVINCI_KEYSCAN_CURRENTST);

	changed = prev_status ^ new_status;
	position = ffs(changed) - 1;

	if (changed) {
		keycode = keymap[position];
		release = (new_status >> position) & 0x1;
		dev_dbg(dev, "davinci_keyscan: key %d %s\n",
		    keycode, release ? "released" : "pressed");

		input_report_key(davinci_ks->input, keycode, !release);
		input_sync(davinci_ks->input);

		/* Clearing interrupt */
		davinci_ks_write(davinci_ks, DAVINCI_KEYSCAN_INT_ALL,
				    DAVINCI_KEYSCAN_INTCLR);

		ret = IRQ_HANDLED;
	}

	/* Enable interrupts */
	davinci_ks_write(davinci_ks, 0x1, DAVINCI_KEYSCAN_INTENA);

	return ret;
}


+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(dev, "no mem resource\n");
+		ret = -ENODEV;

-EINVAL I'd say.
[MA] Ok. -EINVAL


+	key_dev->id.vendor = 0x0001;
+	key_dev->id.product = 0x0001;
+	key_dev->id.version = 0x0001;
+	key_dev->keycode = davinci_kp->pdata->keymap;

Please kopy keymap into the davinci_kp stucture and use it so that
platform data is never changed and can be declared const.

[MA] keymap copied to private data.

+	key_dev->keycodesize = sizeof(unsigned int);

sizeof(davinci_kp->keymap[0]) is safer. Plus make it unsigned short.

[MA] Now it uses sizeof(davinci_kp->keymap[0])

+}
+
+static int __exit davinci_kp_remove(struct platform_device *pdev)

__devexit?


[MA] So, this will be __devexit


+static struct platform_driver davinci_kp_driver = {
+	.driver = {
+			.name = "davinci_keypad",
+			.owner = THIS_MODULE,
+		},
+	.remove = __exit_p(davinci_kp_remove),

__devexit_p(). I think you can still unbind the device even if you use
platform_driver_probe.

[MA] ... and __devexit.


+static int __init davinci_kp_init(void)
+{
+	return platform_driver_probe(&davinci_kp_driver, davinci_kp_probe);
+}
+module_init(davinci_kp_init);
[MA] Should I use platform_driver_probe?


+static void __exit davinci_kp_exit(void)
+{
+	platform_driver_unregister(&davinci_kp_driver);
+}
+module_exit(davinci_kp_exit);
[MA] Is the module exit function __exit or __devexit

Thanks,
Miguel Aguilar
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux