mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 01:24:33 +00:00
ideapad: define cfg bits and create sysfs node for cfg
Create /sys/devices/platform/ideapad/cfg for showing cfg value. Signed-off-by: Ike Panhc <ike.pan@canonical.com> Signed-off-by: Matthew Garrett <mjg@redhat.com>
This commit is contained in:
parent
33009557bd
commit
3371f48167
@ -4,3 +4,20 @@ KernelVersion: 2.6.37
|
||||
Contact: "Ike Panhc <ike.pan@canonical.com>"
|
||||
Description:
|
||||
Control the power of camera module. 1 means on, 0 means off.
|
||||
|
||||
What: /sys/devices/platform/ideapad/cfg
|
||||
Date: Jun 2011
|
||||
KernelVersion: 3.1
|
||||
Contact: "Ike Panhc <ike.pan@canonical.com>"
|
||||
Description:
|
||||
Ideapad capability bits.
|
||||
Bit 8-10: 1 - Intel graphic only
|
||||
2 - ATI graphic only
|
||||
3 - Nvidia graphic only
|
||||
4 - Intel and ATI graphic
|
||||
5 - Intel and Nvidia graphic
|
||||
Bit 16: Bluetooth exist (1 for exist)
|
||||
Bit 17: 3G exist (1 for exist)
|
||||
Bit 18: Wifi exist (1 for exist)
|
||||
Bit 19: Camera exist (1 for exist)
|
||||
|
||||
|
@ -35,10 +35,15 @@
|
||||
|
||||
#define IDEAPAD_RFKILL_DEV_NUM (3)
|
||||
|
||||
#define CFG_BT_BIT (16)
|
||||
#define CFG_3G_BIT (17)
|
||||
#define CFG_WIFI_BIT (18)
|
||||
|
||||
struct ideapad_private {
|
||||
struct rfkill *rfk[IDEAPAD_RFKILL_DEV_NUM];
|
||||
struct platform_device *platform_device;
|
||||
struct input_dev *inputdev;
|
||||
unsigned long cfg;
|
||||
};
|
||||
|
||||
static acpi_handle ideapad_handle;
|
||||
@ -155,7 +160,7 @@ static int write_ec_cmd(acpi_handle handle, int cmd, unsigned long data)
|
||||
}
|
||||
|
||||
/*
|
||||
* camera power
|
||||
* sysfs
|
||||
*/
|
||||
static ssize_t show_ideapad_cam(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
@ -186,6 +191,27 @@ static ssize_t store_ideapad_cam(struct device *dev,
|
||||
|
||||
static DEVICE_ATTR(camera_power, 0644, show_ideapad_cam, store_ideapad_cam);
|
||||
|
||||
static ssize_t show_ideapad_cfg(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct ideapad_private *priv = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "0x%.8lX\n", priv->cfg);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(cfg, 0444, show_ideapad_cfg, NULL);
|
||||
|
||||
static struct attribute *ideapad_attributes[] = {
|
||||
&dev_attr_camera_power.attr,
|
||||
&dev_attr_cfg.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group ideapad_attribute_group = {
|
||||
.attrs = ideapad_attributes
|
||||
};
|
||||
|
||||
/*
|
||||
* Rfkill
|
||||
*/
|
||||
@ -197,9 +223,9 @@ struct ideapad_rfk_data {
|
||||
};
|
||||
|
||||
const struct ideapad_rfk_data ideapad_rfk_data[] = {
|
||||
{ "ideapad_wlan", 18, 0x15, RFKILL_TYPE_WLAN },
|
||||
{ "ideapad_bluetooth", 16, 0x17, RFKILL_TYPE_BLUETOOTH },
|
||||
{ "ideapad_3g", 17, 0x20, RFKILL_TYPE_WWAN },
|
||||
{ "ideapad_wlan", CFG_WIFI_BIT, 0x15, RFKILL_TYPE_WLAN },
|
||||
{ "ideapad_bluetooth", CFG_BT_BIT, 0x17, RFKILL_TYPE_BLUETOOTH },
|
||||
{ "ideapad_3g", CFG_3G_BIT, 0x20, RFKILL_TYPE_WWAN },
|
||||
};
|
||||
|
||||
static int ideapad_rfk_set(void *data, bool blocked)
|
||||
@ -280,15 +306,6 @@ static void __devexit ideapad_unregister_rfkill(struct acpi_device *adevice,
|
||||
/*
|
||||
* 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(struct ideapad_private *priv)
|
||||
{
|
||||
int result;
|
||||
@ -393,10 +410,11 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);
|
||||
|
||||
static int __devinit ideapad_acpi_add(struct acpi_device *adevice)
|
||||
{
|
||||
int ret, i, cfg;
|
||||
int ret, i;
|
||||
unsigned long cfg;
|
||||
struct ideapad_private *priv;
|
||||
|
||||
if (read_method_int(adevice->handle, "_CFG", &cfg))
|
||||
if (read_method_int(adevice->handle, "_CFG", (int *)&cfg))
|
||||
return -ENODEV;
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
@ -404,6 +422,7 @@ static int __devinit ideapad_acpi_add(struct acpi_device *adevice)
|
||||
return -ENOMEM;
|
||||
dev_set_drvdata(&adevice->dev, priv);
|
||||
ideapad_handle = adevice->handle;
|
||||
priv->cfg = cfg;
|
||||
|
||||
ret = ideapad_platform_init(priv);
|
||||
if (ret)
|
||||
@ -414,7 +433,7 @@ static int __devinit ideapad_acpi_add(struct acpi_device *adevice)
|
||||
goto input_failed;
|
||||
|
||||
for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) {
|
||||
if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
|
||||
if (test_bit(ideapad_rfk_data[i].cfgbit, &cfg))
|
||||
ideapad_register_rfkill(adevice, i);
|
||||
else
|
||||
priv->rfk[i] = NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user