eeepc-laptop: allow rfkill hotplug to work on the 900A model
[linux-2.6.git] / drivers / platform / x86 / eeepc-laptop.c
blobda3c08b3dcc1d719918e26718986a75817b76203
1 /*
2 * eepc-laptop.c - Asus Eee PC extras
4 * Based on asus_acpi.c as patched for the Eee PC by Asus:
5 * ftp://ftp.asus.com/pub/ASUS/EeePC/701/ASUS_ACPI_071126.rar
6 * Based on eee.c from eeepc-linux
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/types.h>
25 #include <linux/platform_device.h>
26 #include <linux/backlight.h>
27 #include <linux/fb.h>
28 #include <linux/hwmon.h>
29 #include <linux/hwmon-sysfs.h>
30 #include <acpi/acpi_drivers.h>
31 #include <acpi/acpi_bus.h>
32 #include <linux/uaccess.h>
33 #include <linux/input.h>
34 #include <linux/rfkill.h>
35 #include <linux/pci.h>
36 #include <linux/pci_hotplug.h>
38 #define EEEPC_LAPTOP_VERSION "0.1"
40 #define EEEPC_HOTK_NAME "Eee PC Hotkey Driver"
41 #define EEEPC_HOTK_FILE "eeepc"
42 #define EEEPC_HOTK_CLASS "hotkey"
43 #define EEEPC_HOTK_DEVICE_NAME "Hotkey"
44 #define EEEPC_HOTK_HID "ASUS010"
48 * Definitions for Asus EeePC
50 #define NOTIFY_WLAN_ON 0x10
51 #define NOTIFY_BRN_MIN 0x20
52 #define NOTIFY_BRN_MAX 0x2f
54 enum {
55 DISABLE_ASL_WLAN = 0x0001,
56 DISABLE_ASL_BLUETOOTH = 0x0002,
57 DISABLE_ASL_IRDA = 0x0004,
58 DISABLE_ASL_CAMERA = 0x0008,
59 DISABLE_ASL_TV = 0x0010,
60 DISABLE_ASL_GPS = 0x0020,
61 DISABLE_ASL_DISPLAYSWITCH = 0x0040,
62 DISABLE_ASL_MODEM = 0x0080,
63 DISABLE_ASL_CARDREADER = 0x0100,
64 DISABLE_ASL_3G = 0x0200,
65 DISABLE_ASL_WIMAX = 0x0400,
66 DISABLE_ASL_HWCF = 0x0800
69 enum {
70 CM_ASL_WLAN = 0,
71 CM_ASL_BLUETOOTH,
72 CM_ASL_IRDA,
73 CM_ASL_1394,
74 CM_ASL_CAMERA,
75 CM_ASL_TV,
76 CM_ASL_GPS,
77 CM_ASL_DVDROM,
78 CM_ASL_DISPLAYSWITCH,
79 CM_ASL_PANELBRIGHT,
80 CM_ASL_BIOSFLASH,
81 CM_ASL_ACPIFLASH,
82 CM_ASL_CPUFV,
83 CM_ASL_CPUTEMPERATURE,
84 CM_ASL_FANCPU,
85 CM_ASL_FANCHASSIS,
86 CM_ASL_USBPORT1,
87 CM_ASL_USBPORT2,
88 CM_ASL_USBPORT3,
89 CM_ASL_MODEM,
90 CM_ASL_CARDREADER,
91 CM_ASL_3G,
92 CM_ASL_WIMAX,
93 CM_ASL_HWCF,
94 CM_ASL_LID,
95 CM_ASL_TYPE,
96 CM_ASL_PANELPOWER, /*P901*/
97 CM_ASL_TPD
100 static const char *cm_getv[] = {
101 "WLDG", "BTHG", NULL, NULL,
102 "CAMG", NULL, NULL, NULL,
103 NULL, "PBLG", NULL, NULL,
104 "CFVG", NULL, NULL, NULL,
105 "USBG", NULL, NULL, "MODG",
106 "CRDG", "M3GG", "WIMG", "HWCF",
107 "LIDG", "TYPE", "PBPG", "TPDG"
110 static const char *cm_setv[] = {
111 "WLDS", "BTHS", NULL, NULL,
112 "CAMS", NULL, NULL, NULL,
113 "SDSP", "PBLS", "HDPS", NULL,
114 "CFVS", NULL, NULL, NULL,
115 "USBG", NULL, NULL, "MODS",
116 "CRDS", "M3GS", "WIMS", NULL,
117 NULL, NULL, "PBPS", "TPDS"
120 #define EEEPC_EC "\\_SB.PCI0.SBRG.EC0."
122 #define EEEPC_EC_FAN_PWM EEEPC_EC "SC02" /* Fan PWM duty cycle (%) */
123 #define EEEPC_EC_SC02 0x63
124 #define EEEPC_EC_FAN_HRPM EEEPC_EC "SC05" /* High byte, fan speed (RPM) */
125 #define EEEPC_EC_FAN_LRPM EEEPC_EC "SC06" /* Low byte, fan speed (RPM) */
126 #define EEEPC_EC_FAN_CTRL EEEPC_EC "SFB3" /* Byte containing SF25 */
127 #define EEEPC_EC_SFB3 0xD3
130 * This is the main structure, we can use it to store useful information
131 * about the hotk device
133 struct eeepc_hotk {
134 struct acpi_device *device; /* the device we are in */
135 acpi_handle handle; /* the handle of the hotk device */
136 u32 cm_supported; /* the control methods supported
137 by this BIOS */
138 uint init_flag; /* Init flags */
139 u16 event_count[128]; /* count for each event */
140 struct input_dev *inputdev;
141 u16 *keycode_map;
142 struct rfkill *wlan_rfkill;
143 struct rfkill *bluetooth_rfkill;
144 struct rfkill *wwan3g_rfkill;
145 struct rfkill *wimax_rfkill;
146 struct hotplug_slot *hotplug_slot;
147 struct mutex hotplug_lock;
150 /* The actual device the driver binds to */
151 static struct eeepc_hotk *ehotk;
153 /* Platform device/driver */
154 static int eeepc_hotk_thaw(struct device *device);
155 static int eeepc_hotk_restore(struct device *device);
157 static struct dev_pm_ops eeepc_pm_ops = {
158 .thaw = eeepc_hotk_thaw,
159 .restore = eeepc_hotk_restore,
162 static struct platform_driver platform_driver = {
163 .driver = {
164 .name = EEEPC_HOTK_FILE,
165 .owner = THIS_MODULE,
166 .pm = &eeepc_pm_ops,
170 static struct platform_device *platform_device;
172 struct key_entry {
173 char type;
174 u8 code;
175 u16 keycode;
178 enum { KE_KEY, KE_END };
180 static struct key_entry eeepc_keymap[] = {
181 /* Sleep already handled via generic ACPI code */
182 {KE_KEY, 0x10, KEY_WLAN },
183 {KE_KEY, 0x11, KEY_WLAN },
184 {KE_KEY, 0x12, KEY_PROG1 },
185 {KE_KEY, 0x13, KEY_MUTE },
186 {KE_KEY, 0x14, KEY_VOLUMEDOWN },
187 {KE_KEY, 0x15, KEY_VOLUMEUP },
188 {KE_KEY, 0x1a, KEY_COFFEE },
189 {KE_KEY, 0x1b, KEY_ZOOM },
190 {KE_KEY, 0x1c, KEY_PROG2 },
191 {KE_KEY, 0x1d, KEY_PROG3 },
192 {KE_KEY, NOTIFY_BRN_MIN, KEY_BRIGHTNESSDOWN },
193 {KE_KEY, NOTIFY_BRN_MIN + 2, KEY_BRIGHTNESSUP },
194 {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
195 {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
196 {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
197 {KE_END, 0},
201 * The hotkey driver declaration
203 static int eeepc_hotk_add(struct acpi_device *device);
204 static int eeepc_hotk_remove(struct acpi_device *device, int type);
205 static void eeepc_hotk_notify(struct acpi_device *device, u32 event);
207 static const struct acpi_device_id eeepc_device_ids[] = {
208 {EEEPC_HOTK_HID, 0},
209 {"", 0},
211 MODULE_DEVICE_TABLE(acpi, eeepc_device_ids);
213 static struct acpi_driver eeepc_hotk_driver = {
214 .name = EEEPC_HOTK_NAME,
215 .class = EEEPC_HOTK_CLASS,
216 .ids = eeepc_device_ids,
217 .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
218 .ops = {
219 .add = eeepc_hotk_add,
220 .remove = eeepc_hotk_remove,
221 .notify = eeepc_hotk_notify,
225 /* PCI hotplug ops */
226 static int eeepc_get_adapter_status(struct hotplug_slot *slot, u8 *value);
228 static struct hotplug_slot_ops eeepc_hotplug_slot_ops = {
229 .owner = THIS_MODULE,
230 .get_adapter_status = eeepc_get_adapter_status,
231 .get_power_status = eeepc_get_adapter_status,
234 /* The backlight device /sys/class/backlight */
235 static struct backlight_device *eeepc_backlight_device;
237 /* The hwmon device */
238 static struct device *eeepc_hwmon_device;
241 * The backlight class declaration
243 static int read_brightness(struct backlight_device *bd);
244 static int update_bl_status(struct backlight_device *bd);
245 static struct backlight_ops eeepcbl_ops = {
246 .get_brightness = read_brightness,
247 .update_status = update_bl_status,
250 MODULE_AUTHOR("Corentin Chary, Eric Cooper");
251 MODULE_DESCRIPTION(EEEPC_HOTK_NAME);
252 MODULE_LICENSE("GPL");
255 * ACPI Helpers
257 static int write_acpi_int(acpi_handle handle, const char *method, int val,
258 struct acpi_buffer *output)
260 struct acpi_object_list params;
261 union acpi_object in_obj;
262 acpi_status status;
264 params.count = 1;
265 params.pointer = &in_obj;
266 in_obj.type = ACPI_TYPE_INTEGER;
267 in_obj.integer.value = val;
269 status = acpi_evaluate_object(handle, (char *)method, &params, output);
270 return (status == AE_OK ? 0 : -1);
273 static int read_acpi_int(acpi_handle handle, const char *method, int *val)
275 acpi_status status;
276 unsigned long long result;
278 status = acpi_evaluate_integer(handle, (char *)method, NULL, &result);
279 if (ACPI_FAILURE(status)) {
280 *val = -1;
281 return -1;
282 } else {
283 *val = result;
284 return 0;
288 static int set_acpi(int cm, int value)
290 if (ehotk->cm_supported & (0x1 << cm)) {
291 const char *method = cm_setv[cm];
292 if (method == NULL)
293 return -ENODEV;
294 if (write_acpi_int(ehotk->handle, method, value, NULL))
295 pr_warning("Error writing %s\n", method);
297 return 0;
300 static int get_acpi(int cm)
302 int value = -ENODEV;
303 if ((ehotk->cm_supported & (0x1 << cm))) {
304 const char *method = cm_getv[cm];
305 if (method == NULL)
306 return -ENODEV;
307 if (read_acpi_int(ehotk->handle, method, &value))
308 pr_warning("Error reading %s\n", method);
310 return value;
314 * Backlight
316 static int read_brightness(struct backlight_device *bd)
318 return get_acpi(CM_ASL_PANELBRIGHT);
321 static int set_brightness(struct backlight_device *bd, int value)
323 value = max(0, min(15, value));
324 return set_acpi(CM_ASL_PANELBRIGHT, value);
327 static int update_bl_status(struct backlight_device *bd)
329 return set_brightness(bd, bd->props.brightness);
333 * Rfkill helpers
336 static bool eeepc_wlan_rfkill_blocked(void)
338 if (get_acpi(CM_ASL_WLAN) == 1)
339 return false;
340 return true;
343 static int eeepc_rfkill_set(void *data, bool blocked)
345 unsigned long asl = (unsigned long)data;
346 return set_acpi(asl, !blocked);
349 static const struct rfkill_ops eeepc_rfkill_ops = {
350 .set_block = eeepc_rfkill_set,
353 static void __init eeepc_enable_camera(void)
356 * If the following call to set_acpi() fails, it's because there's no
357 * camera so we can ignore the error.
359 set_acpi(CM_ASL_CAMERA, 1);
363 * Sys helpers
365 static int parse_arg(const char *buf, unsigned long count, int *val)
367 if (!count)
368 return 0;
369 if (sscanf(buf, "%i", val) != 1)
370 return -EINVAL;
371 return count;
374 static ssize_t store_sys_acpi(int cm, const char *buf, size_t count)
376 int rv, value;
378 rv = parse_arg(buf, count, &value);
379 if (rv > 0)
380 value = set_acpi(cm, value);
381 if (value < 0)
382 return value;
383 return rv;
386 static ssize_t show_sys_acpi(int cm, char *buf)
388 int value = get_acpi(cm);
390 if (value < 0)
391 return value;
392 return sprintf(buf, "%d\n", value);
395 #define EEEPC_CREATE_DEVICE_ATTR(_name, _cm) \
396 static ssize_t show_##_name(struct device *dev, \
397 struct device_attribute *attr, \
398 char *buf) \
400 return show_sys_acpi(_cm, buf); \
402 static ssize_t store_##_name(struct device *dev, \
403 struct device_attribute *attr, \
404 const char *buf, size_t count) \
406 return store_sys_acpi(_cm, buf, count); \
408 static struct device_attribute dev_attr_##_name = { \
409 .attr = { \
410 .name = __stringify(_name), \
411 .mode = 0644 }, \
412 .show = show_##_name, \
413 .store = store_##_name, \
416 EEEPC_CREATE_DEVICE_ATTR(camera, CM_ASL_CAMERA);
417 EEEPC_CREATE_DEVICE_ATTR(cardr, CM_ASL_CARDREADER);
418 EEEPC_CREATE_DEVICE_ATTR(disp, CM_ASL_DISPLAYSWITCH);
420 struct eeepc_cpufv {
421 int num;
422 int cur;
425 static int get_cpufv(struct eeepc_cpufv *c)
427 c->cur = get_acpi(CM_ASL_CPUFV);
428 c->num = (c->cur >> 8) & 0xff;
429 c->cur &= 0xff;
430 if (c->cur < 0 || c->num <= 0 || c->num > 12)
431 return -ENODEV;
432 return 0;
435 static ssize_t show_available_cpufv(struct device *dev,
436 struct device_attribute *attr,
437 char *buf)
439 struct eeepc_cpufv c;
440 int i;
441 ssize_t len = 0;
443 if (get_cpufv(&c))
444 return -ENODEV;
445 for (i = 0; i < c.num; i++)
446 len += sprintf(buf + len, "%d ", i);
447 len += sprintf(buf + len, "\n");
448 return len;
451 static ssize_t show_cpufv(struct device *dev,
452 struct device_attribute *attr,
453 char *buf)
455 struct eeepc_cpufv c;
457 if (get_cpufv(&c))
458 return -ENODEV;
459 return sprintf(buf, "%#x\n", (c.num << 8) | c.cur);
462 static ssize_t store_cpufv(struct device *dev,
463 struct device_attribute *attr,
464 const char *buf, size_t count)
466 struct eeepc_cpufv c;
467 int rv, value;
469 if (get_cpufv(&c))
470 return -ENODEV;
471 rv = parse_arg(buf, count, &value);
472 if (rv < 0)
473 return rv;
474 if (!rv || value < 0 || value >= c.num)
475 return -EINVAL;
476 set_acpi(CM_ASL_CPUFV, value);
477 return rv;
480 static struct device_attribute dev_attr_cpufv = {
481 .attr = {
482 .name = "cpufv",
483 .mode = 0644 },
484 .show = show_cpufv,
485 .store = store_cpufv
488 static struct device_attribute dev_attr_available_cpufv = {
489 .attr = {
490 .name = "available_cpufv",
491 .mode = 0444 },
492 .show = show_available_cpufv
495 static struct attribute *platform_attributes[] = {
496 &dev_attr_camera.attr,
497 &dev_attr_cardr.attr,
498 &dev_attr_disp.attr,
499 &dev_attr_cpufv.attr,
500 &dev_attr_available_cpufv.attr,
501 NULL
504 static struct attribute_group platform_attribute_group = {
505 .attrs = platform_attributes
509 * Hotkey functions
511 static struct key_entry *eepc_get_entry_by_scancode(int code)
513 struct key_entry *key;
515 for (key = eeepc_keymap; key->type != KE_END; key++)
516 if (code == key->code)
517 return key;
519 return NULL;
522 static struct key_entry *eepc_get_entry_by_keycode(int code)
524 struct key_entry *key;
526 for (key = eeepc_keymap; key->type != KE_END; key++)
527 if (code == key->keycode && key->type == KE_KEY)
528 return key;
530 return NULL;
533 static int eeepc_getkeycode(struct input_dev *dev, int scancode, int *keycode)
535 struct key_entry *key = eepc_get_entry_by_scancode(scancode);
537 if (key && key->type == KE_KEY) {
538 *keycode = key->keycode;
539 return 0;
542 return -EINVAL;
545 static int eeepc_setkeycode(struct input_dev *dev, int scancode, int keycode)
547 struct key_entry *key;
548 int old_keycode;
550 if (keycode < 0 || keycode > KEY_MAX)
551 return -EINVAL;
553 key = eepc_get_entry_by_scancode(scancode);
554 if (key && key->type == KE_KEY) {
555 old_keycode = key->keycode;
556 key->keycode = keycode;
557 set_bit(keycode, dev->keybit);
558 if (!eepc_get_entry_by_keycode(old_keycode))
559 clear_bit(old_keycode, dev->keybit);
560 return 0;
563 return -EINVAL;
566 static void cmsg_quirk(int cm, const char *name)
568 int dummy;
570 /* Some BIOSes do not report cm although it is avaliable.
571 Check if cm_getv[cm] works and, if yes, assume cm should be set. */
572 if (!(ehotk->cm_supported & (1 << cm))
573 && !read_acpi_int(ehotk->handle, cm_getv[cm], &dummy)) {
574 pr_info("%s (%x) not reported by BIOS,"
575 " enabling anyway\n", name, 1 << cm);
576 ehotk->cm_supported |= 1 << cm;
580 static void cmsg_quirks(void)
582 cmsg_quirk(CM_ASL_LID, "LID");
583 cmsg_quirk(CM_ASL_TYPE, "TYPE");
584 cmsg_quirk(CM_ASL_PANELPOWER, "PANELPOWER");
585 cmsg_quirk(CM_ASL_TPD, "TPD");
588 static int eeepc_hotk_check(void)
590 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
591 int result;
593 result = acpi_bus_get_status(ehotk->device);
594 if (result)
595 return result;
596 if (ehotk->device->status.present) {
597 if (write_acpi_int(ehotk->handle, "INIT", ehotk->init_flag,
598 &buffer)) {
599 pr_err("Hotkey initialization failed\n");
600 return -ENODEV;
601 } else {
602 pr_notice("Hotkey init flags 0x%x\n", ehotk->init_flag);
604 /* get control methods supported */
605 if (read_acpi_int(ehotk->handle, "CMSG"
606 , &ehotk->cm_supported)) {
607 pr_err("Get control methods supported failed\n");
608 return -ENODEV;
609 } else {
610 cmsg_quirks();
611 pr_info("Get control methods supported: 0x%x\n",
612 ehotk->cm_supported);
614 } else {
615 pr_err("Hotkey device not present, aborting\n");
616 return -EINVAL;
618 return 0;
621 static int notify_brn(void)
623 /* returns the *previous* brightness, or -1 */
624 struct backlight_device *bd = eeepc_backlight_device;
625 if (bd) {
626 int old = bd->props.brightness;
627 bd->props.brightness = read_brightness(bd);
628 return old;
630 return -1;
633 static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
634 u8 *value)
636 int val = get_acpi(CM_ASL_WLAN);
638 if (val == 1 || val == 0)
639 *value = val;
640 else
641 return -EINVAL;
643 return 0;
646 static void eeepc_rfkill_hotplug(void)
648 struct pci_dev *dev;
649 struct pci_bus *bus;
650 bool blocked = eeepc_wlan_rfkill_blocked();
652 if (ehotk->wlan_rfkill)
653 rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
655 mutex_lock(&ehotk->hotplug_lock);
657 if (ehotk->hotplug_slot) {
658 bus = pci_find_bus(0, 1);
659 if (!bus) {
660 pr_warning("Unable to find PCI bus 1?\n");
661 goto out_unlock;
664 if (!blocked) {
665 dev = pci_get_slot(bus, 0);
666 if (dev) {
667 /* Device already present */
668 pci_dev_put(dev);
669 goto out_unlock;
671 dev = pci_scan_single_device(bus, 0);
672 if (dev) {
673 pci_bus_assign_resources(bus);
674 if (pci_bus_add_device(dev))
675 pr_err("Unable to hotplug wifi\n");
677 } else {
678 dev = pci_get_slot(bus, 0);
679 if (dev) {
680 pci_remove_bus_device(dev);
681 pci_dev_put(dev);
686 out_unlock:
687 mutex_unlock(&ehotk->hotplug_lock);
690 static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
692 if (event != ACPI_NOTIFY_BUS_CHECK)
693 return;
695 eeepc_rfkill_hotplug();
698 static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
700 static struct key_entry *key;
701 u16 count;
702 int brn = -ENODEV;
704 if (!ehotk)
705 return;
706 if (event > ACPI_MAX_SYS_NOTIFY)
707 return;
708 if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
709 brn = notify_brn();
710 count = ehotk->event_count[event % 128]++;
711 acpi_bus_generate_proc_event(ehotk->device, event, count);
712 acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
713 dev_name(&ehotk->device->dev), event,
714 count);
715 if (ehotk->inputdev) {
716 if (brn != -ENODEV) {
717 /* brightness-change events need special
718 * handling for conversion to key events
720 if (brn < 0)
721 brn = event;
722 else
723 brn += NOTIFY_BRN_MIN;
724 if (event < brn)
725 event = NOTIFY_BRN_MIN; /* brightness down */
726 else if (event > brn)
727 event = NOTIFY_BRN_MIN + 2; /* ... up */
728 else
729 event = NOTIFY_BRN_MIN + 1; /* ... unchanged */
731 key = eepc_get_entry_by_scancode(event);
732 if (key) {
733 switch (key->type) {
734 case KE_KEY:
735 input_report_key(ehotk->inputdev, key->keycode,
737 input_sync(ehotk->inputdev);
738 input_report_key(ehotk->inputdev, key->keycode,
740 input_sync(ehotk->inputdev);
741 break;
747 static int eeepc_register_rfkill_notifier(char *node)
749 acpi_status status = AE_OK;
750 acpi_handle handle;
752 status = acpi_get_handle(NULL, node, &handle);
754 if (ACPI_SUCCESS(status)) {
755 status = acpi_install_notify_handler(handle,
756 ACPI_SYSTEM_NOTIFY,
757 eeepc_rfkill_notify,
758 NULL);
759 if (ACPI_FAILURE(status))
760 pr_warning("Failed to register notify on %s\n", node);
761 } else
762 return -ENODEV;
764 return 0;
767 static void eeepc_unregister_rfkill_notifier(char *node)
769 acpi_status status = AE_OK;
770 acpi_handle handle;
772 status = acpi_get_handle(NULL, node, &handle);
774 if (ACPI_SUCCESS(status)) {
775 status = acpi_remove_notify_handler(handle,
776 ACPI_SYSTEM_NOTIFY,
777 eeepc_rfkill_notify);
778 if (ACPI_FAILURE(status))
779 pr_err("Error removing rfkill notify handler %s\n",
780 node);
784 static void eeepc_cleanup_pci_hotplug(struct hotplug_slot *hotplug_slot)
786 kfree(hotplug_slot->info);
787 kfree(hotplug_slot);
790 static int eeepc_setup_pci_hotplug(void)
792 int ret = -ENOMEM;
793 struct pci_bus *bus = pci_find_bus(0, 1);
795 if (!bus) {
796 pr_err("Unable to find wifi PCI bus\n");
797 return -ENODEV;
800 ehotk->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
801 if (!ehotk->hotplug_slot)
802 goto error_slot;
804 ehotk->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
805 GFP_KERNEL);
806 if (!ehotk->hotplug_slot->info)
807 goto error_info;
809 ehotk->hotplug_slot->private = ehotk;
810 ehotk->hotplug_slot->release = &eeepc_cleanup_pci_hotplug;
811 ehotk->hotplug_slot->ops = &eeepc_hotplug_slot_ops;
812 eeepc_get_adapter_status(ehotk->hotplug_slot,
813 &ehotk->hotplug_slot->info->adapter_status);
815 ret = pci_hp_register(ehotk->hotplug_slot, bus, 0, "eeepc-wifi");
816 if (ret) {
817 pr_err("Unable to register hotplug slot - %d\n", ret);
818 goto error_register;
821 return 0;
823 error_register:
824 kfree(ehotk->hotplug_slot->info);
825 error_info:
826 kfree(ehotk->hotplug_slot);
827 ehotk->hotplug_slot = NULL;
828 error_slot:
829 return ret;
832 static int eeepc_hotk_thaw(struct device *device)
834 if (ehotk->wlan_rfkill) {
835 bool wlan;
838 * Work around bios bug - acpi _PTS turns off the wireless led
839 * during suspend. Normally it restores it on resume, but
840 * we should kick it ourselves in case hibernation is aborted.
842 wlan = get_acpi(CM_ASL_WLAN);
843 set_acpi(CM_ASL_WLAN, wlan);
846 return 0;
849 static int eeepc_hotk_restore(struct device *device)
851 /* Refresh both wlan rfkill state and pci hotplug */
852 if (ehotk->wlan_rfkill)
853 eeepc_rfkill_hotplug();
855 if (ehotk->bluetooth_rfkill)
856 rfkill_set_sw_state(ehotk->bluetooth_rfkill,
857 get_acpi(CM_ASL_BLUETOOTH) != 1);
858 if (ehotk->wwan3g_rfkill)
859 rfkill_set_sw_state(ehotk->wwan3g_rfkill,
860 get_acpi(CM_ASL_3G) != 1);
861 if (ehotk->wimax_rfkill)
862 rfkill_set_sw_state(ehotk->wimax_rfkill,
863 get_acpi(CM_ASL_WIMAX) != 1);
865 return 0;
869 * Hwmon
871 static int eeepc_get_fan_pwm(void)
873 int value = 0;
875 read_acpi_int(NULL, EEEPC_EC_FAN_PWM, &value);
876 value = value * 255 / 100;
877 return (value);
880 static void eeepc_set_fan_pwm(int value)
882 value = SENSORS_LIMIT(value, 0, 255);
883 value = value * 100 / 255;
884 ec_write(EEEPC_EC_SC02, value);
887 static int eeepc_get_fan_rpm(void)
889 int high = 0;
890 int low = 0;
892 read_acpi_int(NULL, EEEPC_EC_FAN_HRPM, &high);
893 read_acpi_int(NULL, EEEPC_EC_FAN_LRPM, &low);
894 return (high << 8 | low);
897 static int eeepc_get_fan_ctrl(void)
899 int value = 0;
901 read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
902 return ((value & 0x02 ? 1 : 0));
905 static void eeepc_set_fan_ctrl(int manual)
907 int value = 0;
909 read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
910 if (manual)
911 value |= 0x02;
912 else
913 value &= ~0x02;
914 ec_write(EEEPC_EC_SFB3, value);
917 static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
919 int rv, value;
921 rv = parse_arg(buf, count, &value);
922 if (rv > 0)
923 set(value);
924 return rv;
927 static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
929 return sprintf(buf, "%d\n", get());
932 #define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _set, _get) \
933 static ssize_t show_##_name(struct device *dev, \
934 struct device_attribute *attr, \
935 char *buf) \
937 return show_sys_hwmon(_set, buf); \
939 static ssize_t store_##_name(struct device *dev, \
940 struct device_attribute *attr, \
941 const char *buf, size_t count) \
943 return store_sys_hwmon(_get, buf, count); \
945 static SENSOR_DEVICE_ATTR(_name, _mode, show_##_name, store_##_name, 0);
947 EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL);
948 EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR,
949 eeepc_get_fan_pwm, eeepc_set_fan_pwm);
950 EEEPC_CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
951 eeepc_get_fan_ctrl, eeepc_set_fan_ctrl);
953 static ssize_t
954 show_name(struct device *dev, struct device_attribute *attr, char *buf)
956 return sprintf(buf, "eeepc\n");
958 static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
960 static struct attribute *hwmon_attributes[] = {
961 &sensor_dev_attr_pwm1.dev_attr.attr,
962 &sensor_dev_attr_fan1_input.dev_attr.attr,
963 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
964 &sensor_dev_attr_name.dev_attr.attr,
965 NULL
968 static struct attribute_group hwmon_attribute_group = {
969 .attrs = hwmon_attributes
973 * exit/init
975 static void eeepc_backlight_exit(void)
977 if (eeepc_backlight_device)
978 backlight_device_unregister(eeepc_backlight_device);
979 eeepc_backlight_device = NULL;
982 static void eeepc_rfkill_exit(void)
984 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P5");
985 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
986 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
987 if (ehotk->wlan_rfkill) {
988 rfkill_unregister(ehotk->wlan_rfkill);
989 rfkill_destroy(ehotk->wlan_rfkill);
990 ehotk->wlan_rfkill = NULL;
993 * Refresh pci hotplug in case the rfkill state was changed after
994 * eeepc_unregister_rfkill_notifier()
996 eeepc_rfkill_hotplug();
997 if (ehotk->hotplug_slot)
998 pci_hp_deregister(ehotk->hotplug_slot);
1000 if (ehotk->bluetooth_rfkill) {
1001 rfkill_unregister(ehotk->bluetooth_rfkill);
1002 rfkill_destroy(ehotk->bluetooth_rfkill);
1003 ehotk->bluetooth_rfkill = NULL;
1005 if (ehotk->wwan3g_rfkill) {
1006 rfkill_unregister(ehotk->wwan3g_rfkill);
1007 rfkill_destroy(ehotk->wwan3g_rfkill);
1008 ehotk->wwan3g_rfkill = NULL;
1010 if (ehotk->wimax_rfkill) {
1011 rfkill_unregister(ehotk->wimax_rfkill);
1012 rfkill_destroy(ehotk->wimax_rfkill);
1013 ehotk->wimax_rfkill = NULL;
1017 static void eeepc_input_exit(void)
1019 if (ehotk->inputdev)
1020 input_unregister_device(ehotk->inputdev);
1023 static void eeepc_hwmon_exit(void)
1025 struct device *hwmon;
1027 hwmon = eeepc_hwmon_device;
1028 if (!hwmon)
1029 return ;
1030 sysfs_remove_group(&hwmon->kobj,
1031 &hwmon_attribute_group);
1032 hwmon_device_unregister(hwmon);
1033 eeepc_hwmon_device = NULL;
1036 static int eeepc_new_rfkill(struct rfkill **rfkill,
1037 const char *name, struct device *dev,
1038 enum rfkill_type type, int cm)
1040 int result;
1042 result = get_acpi(cm);
1043 if (result < 0)
1044 return result;
1046 *rfkill = rfkill_alloc(name, dev, type,
1047 &eeepc_rfkill_ops, (void *)(unsigned long)cm);
1049 if (!*rfkill)
1050 return -EINVAL;
1052 rfkill_init_sw_state(*rfkill, get_acpi(cm) != 1);
1053 result = rfkill_register(*rfkill);
1054 if (result) {
1055 rfkill_destroy(*rfkill);
1056 *rfkill = NULL;
1057 return result;
1059 return 0;
1063 static int eeepc_rfkill_init(struct device *dev)
1065 int result = 0;
1067 mutex_init(&ehotk->hotplug_lock);
1069 result = eeepc_new_rfkill(&ehotk->wlan_rfkill,
1070 "eeepc-wlan", dev,
1071 RFKILL_TYPE_WLAN, CM_ASL_WLAN);
1073 if (result && result != -ENODEV)
1074 goto exit;
1076 result = eeepc_new_rfkill(&ehotk->bluetooth_rfkill,
1077 "eeepc-bluetooth", dev,
1078 RFKILL_TYPE_BLUETOOTH, CM_ASL_BLUETOOTH);
1080 if (result && result != -ENODEV)
1081 goto exit;
1083 result = eeepc_new_rfkill(&ehotk->wwan3g_rfkill,
1084 "eeepc-wwan3g", dev,
1085 RFKILL_TYPE_WWAN, CM_ASL_3G);
1087 if (result && result != -ENODEV)
1088 goto exit;
1090 result = eeepc_new_rfkill(&ehotk->wimax_rfkill,
1091 "eeepc-wimax", dev,
1092 RFKILL_TYPE_WIMAX, CM_ASL_WIMAX);
1094 if (result && result != -ENODEV)
1095 goto exit;
1097 result = eeepc_setup_pci_hotplug();
1099 * If we get -EBUSY then something else is handling the PCI hotplug -
1100 * don't fail in this case
1102 if (result == -EBUSY)
1103 result = 0;
1105 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P5");
1106 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
1107 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
1109 * Refresh pci hotplug in case the rfkill state was changed during
1110 * setup.
1112 eeepc_rfkill_hotplug();
1114 exit:
1115 if (result && result != -ENODEV)
1116 eeepc_rfkill_exit();
1117 return result;
1120 static int eeepc_backlight_init(struct device *dev)
1122 struct backlight_device *bd;
1124 bd = backlight_device_register(EEEPC_HOTK_FILE, dev,
1125 NULL, &eeepcbl_ops);
1126 if (IS_ERR(bd)) {
1127 pr_err("Could not register eeepc backlight device\n");
1128 eeepc_backlight_device = NULL;
1129 return PTR_ERR(bd);
1131 eeepc_backlight_device = bd;
1132 bd->props.max_brightness = 15;
1133 bd->props.brightness = read_brightness(NULL);
1134 bd->props.power = FB_BLANK_UNBLANK;
1135 backlight_update_status(bd);
1136 return 0;
1139 static int eeepc_hwmon_init(struct device *dev)
1141 struct device *hwmon;
1142 int result;
1144 hwmon = hwmon_device_register(dev);
1145 if (IS_ERR(hwmon)) {
1146 pr_err("Could not register eeepc hwmon device\n");
1147 eeepc_hwmon_device = NULL;
1148 return PTR_ERR(hwmon);
1150 eeepc_hwmon_device = hwmon;
1151 result = sysfs_create_group(&hwmon->kobj,
1152 &hwmon_attribute_group);
1153 if (result)
1154 eeepc_hwmon_exit();
1155 return result;
1158 static int eeepc_input_init(struct device *dev)
1160 const struct key_entry *key;
1161 int result;
1163 ehotk->inputdev = input_allocate_device();
1164 if (!ehotk->inputdev) {
1165 pr_info("Unable to allocate input device\n");
1166 return -ENOMEM;
1168 ehotk->inputdev->name = "Asus EeePC extra buttons";
1169 ehotk->inputdev->dev.parent = dev;
1170 ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0";
1171 ehotk->inputdev->id.bustype = BUS_HOST;
1172 ehotk->inputdev->getkeycode = eeepc_getkeycode;
1173 ehotk->inputdev->setkeycode = eeepc_setkeycode;
1175 for (key = eeepc_keymap; key->type != KE_END; key++) {
1176 switch (key->type) {
1177 case KE_KEY:
1178 set_bit(EV_KEY, ehotk->inputdev->evbit);
1179 set_bit(key->keycode, ehotk->inputdev->keybit);
1180 break;
1183 result = input_register_device(ehotk->inputdev);
1184 if (result) {
1185 pr_info("Unable to register input device\n");
1186 input_free_device(ehotk->inputdev);
1187 return result;
1189 return 0;
1192 static int eeepc_hotk_add(struct acpi_device *device)
1194 struct device *dev;
1195 int result;
1197 if (!device)
1198 return -EINVAL;
1199 pr_notice(EEEPC_HOTK_NAME "\n");
1200 ehotk = kzalloc(sizeof(struct eeepc_hotk), GFP_KERNEL);
1201 if (!ehotk)
1202 return -ENOMEM;
1203 ehotk->init_flag = DISABLE_ASL_WLAN | DISABLE_ASL_DISPLAYSWITCH;
1204 ehotk->handle = device->handle;
1205 strcpy(acpi_device_name(device), EEEPC_HOTK_DEVICE_NAME);
1206 strcpy(acpi_device_class(device), EEEPC_HOTK_CLASS);
1207 device->driver_data = ehotk;
1208 ehotk->device = device;
1210 result = eeepc_hotk_check();
1211 if (result)
1212 goto fail_platform_driver;
1213 eeepc_enable_camera();
1215 /* Register platform stuff */
1216 result = platform_driver_register(&platform_driver);
1217 if (result)
1218 goto fail_platform_driver;
1219 platform_device = platform_device_alloc(EEEPC_HOTK_FILE, -1);
1220 if (!platform_device) {
1221 result = -ENOMEM;
1222 goto fail_platform_device1;
1224 result = platform_device_add(platform_device);
1225 if (result)
1226 goto fail_platform_device2;
1227 result = sysfs_create_group(&platform_device->dev.kobj,
1228 &platform_attribute_group);
1229 if (result)
1230 goto fail_sysfs;
1232 dev = &platform_device->dev;
1234 if (!acpi_video_backlight_support()) {
1235 result = eeepc_backlight_init(dev);
1236 if (result)
1237 goto fail_backlight;
1238 } else
1239 pr_info("Backlight controlled by ACPI video "
1240 "driver\n");
1242 result = eeepc_input_init(dev);
1243 if (result)
1244 goto fail_input;
1246 result = eeepc_hwmon_init(dev);
1247 if (result)
1248 goto fail_hwmon;
1250 result = eeepc_rfkill_init(dev);
1251 if (result)
1252 goto fail_rfkill;
1254 return 0;
1256 fail_rfkill:
1257 eeepc_hwmon_exit();
1258 fail_hwmon:
1259 eeepc_input_exit();
1260 fail_input:
1261 eeepc_backlight_exit();
1262 fail_backlight:
1263 sysfs_remove_group(&platform_device->dev.kobj,
1264 &platform_attribute_group);
1265 fail_sysfs:
1266 platform_device_del(platform_device);
1267 fail_platform_device2:
1268 platform_device_put(platform_device);
1269 fail_platform_device1:
1270 platform_driver_unregister(&platform_driver);
1271 fail_platform_driver:
1272 kfree(ehotk);
1274 return result;
1277 static int eeepc_hotk_remove(struct acpi_device *device, int type)
1279 if (!device || !acpi_driver_data(device))
1280 return -EINVAL;
1282 eeepc_backlight_exit();
1283 eeepc_rfkill_exit();
1284 eeepc_input_exit();
1285 eeepc_hwmon_exit();
1286 sysfs_remove_group(&platform_device->dev.kobj,
1287 &platform_attribute_group);
1288 platform_device_unregister(platform_device);
1289 platform_driver_unregister(&platform_driver);
1291 kfree(ehotk);
1292 return 0;
1295 static int __init eeepc_laptop_init(void)
1297 int result;
1299 if (acpi_disabled)
1300 return -ENODEV;
1301 result = acpi_bus_register_driver(&eeepc_hotk_driver);
1302 if (result < 0)
1303 return result;
1304 if (!ehotk) {
1305 acpi_bus_unregister_driver(&eeepc_hotk_driver);
1306 return -ENODEV;
1308 return 0;
1311 static void __exit eeepc_laptop_exit(void)
1313 acpi_bus_unregister_driver(&eeepc_hotk_driver);
1316 module_init(eeepc_laptop_init);
1317 module_exit(eeepc_laptop_exit);