ACPI & driver patch candidates for 2.6.33-rc4
Subsystems (8)
Len Brown
reviewerplease speak up now if any of these should not go upstream.
thanks,
-Len
Len Brown
reviewerPATCH 1/16 ACPI: EC: Accelerate query execution
From: Alexey Starikovskiy <[email protected]>
Split EC query handling into acknowledge and execution phase. This allows much smaller pending query lattency and lowers chances of EC going "wild" and losing events.
Reference: http://bugzilla.kernel.org/show_bug.cgi?id=14858
--- drivers/acpi/ec.c | 122 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 77 insertions(+), 45 deletions(-)
drivers/acpi/ec.c +77 -45
@@ -201,14 +201,13 @@ unlock:spin_unlock_irqrestore (&ec->curr_lock, flags); } -static void acpi_ec_gpe_query (void *ec_cxt); +static int acpi_ec_sync_query (struct acpi_ec *ec); -static int ec_check_sci (struct acpi_ec *ec,u8 state) +static int ec_check_sci_sync (struct acpi_ec *ec,u8 state) {if (state &ACPI_EC_FLAG_SCI ) {if (!test_and_set_bit (EC_FLAGS_QUERY_PENDING , &ec->flags)) -return acpi_os_execute (OSL_EC_BURST_HANDLER , - acpi_ec_gpe_query, ec); +return acpi_ec_sync_query (ec); }return 0 ; }
@@ -249,11 +248,6 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, {unsigned long tmp;int ret =0 ; -pr_debug (PREFIX "transaction start\n" ); -/* disable GPE during transaction if storm is detected */ -if (test_bit (EC_FLAGS_GPE_STORM , &ec->flags)) { -acpi_disable_gpe (NULL , ec->gpe); - }if (EC_FLAGS_MSI )udelay (ACPI_EC_MSI_UDELAY );/* start transaction */
@@ -269,16 +263,6 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,spin_lock_irqsave (&ec->curr_lock, tmp); ec->curr =NULL ;spin_unlock_irqrestore (&ec->curr_lock, tmp); -if (test_bit (EC_FLAGS_GPE_STORM , &ec->flags)) { -/* check if we received SCI during transaction */ -ec_check_sci (ec,acpi_ec_read_status (ec)); -/* it is safe to enable GPE outside of transaction */ -acpi_enable_gpe (NULL , ec->gpe); - }else if (t->irq_count >ACPI_EC_STORM_THRESHOLD ) { -pr_info (PREFIX "GPE storm detected, " -"transactions will use polling mode\n" ); -set_bit (EC_FLAGS_GPE_STORM , &ec->flags); - }return ret; }
@@ -321,7 +305,24 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) status = -ETIME ; goto end; } +pr_debug (PREFIX "transaction start\n" ); +/* disable GPE during transaction if storm is detected */ +if (test_bit (EC_FLAGS_GPE_STORM , &ec->flags)) { +acpi_disable_gpe (NULL , ec->gpe); + } + status =acpi_ec_transaction_unlocked (ec, t); + +/* check if we received SCI during transaction */ +ec_check_sci_sync (ec,acpi_ec_read_status (ec)); +if (test_bit (EC_FLAGS_GPE_STORM , &ec->flags)) { +/* it is safe to enable GPE outside of transaction */ +acpi_enable_gpe (NULL , ec->gpe); + }else if (t->irq_count >ACPI_EC_STORM_THRESHOLD ) { +pr_info (PREFIX "GPE storm detected, " +"transactions will use polling mode\n" ); +set_bit (EC_FLAGS_GPE_STORM , &ec->flags); + } end:if (ec->global_lock)acpi_release_global_lock (glk);
@@ -443,7 +444,7 @@ int ec_transaction(u8 command,EXPORT_SYMBOL (ec_transaction); -static int acpi_ec_query (struct acpi_ec *ec,u8 * data) +static int acpi_ec_query_unlocked (struct acpi_ec *ec,u8 * data) {int result;u8 d;
@@ -452,20 +453,16 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data) .wlen = 0, .rlen = 1};if (!ec || !data)return -EINVAL ; -/* * Query the EC to find out which _Qxx method we need to evaluate. * Note that successful completion of the query causes the ACPI_EC_SCI * bit to be cleared (and thus clearing the interrupt source). */ - - result =acpi_ec_transaction (ec, &t); + result =acpi_ec_transaction_unlocked (ec, &t);if (result)return result; -if (!d)return -ENODATA ; - *data = d;return 0 ; }
@@ -509,43 +506,78 @@ void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)EXPORT_SYMBOL_GPL (acpi_ec_remove_query_handler); -static void acpi_ec_gpe_query (void *ec_cxt) +static void acpi_ec_run (void *cxt) { -struct acpi_ec *ec = ec_cxt; -u8 value =0 ; -struct acpi_ec_query_handler *handler, copy; - -if (!ec ||acpi_ec_query (ec, &value)) +struct acpi_ec_query_handler *handler = cxt; +if (!handler)return ; -mutex_lock (&ec->lock); +pr_debug (PREFIX "start query execution\n" ); +if (handler->func) + handler->func (handler->data); +else if (handler->handle) +acpi_evaluate_object (handler->handle,NULL ,NULL ,NULL ); +pr_debug (PREFIX "stop query execution\n" ); +kfree (handler); +} + +static int acpi_ec_sync_query (struct acpi_ec *ec) +{ +u8 value =0 ; +int status; +struct acpi_ec_query_handler *handler, *copy; +if ((status =acpi_ec_query_unlocked (ec, &value))) +return status;list_for_each_entry (handler, &ec->list, node) {if (value == handler->query_bit) {/* have custom handler for this bit */ -memcpy (©, handler,sizeof (copy)); -mutex_unlock (&ec->lock); -if (copy.func) { - copy.func (copy.data); - }else if (copy.handle) { -acpi_evaluate_object (copy.handle,NULL ,NULL ,NULL ); - } -return ; + copy =kmalloc (sizeof (*handler),GFP_KERNEL ); +if (!copy) +return -ENOMEM ; +memcpy (copy, handler,sizeof (*copy)); +pr_debug (PREFIX "push query execution (0x%2x) on queue\n" , value); +return acpi_os_execute (OSL_GPE_HANDLER , + acpi_ec_run, copy); } } +return 0 ; +} + +static void acpi_ec_gpe_query (void *ec_cxt) +{ +struct acpi_ec *ec = ec_cxt; +if (!ec) +return ; +mutex_lock (&ec->lock); +acpi_ec_sync_query (ec);mutex_unlock (&ec->lock); } +static void acpi_ec_gpe_query (void *ec_cxt); + +static int ec_check_sci (struct acpi_ec *ec,u8 state) +{ +if (state &ACPI_EC_FLAG_SCI ) { +if (!test_and_set_bit (EC_FLAGS_QUERY_PENDING , &ec->flags)) { +pr_debug (PREFIX "push gpe query to the queue\n" ); +return acpi_os_execute (OSL_NOTIFY_HANDLER , + acpi_ec_gpe_query, ec); + } + } +return 0 ; +} +static u32 acpi_ec_gpe_handler (void *data) {struct acpi_ec *ec = data; -u8 status;pr_debug (PREFIX "~~~> interrupt\n" ); - status =acpi_ec_read_status (ec); -advance_transaction (ec, status); -if (ec_transaction_done (ec) && (status &ACPI_EC_FLAG_IBF ) ==0 ) +advance_transaction (ec,acpi_ec_read_status (ec)); +if (ec_transaction_done (ec) && + (acpi_ec_read_status (ec) &ACPI_EC_FLAG_IBF ) ==0 ) {wake_up (&ec->wait); -ec_check_sci (ec, status); +ec_check_sci (ec,acpi_ec_read_status (ec)); + }return ACPI_INTERRUPT_HANDLED ; }
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 2/16 acpi_pad: fix error checks
In reply to Len BrownFrom: Chen Gong <[email protected]>
There are some fixes listed below:
1. When met a bogus BIOS, the return value of cpu number maybe is a negative value so that acpi_pad_pur get an unexpected result.
2. the return value of function acpi_pad_idle_cpus is useless.
3. enhance the process of create_power_saving_task/destroy_power_saving_task
4. Add more error checks when evaluating _PUR object.
5. one typo fix
--- drivers/acpi/acpi_pad.c | 37 ++++++++++++++++++++----------------- 1 files changed, 20 insertions(+), 17 deletions(-)
drivers/acpi/acpi_pad.c +20 -17
@@ -207,7 +207,7 @@ static int power_saving_thread(void *data)* the mechanism only works when all CPUs have RT task running, * as if one CPU hasn't RT task, RT task from other CPUs will * borrow CPU time from this CPU and cause RT task use > 95% -* CPU time. To make 'avoid staration' work, takes a nap here. +* CPU time. To make 'avoid starvation' work, takes a nap here. */ if (do_sleep)schedule_timeout_killable (HZ * idle_pct /100 );
@@ -221,14 +221,18 @@ static struct task_struct *ps_tsks[NR_CPUS];static unsigned int ps_tsk_num;static int create_power_saving_task (void ) { +int rc = -ENOMEM ; + ps_tsks[ps_tsk_num] =kthread_run (power_saving_thread, (void *)(unsigned long )ps_tsk_num,"power_saving/%d" , ps_tsk_num); -if (ps_tsks[ps_tsk_num]) { + rc =IS_ERR (ps_tsks[ps_tsk_num]) ?PTR_ERR (ps_tsks[ps_tsk_num]) :0 ; +if (!rc) ps_tsk_num++; -return 0 ; - } -return -EINVAL ; +else + ps_tsks[ps_tsk_num] =NULL ; + +return rc; }static void destroy_power_saving_task (void )
@@ -236,6 +240,7 @@ static void destroy_power_saving_task(void)if (ps_tsk_num >0 ) { ps_tsk_num--;kthread_stop (ps_tsks[ps_tsk_num]); + ps_tsks[ps_tsk_num] =NULL ; } }
@@ -252,7 +257,7 @@ static void set_power_saving_task_num(unsigned int num) } } -static int acpi_pad_idle_cpus (unsigned int num_cpus) +static void acpi_pad_idle_cpus (unsigned int num_cpus) {get_online_cpus ();
@@ -260,7 +265,6 @@ static int acpi_pad_idle_cpus(unsigned int num_cpus)set_power_saving_task_num (num_cpus);put_online_cpus (); -return 0 ; }static uint32_t acpi_pad_idle_cpus_num (void )
@@ -368,19 +372,21 @@ static void acpi_pad_remove_sysfs(struct acpi_device *device)static int acpi_pad_pur (acpi_handle handle,int *num_cpus) {struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER ,NULL }; -acpi_status status;union acpi_object *package;int rev, num, ret = -EINVAL ; - status =acpi_evaluate_object (handle,"_PUR" ,NULL , &buffer); -if (ACPI_FAILURE (status)) +if (ACPI_FAILURE (acpi_evaluate_object (handle,"_PUR" ,NULL , &buffer))) +return -EINVAL ; + +if (!buffer.length || !buffer.pointer)return -EINVAL ; + package = buffer.pointer;if (package->type !=ACPI_TYPE_PACKAGE || package->package.count !=2 ) goto out; rev = package->package.elements[0 ].integer.value; num = package->package.elements[1 ].integer.value; -if (rev !=1 ) +if (rev !=1 || num <0 ) goto out; *num_cpus = num; ret =0 ;
@@ -409,7 +415,7 @@ static void acpi_pad_ost(acpi_handle handle, int stat,static void acpi_pad_handle_notify (acpi_handle handle) { -int num_cpus, ret; +int num_cpus;uint32_t idle_cpus;mutex_lock (&isolated_cpus_lock);
@@ -417,12 +423,9 @@ static void acpi_pad_handle_notify(acpi_handle handle)mutex_unlock (&isolated_cpus_lock);return ; } - ret =acpi_pad_idle_cpus (num_cpus); +acpi_pad_idle_cpus (num_cpus); idle_cpus =acpi_pad_idle_cpus_num (); -if (!ret) -acpi_pad_ost (handle,0 , idle_cpus); -else -acpi_pad_ost (handle,1 ,0 ); +acpi_pad_ost (handle,0 , idle_cpus);mutex_unlock (&isolated_cpus_lock); }
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 3/16 ACPI video: Prune dupe video devices, unless "video.allow_duplicates"
In reply to Len BrownFrom: Zhang Rui <[email protected]>
Some buggy BIOS exports multiple ACPI video bus devices for the same VGA controller, and multiple backlight control methods as well. This messes up the ACPI video backlight control.
http://bugzilla.kernel.org/show_bug.cgi?id=13577
With this patch applied, only the FIRST ACPI video bus device under a PCI device node is bind to ACPI video driver by default.
If the first ACPI video bus device doesn't work well, we can use video.allow_duplicates=1 to go back to the old behavior.
--- drivers/acpi/video.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-)
drivers/acpi/video.c +43 -0
@@ -78,6 +78,13 @@ MODULE_LICENSE("GPL");static int brightness_switch_enabled =1 ;module_param (brightness_switch_enabled, bool,0644 ); +/* +* By default, we don't allow duplicate ACPI video bus devices +* under the same VGA controller +*/ +static int allow_duplicates; +module_param (allow_duplicates, bool,0644 ); +static int register_count =0 ;static int acpi_video_bus_add (struct acpi_device *device);static int acpi_video_bus_remove (struct acpi_device *device,int type);
@@ -2233,11 +2240,47 @@ static int acpi_video_resume(struct acpi_device *device)return AE_OK ; } +static acpi_status +acpi_video_bus_match (acpi_handle handle,u32 level,void *context, +void **return_value) +{ +struct acpi_device *device = context; +struct acpi_device *sibling; +int result; + +if (handle == device->handle) +return AE_CTRL_TERMINATE ; + + result =acpi_bus_get_device (handle, &sibling); +if (result) +return AE_OK ; + +if (!strcmp (acpi_device_name (sibling),ACPI_VIDEO_BUS_NAME )) +return AE_ALREADY_EXISTS ; + +return AE_OK ; +} +static int acpi_video_bus_add (struct acpi_device *device) {struct acpi_video_bus *video;struct input_dev *input;int error; +acpi_status status; + + status =acpi_walk_namespace (ACPI_TYPE_DEVICE , + device->parent->handle,1 , + acpi_video_bus_match,NULL , + device,NULL ); +if (status ==AE_ALREADY_EXISTS ) { + printk(KERN_WARNING FW_BUG +"Duplicate ACPI video bus devices for the" +" same VGA controller, please try module " +"parameter \"video.allow_duplicates=1\"" + "if the current driver doesn't work.\n"); +if (!allow_duplicates) +return -ENODEV ; + } video =kzalloc (sizeof (struct acpi_video_bus ),GFP_KERNEL );if (!video)
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 4/16 x86, ACPI: delete acpi_boot_table_init() return value
In reply to Len BrownFrom: Len Brown <[email protected]>
cleanup only.
setup_arch(), doesn't care care if ACPI initialization succeeded or failed, so delete acpi_boot_table_init()'s return value.
--- arch/x86/kernel/acpi/boot.c | 22 ++++++---------------- include/linux/acpi.h | 6 +++--- 2 files changed, 9 insertions(+), 19 deletions(-)
arch/x86/kernel/acpi/boot.c +6 -16
@@ -1529,16 +1529,10 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = {* if acpi_blacklisted() acpi_disabled = 1; * acpi_irq_model=... * ... -* -* return value: (currently ignored) -* 0: success -* !0: failure */ -int __init acpi_boot_table_init (void ) +void __init acpi_boot_table_init (void ) { -int error; -dmi_check_system (acpi_dmi_table);/*
@@ -1546,15 +1540,14 @@ int __init acpi_boot_table_init(void)* One exception: acpi=ht continues far enough to enumerate LAPICs */ if (acpi_disabled && !acpi_ht) -return 1 ; +return ;/* * Initialize the ACPI boot-time table parser. */ - error =acpi_table_init (); -if (error) { +if (acpi_table_init ()) {disable_acpi (); -return error; +return ; }acpi_table_parse (ACPI_SIG_BOOT , acpi_parse_sbf);
@@ -1562,18 +1555,15 @@ int __init acpi_boot_table_init(void)/* * blacklist may disable ACPI entirely */ - error =acpi_blacklisted (); -if (error) { +if (acpi_blacklisted ()) {if (acpi_force) { printk(KERN_WARNING PREFIX "acpi=force override\n"); }else { printk(KERN_WARNING PREFIX "Disabling ACPI support\n");disable_acpi (); -return error; +return ; } } - -return 0 ; }int __init early_acpi_boot_init (void )
include/linux/acpi.h +3 -3
@@ -80,7 +80,7 @@ char * __acpi_map_table (unsigned long phys_addr, unsigned long size);void __acpi_unmap_table (char *map,unsigned long size);int early_acpi_boot_init (void );int acpi_boot_init (void ); -int acpi_boot_table_init (void ); +void acpi_boot_table_init (void );int acpi_mps_check (void );int acpi_numa_init (void );
@@ -321,9 +321,9 @@ static inline int acpi_boot_init(void)return 0 ; } -static inline int acpi_boot_table_init (void ) +static inline void acpi_boot_table_init (void ) { -return 0 ; +return ; }static inline int acpi_mps_check (void )
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 5/16 drm/i915: Add HP nx9020/Samsung SX20S to ACPI LID quirk list
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
The HP comaq nx9020/Samsung SX20S laptop always report that the LID status is closed and we can't use it reliabily for LVDS detection. So add the two boxes into the quirk list.
http://bugzilla.kernel.org/show_bug.cgi?id=14957
http://bugzilla.kernel.org/show_bug.cgi?id=14554
--- drivers/gpu/drm/i915/intel_lvds.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
drivers/gpu/drm/i915/intel_lvds.c +14 -0
@@ -602,6 +602,20 @@ static void intel_lvds_mode_set(struct drm_encoder *encoder,/* Some lid devices report incorrect lid status, assume they're connected */ static const struct dmi_system_id bad_lid_status[] = { { + .ident ="Compaq nx9020" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), +DMI_MATCH (DMI_BOARD_NAME ,"3084" ), + }, + }, + { + .ident ="Samsung SX20S" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Samsung Electronics" ), +DMI_MATCH (DMI_BOARD_NAME ,"SX20S" ), + }, + }, + { .ident ="Aspire One" , .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ),
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 6/16 ACPI: SBS: Move SBS HC callback to faster Notify queue
In reply to Len BrownFrom: Alexey Starikovskiy <[email protected]>
SBS transactions should happen in Notify work queue, to not create a dead lock with GPE execution accessing SBS devices.
--- drivers/acpi/ec.c | 3 ++- drivers/acpi/sbshc.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/acpi/ec.c +2 -1
@@ -535,7 +535,8 @@ static int acpi_ec_sync_query(struct acpi_ec *ec)return -ENOMEM ;memcpy (copy, handler,sizeof (*copy));pr_debug (PREFIX "push query execution (0x%2x) on queue\n" , value); -return acpi_os_execute (OSL_GPE_HANDLER , +return acpi_os_execute ((copy->func) ? +OSL_NOTIFY_HANDLER :OSL_GPE_HANDLER , acpi_ec_run, copy); } }
drivers/acpi/sbshc.c +1 -1
@@ -242,7 +242,7 @@ static int smbus_alarm(void *context)case ACPI_SBS_CHARGER :case ACPI_SBS_MANAGER :case ACPI_SBS_BATTERY : -acpi_os_execute (OSL_GPE_HANDLER , +acpi_os_execute (OSL_NOTIFY_HANDLER , acpi_smbus_callback, hc);default :; }
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 7/16 ACPI: EC: Add wait for irq storm
In reply to Len BrownFrom: Alexey Starikovskiy <[email protected]>
Merge of poll and irq modes accelerated EC transaction, so that keyboard starts to suffer again. Add msleep(1) into transaction path for the storm to allow keyboard controller to do its job.
Reference: http://bugzilla.kernel.org/show_bug.cgi?id=14747
--- drivers/acpi/ec.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/acpi/ec.c +2 -1
@@ -259,7 +259,6 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,clear_bit (EC_FLAGS_QUERY_PENDING , &ec->flags);spin_unlock_irqrestore (&ec->curr_lock, tmp); ret =ec_poll (ec); -pr_debug (PREFIX "transaction end\n" );spin_lock_irqsave (&ec->curr_lock, tmp); ec->curr =NULL ;spin_unlock_irqrestore (&ec->curr_lock, tmp);
@@ -316,6 +315,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)/* check if we received SCI during transaction */ ec_check_sci_sync (ec,acpi_ec_read_status (ec));if (test_bit (EC_FLAGS_GPE_STORM , &ec->flags)) { +msleep (1 );/* it is safe to enable GPE outside of transaction */ acpi_enable_gpe (NULL , ec->gpe); }else if (t->irq_count >ACPI_EC_STORM_THRESHOLD ) {
@@ -323,6 +323,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) "transactions will use polling mode\n");set_bit (EC_FLAGS_GPE_STORM , &ec->flags); } +pr_debug (PREFIX "transaction end\n" ); end:if (ec->global_lock)acpi_release_global_lock (glk);
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 8/16 ACPI: Advertise to BIOS in _OSC: _OST on _PPC changes
In reply to Len BrownFrom: Zhao Yakui <[email protected]>
If the BIOS pokes the system-wide OSC bits to see if Linux supports evaluating _OST after a _PPC change notification, answer yes.
Also, fix an oversight where we neglected to set the OSC bit advertising processor aggregator device support when acpi-pad is compiled as a module.
--- drivers/acpi/bus.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
drivers/acpi/bus.c +6 -1
@@ -490,9 +490,14 @@ static void acpi_bus_osc_support(void) capbuf[OSC_QUERY_TYPE ] =OSC_QUERY_ENABLE ; capbuf[OSC_SUPPORT_TYPE ] =OSC_SB_PR3_SUPPORT ;/* _PR3 is in use */ -#ifdef CONFIG_ACPI_PROCESSOR_AGGREGATOR +#if defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR ) ||\ + defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR_MODULE ) capbuf[OSC_SUPPORT_TYPE ] |=OSC_SB_PAD_SUPPORT ;#endif + +#if defined(CONFIG_ACPI_PROCESSOR ) || defined(CONFIG_ACPI_PROCESSOR_MODULE ) + capbuf[OSC_SUPPORT_TYPE ] |=OSC_SB_PPC_OST_SUPPORT ; +#endif if (ACPI_FAILURE (acpi_get_handle (NULL ,"\\_SB" , &handle)))return ;if (ACPI_SUCCESS (acpi_run_osc (handle, &context)))
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 9/16 ACPI: Remove unnecessary cast.
In reply to Len BrownFrom: H Hartley Sweeten <[email protected]>
The struct seq_file 'private' member is a void *, the cast is not needed. Also, remove an extra whitespace line.
--- drivers/acpi/processor_thermal.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
drivers/acpi/processor_thermal.c +1 -2
@@ -443,8 +443,7 @@ struct thermal_cooling_device_ops processor_cooling_ops = {#ifdef CONFIG_ACPI_PROCFS static int acpi_processor_limit_seq_show (struct seq_file *seq,void *offset) { -struct acpi_processor *pr = (struct acpi_processor *)seq->private; - +struct acpi_processor *pr = seq->private;if (!pr) goto end;
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 10/16 ACPI: don't cond_resched if irq is disabled
In reply to Len BrownFrom: Xiaotian Feng <[email protected]>
commit 8bd108d adds preemption point after each opcode parse, then a sleeping function called from invalid context bug was founded during suspend/resume stage. this was fixed in commit abe1dfa by don't cond_resched when irq_disabled. But recent commit 138d156 changes the behaviour to don't cond_resched when in_atomic. This makes the sleeping function called from invalid context bug happen again, which is reported in http://lkml.org/lkml/2009/12/1/371.
This patch also fixes http://bugzilla.kernel.org/show_bug.cgi?id=14483
--- include/acpi/platform/aclinux.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/acpi/platform/aclinux.h +1 -1
@@ -152,7 +152,7 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)#include <linux/hardirq.h> #define ACPI_PREEMPTION_POINT () \ do { \ - if (!in_atomic_preempt_off()) \ + if (!in_atomic_preempt_off() && !irqs_disabled()) \ cond_resched(); \ } while (0)
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 11/16 eeepc-laptop: disable cpu speed control on EeePC 701
In reply to Len BrownFrom: Alan Jenkins <[email protected]>
The EeePC 4G ("701") implements CFVS, but it is not supported by the pre-installed OS, and the original option to change it in the BIOS setup screen was removed in later versions. Judging by the lack of "Super Hybrid Engine" on Asus product pages, this applies to all "701" models (4G/4G Surf/2G Surf).
So Asus made a deliberate decision not to support it on this model. We have several reports that using it can cause the system to hang [1]. That said, it does not happen all the time. Some users do not experience it at all (and apparently wish to continue "right-clocking").
Check for the EeePC 701 using DMI. If met, then disable writes to the "cpufv" sysfs attribute and log an explanatory message.
Add a "cpufv_disabled" attribute which allow users to override this policy. Writing to this attribute will log a second message.
The sysfs attribute is more useful than a module option, because it makes it easier for userspace scripts to provide consistent behaviour (according to user configuration), regardless of whether the kernel includes this change.
[1] <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=559578>
--- drivers/platform/x86/eeepc-laptop.c | 87 +++++++++++++++++++++++++++++++++++ 1 files changed, 87 insertions(+), 0 deletions(-)
drivers/platform/x86/eeepc-laptop.c +87 -0
@@ -35,6 +35,7 @@#include <linux/pci.h> #include <linux/pci_hotplug.h> #include <linux/leds.h> +#include <linux/dmi.h> #define EEEPC_LAPTOP_VERSION "0.1"#define EEEPC_LAPTOP_NAME "Eee PC Hotkey Driver"
@@ -159,6 +160,7 @@ struct eeepc_laptop {acpi_handle handle;/* the handle of the acpi device */ u32 cm_supported;/* the control methods supported by this BIOS */ +bool cpufv_disabled;u16 event_count[128 ];/* count for each event */ struct platform_device *platform_device;
@@ -378,6 +380,8 @@ static ssize_t store_cpufv(struct device *dev,struct eeepc_cpufv c;int rv, value; +if (eeepc->cpufv_disabled) +return -EPERM ;if (get_cpufv (eeepc, &c))return -ENODEV ; rv =parse_arg (buf, count, &value);
@@ -389,6 +393,41 @@ static ssize_t store_cpufv(struct device *dev,return rv; } +static ssize_t show_cpufv_disabled (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +struct eeepc_laptop *eeepc =dev_get_drvdata (dev); + +return sprintf (buf,"%d\n" , eeepc->cpufv_disabled); +} + +static ssize_t store_cpufv_disabled (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ +struct eeepc_laptop *eeepc =dev_get_drvdata (dev); +int rv, value; + + rv =parse_arg (buf, count, &value); +if (rv <0 ) +return rv; + +switch (value) { +case 0 : +if (eeepc->cpufv_disabled) +pr_warning ("cpufv enabled (not officially supported " +"on this model)\n" ); + eeepc->cpufv_disabled = false; +return rv; +case 1 : +return -EPERM ; +default : +return -EINVAL ; + } +} + +static struct device_attribute dev_attr_cpufv = { .attr = { .name ="cpufv" ,
@@ -404,12 +443,22 @@ static struct device_attribute dev_attr_available_cpufv = { .show = show_available_cpufv }; +static struct device_attribute dev_attr_cpufv_disabled = { + .attr = { + .name ="cpufv_disabled" , + .mode =0644 }, + .show = show_cpufv_disabled, + .store = store_cpufv_disabled +}; + +static struct attribute *platform_attributes[] = { &dev_attr_camera.attr, &dev_attr_cardr.attr, &dev_attr_disp.attr, &dev_attr_cpufv.attr, &dev_attr_available_cpufv.attr, + &dev_attr_cpufv_disabled.attr,NULL };
@@ -1261,6 +1310,42 @@ static void eeepc_acpi_notify(struct acpi_device *device, u32 event) } } +static void eeepc_dmi_check (struct eeepc_laptop *eeepc) +{ +const char *model; + +/* +* Blacklist for setting cpufv (cpu speed). +* +* EeePC 4G ("701") implements CFVS, but it is not supported +* by the pre-installed OS, and the original option to change it +* in the BIOS setup screen was removed in later versions. +* +* Judging by the lack of "Super Hybrid Engine" on Asus product pages, +* this applies to all "701" models (4G/4G Surf/2G Surf). +* +* So Asus made a deliberate decision not to support it on this model. +* We have several reports that using it can cause the system to hang +* +* The hang has also been reported on a "702" (Model name "8G"?). +* +* We avoid dmi_check_system() / dmi_match(), because they use +* substring matching. We don't want to affect the "701SD" +* and "701SDX" models, because they do support S.H.E. +*/ + + model =dmi_get_system_info (DMI_PRODUCT_NAME ); +if (!model) +return ; + +if (strcmp (model,"701" ) ==0 ||strcmp (model,"702" ) ==0 ) { + eeepc->cpufv_disabled = true; +pr_info ("model %s does not officially support setting cpu " +"speed\n" , model); +pr_info ("cpufv disabled to avoid instability\n" ); + } +} +static void cmsg_quirk (struct eeepc_laptop *eeepc,int cm,const char *name) {int dummy;
@@ -1342,6 +1427,8 @@ static int __devinit eeepc_acpi_add(struct acpi_device *device)strcpy (acpi_device_class (device),EEEPC_ACPI_CLASS ); device->driver_data = eeepc; +eeepc_dmi_check (eeepc); + result =eeepc_acpi_init (eeepc, device);if (result) goto fail_platform;
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 12/16 eeepc-laptop: dmi blacklist to disable pci hotplug code
In reply to Len BrownFrom: Corentin Chary <[email protected]>
This is a short term workaround for Eeepc 1005HA.
refs: <http://bugzilla.kernel.org/show_bug.cgi?id=14570>
--- drivers/platform/x86/eeepc-laptop.c | 25 ++++++++++++++++++++----- 1 files changed, 20 insertions(+), 5 deletions(-)
drivers/platform/x86/eeepc-laptop.c +20 -5
@@ -161,6 +161,7 @@ struct eeepc_laptop {u32 cm_supported;/* the control methods supported by this BIOS */ bool cpufv_disabled; +bool hotplug_disabled;u16 event_count[128 ];/* count for each event */ struct platform_device *platform_device;
@@ -845,6 +846,9 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)if (result && result != -ENODEV ) goto exit; +if (eeepc->hotplug_disabled) +return 0 ; + result =eeepc_setup_pci_hotplug (eeepc);/* * If we get -EBUSY then something else is handling the PCI hotplug -
@@ -1314,6 +1318,10 @@ static void eeepc_dmi_check(struct eeepc_laptop *eeepc) {const char *model; + model =dmi_get_system_info (DMI_PRODUCT_NAME ); +if (!model) +return ; +/* * Blacklist for setting cpufv (cpu speed). *
@@ -1333,17 +1341,24 @@ static void eeepc_dmi_check(struct eeepc_laptop *eeepc)* substring matching. We don't want to affect the "701SD" * and "701SDX" models, because they do support S.H.E. */ - - model =dmi_get_system_info (DMI_PRODUCT_NAME ); -if (!model) -return ; -if (strcmp (model,"701" ) ==0 ||strcmp (model,"702" ) ==0 ) { eeepc->cpufv_disabled = true;pr_info ("model %s does not officially support setting cpu " "speed\n" , model);pr_info ("cpufv disabled to avoid instability\n" ); } + +/* +* Blacklist for wlan hotplug +* +* Eeepc 1005HA doesn't work like others models and don't need the +* hotplug code. In fact, current hotplug code seems to unplug another +* device... +*/ +if (strcmp (model,"1005HA" ) ==0 ) { + eeepc->hotplug_disabled = true; +pr_info ("wlan hotplug disabled\n" ); + } }static void cmsg_quirk (struct eeepc_laptop *eeepc,int cm,const char *name)
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 13/16 eeepc-laptop: switch to using sparse keymap library
In reply to Len BrownFrom: Dmitry Torokhov <[email protected]>
--- drivers/platform/x86/Kconfig | 1 + drivers/platform/x86/eeepc-laptop.c | 186 ++++++++++------------------------- 2 files changed, 52 insertions(+), 135 deletions(-)
drivers/platform/x86/Kconfig +1 -0
@@ -364,6 +364,7 @@ config EEEPC_LAPTOP select HWMON select LEDS_CLASS select NEW_LEDS + select INPUT_SPARSEKMAP ---help--- This driver supports the Fn-Fx keys on Eee PC laptops.
drivers/platform/x86/eeepc-laptop.c +51 -135
236 lines not on this page · raw message
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 14/16 eeepc-laptop: add hotplug_disable parameter
In reply to Len BrownFrom: Corentin Chary <[email protected]>
Some new models need to disable wireless hotplug. For the moment, we don't know excactly what models need that, except 1005HA.
Users will be able to use that param as a workaround.
--- drivers/platform/x86/eeepc-laptop.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
drivers/platform/x86/eeepc-laptop.c +10 -0
@@ -50,6 +50,14 @@ MODULE_AUTHOR("Corentin Chary, Eric Cooper");MODULE_DESCRIPTION (EEEPC_LAPTOP_NAME );MODULE_LICENSE ("GPL" ); +static bool hotplug_disabled; + +module_param (hotplug_disabled, bool,0644 ); +MODULE_PARM_DESC (hotplug_disabled, +"Disable hotplug for wireless device. " +"If your laptop need that, please report to " +"[email protected]." ); +/* * Definitions for Asus EeePC */
@@ -1356,6 +1364,8 @@ static int __devinit eeepc_acpi_add(struct acpi_device *device)strcpy (acpi_device_class (device),EEEPC_ACPI_CLASS ); device->driver_data = eeepc; + eeepc->hotplug_disabled = hotplug_disabled; +eeepc_dmi_check (eeepc); result =eeepc_acpi_init (eeepc, device);
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 15/16 eeepc-laptop: disable wireless hotplug for 1201N
In reply to Len BrownFrom: Corentin Chary <[email protected]>
--- drivers/platform/x86/eeepc-laptop.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/platform/x86/eeepc-laptop.c +1 -1
@@ -1277,7 +1277,7 @@ static void eeepc_dmi_check(struct eeepc_laptop *eeepc)* hotplug code. In fact, current hotplug code seems to unplug another * device... */ -if (strcmp (model,"1005HA" ) ==0 ) { +if (strcmp (model,"1005HA" ) ==0 ||strcmp (model,"1201N" ) ==0 ) { eeepc->hotplug_disabled = true;pr_info ("wlan hotplug disabled\n" ); }
Signature · 1 line
1.6.0.6
Len Brown
reviewerPATCH 16/16 ACPI: Fix section mismatch error for acpi_early_processor_set_pdc()
In reply to Len BrownFrom: Luck, Tony <[email protected]>
Alex Chiang introduced acpi_early_processor_set_pdc() in commit:
ACPI: processor: call _PDC early 78f1699659963fff97975df44db6d5dbe7218e55
But this results in a section mismatch:
WARNING: drivers/acpi/acpi.o(.text+0xa9c1): Section mismatch in reference from the function acpi_early_processor_set_pdc() to the variable .cpuinit.data:processor_idle_dmi_table The function acpi_early_processor_set_pdc() references
the variable __cpuinitdata processor_idle_dmi_table.
This is often because acpi_early_processor_set_pdc lacks a __cpuinitdata annotation or the annotation of processor_idle_dmi_table is wrong.
The only caller of acpi_early_processor_set_pdc() is acpi_bus_init() which is an "__init" function. So the correct fix here is to mark acpi_early_processor_set_pdc() "__init" too.
--- drivers/acpi/processor_pdc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/acpi/processor_pdc.c +1 -1
@@ -151,7 +151,7 @@ early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv)return AE_OK ; } -void acpi_early_processor_set_pdc (void ) +void __init acpi_early_processor_set_pdc (void ) {/* * Check whether the system is DMI table. If yes, OSPM
Signature · 1 line
1.6.0.6
Quoted 1 line · Len Brown
please speak up now if any of these should not go upstream.
Hi Len,
Please also apply
[PATCH] sony-laptop - fix using of uninitialized variable
from Dmitry on Jan 10th[1]
[1]: http://patchwork.kernel.org/patch/71976/
Signature · 2 lines
mattia :wq!