Skip to content

Commit

Permalink
ideapad: define cfg bits and create sysfs node for cfg
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ike Panhc authored and Matthew Garrett committed Aug 5, 2011
1 parent 3300955 commit 3371f48
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 16 deletions.
17 changes: 17 additions & 0 deletions Documentation/ABI/testing/sysfs-platform-ideapad-laptop
Original file line number Diff line number Diff line change
Expand Up @@ -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)

51 changes: 35 additions & 16 deletions drivers/platform/x86/ideapad-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
*/
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -393,17 +410,19 @@ 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);
if (!priv)
return -ENOMEM;
dev_set_drvdata(&adevice->dev, priv);
ideapad_handle = adevice->handle;
priv->cfg = cfg;

ret = ideapad_platform_init(priv);
if (ret)
Expand All @@ -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;
Expand Down

0 comments on commit 3371f48

Please sign in to comment.