public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] ideapad: hotkey enablement
@ 2010-11-17  6:59 Ike Panhc
  2010-11-17  7:00 ` [PATCH 1/3] ideapad: add platform driver for ideapad Ike Panhc
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Ike Panhc @ 2010-11-17  6:59 UTC (permalink / raw)
  To: linux-kernel, platform-driver-x86; +Cc: Matthew Garrett, David Woodhouse

Here are the enablement patches for hotkey events on ideapads and these patches
are made against current checkout of mainline kernel.

These patches are available in the git repository at:
  git://kernel.ubuntu.com/ikepanhc/ideapad-laptop.git ideapad-laptop

Ike Panhc (3):
  ideapad: add platform driver for ideapad
  ideapad: let camera power control entry under platform driver
  ideapad: add hotkey support

 drivers/platform/x86/ideapad-laptop.c |  174 ++++++++++++++++++++++++++-------
 1 files changed, 140 insertions(+), 34 deletions(-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] ideapad: add platform driver for ideapad
  2010-11-17  6:59 [PATCH 0/3] ideapad: hotkey enablement Ike Panhc
@ 2010-11-17  7:00 ` Ike Panhc
  2010-11-17  7:00 ` [PATCH 2/3] ideapad: let camera power control entry under platform driver Ike Panhc
  2010-11-17  7:00 ` [PATCH 3/3] ideapad: add hotkey support Ike Panhc
  2 siblings, 0 replies; 9+ messages in thread
From: Ike Panhc @ 2010-11-17  7:00 UTC (permalink / raw)
  To: linux-kernel, platform-driver-x86; +Cc: Matthew Garrett, David Woodhouse

Create /sys/devices/platform/Ideapad for nodes of ideapad landing.

Signed-off-by: Ike Panhc <ike.pan@canonical.com>
---
 drivers/platform/x86/ideapad-laptop.c |   59 ++++++++++++++++++++++++++------
 1 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
index 5ff1220..26edbdb 100644
--- a/drivers/platform/x86/ideapad-laptop.c
+++ b/drivers/platform/x86/ideapad-laptop.c
@@ -27,6 +27,7 @@
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
 #include <linux/rfkill.h>
+#include <linux/platform_device.h>
 
 #define IDEAPAD_DEV_CAMERA	0
 #define IDEAPAD_DEV_WLAN	1
@@ -37,6 +38,7 @@
 struct ideapad_private {
 	acpi_handle handle;
 	struct rfkill *rfk[5];
+	struct platform_device *platform_device;
 } *ideapad_priv;
 
 static struct {
@@ -277,6 +279,35 @@ static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev)
 	rfkill_destroy(priv->rfk[dev]);
 }
 
+/*
+ * Platform device
+ */
+static int ideapad_platform_init(void)
+{
+	int result;
+
+	ideapad_priv->platform_device = platform_device_alloc("Ideapad", -1);
+	if (!ideapad_priv->platform_device)
+		return -ENOMEM;
+	platform_set_drvdata(ideapad_priv->platform_device, ideapad_priv);
+
+	result = platform_device_add(ideapad_priv->platform_device);
+	if (result)
+		goto fail_platform_device;
+
+	return 0;
+
+fail_platform_device:
+	platform_device_put(ideapad_priv->platform_device);
+	return result;
+}
+
+static void ideapad_platform_exit(void)
+{
+	platform_device_unregister(ideapad_priv->platform_device);
+}
+/* the above is platform device */
+
 static const struct acpi_device_id ideapad_device_ids[] = {
 	{ "VPC2004", 0},
 	{ "", 0},
@@ -285,7 +316,7 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);
 
 static int ideapad_acpi_add(struct acpi_device *adevice)
 {
-	int i, cfg;
+	int ret, i, cfg;
 	int devs_present[5];
 	struct ideapad_private *priv;
 
@@ -305,18 +336,20 @@ static int ideapad_acpi_add(struct acpi_device *adevice)
 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
+	ideapad_priv = priv;
+
+	ret = ideapad_platform_init();
+	if (ret)
+		goto platform_failed;
 
 	if (devs_present[IDEAPAD_DEV_CAMERA]) {
-		int ret = device_create_file(&adevice->dev, &dev_attr_camera_power);
-		if (ret) {
-			kfree(priv);
-			return ret;
-		}
+		ret = device_create_file(&adevice->dev, &dev_attr_camera_power);
+		if (ret)
+			goto camera_failed;
 	}
 
 	priv->handle = adevice->handle;
 	dev_set_drvdata(&adevice->dev, priv);
-	ideapad_priv = priv;
 	for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++) {
 		if (!devs_present[i])
 			continue;
@@ -325,6 +358,12 @@ static int ideapad_acpi_add(struct acpi_device *adevice)
 	}
 	ideapad_sync_rfk_state(adevice);
 	return 0;
+
+camera_failed:
+	ideapad_platform_exit();
+platform_failed:
+	kfree(priv);
+	return ret;
 }
 
 static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
@@ -337,6 +376,7 @@ static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
 	for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++)
 		ideapad_unregister_rfkill(adevice, i);
 
+	ideapad_platform_exit();
 	dev_set_drvdata(&adevice->dev, NULL);
 	kfree(priv);
 	return 0;
@@ -374,16 +414,13 @@ static struct acpi_driver ideapad_acpi_driver = {
 
 static int __init ideapad_acpi_module_init(void)
 {
-	acpi_bus_register_driver(&ideapad_acpi_driver);
-
-	return 0;
+	return acpi_bus_register_driver(&ideapad_acpi_driver);
 }
 
 
 static void __exit ideapad_acpi_module_exit(void)
 {
 	acpi_bus_unregister_driver(&ideapad_acpi_driver);
-
 }
 
 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] ideapad: let camera power control entry under platform driver
  2010-11-17  6:59 [PATCH 0/3] ideapad: hotkey enablement Ike Panhc
  2010-11-17  7:00 ` [PATCH 1/3] ideapad: add platform driver for ideapad Ike Panhc
@ 2010-11-17  7:00 ` Ike Panhc
  2010-11-17  7:00 ` [PATCH 3/3] ideapad: add hotkey support Ike Panhc
  2 siblings, 0 replies; 9+ messages in thread
From: Ike Panhc @ 2010-11-17  7:00 UTC (permalink / raw)
  To: linux-kernel, platform-driver-x86; +Cc: Matthew Garrett, David Woodhouse

The entry was at /sys/devices/LNXSYSTM:00/../VPC2004:00/camera_power
move to /sys/devices/platform/Ideapad/camera_power

Signed-off-by: Ike Panhc <ike.pan@canonical.com>
---
 drivers/platform/x86/ideapad-laptop.c |   55 +++++++++++++++------------------
 1 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
index 26edbdb..d75c21f 100644
--- a/drivers/platform/x86/ideapad-laptop.c
+++ b/drivers/platform/x86/ideapad-laptop.c
@@ -282,6 +282,15 @@ static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev)
 /*
  * Platform device
  */
+static struct attribute *ideapad_attributes[] = {
+	&dev_attr_camera_power.attr,
+	NULL
+};
+
+static struct attribute_group ideapad_attribute_group = {
+	.attrs = ideapad_attributes
+};
+
 static int ideapad_platform_init(void)
 {
 	int result;
@@ -295,8 +304,14 @@ static int ideapad_platform_init(void)
 	if (result)
 		goto fail_platform_device;
 
+	result = sysfs_create_group(&ideapad_priv->platform_device->dev.kobj,
+				    &ideapad_attribute_group);
+	if (result)
+		goto fail_sysfs;
 	return 0;
 
+fail_sysfs:
+	platform_device_del(ideapad_priv->platform_device);
 fail_platform_device:
 	platform_device_put(ideapad_priv->platform_device);
 	return result;
@@ -304,6 +319,8 @@ fail_platform_device:
 
 static void ideapad_platform_exit(void)
 {
+	sysfs_remove_group(&ideapad_priv->platform_device->dev.kobj,
+			   &ideapad_attribute_group);
 	platform_device_unregister(ideapad_priv->platform_device);
 }
 /* the above is platform device */
@@ -317,50 +334,30 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);
 static int ideapad_acpi_add(struct acpi_device *adevice)
 {
 	int ret, i, cfg;
-	int devs_present[5];
 	struct ideapad_private *priv;
 
 	if (read_method_int(adevice->handle, "_CFG", &cfg))
 		return -ENODEV;
 
-	for (i = IDEAPAD_DEV_CAMERA; i < IDEAPAD_DEV_KILLSW; i++) {
-		if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
-			devs_present[i] = 1;
-		else
-			devs_present[i] = 0;
-	}
-
-	/* The hardware switch is always present */
-	devs_present[IDEAPAD_DEV_KILLSW] = 1;
-
 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
 	ideapad_priv = priv;
+	priv->handle = adevice->handle;
+	dev_set_drvdata(&adevice->dev, priv);
 
 	ret = ideapad_platform_init();
 	if (ret)
 		goto platform_failed;
 
-	if (devs_present[IDEAPAD_DEV_CAMERA]) {
-		ret = device_create_file(&adevice->dev, &dev_attr_camera_power);
-		if (ret)
-			goto camera_failed;
-	}
-
-	priv->handle = adevice->handle;
-	dev_set_drvdata(&adevice->dev, priv);
-	for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++) {
-		if (!devs_present[i])
-			continue;
-
-		ideapad_register_rfkill(adevice, i);
+	for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) {
+		if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
+			ideapad_register_rfkill(adevice, i);
 	}
 	ideapad_sync_rfk_state(adevice);
+
 	return 0;
 
-camera_failed:
-	ideapad_platform_exit();
 platform_failed:
 	kfree(priv);
 	return ret;
@@ -371,14 +368,12 @@ static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
 	struct ideapad_private *priv = dev_get_drvdata(&adevice->dev);
 	int i;
 
-	device_remove_file(&adevice->dev, &dev_attr_camera_power);
-
-	for (i = IDEAPAD_DEV_WLAN; i <= IDEAPAD_DEV_KILLSW; i++)
+	for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++)
 		ideapad_unregister_rfkill(adevice, i);
-
 	ideapad_platform_exit();
 	dev_set_drvdata(&adevice->dev, NULL);
 	kfree(priv);
+
 	return 0;
 }
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] ideapad: add hotkey support
  2010-11-17  6:59 [PATCH 0/3] ideapad: hotkey enablement Ike Panhc
  2010-11-17  7:00 ` [PATCH 1/3] ideapad: add platform driver for ideapad Ike Panhc
  2010-11-17  7:00 ` [PATCH 2/3] ideapad: let camera power control entry under platform driver Ike Panhc
@ 2010-11-17  7:00 ` Ike Panhc
  2010-11-17 21:29   ` Dmitry Torokhov
  2010-12-02 23:41   ` Dave Hansen
  2 siblings, 2 replies; 9+ messages in thread
From: Ike Panhc @ 2010-11-17  7:00 UTC (permalink / raw)
  To: linux-kernel, platform-driver-x86; +Cc: Matthew Garrett, David Woodhouse

Hotkey enabled by this patch:
  Fn+F3: Video mode switch
  Fn+F5: software rfkill for wifi

For some ideapad when push Fn+F3, hardware generates Super-P keys, those key
will not be enabled by this patch.

Signed-off-by: Ike Panhc <ike.pan@canonical.com>
---
 drivers/platform/x86/ideapad-laptop.c |   74 +++++++++++++++++++++++++++++++++
 1 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
index d75c21f..d397034 100644
--- a/drivers/platform/x86/ideapad-laptop.c
+++ b/drivers/platform/x86/ideapad-laptop.c
@@ -28,6 +28,8 @@
 #include <acpi/acpi_drivers.h>
 #include <linux/rfkill.h>
 #include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/input/sparse-keymap.h>
 
 #define IDEAPAD_DEV_CAMERA	0
 #define IDEAPAD_DEV_WLAN	1
@@ -39,6 +41,7 @@ struct ideapad_private {
 	acpi_handle handle;
 	struct rfkill *rfk[5];
 	struct platform_device *platform_device;
+	struct input_dev *inputdev;
 } *ideapad_priv;
 
 static struct {
@@ -325,6 +328,68 @@ static void ideapad_platform_exit(void)
 }
 /* the above is platform device */
 
+/*
+ * input device
+ */
+static const struct key_entry ideapad_keymap[] = {
+	{ KE_KEY, 0x06, { KEY_SWITCHVIDEOMODE } },
+	{ KE_KEY, 0x0D, { KEY_WLAN } },
+	{ KE_END, 0 },
+};
+
+static int ideapad_input_init(void)
+{
+	struct input_dev *inputdev;
+	int error;
+
+	inputdev = input_allocate_device();
+	if (!inputdev) {
+		pr_info("Unable to allocate input device\n");
+		return -ENOMEM;
+	}
+
+	inputdev->name = "Ideapad extra buttons";
+	inputdev->phys = "ideapad/input0";
+	inputdev->id.bustype = BUS_HOST;
+	inputdev->dev.parent = &ideapad_priv->platform_device->dev;
+
+	error = sparse_keymap_setup(inputdev, ideapad_keymap, NULL);
+	if (error) {
+		pr_err("Unable to setup input device keymap\n");
+		goto err_free_dev;
+	}
+
+	error = input_register_device(inputdev);
+	if (error) {
+		pr_err("Unable to register input device\n");
+		goto err_free_keymap;
+	}
+
+	ideapad_priv->inputdev = inputdev;
+	return 0;
+
+err_free_keymap:
+	sparse_keymap_free(inputdev);
+err_free_dev:
+	input_free_device(inputdev);
+	return error;
+}
+
+static void ideapad_input_exit(void)
+{
+	if (ideapad_priv->inputdev) {
+		sparse_keymap_free(ideapad_priv->inputdev);
+		input_unregister_device(ideapad_priv->inputdev);
+	}
+	ideapad_priv->inputdev = NULL;
+}
+
+static void ideapad_input_report(unsigned long scancode)
+{
+	sparse_keymap_report_event(ideapad_priv->inputdev, scancode, 1, true);
+}
+/* the above is input device */
+
 static const struct acpi_device_id ideapad_device_ids[] = {
 	{ "VPC2004", 0},
 	{ "", 0},
@@ -350,6 +415,10 @@ static int ideapad_acpi_add(struct acpi_device *adevice)
 	if (ret)
 		goto platform_failed;
 
+	ret = ideapad_input_init();
+	if (ret)
+		goto input_failed;
+
 	for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) {
 		if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
 			ideapad_register_rfkill(adevice, i);
@@ -358,6 +427,8 @@ static int ideapad_acpi_add(struct acpi_device *adevice)
 
 	return 0;
 
+input_failed:
+	ideapad_platform_exit();
 platform_failed:
 	kfree(priv);
 	return ret;
@@ -370,6 +441,7 @@ static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
 
 	for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++)
 		ideapad_unregister_rfkill(adevice, i);
+	ideapad_input_exit();
 	ideapad_platform_exit();
 	dev_set_drvdata(&adevice->dev, NULL);
 	kfree(priv);
@@ -392,6 +464,8 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event)
 		if (test_bit(vpc_bit, &vpc1)) {
 			if (vpc_bit == 9)
 				ideapad_sync_rfk_state(adevice);
+			else
+				ideapad_input_report(vpc_bit);
 		}
 	}
 }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ideapad: add hotkey support
  2010-11-17  7:00 ` [PATCH 3/3] ideapad: add hotkey support Ike Panhc
@ 2010-11-17 21:29   ` Dmitry Torokhov
  2010-11-18  7:35     ` Corentin Chary
  2010-12-02 23:41   ` Dave Hansen
  1 sibling, 1 reply; 9+ messages in thread
From: Dmitry Torokhov @ 2010-11-17 21:29 UTC (permalink / raw)
  To: Ike Panhc
  Cc: linux-kernel, platform-driver-x86, Matthew Garrett,
	David Woodhouse

On Wed, Nov 17, 2010 at 03:00:38PM +0800, Ike Panhc wrote:
> Hotkey enabled by this patch:
>   Fn+F3: Video mode switch
>   Fn+F5: software rfkill for wifi
> 
> For some ideapad when push Fn+F3, hardware generates Super-P keys, those key
> will not be enabled by this patch.
> 
> Signed-off-by: Ike Panhc <ike.pan@canonical.com>
> ---
>  drivers/platform/x86/ideapad-laptop.c |   74 +++++++++++++++++++++++++++++++++
>  1 files changed, 74 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
> index d75c21f..d397034 100644
> --- a/drivers/platform/x86/ideapad-laptop.c
> +++ b/drivers/platform/x86/ideapad-laptop.c
> @@ -28,6 +28,8 @@
>  #include <acpi/acpi_drivers.h>
>  #include <linux/rfkill.h>
>  #include <linux/platform_device.h>
> +#include <linux/input.h>
> +#include <linux/input/sparse-keymap.h>
>  
>  #define IDEAPAD_DEV_CAMERA	0
>  #define IDEAPAD_DEV_WLAN	1
> @@ -39,6 +41,7 @@ struct ideapad_private {
>  	acpi_handle handle;
>  	struct rfkill *rfk[5];
>  	struct platform_device *platform_device;
> +	struct input_dev *inputdev;
>  } *ideapad_priv;
>  
>  static struct {
> @@ -325,6 +328,68 @@ static void ideapad_platform_exit(void)
>  }
>  /* the above is platform device */
>  
> +/*
> + * input device
> + */
> +static const struct key_entry ideapad_keymap[] = {
> +	{ KE_KEY, 0x06, { KEY_SWITCHVIDEOMODE } },
> +	{ KE_KEY, 0x0D, { KEY_WLAN } },
> +	{ KE_END, 0 },
> +};
> +
> +static int ideapad_input_init(void)

__devinit?

> +{
> +	struct input_dev *inputdev;
> +	int error;
> +
> +	inputdev = input_allocate_device();
> +	if (!inputdev) {
> +		pr_info("Unable to allocate input device\n");
> +		return -ENOMEM;
> +	}
> +
> +	inputdev->name = "Ideapad extra buttons";
> +	inputdev->phys = "ideapad/input0";
> +	inputdev->id.bustype = BUS_HOST;
> +	inputdev->dev.parent = &ideapad_priv->platform_device->dev;
> +
> +	error = sparse_keymap_setup(inputdev, ideapad_keymap, NULL);
> +	if (error) {
> +		pr_err("Unable to setup input device keymap\n");
> +		goto err_free_dev;
> +	}
> +
> +	error = input_register_device(inputdev);
> +	if (error) {
> +		pr_err("Unable to register input device\n");
> +		goto err_free_keymap;
> +	}
> +
> +	ideapad_priv->inputdev = inputdev;

Why don't you pass ideapad_priv in as an argument instead of relying on
global. I know that there can only be one, but then why do you have a
structure?

> +	return 0;
> +
> +err_free_keymap:
> +	sparse_keymap_free(inputdev);
> +err_free_dev:
> +	input_free_device(inputdev);
> +	return error;
> +}
> +
> +static void ideapad_input_exit(void)

__devexit? The rest of the driver might user these markups as well.

> +{
> +	if (ideapad_priv->inputdev) {
> +		sparse_keymap_free(ideapad_priv->inputdev);
> +		input_unregister_device(ideapad_priv->inputdev);
> +	}
> +	ideapad_priv->inputdev = NULL;

You fail driver initialization when ideapad_input_init() fails so there
is no point in checking whether ideapad_priv->inputdev is null or not.

Otherwise looks good from input POV.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ideapad: add hotkey support
  2010-11-17 21:29   ` Dmitry Torokhov
@ 2010-11-18  7:35     ` Corentin Chary
  2010-11-19  7:09       ` Ike Panhc
  0 siblings, 1 reply; 9+ messages in thread
From: Corentin Chary @ 2010-11-18  7:35 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Ike Panhc, linux-kernel, platform-driver-x86, Matthew Garrett,
	David Woodhouse

On Wed, Nov 17, 2010 at 10:29 PM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> On Wed, Nov 17, 2010 at 03:00:38PM +0800, Ike Panhc wrote:
>> Hotkey enabled by this patch:
>>   Fn+F3: Video mode switch
>>   Fn+F5: software rfkill for wifi
>>
>> For some ideapad when push Fn+F3, hardware generates Super-P keys, those key
>> will not be enabled by this patch.
>>
>> Signed-off-by: Ike Panhc <ike.pan@canonical.com>
>> ---
>>  drivers/platform/x86/ideapad-laptop.c |   74 +++++++++++++++++++++++++++++++++
>>  1 files changed, 74 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
>> index d75c21f..d397034 100644
>> --- a/drivers/platform/x86/ideapad-laptop.c
>> +++ b/drivers/platform/x86/ideapad-laptop.c
>> @@ -28,6 +28,8 @@
>>  #include <acpi/acpi_drivers.h>
>>  #include <linux/rfkill.h>
>>  #include <linux/platform_device.h>
>> +#include <linux/input.h>
>> +#include <linux/input/sparse-keymap.h>
>>
>>  #define IDEAPAD_DEV_CAMERA   0
>>  #define IDEAPAD_DEV_WLAN     1
>> @@ -39,6 +41,7 @@ struct ideapad_private {
>>       acpi_handle handle;
>>       struct rfkill *rfk[5];
>>       struct platform_device *platform_device;
>> +     struct input_dev *inputdev;
>>  } *ideapad_priv;
>>
>>  static struct {
>> @@ -325,6 +328,68 @@ static void ideapad_platform_exit(void)
>>  }
>>  /* the above is platform device */
>>
>> +/*
>> + * input device
>> + */
>> +static const struct key_entry ideapad_keymap[] = {
>> +     { KE_KEY, 0x06, { KEY_SWITCHVIDEOMODE } },
>> +     { KE_KEY, 0x0D, { KEY_WLAN } },
>> +     { KE_END, 0 },
>> +};
>> +
>> +static int ideapad_input_init(void)
>
> __devinit?
>
>> +{
>> +     struct input_dev *inputdev;
>> +     int error;
>> +
>> +     inputdev = input_allocate_device();
>> +     if (!inputdev) {
>> +             pr_info("Unable to allocate input device\n");
>> +             return -ENOMEM;
>> +     }
>> +
>> +     inputdev->name = "Ideapad extra buttons";
>> +     inputdev->phys = "ideapad/input0";
>> +     inputdev->id.bustype = BUS_HOST;
>> +     inputdev->dev.parent = &ideapad_priv->platform_device->dev;
>> +
>> +     error = sparse_keymap_setup(inputdev, ideapad_keymap, NULL);
>> +     if (error) {
>> +             pr_err("Unable to setup input device keymap\n");
>> +             goto err_free_dev;
>> +     }
>> +
>> +     error = input_register_device(inputdev);
>> +     if (error) {
>> +             pr_err("Unable to register input device\n");
>> +             goto err_free_keymap;
>> +     }
>> +
>> +     ideapad_priv->inputdev = inputdev;
>
> Why don't you pass ideapad_priv in as an argument instead of relying on
> global. I know that there can only be one, but then why do you have a
> structure?

That may allow to remove the global later, like we did on
eeepc-laptop/asus-laptop.

>> +     return 0;
>> +
>> +err_free_keymap:
>> +     sparse_keymap_free(inputdev);
>> +err_free_dev:
>> +     input_free_device(inputdev);
>> +     return error;
>> +}
>> +
>> +static void ideapad_input_exit(void)
>
> __devexit? The rest of the driver might user these markups as well.
>
>> +{
>> +     if (ideapad_priv->inputdev) {
>> +             sparse_keymap_free(ideapad_priv->inputdev);
>> +             input_unregister_device(ideapad_priv->inputdev);
>> +     }
>> +     ideapad_priv->inputdev = NULL;
>
> You fail driver initialization when ideapad_input_init() fails so there
> is no point in checking whether ideapad_priv->inputdev is null or not.
>
> Otherwise looks good from input POV.
>
> Thanks.



-- 
Corentin Chary
http://xf.iksaif.net

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ideapad: add hotkey support
  2010-11-18  7:35     ` Corentin Chary
@ 2010-11-19  7:09       ` Ike Panhc
  0 siblings, 0 replies; 9+ messages in thread
From: Ike Panhc @ 2010-11-19  7:09 UTC (permalink / raw)
  To: Corentin Chary
  Cc: Dmitry Torokhov, linux-kernel, platform-driver-x86,
	Matthew Garrett, David Woodhouse

On 11/18/2010 03:35 PM, Corentin Chary wrote:
> On Wed, Nov 17, 2010 at 10:29 PM, Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
>> On Wed, Nov 17, 2010 at 03:00:38PM +0800, Ike Panhc wrote:
>>> Hotkey enabled by this patch:
>>>   Fn+F3: Video mode switch
>>>   Fn+F5: software rfkill for wifi
>>>
>>> For some ideapad when push Fn+F3, hardware generates Super-P keys, those key
>>> will not be enabled by this patch.
>>>
>>> Signed-off-by: Ike Panhc <ike.pan@canonical.com>
>>> ---
>>>  drivers/platform/x86/ideapad-laptop.c |   74 +++++++++++++++++++++++++++++++++
>>>  1 files changed, 74 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
>>> index d75c21f..d397034 100644
>>> --- a/drivers/platform/x86/ideapad-laptop.c
>>> +++ b/drivers/platform/x86/ideapad-laptop.c
>>> @@ -28,6 +28,8 @@
>>>  #include <acpi/acpi_drivers.h>
>>>  #include <linux/rfkill.h>
>>>  #include <linux/platform_device.h>
>>> +#include <linux/input.h>
>>> +#include <linux/input/sparse-keymap.h>
>>>
>>>  #define IDEAPAD_DEV_CAMERA   0
>>>  #define IDEAPAD_DEV_WLAN     1
>>> @@ -39,6 +41,7 @@ struct ideapad_private {
>>>       acpi_handle handle;
>>>       struct rfkill *rfk[5];
>>>       struct platform_device *platform_device;
>>> +     struct input_dev *inputdev;
>>>  } *ideapad_priv;
>>>
>>>  static struct {
>>> @@ -325,6 +328,68 @@ static void ideapad_platform_exit(void)
>>>  }
>>>  /* the above is platform device */
>>>
>>> +/*
>>> + * input device
>>> + */
>>> +static const struct key_entry ideapad_keymap[] = {
>>> +     { KE_KEY, 0x06, { KEY_SWITCHVIDEOMODE } },
>>> +     { KE_KEY, 0x0D, { KEY_WLAN } },
>>> +     { KE_END, 0 },
>>> +};
>>> +
>>> +static int ideapad_input_init(void)
>>
>> __devinit?
>>
>>> +{
>>> +     struct input_dev *inputdev;
>>> +     int error;
>>> +
>>> +     inputdev = input_allocate_device();
>>> +     if (!inputdev) {
>>> +             pr_info("Unable to allocate input device\n");
>>> +             return -ENOMEM;
>>> +     }
>>> +
>>> +     inputdev->name = "Ideapad extra buttons";
>>> +     inputdev->phys = "ideapad/input0";
>>> +     inputdev->id.bustype = BUS_HOST;
>>> +     inputdev->dev.parent = &ideapad_priv->platform_device->dev;
>>> +
>>> +     error = sparse_keymap_setup(inputdev, ideapad_keymap, NULL);
>>> +     if (error) {
>>> +             pr_err("Unable to setup input device keymap\n");
>>> +             goto err_free_dev;
>>> +     }
>>> +
>>> +     error = input_register_device(inputdev);
>>> +     if (error) {
>>> +             pr_err("Unable to register input device\n");
>>> +             goto err_free_keymap;
>>> +     }
>>> +
>>> +     ideapad_priv->inputdev = inputdev;
>>
>> Why don't you pass ideapad_priv in as an argument instead of relying on
>> global. I know that there can only be one, but then why do you have a
>> structure?
> 
> That may allow to remove the global later, like we did on
> eeepc-laptop/asus-laptop.

I am ok to go though the driver and try to avoid using global variable.

Other feedbacks is easy done, so I will fix them first..

> 
>>> +     return 0;
>>> +
>>> +err_free_keymap:
>>> +     sparse_keymap_free(inputdev);
>>> +err_free_dev:
>>> +     input_free_device(inputdev);
>>> +     return error;
>>> +}
>>> +
>>> +static void ideapad_input_exit(void)
>>
>> __devexit? The rest of the driver might user these markups as well.
>>
>>> +{
>>> +     if (ideapad_priv->inputdev) {
>>> +             sparse_keymap_free(ideapad_priv->inputdev);
>>> +             input_unregister_device(ideapad_priv->inputdev);
>>> +     }
>>> +     ideapad_priv->inputdev = NULL;
>>
>> You fail driver initialization when ideapad_input_init() fails so there
>> is no point in checking whether ideapad_priv->inputdev is null or not.
>>
>> Otherwise looks good from input POV.
>>
>> Thanks.
> 
> 
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ideapad: add hotkey support
  2010-11-17  7:00 ` [PATCH 3/3] ideapad: add hotkey support Ike Panhc
  2010-11-17 21:29   ` Dmitry Torokhov
@ 2010-12-02 23:41   ` Dave Hansen
  2010-12-02 23:43     ` Ike Panhc
  1 sibling, 1 reply; 9+ messages in thread
From: Dave Hansen @ 2010-12-02 23:41 UTC (permalink / raw)
  To: Ike Panhc
  Cc: linux-kernel, platform-driver-x86, Matthew Garrett,
	David Woodhouse

On Wed, 2010-11-17 at 15:00 +0800, Ike Panhc wrote:
> +static void ideapad_input_report(unsigned long scancode)
> +{
> +       sparse_keymap_report_event(ideapad_priv->inputdev, scancode, 1, true);
> +} 

I got a little build error about some unresolved symbols in the module
while compiling:
        
        ERROR: "sparse_keymap_setup" [drivers/platform/x86/ideapad-laptop.ko] undefined!
        ERROR: "sparse_keymap_free" [drivers/platform/x86/ideapad-laptop.ko] undefined!
        ERROR: "sparse_keymap_report_event" [drivers/platform/x86/ideapad-laptop.ko] undefined!
        
You can get it to go away by setting CONFIG_INPUT_SPARSEKMAP=m or =y
in .config.  But, I think your patches need this:

diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index faec777..879d266 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -226,6 +226,7 @@ config IDEAPAD_LAPTOP
 	tristate "Lenovo IdeaPad Laptop Extras"
 	depends on ACPI
 	depends on RFKILL
+	select INPUT_SPARSEKMAP
 	help
 	  This is a driver for the rfkill switches on Lenovo IdeaPad netbooks.
 

Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com>


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ideapad: add hotkey support
  2010-12-02 23:41   ` Dave Hansen
@ 2010-12-02 23:43     ` Ike Panhc
  0 siblings, 0 replies; 9+ messages in thread
From: Ike Panhc @ 2010-12-02 23:43 UTC (permalink / raw)
  To: Dave Hansen
  Cc: linux-kernel, platform-driver-x86, Matthew Garrett,
	David Woodhouse

On 12/03/2010 07:41 AM, Dave Hansen wrote:
> On Wed, 2010-11-17 at 15:00 +0800, Ike Panhc wrote:
>> +static void ideapad_input_report(unsigned long scancode)
>> +{
>> +       sparse_keymap_report_event(ideapad_priv->inputdev, scancode, 1, true);
>> +} 
> 
> I got a little build error about some unresolved symbols in the module
> while compiling:
>         
>         ERROR: "sparse_keymap_setup" [drivers/platform/x86/ideapad-laptop.ko] undefined!
>         ERROR: "sparse_keymap_free" [drivers/platform/x86/ideapad-laptop.ko] undefined!
>         ERROR: "sparse_keymap_report_event" [drivers/platform/x86/ideapad-laptop.ko] undefined!
>         
> You can get it to go away by setting CONFIG_INPUT_SPARSEKMAP=m or =y
> in .config.  But, I think your patches need this:
> 
> diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> index faec777..879d266 100644
> --- a/drivers/platform/x86/Kconfig
> +++ b/drivers/platform/x86/Kconfig
> @@ -226,6 +226,7 @@ config IDEAPAD_LAPTOP
>  	tristate "Lenovo IdeaPad Laptop Extras"
>  	depends on ACPI
>  	depends on RFKILL
> +	select INPUT_SPARSEKMAP
>  	help
>  	  This is a driver for the rfkill switches on Lenovo IdeaPad netbooks.
>  
> 
> Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com>
> 

Thanks, you are right

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-12-02 23:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-17  6:59 [PATCH 0/3] ideapad: hotkey enablement Ike Panhc
2010-11-17  7:00 ` [PATCH 1/3] ideapad: add platform driver for ideapad Ike Panhc
2010-11-17  7:00 ` [PATCH 2/3] ideapad: let camera power control entry under platform driver Ike Panhc
2010-11-17  7:00 ` [PATCH 3/3] ideapad: add hotkey support Ike Panhc
2010-11-17 21:29   ` Dmitry Torokhov
2010-11-18  7:35     ` Corentin Chary
2010-11-19  7:09       ` Ike Panhc
2010-12-02 23:41   ` Dave Hansen
2010-12-02 23:43     ` Ike Panhc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox