提交 c9f718d0 编写于 作者: I Ike Panhc 提交者: Matthew Garrett

ideapad: let camera power control entry under platform driver

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

Add document about usage of ideapad node in sysfs.
Signed-off-by: NIke Panhc <ike.pan@canonical.com>
Signed-off-by: NMatthew Garrett <mjg@redhat.com>
上级 98ee6919
What: /sys/devices/platform/ideapad/camera_power
Date: Dec 2010
KernelVersion: 2.6.37
Contact: "Ike Panhc <ike.pan@canonical.com>"
Description:
Control the power of camera module. 1 means on, 0 means off.
...@@ -282,6 +282,15 @@ static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev) ...@@ -282,6 +282,15 @@ static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev)
/* /*
* Platform device * 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 __devinit ideapad_platform_init(void) static int __devinit ideapad_platform_init(void)
{ {
int result; int result;
...@@ -295,8 +304,14 @@ static int __devinit ideapad_platform_init(void) ...@@ -295,8 +304,14 @@ static int __devinit ideapad_platform_init(void)
if (result) if (result)
goto fail_platform_device; goto fail_platform_device;
result = sysfs_create_group(&ideapad_priv->platform_device->dev.kobj,
&ideapad_attribute_group);
if (result)
goto fail_sysfs;
return 0; return 0;
fail_sysfs:
platform_device_del(ideapad_priv->platform_device);
fail_platform_device: fail_platform_device:
platform_device_put(ideapad_priv->platform_device); platform_device_put(ideapad_priv->platform_device);
return result; return result;
...@@ -304,6 +319,8 @@ static int __devinit ideapad_platform_init(void) ...@@ -304,6 +319,8 @@ static int __devinit ideapad_platform_init(void)
static void ideapad_platform_exit(void) 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); platform_device_unregister(ideapad_priv->platform_device);
} }
/* the above is platform device */ /* the above is platform device */
...@@ -317,50 +334,30 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids); ...@@ -317,50 +334,30 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);
static int ideapad_acpi_add(struct acpi_device *adevice) static int ideapad_acpi_add(struct acpi_device *adevice)
{ {
int ret, i, cfg; int ret, i, cfg;
int devs_present[5];
struct ideapad_private *priv; struct ideapad_private *priv;
if (read_method_int(adevice->handle, "_CFG", &cfg)) if (read_method_int(adevice->handle, "_CFG", &cfg))
return -ENODEV; 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); priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
ideapad_priv = priv; ideapad_priv = priv;
priv->handle = adevice->handle;
dev_set_drvdata(&adevice->dev, priv);
ret = ideapad_platform_init(); ret = ideapad_platform_init();
if (ret) if (ret)
goto platform_failed; goto platform_failed;
if (devs_present[IDEAPAD_DEV_CAMERA]) { for (i = IDEAPAD_DEV_WLAN; i < IDEAPAD_DEV_KILLSW; i++) {
ret = device_create_file(&adevice->dev, &dev_attr_camera_power); if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
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); ideapad_register_rfkill(adevice, i);
} }
ideapad_sync_rfk_state(adevice); ideapad_sync_rfk_state(adevice);
return 0; return 0;
camera_failed:
ideapad_platform_exit();
platform_failed: platform_failed:
kfree(priv); kfree(priv);
return ret; return ret;
...@@ -371,14 +368,12 @@ static int ideapad_acpi_remove(struct acpi_device *adevice, int type) ...@@ -371,14 +368,12 @@ static int ideapad_acpi_remove(struct acpi_device *adevice, int type)
struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); struct ideapad_private *priv = dev_get_drvdata(&adevice->dev);
int i; 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_unregister_rfkill(adevice, i);
ideapad_platform_exit(); ideapad_platform_exit();
dev_set_drvdata(&adevice->dev, NULL); dev_set_drvdata(&adevice->dev, NULL);
kfree(priv); kfree(priv);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册