Commit 6cbef9fd authored by Len Brown's avatar Len Brown

Merge branch 'dell-laptop' into release

parents 0ceafc33 8c5d30e5
...@@ -248,19 +248,6 @@ config SGI_GRU_DEBUG ...@@ -248,19 +248,6 @@ config SGI_GRU_DEBUG
This option enables addition debugging code for the SGI GRU driver. If This option enables addition debugging code for the SGI GRU driver. If
you are unsure, say N. you are unsure, say N.
config DELL_LAPTOP
tristate "Dell Laptop Extras (EXPERIMENTAL)"
depends on X86
depends on DCDBAS
depends on EXPERIMENTAL
depends on BACKLIGHT_CLASS_DEVICE
depends on RFKILL
depends on POWER_SUPPLY
default n
---help---
This driver adds support for rfkill and backlight control to Dell
laptops.
config ISL29003 config ISL29003
tristate "Intersil ISL29003 ambient light sensor" tristate "Intersil ISL29003 ambient light sensor"
depends on I2C && SYSFS depends on I2C && SYSFS
......
...@@ -58,6 +58,14 @@ static int da_command_code; ...@@ -58,6 +58,14 @@ static int da_command_code;
static int da_num_tokens; static int da_num_tokens;
static struct calling_interface_token *da_tokens; static struct calling_interface_token *da_tokens;
static struct platform_driver platform_driver = {
.driver = {
.name = "dell-laptop",
.owner = THIS_MODULE,
}
};
static struct platform_device *platform_device;
static struct backlight_device *dell_backlight_device; static struct backlight_device *dell_backlight_device;
static struct rfkill *wifi_rfkill; static struct rfkill *wifi_rfkill;
static struct rfkill *bluetooth_rfkill; static struct rfkill *bluetooth_rfkill;
...@@ -74,7 +82,7 @@ static const struct dmi_system_id __initdata dell_device_table[] = { ...@@ -74,7 +82,7 @@ static const struct dmi_system_id __initdata dell_device_table[] = {
{ } { }
}; };
static void parse_da_table(const struct dmi_header *dm) static void __init parse_da_table(const struct dmi_header *dm)
{ {
/* Final token is a terminator, so we don't want to copy it */ /* Final token is a terminator, so we don't want to copy it */
int tokens = (dm->length-11)/sizeof(struct calling_interface_token)-1; int tokens = (dm->length-11)/sizeof(struct calling_interface_token)-1;
...@@ -103,7 +111,7 @@ static void parse_da_table(const struct dmi_header *dm) ...@@ -103,7 +111,7 @@ static void parse_da_table(const struct dmi_header *dm)
da_num_tokens += tokens; da_num_tokens += tokens;
} }
static void find_tokens(const struct dmi_header *dm, void *dummy) static void __init find_tokens(const struct dmi_header *dm, void *dummy)
{ {
switch (dm->type) { switch (dm->type) {
case 0xd4: /* Indexed IO */ case 0xd4: /* Indexed IO */
...@@ -197,8 +205,8 @@ static void dell_rfkill_query(struct rfkill *rfkill, void *data) ...@@ -197,8 +205,8 @@ static void dell_rfkill_query(struct rfkill *rfkill, void *data)
dell_send_request(&buffer, 17, 11); dell_send_request(&buffer, 17, 11);
status = buffer.output[1]; status = buffer.output[1];
if (status & BIT(bit)) rfkill_set_sw_state(rfkill, !!(status & BIT(bit)));
rfkill_set_hw_state(rfkill, !!(status & BIT(16))); rfkill_set_hw_state(rfkill, !(status & BIT(16)));
} }
static const struct rfkill_ops dell_rfkill_ops = { static const struct rfkill_ops dell_rfkill_ops = {
...@@ -206,7 +214,7 @@ static const struct rfkill_ops dell_rfkill_ops = { ...@@ -206,7 +214,7 @@ static const struct rfkill_ops dell_rfkill_ops = {
.query = dell_rfkill_query, .query = dell_rfkill_query,
}; };
static int dell_setup_rfkill(void) static int __init dell_setup_rfkill(void)
{ {
struct calling_interface_buffer buffer; struct calling_interface_buffer buffer;
int status; int status;
...@@ -217,7 +225,8 @@ static int dell_setup_rfkill(void) ...@@ -217,7 +225,8 @@ static int dell_setup_rfkill(void)
status = buffer.output[1]; status = buffer.output[1];
if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) {
wifi_rfkill = rfkill_alloc("dell-wifi", NULL, RFKILL_TYPE_WLAN, wifi_rfkill = rfkill_alloc("dell-wifi", &platform_device->dev,
RFKILL_TYPE_WLAN,
&dell_rfkill_ops, (void *) 1); &dell_rfkill_ops, (void *) 1);
if (!wifi_rfkill) { if (!wifi_rfkill) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -229,7 +238,8 @@ static int dell_setup_rfkill(void) ...@@ -229,7 +238,8 @@ static int dell_setup_rfkill(void)
} }
if ((status & (1<<3|1<<9)) == (1<<3|1<<9)) { if ((status & (1<<3|1<<9)) == (1<<3|1<<9)) {
bluetooth_rfkill = rfkill_alloc("dell-bluetooth", NULL, bluetooth_rfkill = rfkill_alloc("dell-bluetooth",
&platform_device->dev,
RFKILL_TYPE_BLUETOOTH, RFKILL_TYPE_BLUETOOTH,
&dell_rfkill_ops, (void *) 2); &dell_rfkill_ops, (void *) 2);
if (!bluetooth_rfkill) { if (!bluetooth_rfkill) {
...@@ -242,7 +252,9 @@ static int dell_setup_rfkill(void) ...@@ -242,7 +252,9 @@ static int dell_setup_rfkill(void)
} }
if ((status & (1<<4|1<<10)) == (1<<4|1<<10)) { if ((status & (1<<4|1<<10)) == (1<<4|1<<10)) {
wwan_rfkill = rfkill_alloc("dell-wwan", NULL, RFKILL_TYPE_WWAN, wwan_rfkill = rfkill_alloc("dell-wwan",
&platform_device->dev,
RFKILL_TYPE_WWAN,
&dell_rfkill_ops, (void *) 3); &dell_rfkill_ops, (void *) 3);
if (!wwan_rfkill) { if (!wwan_rfkill) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -268,6 +280,22 @@ err_wifi: ...@@ -268,6 +280,22 @@ err_wifi:
return ret; return ret;
} }
static void dell_cleanup_rfkill(void)
{
if (wifi_rfkill) {
rfkill_unregister(wifi_rfkill);
rfkill_destroy(wifi_rfkill);
}
if (bluetooth_rfkill) {
rfkill_unregister(bluetooth_rfkill);
rfkill_destroy(bluetooth_rfkill);
}
if (wwan_rfkill) {
rfkill_unregister(wwan_rfkill);
rfkill_destroy(wwan_rfkill);
}
}
static int dell_send_intensity(struct backlight_device *bd) static int dell_send_intensity(struct backlight_device *bd)
{ {
struct calling_interface_buffer buffer; struct calling_interface_buffer buffer;
...@@ -326,11 +354,23 @@ static int __init dell_init(void) ...@@ -326,11 +354,23 @@ static int __init dell_init(void)
return -ENODEV; return -ENODEV;
} }
ret = platform_driver_register(&platform_driver);
if (ret)
goto fail_platform_driver;
platform_device = platform_device_alloc("dell-laptop", -1);
if (!platform_device) {
ret = -ENOMEM;
goto fail_platform_device1;
}
ret = platform_device_add(platform_device);
if (ret)
goto fail_platform_device2;
ret = dell_setup_rfkill(); ret = dell_setup_rfkill();
if (ret) { if (ret) {
printk(KERN_WARNING "dell-laptop: Unable to setup rfkill\n"); printk(KERN_WARNING "dell-laptop: Unable to setup rfkill\n");
goto out; goto fail_rfkill;
} }
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
...@@ -352,13 +392,13 @@ static int __init dell_init(void) ...@@ -352,13 +392,13 @@ static int __init dell_init(void)
if (max_intensity) { if (max_intensity) {
dell_backlight_device = backlight_device_register( dell_backlight_device = backlight_device_register(
"dell_backlight", "dell_backlight",
NULL, NULL, &platform_device->dev, NULL,
&dell_ops); &dell_ops);
if (IS_ERR(dell_backlight_device)) { if (IS_ERR(dell_backlight_device)) {
ret = PTR_ERR(dell_backlight_device); ret = PTR_ERR(dell_backlight_device);
dell_backlight_device = NULL; dell_backlight_device = NULL;
goto out; goto fail_backlight;
} }
dell_backlight_device->props.max_brightness = max_intensity; dell_backlight_device->props.max_brightness = max_intensity;
...@@ -368,13 +408,16 @@ static int __init dell_init(void) ...@@ -368,13 +408,16 @@ static int __init dell_init(void)
} }
return 0; return 0;
out:
if (wifi_rfkill) fail_backlight:
rfkill_unregister(wifi_rfkill); dell_cleanup_rfkill();
if (bluetooth_rfkill) fail_rfkill:
rfkill_unregister(bluetooth_rfkill); platform_device_del(platform_device);
if (wwan_rfkill) fail_platform_device2:
rfkill_unregister(wwan_rfkill); platform_device_put(platform_device);
fail_platform_device1:
platform_driver_unregister(&platform_driver);
fail_platform_driver:
kfree(da_tokens); kfree(da_tokens);
return ret; return ret;
} }
...@@ -382,12 +425,7 @@ out: ...@@ -382,12 +425,7 @@ out:
static void __exit dell_exit(void) static void __exit dell_exit(void)
{ {
backlight_device_unregister(dell_backlight_device); backlight_device_unregister(dell_backlight_device);
if (wifi_rfkill) dell_cleanup_rfkill();
rfkill_unregister(wifi_rfkill);
if (bluetooth_rfkill)
rfkill_unregister(bluetooth_rfkill);
if (wwan_rfkill)
rfkill_unregister(wwan_rfkill);
} }
module_init(dell_init); module_init(dell_init);
......
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