[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20090622132906.6dc5b08c.sfr@canb.auug.org.au>
Date: Mon, 22 Jun 2009 13:29:06 +1000
From: Stephen Rothwell <sfr@...b.auug.org.au>
To: "John W. Linville" <linville@...driver.com>
Cc: linux-next@...r.kernel.org, linux-kernel@...r.kernel.org,
Corentin Chary <corentincj@...aif.net>,
Len Brown <lenb@...nel.org>,
Alan Jenkins <alan-jenkins@...fmail.co.uk>,
"David S. Miller" <davem@...emloft.net>
Subject: linux-next: manual merge of the net/wireless tree with the acpi
tree
Hi John,
Today's linux-next merge of the wireless tree got a conflict in
drivers/platform/x86/eeepc-laptop.c between commit
bd134968b9c14d3631e9e33599b27cef0e4d884e ("eeepc-laptop: rfkill
refactoring") from the acpi tree and commit
96e9cfeb9692b0bc6e03f9b6f9cb3c67a40b76d1 ("eeepc-laptop: read rfkill
soft-blocked state on resume") from the wireless tree.
The former changed the names of some structure entries that the latter
used. I fixed it up (see below) and can carry the fix for a while.
--
Cheers,
Stephen Rothwell sfr@...b.auug.org.au
diff --cc drivers/platform/x86/eeepc-laptop.c
index 67ad360,8153b3e..0000000
--- a/drivers/platform/x86/eeepc-laptop.c
+++ b/drivers/platform/x86/eeepc-laptop.c
@@@ -191,7 -180,7 +191,8 @@@ static struct key_entry eeepc_keymap[]
*/
static int eeepc_hotk_add(struct acpi_device *device);
static int eeepc_hotk_remove(struct acpi_device *device, int type);
+static void eeepc_hotk_notify(struct acpi_device *device, u32 event);
+ static int eeepc_hotk_resume(struct acpi_device *device);
static const struct acpi_device_id eeepc_device_ids[] = {
{EEEPC_HOTK_HID, 0},
@@@ -207,7 -195,7 +208,8 @@@ static struct acpi_driver eeepc_hotk_dr
.ops = {
.add = eeepc_hotk_add,
.remove = eeepc_hotk_remove,
+ .notify = eeepc_hotk_notify,
+ .resume = eeepc_hotk_resume,
},
};
@@@ -645,30 -514,14 +647,27 @@@ static int notify_brn(void
return -1;
}
+static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
+ u8 *value)
+{
+ int val = get_acpi(CM_ASL_WLAN);
+
+ if (val == 1 || val == 0)
+ *value = val;
+ else
+ return -EINVAL;
+
+ return 0;
+}
+
- static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
+ static void eeepc_rfkill_hotplug(void)
{
struct pci_dev *dev;
struct pci_bus *bus = pci_find_bus(0, 1);
bool blocked;
- if (event != ACPI_NOTIFY_BUS_CHECK)
- return;
-
if (!bus) {
- printk(EEEPC_WARNING "Unable to find PCI bus 1?\n");
+ pr_warning("Unable to find PCI bus 1?\n");
return;
}
@@@ -694,10 -547,18 +693,18 @@@
}
}
- rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, blocked);
+ rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
}
+ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
+ {
+ if (event != ACPI_NOTIFY_BUS_CHECK)
+ return;
+
+ eeepc_rfkill_hotplug();
+ }
+
-static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
+static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
{
static struct key_entry *key;
u16 count;
@@@ -869,6 -741,33 +876,33 @@@ static int eeepc_hotk_remove(struct acp
return 0;
}
+ static int eeepc_hotk_resume(struct acpi_device *device)
+ {
- if (ehotk->eeepc_wlan_rfkill) {
++ if (ehotk->wlan_rfkill) {
+ bool wlan;
+
+ /* Workaround - it seems that _PTS disables the wireless
+ without notification or changing the value read by WLAN.
+ Normally this is fine because the correct value is restored
+ from the non-volatile storage on resume, but we need to do
+ it ourself if case suspend is aborted, or we lose wireless.
+ */
+ wlan = get_acpi(CM_ASL_WLAN);
+ set_acpi(CM_ASL_WLAN, wlan);
+
- rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill,
++ rfkill_set_sw_state(ehotk->wlan_rfkill,
+ wlan != 1);
+
+ eeepc_rfkill_hotplug();
+ }
+
- if (ehotk->eeepc_bluetooth_rfkill)
- rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill,
++ if (ehotk->bluetooth_rfkill)
++ rfkill_set_sw_state(ehotk->bluetooth_rfkill,
+ get_acpi(CM_ASL_BLUETOOTH) != 1);
+
+ return 0;
+ }
+
/*
* Hwmon
*/
@@@ -1029,75 -922,6 +1063,75 @@@ static void __exit eeepc_laptop_exit(vo
platform_driver_unregister(&platform_driver);
}
+static int eeepc_new_rfkill(struct rfkill **rfkill,
+ const char *name, struct device *dev,
+ enum rfkill_type type, int cm)
+{
+ int result;
+
+ result = get_acpi(cm);
+ if (result < 0)
+ return result;
+
+ *rfkill = rfkill_alloc(name, dev, type,
+ &eeepc_rfkill_ops, (void *)(unsigned long)cm);
+
+ if (!*rfkill)
+ return -EINVAL;
+
- rfkill_set_sw_state(*rfkill, get_acpi(cm) != 1);
++ rfkill_init_sw_state(*rfkill, get_acpi(cm) != 1);
+ result = rfkill_register(*rfkill);
+ if (result) {
+ rfkill_destroy(*rfkill);
+ *rfkill = NULL;
+ return result;
+ }
+ return 0;
+}
+
+
+static int eeepc_rfkill_init(struct device *dev)
+{
+ int result = 0;
+
+ eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
+ eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
+
+ result = eeepc_new_rfkill(&ehotk->wlan_rfkill,
+ "eeepc-wlan", dev,
+ RFKILL_TYPE_WLAN, CM_ASL_WLAN);
+
+ if (result && result != -ENODEV)
+ goto exit;
+
+ result = eeepc_new_rfkill(&ehotk->bluetooth_rfkill,
+ "eeepc-bluetooth", dev,
+ RFKILL_TYPE_BLUETOOTH, CM_ASL_BLUETOOTH);
+
+ if (result && result != -ENODEV)
+ goto exit;
+
+ result = eeepc_new_rfkill(&ehotk->wwan3g_rfkill,
+ "eeepc-wwan3g", dev,
+ RFKILL_TYPE_WWAN, CM_ASL_3G);
+
+ if (result && result != -ENODEV)
+ goto exit;
+
+ result = eeepc_setup_pci_hotplug();
+ /*
+ * If we get -EBUSY then something else is handling the PCI hotplug -
+ * don't fail in this case
+ */
+ if (result == -EBUSY)
+ result = 0;
+
+exit:
+ if (result && result != -ENODEV)
+ eeepc_rfkill_exit();
+ return result;
+}
+
static int eeepc_backlight_init(struct device *dev)
{
struct backlight_device *bd;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists