Commit 9476cdfa authored by malattia@linux.it's avatar malattia@linux.it Committed by Len Brown

sony-laptop: add edge modem support (also called WWAN)

Some SZ Vaios have a gsm built-in modem. Allow powering on/off this device.
Thanks to Joshua Wise for the base code.
Signed-off-by: default avatarMattia Dongili <malattia@linux.it>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 9f9f0761
...@@ -923,6 +923,7 @@ struct sony_pic_dev { ...@@ -923,6 +923,7 @@ struct sony_pic_dev {
int model; int model;
u8 camera_power; u8 camera_power;
u8 bluetooth_power; u8 bluetooth_power;
u8 wwan_power;
struct acpi_device *acpi_dev; struct acpi_device *acpi_dev;
struct sony_pic_irq *cur_irq; struct sony_pic_irq *cur_irq;
struct sony_pic_ioport *cur_ioport; struct sony_pic_ioport *cur_ioport;
...@@ -1330,6 +1331,44 @@ static ssize_t sony_pic_camerapower_show(struct device *dev, ...@@ -1330,6 +1331,44 @@ static ssize_t sony_pic_camerapower_show(struct device *dev,
return count; return count;
} }
/* gprs/edge modem (SZ460N and SZ210P), thanks to Joshua Wise */
static void sony_pic_set_wwanpower(u8 state)
{
state = !!state;
mutex_lock(&spic_dev.lock);
if (spic_dev.wwan_power == state) {
mutex_unlock(&spic_dev.lock);
return;
}
sony_pic_call2(0xB0, state);
spic_dev.wwan_power = state;
mutex_unlock(&spic_dev.lock);
}
static ssize_t sony_pic_wwanpower_store(struct device *dev,
struct device_attribute *attr,
const char *buffer, size_t count)
{
unsigned long value;
if (count > 31)
return -EINVAL;
value = simple_strtoul(buffer, NULL, 10);
sony_pic_set_wwanpower(value);
return count;
}
static ssize_t sony_pic_wwanpower_show(struct device *dev,
struct device_attribute *attr, char *buffer)
{
ssize_t count;
mutex_lock(&spic_dev.lock);
count = snprintf(buffer, PAGE_SIZE, "%d\n", spic_dev.wwan_power);
mutex_unlock(&spic_dev.lock);
return count;
}
/* bluetooth subsystem power state */ /* bluetooth subsystem power state */
static void __sony_pic_set_bluetoothpower(u8 state) static void __sony_pic_set_bluetoothpower(u8 state)
{ {
...@@ -1412,11 +1451,13 @@ struct device_attribute spic_attr_##_name = __ATTR(_name, \ ...@@ -1412,11 +1451,13 @@ struct device_attribute spic_attr_##_name = __ATTR(_name, \
static SPIC_ATTR(camerapower, 0644); static SPIC_ATTR(camerapower, 0644);
static SPIC_ATTR(bluetoothpower, 0644); static SPIC_ATTR(bluetoothpower, 0644);
static SPIC_ATTR(wwanpower, 0644);
static SPIC_ATTR(fanspeed, 0644); static SPIC_ATTR(fanspeed, 0644);
static struct attribute *spic_attributes[] = { static struct attribute *spic_attributes[] = {
&spic_attr_camerapower.attr, &spic_attr_camerapower.attr,
&spic_attr_bluetoothpower.attr, &spic_attr_bluetoothpower.attr,
&spic_attr_wwanpower.attr,
&spic_attr_fanspeed.attr, &spic_attr_fanspeed.attr,
NULL NULL
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment