Bug 15257
Summary: | drivers/input/misc/winbond-cir.c breaks suspend | ||
---|---|---|---|
Product: | Drivers | Reporter: | David Härdeman (david) |
Component: | Input Devices | Assignee: | David Härdeman (david) |
Status: | RESOLVED CODE_FIX | ||
Severity: | normal | CC: | alan, rui.zhang |
Priority: | P1 | ||
Hardware: | All | ||
OS: | Linux | ||
URL: | http://www.spinics.net/lists/linux-input/msg07041.html | ||
Kernel Version: | git checkout between 2.6.33-rc6 and 2.6.33-rc7 | Subsystem: | |
Regression: | No | Bisected commit-id: | |
Bug Depends on: | |||
Bug Blocks: | 56331 | ||
Attachments: |
debug log captured by netconsole during suspend/resume/suspend
decompiled dsdt |
Description
David Härdeman
2010-02-08 10:09:06 UTC
Created attachment 24949 [details]
debug log captured by netconsole during suspend/resume/suspend
Created attachment 24950 [details]
decompiled dsdt
Sorry - semi automatic adding of maintainer backfired given who filed the bug itself I'm just getting more and more confused in trying to debug this...if I insert this: if (1) { struct acpi_device *acpi_dev = device->data; acpi_handle handle = acpi_dev->handle; char prefix[80] = {'\0'}; struct acpi_buffer buffer = {sizeof(prefix), prefix}; acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); printk("Calling _DIS on %s (0x%p)\n", prefix, handle); acpi_dbg_level=0xFFFFFFFF; printk("_DIS first attempt\n"); if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL))) printk("Calling _DIS once Failed\n"); printk("_DIS second attempt\n"); if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL))) printk("Calling _DIS twice Failed\n"); acpi_dbg_level=0x3; } at random places in my driver's probe method, it seems to work as long as it's placed before the request_irq() call, whenever it's after the request_irq() call, the machine hangs... But looking at the "_DIS" method from the dsdt...all it does (as far as I can tell) is: 1) Acquire mutex 2) Set logical device number in SuperIO chip 3) Write a disable bit at 0x30 4) Release mutex So why would the request_irq() call have any bearing on "_DIS"....??? Answer: Because calling _DIS immediately generates an IRQ with all status bits set...would the proper fix be to use disable_irq() / enable_irq() at the right places (suspend/resume) in the driver? Patch sent to linux-input and linux-kernel please attach the url to this patch. re-assign to linux-input category. Patch URL added... Fixed with commit 197d4db752e67160d79fed09968c2140376a80a3 |