* [Patch 0/3] eeepc-laptop updates @ 2008-11-17 13:33 Matthew Garrett 2008-11-17 13:35 ` [Patch 1/3] eeepc-laptop: Add support for extended hotkeys Matthew Garrett 0 siblings, 1 reply; 5+ messages in thread From: Matthew Garrett @ 2008-11-17 13:33 UTC (permalink / raw) To: Corentin Chary, ecc; +Cc: linux acpi, linux-kernel (This time with correct addresses...) This patch series includes patches for the extended hotkeys on the later Eees, tidying up some rfkill warnings and making the rfkill PCI hotplug work correctly on the current Eees. -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Patch 1/3] eeepc-laptop: Add support for extended hotkeys 2008-11-17 13:33 [Patch 0/3] eeepc-laptop updates Matthew Garrett @ 2008-11-17 13:35 ` Matthew Garrett 2008-11-17 13:38 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Matthew Garrett 0 siblings, 1 reply; 5+ messages in thread From: Matthew Garrett @ 2008-11-17 13:35 UTC (permalink / raw) To: Corentin Chary, ecc; +Cc: linux acpi, linux-kernel Newer Eees have extra hotkeys above the function keys. This patch adds support for sending them through the input layer. Some default keycodes are added, but these can be remapped by the user. Signed-off-by: Matthew Garrett <mjg@redhat.com> diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c index 9ef98b2..e81ef18 100644 --- a/drivers/misc/eeepc-laptop.c +++ b/drivers/misc/eeepc-laptop.c @@ -161,6 +161,10 @@ static struct key_entry eeepc_keymap[] = { {KE_KEY, 0x13, KEY_MUTE }, {KE_KEY, 0x14, KEY_VOLUMEDOWN }, {KE_KEY, 0x15, KEY_VOLUMEUP }, + {KE_KEY, 0x1a, KEY_COFFEE }, + {KE_KEY, 0x1b, KEY_ZOOM }, + {KE_KEY, 0x1c, KEY_PROG2 }, + {KE_KEY, 0x1d, KEY_PROG3 }, {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE }, {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE }, {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE }, -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Patch 2/3] eeepc-laptop: Check return values from rfkill_register 2008-11-17 13:35 ` [Patch 1/3] eeepc-laptop: Add support for extended hotkeys Matthew Garrett @ 2008-11-17 13:38 ` Matthew Garrett 2008-11-17 13:41 ` [Patch 3/3] eeepc-laptop: Implement rfkill hotplugging in eeepc-laptop Matthew Garrett 2008-11-17 15:09 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Alan Jenkins 0 siblings, 2 replies; 5+ messages in thread From: Matthew Garrett @ 2008-11-17 13:38 UTC (permalink / raw) To: Corentin Chary, ecc; +Cc: linux acpi, linux-kernel We should check that rfkill registration succeeds and error out if it doesn't. This patch also sets the default state to match the BIOS on load. Signed-off-by: Matthew Garrett <mjg@redhat.com> diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c index e81ef18..4d70626 100644 --- a/drivers/misc/eeepc-laptop.c +++ b/drivers/misc/eeepc-laptop.c @@ -573,18 +573,25 @@ static int eeepc_hotk_add(struct acpi_device *device) RFKILL_TYPE_WLAN); if (!ehotk->eeepc_wlan_rfkill) - goto end; + goto wlan_fail; ehotk->eeepc_wlan_rfkill->name = "eeepc-wlan"; ehotk->eeepc_wlan_rfkill->toggle_radio = eeepc_wlan_rfkill_set; ehotk->eeepc_wlan_rfkill->get_state = eeepc_wlan_rfkill_state; - if (get_acpi(CM_ASL_WLAN) == 1) + if (get_acpi(CM_ASL_WLAN) == 1) { ehotk->eeepc_wlan_rfkill->state = RFKILL_STATE_UNBLOCKED; - else + rfkill_set_default(RFKILL_TYPE_WLAN, + RFKILL_STATE_UNBLOCKED); + } else { ehotk->eeepc_wlan_rfkill->state = RFKILL_STATE_SOFT_BLOCKED; - rfkill_register(ehotk->eeepc_wlan_rfkill); + rfkill_set_default(RFKILL_TYPE_WLAN, + RFKILL_STATE_SOFT_BLOCKED); + } + result = rfkill_register(ehotk->eeepc_wlan_rfkill); + if (result) + goto wlan_fail; } if (get_acpi(CM_ASL_BLUETOOTH) != -1) { @@ -592,22 +599,39 @@ static int eeepc_hotk_add(struct acpi_device *device) rfkill_allocate(&device->dev, RFKILL_TYPE_BLUETOOTH); if (!ehotk->eeepc_bluetooth_rfkill) - goto end; + goto bluetooth_fail; ehotk->eeepc_bluetooth_rfkill->name = "eeepc-bluetooth"; ehotk->eeepc_bluetooth_rfkill->toggle_radio = eeepc_bluetooth_rfkill_set; ehotk->eeepc_bluetooth_rfkill->get_state = eeepc_bluetooth_rfkill_state; - if (get_acpi(CM_ASL_BLUETOOTH) == 1) + if (get_acpi(CM_ASL_BLUETOOTH) == 1) { ehotk->eeepc_bluetooth_rfkill->state = RFKILL_STATE_UNBLOCKED; - else + rfkill_set_default(RFKILL_TYPE_BLUETOOTH, + RFKILL_STATE_UNBLOCKED); + } else { ehotk->eeepc_bluetooth_rfkill->state = RFKILL_STATE_SOFT_BLOCKED; - rfkill_register(ehotk->eeepc_bluetooth_rfkill); + rfkill_set_default(RFKILL_TYPE_BLUETOOTH, + RFKILL_STATE_SOFT_BLOCKED); + } + + result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); + if (result) + goto bluetooth_fail; } + return 0; + bluetooth_fail: + if (ehotk->eeepc_bluetooth_rfkill) + rfkill_free(ehotk->eeepc_bluetooth_rfkill); + rfkill_unregister(ehotk->eeepc_wlan_rfkill); + ehotk->eeepc_wlan_rfkill = NULL; + wlan_fail: + if (ehotk->eeepc_wlan_rfkill) + rfkill_free(ehotk->eeepc_wlan_rfkill); end: if (result) { kfree(ehotk); -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Patch 3/3] eeepc-laptop: Implement rfkill hotplugging in eeepc-laptop 2008-11-17 13:38 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Matthew Garrett @ 2008-11-17 13:41 ` Matthew Garrett 2008-11-17 15:09 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Alan Jenkins 1 sibling, 0 replies; 5+ messages in thread From: Matthew Garrett @ 2008-11-17 13:41 UTC (permalink / raw) To: Corentin Chary, ecc; +Cc: linux acpi, linux-kernel The Eee implements rfkill by logically unplugging the wireless card from the PCI bus. Despite sending ACPI notifications, this does not appear to be implemented using standard ACPI hotplug - nor does the firmware provide the _OSC method required to support native PCIe hotplug. The only sensible choice appears to be to handle the hotplugging directly in the eeepc-laptop driver. Tested successfully on a 700, 900 and 901. Signed-off-by: Matthew Garrett <mjg@redhat.com> --- diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c index 4d70626..136c742 100644 --- a/drivers/misc/eeepc-laptop.c +++ b/drivers/misc/eeepc-laptop.c @@ -30,6 +30,7 @@ #include <linux/uaccess.h> #include <linux/input.h> #include <linux/rfkill.h> +#include <linux/pci.h> #define EEEPC_LAPTOP_VERSION "0.1" @@ -517,6 +518,41 @@ static void notify_brn(void) bd->props.brightness = read_brightness(bd); } +static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) +{ + struct pci_dev *dev; + struct pci_bus *bus = pci_find_bus(0, 1); + + if (event != ACPI_NOTIFY_BUS_CHECK) + return; + + if (!bus) { + printk(EEEPC_WARNING "Unable to find PCI bus 1?\n"); + return; + } + + if (get_acpi(CM_ASL_WLAN) == 1) { + dev = pci_get_slot(bus, 0); + if (dev) { + /* Device already present */ + pci_dev_put(dev); + return; + } + dev = pci_scan_single_device(bus, 0); + if (dev) { + pci_bus_assign_resources(bus); + if (pci_bus_add_device(dev)) + printk(EEEPC_ERR "Unable to hotplug wifi\n"); + } + } else { + dev = pci_get_slot(bus, 0); + if (dev) { + pci_remove_bus_device(dev); + pci_dev_put(dev); + } + } +} + static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) { static struct key_entry *key; @@ -543,6 +579,45 @@ static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) } } +static int eeepc_register_rfkill_notifier(char *node) +{ + acpi_status status = AE_OK; + acpi_handle handle; + + status = acpi_get_handle(NULL, node, &handle); + + if (ACPI_SUCCESS(status)) { + status = acpi_install_notify_handler(handle, + ACPI_SYSTEM_NOTIFY, + eeepc_rfkill_notify, + NULL); + if (ACPI_FAILURE(status)) + printk(EEEPC_WARNING + "Failed to register notify on %s\n", node); + } else + return -ENODEV; + + return 0; +} + +static void eeepc_unregister_rfkill_notifier(char *node) +{ + acpi_status status = AE_OK; + acpi_handle handle; + + status = acpi_get_handle(NULL, node, &handle); + + if (ACPI_SUCCESS(status)) { + status = acpi_remove_notify_handler(handle, + ACPI_SYSTEM_NOTIFY, + eeepc_rfkill_notify); + if (ACPI_FAILURE(status)) + printk(EEEPC_ERR + "Error removing rfkill notify handler %s\n", + node); + } +} + static int eeepc_hotk_add(struct acpi_device *device) { acpi_status status = AE_OK; @@ -622,6 +697,10 @@ static int eeepc_hotk_add(struct acpi_device *device) if (result) goto bluetooth_fail; } + + eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6"); + eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7"); + return 0; bluetooth_fail: @@ -650,6 +729,10 @@ static int eeepc_hotk_remove(struct acpi_device *device, int type) eeepc_hotk_notify); if (ACPI_FAILURE(status)) printk(EEEPC_ERR "Error removing notify handler\n"); + + eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6"); + eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7"); + kfree(ehotk); return 0; } -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Patch 2/3] eeepc-laptop: Check return values from rfkill_register 2008-11-17 13:38 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Matthew Garrett 2008-11-17 13:41 ` [Patch 3/3] eeepc-laptop: Implement rfkill hotplugging in eeepc-laptop Matthew Garrett @ 2008-11-17 15:09 ` Alan Jenkins 1 sibling, 0 replies; 5+ messages in thread From: Alan Jenkins @ 2008-11-17 15:09 UTC (permalink / raw) To: Matthew Garrett; +Cc: Corentin Chary, ecc, linux acpi, linux-kernel On 11/17/08, Matthew Garrett <mjg59@srcf.ucam.org> wrote: > We should check that rfkill registration succeeds and error out if it > doesn't. This patch also sets the default state to match the BIOS on > load. > > Signed-off-by: Matthew Garrett <mjg@redhat.com> > > diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c You change the usage of the "end" label so it's now only reached on failure. How about renaming it to "fail" or "ehotk_fail"? Also, it looks like "if (result)" is now redundant - result will always be non-zero in the error path. > + return 0; > > + bluetooth_fail: > + if (ehotk->eeepc_bluetooth_rfkill) > + rfkill_free(ehotk->eeepc_bluetooth_rfkill); > + rfkill_unregister(ehotk->eeepc_wlan_rfkill); > + ehotk->eeepc_wlan_rfkill = NULL; > + wlan_fail: > + if (ehotk->eeepc_wlan_rfkill) > + rfkill_free(ehotk->eeepc_wlan_rfkill); > end: > if (result) { > kfree(ehotk); ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-11-17 15:09 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-11-17 13:33 [Patch 0/3] eeepc-laptop updates Matthew Garrett 2008-11-17 13:35 ` [Patch 1/3] eeepc-laptop: Add support for extended hotkeys Matthew Garrett 2008-11-17 13:38 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Matthew Garrett 2008-11-17 13:41 ` [Patch 3/3] eeepc-laptop: Implement rfkill hotplugging in eeepc-laptop Matthew Garrett 2008-11-17 15:09 ` [Patch 2/3] eeepc-laptop: Check return values from rfkill_register Alan Jenkins
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox