From 68e3a8e2a1225ce06637e7ffc2ca75b6f198e008 Mon Sep 17 00:00:00 2001 From: Thomas Renninger Date: Mon, 11 Aug 2008 15:03:20 +0200 Subject: [PATCH] --- yaml --- r: 117279 b: refs/heads/master c: 36eec5e29cf31011a7fbe121badfed7efb2a4ebb h: refs/heads/master i: 117277: be649fa91fc3fbe2b9bf6141383ec89a61122804 117275: 9c0f73a644d698825679dc53b3df3c56db7746e1 117271: dd876f2f36671eeaaa18201c5b0e4e4fc750763b 117263: 9d25993ce2a35464add2b52b7c766f9dd7dda274 117247: 296cd3e8f70f61efe91040fb31dbd0de23c733e4 v: v3 --- [refs] | 2 +- trunk/Documentation/kernel-parameters.txt | 47 ++-- trunk/Documentation/laptops/acer-wmi.txt | 28 ++- .../arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 42 ++-- trunk/drivers/acpi/processor_perflib.c | 18 +- trunk/drivers/acpi/wmi.c | 39 +--- trunk/drivers/misc/Kconfig | 1 - trunk/drivers/misc/acer-wmi.c | 215 +++++++----------- trunk/include/linux/kernel.h | 24 -- 9 files changed, 161 insertions(+), 255 deletions(-) diff --git a/[refs] b/[refs] index a84f94088a31..78768f87d123 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aa58329fc8ec50b379388fcad55f62c3493730d3 +refs/heads/master: 36eec5e29cf31011a7fbe121badfed7efb2a4ebb diff --git a/trunk/Documentation/kernel-parameters.txt b/trunk/Documentation/kernel-parameters.txt index 1150444a21ab..44d1bd142edf 100644 --- a/trunk/Documentation/kernel-parameters.txt +++ b/trunk/Documentation/kernel-parameters.txt @@ -217,20 +217,39 @@ and is between 256 and 4096 characters. It is defined in the file acpi.debug_level= [HW,ACPI] Format: Each bit of the indicates an ACPI debug level, - 1: enable, 0: disable. It is useful for boot time - debugging. After system has booted up, it can be set - via /sys/module/acpi/parameters/debug_level. - CONFIG_ACPI_DEBUG must be enabled for this to produce any output. - Available bits (add the numbers together) to enable different - debug output levels of the ACPI subsystem: - 0x01 error 0x02 warn 0x04 init 0x08 debug object - 0x10 info 0x20 init names 0x40 parse 0x80 load - 0x100 dispatch 0x200 execute 0x400 names 0x800 operation region - 0x1000 bfield 0x2000 tables 0x4000 values 0x8000 objects - 0x10000 resources 0x20000 user requests 0x40000 package. - The number can be in decimal or prefixed with 0x in hex. - Warning: Many of these options can produce a lot of - output and make your system unusable. Be very careful. + which corresponds to the level in an ACPI_DEBUG_PRINT + statement. After system has booted up, this mask + can be set via /sys/module/acpi/parameters/debug_level. + + CONFIG_ACPI_DEBUG must be enabled for this to produce + any output. The number can be in decimal or prefixed + with 0x in hex. Some of these options produce so much + output that the system is unusable. + + The following global components are defined by the + ACPI CA: + 0x01 error + 0x02 warn + 0x04 init + 0x08 debug object + 0x10 info + 0x20 init names + 0x40 parse + 0x80 load + 0x100 dispatch + 0x200 execute + 0x400 names + 0x800 operation region + 0x1000 bfield + 0x2000 tables + 0x4000 values + 0x8000 objects + 0x10000 resources + 0x20000 user requests + 0x40000 package + The number can be in decimal or prefixed with 0x in hex. + Warning: Many of these options can produce a lot of + output and make your system unusable. Be very careful. acpi_pm_good [X86-32,X86-64] Override the pmtimer bug detection: force the kernel diff --git a/trunk/Documentation/laptops/acer-wmi.txt b/trunk/Documentation/laptops/acer-wmi.txt index 2b3a6b5260bf..69b5dd4e5a59 100644 --- a/trunk/Documentation/laptops/acer-wmi.txt +++ b/trunk/Documentation/laptops/acer-wmi.txt @@ -1,7 +1,7 @@ Acer Laptop WMI Extras Driver http://code.google.com/p/aceracpi -Version 0.2 -18th August 2008 +Version 0.1 +9th February 2008 Copyright 2007-2008 Carlos Corbacho @@ -87,7 +87,17 @@ acer-wmi come with built-in wireless. However, should you feel so inclined to ever wish to remove the card, or swap it out at some point, please get in touch with me, as we may well be able to gain some data on wireless card detection. -The wireless radio is exposed through rfkill. +To read the status of the wireless radio (0=off, 1=on): +cat /sys/devices/platform/acer-wmi/wireless + +To enable the wireless radio: +echo 1 > /sys/devices/platform/acer-wmi/wireless + +To disable the wireless radio: +echo 0 > /sys/devices/platform/acer-wmi/wireless + +To set the state of the wireless radio when loading acer-wmi, pass: +wireless=X (where X is 0 or 1) Bluetooth ********* @@ -107,7 +117,17 @@ For the adventurously minded - if you want to buy an internal bluetooth module off the internet that is compatible with your laptop and fit it, then it will work just fine with acer-wmi. -Bluetooth is exposed through rfkill. +To read the status of the bluetooth module (0=off, 1=on): +cat /sys/devices/platform/acer-wmi/wireless + +To enable the bluetooth module: +echo 1 > /sys/devices/platform/acer-wmi/bluetooth + +To disable the bluetooth module: +echo 0 > /sys/devices/platform/acer-wmi/bluetooth + +To set the state of the bluetooth module when loading acer-wmi, pass: +bluetooth=X (where X is 0 or 1) 3G ** diff --git a/trunk/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/trunk/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 4e0c6abd7ca4..84bb395038d8 100644 --- a/trunk/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/trunk/arch/x86/kernel/cpu/cpufreq/powernow-k8.c @@ -45,6 +45,7 @@ #endif #define PFX "powernow-k8: " +#define BFX PFX "BIOS error: " #define VERSION "version 2.20.00" #include "powernow-k8.h" @@ -535,40 +536,35 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 for (j = 0; j < data->numps; j++) { if (pst[j].vid > LEAST_VID) { - printk(KERN_ERR FW_BUG PFX "vid %d invalid : 0x%x\n", - j, pst[j].vid); + printk(KERN_ERR PFX "vid %d invalid : 0x%x\n", j, pst[j].vid); return -EINVAL; } if (pst[j].vid < data->rvo) { /* vid + rvo >= 0 */ - printk(KERN_ERR FW_BUG PFX "0 vid exceeded with pstate" - " %d\n", j); + printk(KERN_ERR BFX "0 vid exceeded with pstate %d\n", j); return -ENODEV; } if (pst[j].vid < maxvid + data->rvo) { /* vid + rvo >= maxvid */ - printk(KERN_ERR FW_BUG PFX "maxvid exceeded with pstate" - " %d\n", j); + printk(KERN_ERR BFX "maxvid exceeded with pstate %d\n", j); return -ENODEV; } if (pst[j].fid > MAX_FID) { - printk(KERN_ERR FW_BUG PFX "maxfid exceeded with pstate" - " %d\n", j); + printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j); return -ENODEV; } if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) { /* Only first fid is allowed to be in "low" range */ - printk(KERN_ERR FW_BUG PFX "two low fids - %d : " - "0x%x\n", j, pst[j].fid); + printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid); return -EINVAL; } if (pst[j].fid < lastfid) lastfid = pst[j].fid; } if (lastfid & 1) { - printk(KERN_ERR FW_BUG PFX "lastfid invalid\n"); + printk(KERN_ERR BFX "lastfid invalid\n"); return -EINVAL; } if (lastfid > LO_FID_TABLE_TOP) - printk(KERN_INFO FW_BUG PFX "first fid not from lo freq table\n"); + printk(KERN_INFO BFX "first fid not from lo freq table\n"); return 0; } @@ -676,13 +672,13 @@ static int find_psb_table(struct powernow_k8_data *data) dprintk("table vers: 0x%x\n", psb->tableversion); if (psb->tableversion != PSB_VERSION_1_4) { - printk(KERN_ERR FW_BUG PFX "PSB table is not v1.4\n"); + printk(KERN_ERR BFX "PSB table is not v1.4\n"); return -ENODEV; } dprintk("flags: 0x%x\n", psb->flags1); if (psb->flags1) { - printk(KERN_ERR FW_BUG PFX "unknown flags\n"); + printk(KERN_ERR BFX "unknown flags\n"); return -ENODEV; } @@ -709,7 +705,7 @@ static int find_psb_table(struct powernow_k8_data *data) } } if (cpst != 1) { - printk(KERN_ERR FW_BUG PFX "numpst must be 1\n"); + printk(KERN_ERR BFX "numpst must be 1\n"); return -ENODEV; } @@ -1134,19 +1130,17 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) "ACPI Processor module before starting this " "driver.\n"); #else - printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide" - " ACPI _PSS objects in a way that Linux " - "understands. Please report this to the Linux " - "ACPI maintainers and complain to your BIOS " - "vendor.\n"); + printk(KERN_ERR PFX "Your BIOS does not provide ACPI " + "_PSS objects in a way that Linux understands. " + "Please report this to the Linux ACPI maintainers" + " and complain to your BIOS vendor.\n"); #endif kfree(data); return -ENODEV; } if (pol->cpu != 0) { - printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for " - "CPU other than CPU0. Complain to your BIOS " - "vendor.\n"); + printk(KERN_ERR PFX "No ACPI _PSS objects for CPU other than " + "CPU0. Complain to your BIOS vendor.\n"); kfree(data); return -ENODEV; } @@ -1199,7 +1193,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) /* min/max the cpu is capable of */ if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) { - printk(KERN_ERR FW_BUG PFX "invalid powernow_table\n"); + printk(KERN_ERR PFX "invalid powernow_table\n"); powernow_k8_cpu_exit_acpi(data); kfree(data->powernow_table); kfree(data); diff --git a/trunk/drivers/acpi/processor_perflib.c b/trunk/drivers/acpi/processor_perflib.c index 242f8143008a..80c251ec6d2a 100644 --- a/trunk/drivers/acpi/processor_perflib.c +++ b/trunk/drivers/acpi/processor_perflib.c @@ -38,7 +38,6 @@ #include #endif -#include #include #include @@ -335,6 +334,7 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr) acpi_status status = AE_OK; acpi_handle handle = NULL; + if (!pr || !pr->performance || !pr->handle) return -EINVAL; @@ -347,25 +347,13 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr) result = acpi_processor_get_performance_control(pr); if (result) - goto update_bios; + return result; result = acpi_processor_get_performance_states(pr); if (result) - goto update_bios; + return result; return 0; - - /* - * Having _PPC but missing frequencies (_PSS, _PCT) is a very good hint that - * the BIOS is older than the CPU and does not know its frequencies - */ - update_bios: - if (ACPI_SUCCESS(acpi_get_handle(pr->handle, "_PPC", &handle))){ - if(boot_cpu_has(X86_FEATURE_EST)) - printk(KERN_WARNING FW_BUG "BIOS needs update for CPU " - "frequency support\n"); - } - return result; } int acpi_processor_notify_smm(struct module *calling_module) diff --git a/trunk/drivers/acpi/wmi.c b/trunk/drivers/acpi/wmi.c index 5464cfcf8297..cfe2c833474d 100644 --- a/trunk/drivers/acpi/wmi.c +++ b/trunk/drivers/acpi/wmi.c @@ -217,35 +217,6 @@ static bool find_guid(const char *guid_string, struct wmi_block **out) return 0; } -static acpi_status wmi_method_enable(struct wmi_block *wblock, int enable) -{ - struct guid_block *block = NULL; - char method[5]; - struct acpi_object_list input; - union acpi_object params[1]; - acpi_status status; - acpi_handle handle; - - block = &wblock->gblock; - handle = wblock->handle; - - if (!block) - return AE_NOT_EXIST; - - input.count = 1; - input.pointer = params; - params[0].type = ACPI_TYPE_INTEGER; - params[0].integer.value = enable; - - snprintf(method, 5, "WE%02X", block->notify_id); - status = acpi_evaluate_object(handle, method, &input, NULL); - - if (status != AE_OK && status != AE_NOT_FOUND) - return status; - else - return AE_OK; -} - /* * Exported WMI functions */ @@ -456,7 +427,6 @@ acpi_status wmi_install_notify_handler(const char *guid, wmi_notify_handler handler, void *data) { struct wmi_block *block; - acpi_status status; if (!guid || !handler) return AE_BAD_PARAMETER; @@ -471,9 +441,7 @@ wmi_notify_handler handler, void *data) block->handler = handler; block->handler_data = data; - status = wmi_method_enable(block, 1); - - return status; + return AE_OK; } EXPORT_SYMBOL_GPL(wmi_install_notify_handler); @@ -485,7 +453,6 @@ EXPORT_SYMBOL_GPL(wmi_install_notify_handler); acpi_status wmi_remove_notify_handler(const char *guid) { struct wmi_block *block; - acpi_status status; if (!guid) return AE_BAD_PARAMETER; @@ -497,12 +464,10 @@ acpi_status wmi_remove_notify_handler(const char *guid) if (!block->handler) return AE_NULL_ENTRY; - status = wmi_method_enable(block, 0); - block->handler = NULL; block->handler_data = NULL; - return status; + return AE_OK; } EXPORT_SYMBOL_GPL(wmi_remove_notify_handler); diff --git a/trunk/drivers/misc/Kconfig b/trunk/drivers/misc/Kconfig index 6abb95919c38..a726f3b01a6b 100644 --- a/trunk/drivers/misc/Kconfig +++ b/trunk/drivers/misc/Kconfig @@ -145,7 +145,6 @@ config ACER_WMI depends on NEW_LEDS depends on BACKLIGHT_CLASS_DEVICE depends on SERIO_I8042 - depends on RFKILL select ACPI_WMI ---help--- This is a driver for newer Acer (and Wistron) laptops. It adds diff --git a/trunk/drivers/misc/acer-wmi.c b/trunk/drivers/misc/acer-wmi.c index cf4c39fbc66f..d8b0d326e452 100644 --- a/trunk/drivers/misc/acer-wmi.c +++ b/trunk/drivers/misc/acer-wmi.c @@ -33,8 +33,6 @@ #include #include #include -#include -#include #include #include @@ -125,15 +123,21 @@ enum interface_flags { static int max_brightness = 0xF; +static int wireless = -1; +static int bluetooth = -1; static int mailled = -1; static int brightness = -1; static int threeg = -1; static int force_series; module_param(mailled, int, 0444); +module_param(wireless, int, 0444); +module_param(bluetooth, int, 0444); module_param(brightness, int, 0444); module_param(threeg, int, 0444); module_param(force_series, int, 0444); +MODULE_PARM_DESC(wireless, "Set initial state of Wireless hardware"); +MODULE_PARM_DESC(bluetooth, "Set initial state of Bluetooth hardware"); MODULE_PARM_DESC(mailled, "Set initial state of Mail LED"); MODULE_PARM_DESC(brightness, "Set initial LCD backlight brightness"); MODULE_PARM_DESC(threeg, "Set initial state of 3G hardware"); @@ -141,6 +145,8 @@ MODULE_PARM_DESC(force_series, "Force a different laptop series"); struct acer_data { int mailled; + int wireless; + int bluetooth; int threeg; int brightness; }; @@ -151,9 +157,6 @@ struct acer_debug { u32 wmid_devices; }; -static struct rfkill *wireless_rfkill; -static struct rfkill *bluetooth_rfkill; - /* Each low-level interface must define at least some of the following */ struct wmi_interface { /* The WMI device type */ @@ -843,6 +846,8 @@ static void __init acer_commandline_init(void) * capability isn't available on the given interface */ set_u32(mailled, ACER_CAP_MAILLED); + set_u32(wireless, ACER_CAP_WIRELESS); + set_u32(bluetooth, ACER_CAP_BLUETOOTH); set_u32(threeg, ACER_CAP_THREEG); set_u32(brightness, ACER_CAP_BRIGHTNESS); } @@ -928,135 +933,40 @@ static void acer_backlight_exit(void) } /* - * Rfkill devices + * Read/ write bool sysfs macro */ -static void acer_rfkill_update(struct work_struct *ignored); -static DECLARE_DELAYED_WORK(acer_rfkill_work, acer_rfkill_update); -static void acer_rfkill_update(struct work_struct *ignored) -{ - u32 state; - acpi_status status; - - status = get_u32(&state, ACER_CAP_WIRELESS); - if (ACPI_SUCCESS(status)) - rfkill_force_state(wireless_rfkill, state ? - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED); - - if (has_cap(ACER_CAP_BLUETOOTH)) { - status = get_u32(&state, ACER_CAP_BLUETOOTH); - if (ACPI_SUCCESS(status)) - rfkill_force_state(bluetooth_rfkill, state ? - RFKILL_STATE_UNBLOCKED : - RFKILL_STATE_SOFT_BLOCKED); - } - - schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ)); -} - -static int acer_rfkill_set(void *data, enum rfkill_state state) -{ - acpi_status status; - u32 *cap = data; - status = set_u32((u32) (state == RFKILL_STATE_UNBLOCKED), *cap); - if (ACPI_FAILURE(status)) - return -ENODEV; - return 0; -} - -static struct rfkill * acer_rfkill_register(struct device *dev, -enum rfkill_type type, char *name, u32 cap) -{ - int err; - u32 state; - u32 *data; - struct rfkill *rfkill_dev; - - rfkill_dev = rfkill_allocate(dev, type); - if (!rfkill_dev) - return ERR_PTR(-ENOMEM); - rfkill_dev->name = name; - get_u32(&state, cap); - rfkill_dev->state = state ? RFKILL_STATE_UNBLOCKED : - RFKILL_STATE_SOFT_BLOCKED; - data = kzalloc(sizeof(u32), GFP_KERNEL); - if (!data) { - rfkill_free(rfkill_dev); - return ERR_PTR(-ENOMEM); - } - *data = cap; - rfkill_dev->data = data; - rfkill_dev->toggle_radio = acer_rfkill_set; - rfkill_dev->user_claim_unsupported = 1; - - err = rfkill_register(rfkill_dev); - if (err) { - kfree(rfkill_dev->data); - rfkill_free(rfkill_dev); - return ERR_PTR(err); - } - return rfkill_dev; -} - -static int acer_rfkill_init(struct device *dev) -{ - wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN, - "acer-wireless", ACER_CAP_WIRELESS); - if (IS_ERR(wireless_rfkill)) - return PTR_ERR(wireless_rfkill); - - if (has_cap(ACER_CAP_BLUETOOTH)) { - bluetooth_rfkill = acer_rfkill_register(dev, - RFKILL_TYPE_BLUETOOTH, "acer-bluetooth", - ACER_CAP_BLUETOOTH); - if (IS_ERR(bluetooth_rfkill)) { - kfree(wireless_rfkill->data); - rfkill_unregister(wireless_rfkill); - return PTR_ERR(bluetooth_rfkill); - } - } - - schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ)); - - return 0; -} - -static void acer_rfkill_exit(void) -{ - cancel_delayed_work_sync(&acer_rfkill_work); - kfree(wireless_rfkill->data); - rfkill_unregister(wireless_rfkill); - if (has_cap(ACER_CAP_BLUETOOTH)) { - kfree(wireless_rfkill->data); - rfkill_unregister(bluetooth_rfkill); - } - return; -} +#define show_set_bool(value, cap) \ +static ssize_t \ +show_bool_##value(struct device *dev, struct device_attribute *attr, \ + char *buf) \ +{ \ + u32 result; \ + acpi_status status = get_u32(&result, cap); \ + if (ACPI_SUCCESS(status)) \ + return sprintf(buf, "%u\n", result); \ + return sprintf(buf, "Read error\n"); \ +} \ +\ +static ssize_t \ +set_bool_##value(struct device *dev, struct device_attribute *attr, \ + const char *buf, size_t count) \ +{ \ + u32 tmp = simple_strtoul(buf, NULL, 10); \ + acpi_status status = set_u32(tmp, cap); \ + if (ACPI_FAILURE(status)) \ + return -EINVAL; \ + return count; \ +} \ +static DEVICE_ATTR(value, S_IWUGO | S_IRUGO | S_IWUSR, \ + show_bool_##value, set_bool_##value); + +show_set_bool(wireless, ACER_CAP_WIRELESS); +show_set_bool(bluetooth, ACER_CAP_BLUETOOTH); +show_set_bool(threeg, ACER_CAP_THREEG); /* - * sysfs interface + * Read interface sysfs macro */ -static ssize_t show_bool_threeg(struct device *dev, - struct device_attribute *attr, char *buf) -{ - u32 result; \ - acpi_status status = get_u32(&result, ACER_CAP_THREEG); - if (ACPI_SUCCESS(status)) - return sprintf(buf, "%u\n", result); - return sprintf(buf, "Read error\n"); -} - -static ssize_t set_bool_threeg(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - u32 tmp = simple_strtoul(buf, NULL, 10); - acpi_status status = set_u32(tmp, ACER_CAP_THREEG); - if (ACPI_FAILURE(status)) - return -EINVAL; - return count; -} -static DEVICE_ATTR(threeg, S_IWUGO | S_IRUGO | S_IWUSR, show_bool_threeg, - set_bool_threeg); - static ssize_t show_interface(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1116,9 +1026,7 @@ static int __devinit acer_platform_probe(struct platform_device *device) goto error_brightness; } - err = acer_rfkill_init(&device->dev); - - return err; + return 0; error_brightness: acer_led_exit(); @@ -1132,8 +1040,6 @@ static int acer_platform_remove(struct platform_device *device) acer_led_exit(); if (has_cap(ACER_CAP_BRIGHTNESS)) acer_backlight_exit(); - - acer_rfkill_exit(); return 0; } @@ -1146,6 +1052,16 @@ pm_message_t state) if (!data) return -ENOMEM; + if (has_cap(ACER_CAP_WIRELESS)) { + get_u32(&value, ACER_CAP_WIRELESS); + data->wireless = value; + } + + if (has_cap(ACER_CAP_BLUETOOTH)) { + get_u32(&value, ACER_CAP_BLUETOOTH); + data->bluetooth = value; + } + if (has_cap(ACER_CAP_MAILLED)) { get_u32(&value, ACER_CAP_MAILLED); data->mailled = value; @@ -1166,6 +1082,15 @@ static int acer_platform_resume(struct platform_device *device) if (!data) return -ENOMEM; + if (has_cap(ACER_CAP_WIRELESS)) + set_u32(data->wireless, ACER_CAP_WIRELESS); + + if (has_cap(ACER_CAP_BLUETOOTH)) + set_u32(data->bluetooth, ACER_CAP_BLUETOOTH); + + if (has_cap(ACER_CAP_THREEG)) + set_u32(data->threeg, ACER_CAP_THREEG); + if (has_cap(ACER_CAP_MAILLED)) set_u32(data->mailled, ACER_CAP_MAILLED); @@ -1190,6 +1115,12 @@ static struct platform_device *acer_platform_device; static int remove_sysfs(struct platform_device *device) { + if (has_cap(ACER_CAP_WIRELESS)) + device_remove_file(&device->dev, &dev_attr_wireless); + + if (has_cap(ACER_CAP_BLUETOOTH)) + device_remove_file(&device->dev, &dev_attr_bluetooth); + if (has_cap(ACER_CAP_THREEG)) device_remove_file(&device->dev, &dev_attr_threeg); @@ -1202,6 +1133,20 @@ static int create_sysfs(void) { int retval = -ENOMEM; + if (has_cap(ACER_CAP_WIRELESS)) { + retval = device_create_file(&acer_platform_device->dev, + &dev_attr_wireless); + if (retval) + goto error_sysfs; + } + + if (has_cap(ACER_CAP_BLUETOOTH)) { + retval = device_create_file(&acer_platform_device->dev, + &dev_attr_bluetooth); + if (retval) + goto error_sysfs; + } + if (has_cap(ACER_CAP_THREEG)) { retval = device_create_file(&acer_platform_device->dev, &dev_attr_threeg); diff --git a/trunk/include/linux/kernel.h b/trunk/include/linux/kernel.h index 0b19848e380e..2651f805ba6d 100644 --- a/trunk/include/linux/kernel.h +++ b/trunk/include/linux/kernel.h @@ -190,30 +190,6 @@ extern int kernel_text_address(unsigned long addr); struct pid; extern struct pid *session_of_pgrp(struct pid *pgrp); -/* - * FW_BUG - * Add this to a message where you are sure the firmware is buggy or behaves - * really stupid or out of spec. Be aware that the responsible BIOS developer - * should be able to fix this issue or at least get a concrete idea of the - * problem by reading your message without the need of looking at the kernel - * code. - * - * Use it for definite and high priority BIOS bugs. - * - * FW_WARN - * Use it for not that clear (e.g. could the kernel messed up things already?) - * and medium priority BIOS bugs. - * - * FW_INFO - * Use this one if you want to tell the user or vendor about something - * suspicious, but generally harmless related to the firmware. - * - * Use it for information or very low priority BIOS bugs. - */ -#define FW_BUG "[Firmware Bug]: " -#define FW_WARN "[Firmware Warn]: " -#define FW_INFO "[Firmware Info]: " - #ifdef CONFIG_PRINTK asmlinkage int vprintk(const char *fmt, va_list args) __attribute__ ((format (printf, 1, 0)));