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: Ike Panhc <ike.pan@canonical.com> Signed-off-by: Matthew Garrett <mjg@redhat.com>
This commit is contained in:
committed by
Matthew Garrett
parent
98ee69191d
commit
c9f718d0c6
6
Documentation/ABI/testing/sysfs-platform-ideapad-laptop
Normal file
6
Documentation/ABI/testing/sysfs-platform-ideapad-laptop
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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 @@ fail_platform_device:
|
|||||||
|
|
||||||
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);
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user