1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * eeepc-laptop.c - Asus Eee PC extras
5 * Based on asus_acpi.c as patched for the Eee PC by Asus:
6 * ftp://ftp.asus.com/pub/ASUS/EeePC/701/ASUS_ACPI_071126.rar
7 * Based on eee.c from eeepc-linux
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/types.h>
16 #include <linux/platform_device.h>
17 #include <linux/backlight.h>
19 #include <linux/hwmon.h>
20 #include <linux/hwmon-sysfs.h>
21 #include <linux/slab.h>
22 #include <linux/acpi.h>
23 #include <linux/uaccess.h>
24 #include <linux/input.h>
25 #include <linux/input/sparse-keymap.h>
26 #include <linux/rfkill.h>
27 #include <linux/pci.h>
28 #include <linux/pci_hotplug.h>
29 #include <linux/leds.h>
30 #include <linux/dmi.h>
31 #include <acpi/video.h>
33 #define EEEPC_LAPTOP_VERSION "0.1"
34 #define EEEPC_LAPTOP_NAME "Eee PC Hotkey Driver"
35 #define EEEPC_LAPTOP_FILE "eeepc"
37 #define EEEPC_ACPI_CLASS "hotkey"
38 #define EEEPC_ACPI_DEVICE_NAME "Hotkey"
39 #define EEEPC_ACPI_HID "ASUS010"
41 MODULE_AUTHOR("Corentin Chary, Eric Cooper");
42 MODULE_DESCRIPTION(EEEPC_LAPTOP_NAME
);
43 MODULE_LICENSE("GPL");
45 static bool hotplug_disabled
;
47 module_param(hotplug_disabled
, bool, 0444);
48 MODULE_PARM_DESC(hotplug_disabled
,
49 "Disable hotplug for wireless device. "
50 "If your laptop need that, please report to "
51 "acpi4asus-user@lists.sourceforge.net.");
54 * Definitions for Asus EeePC
56 #define NOTIFY_BRN_MIN 0x20
57 #define NOTIFY_BRN_MAX 0x2f
60 DISABLE_ASL_WLAN
= 0x0001,
61 DISABLE_ASL_BLUETOOTH
= 0x0002,
62 DISABLE_ASL_IRDA
= 0x0004,
63 DISABLE_ASL_CAMERA
= 0x0008,
64 DISABLE_ASL_TV
= 0x0010,
65 DISABLE_ASL_GPS
= 0x0020,
66 DISABLE_ASL_DISPLAYSWITCH
= 0x0040,
67 DISABLE_ASL_MODEM
= 0x0080,
68 DISABLE_ASL_CARDREADER
= 0x0100,
69 DISABLE_ASL_3G
= 0x0200,
70 DISABLE_ASL_WIMAX
= 0x0400,
71 DISABLE_ASL_HWCF
= 0x0800
88 CM_ASL_CPUTEMPERATURE
,
101 CM_ASL_PANELPOWER
, /*P901*/
105 static const char *cm_getv
[] = {
106 "WLDG", "BTHG", NULL
, NULL
,
107 "CAMG", NULL
, NULL
, NULL
,
108 NULL
, "PBLG", NULL
, NULL
,
109 "CFVG", NULL
, NULL
, NULL
,
110 "USBG", NULL
, NULL
, "MODG",
111 "CRDG", "M3GG", "WIMG", "HWCF",
112 "LIDG", "TYPE", "PBPG", "TPDG"
115 static const char *cm_setv
[] = {
116 "WLDS", "BTHS", NULL
, NULL
,
117 "CAMS", NULL
, NULL
, NULL
,
118 "SDSP", "PBLS", "HDPS", NULL
,
119 "CFVS", NULL
, NULL
, NULL
,
120 "USBG", NULL
, NULL
, "MODS",
121 "CRDS", "M3GS", "WIMS", NULL
,
122 NULL
, NULL
, "PBPS", "TPDS"
125 static const struct key_entry eeepc_keymap
[] = {
126 { KE_KEY
, 0x10, { KEY_WLAN
} },
127 { KE_KEY
, 0x11, { KEY_WLAN
} },
128 { KE_KEY
, 0x12, { KEY_PROG1
} },
129 { KE_KEY
, 0x13, { KEY_MUTE
} },
130 { KE_KEY
, 0x14, { KEY_VOLUMEDOWN
} },
131 { KE_KEY
, 0x15, { KEY_VOLUMEUP
} },
132 { KE_KEY
, 0x16, { KEY_DISPLAY_OFF
} },
133 { KE_KEY
, 0x1a, { KEY_COFFEE
} },
134 { KE_KEY
, 0x1b, { KEY_ZOOM
} },
135 { KE_KEY
, 0x1c, { KEY_PROG2
} },
136 { KE_KEY
, 0x1d, { KEY_PROG3
} },
137 { KE_KEY
, NOTIFY_BRN_MIN
, { KEY_BRIGHTNESSDOWN
} },
138 { KE_KEY
, NOTIFY_BRN_MAX
, { KEY_BRIGHTNESSUP
} },
139 { KE_KEY
, 0x30, { KEY_SWITCHVIDEOMODE
} },
140 { KE_KEY
, 0x31, { KEY_SWITCHVIDEOMODE
} },
141 { KE_KEY
, 0x32, { KEY_SWITCHVIDEOMODE
} },
142 { KE_KEY
, 0x37, { KEY_F13
} }, /* Disable Touchpad */
143 { KE_KEY
, 0x38, { KEY_F14
} },
144 { KE_IGNORE
, 0x50, { KEY_RESERVED
} }, /* AC plugged */
145 { KE_IGNORE
, 0x51, { KEY_RESERVED
} }, /* AC unplugged */
150 * This is the main structure, we can use it to store useful information
152 struct eeepc_laptop
{
153 acpi_handle handle
; /* the handle of the acpi device */
154 u32 cm_supported
; /* the control methods supported
157 bool hotplug_disabled
;
158 u16 event_count
[128]; /* count for each event */
160 struct platform_device
*platform_device
;
161 struct acpi_device
*device
; /* the device we are in */
162 struct backlight_device
*backlight_device
;
164 struct input_dev
*inputdev
;
166 struct rfkill
*wlan_rfkill
;
167 struct rfkill
*bluetooth_rfkill
;
168 struct rfkill
*wwan3g_rfkill
;
169 struct rfkill
*wimax_rfkill
;
171 struct hotplug_slot hotplug_slot
;
172 struct mutex hotplug_lock
;
174 struct led_classdev tpd_led
;
176 struct workqueue_struct
*led_workqueue
;
177 struct work_struct tpd_led_work
;
183 static int write_acpi_int(acpi_handle handle
, const char *method
, int val
)
187 status
= acpi_execute_simple_method(handle
, (char *)method
, val
);
189 return (status
== AE_OK
? 0 : -1);
192 static int read_acpi_int(acpi_handle handle
, const char *method
, int *val
)
195 unsigned long long result
;
197 status
= acpi_evaluate_integer(handle
, (char *)method
, NULL
, &result
);
198 if (ACPI_FAILURE(status
)) {
207 static int set_acpi(struct eeepc_laptop
*eeepc
, int cm
, int value
)
209 const char *method
= cm_setv
[cm
];
213 if ((eeepc
->cm_supported
& (0x1 << cm
)) == 0)
216 if (write_acpi_int(eeepc
->handle
, method
, value
))
217 pr_warn("Error writing %s\n", method
);
221 static int get_acpi(struct eeepc_laptop
*eeepc
, int cm
)
223 const char *method
= cm_getv
[cm
];
228 if ((eeepc
->cm_supported
& (0x1 << cm
)) == 0)
231 if (read_acpi_int(eeepc
->handle
, method
, &value
))
232 pr_warn("Error reading %s\n", method
);
236 static int acpi_setter_handle(struct eeepc_laptop
*eeepc
, int cm
,
239 const char *method
= cm_setv
[cm
];
244 if ((eeepc
->cm_supported
& (0x1 << cm
)) == 0)
247 status
= acpi_get_handle(eeepc
->handle
, (char *)method
,
249 if (status
!= AE_OK
) {
250 pr_warn("Error finding %s\n", method
);
260 static int parse_arg(const char *buf
, int *val
)
262 if (sscanf(buf
, "%i", val
) != 1)
267 static ssize_t
store_sys_acpi(struct device
*dev
, int cm
,
268 const char *buf
, size_t count
)
270 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
273 rv
= parse_arg(buf
, &value
);
276 rv
= set_acpi(eeepc
, cm
, value
);
282 static ssize_t
show_sys_acpi(struct device
*dev
, int cm
, char *buf
)
284 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
285 int value
= get_acpi(eeepc
, cm
);
289 return sprintf(buf
, "%d\n", value
);
292 #define EEEPC_ACPI_SHOW_FUNC(_name, _cm) \
293 static ssize_t _name##_show(struct device *dev, \
294 struct device_attribute *attr, \
297 return show_sys_acpi(dev, _cm, buf); \
300 #define EEEPC_ACPI_STORE_FUNC(_name, _cm) \
301 static ssize_t _name##_store(struct device *dev, \
302 struct device_attribute *attr, \
303 const char *buf, size_t count) \
305 return store_sys_acpi(dev, _cm, buf, count); \
308 #define EEEPC_CREATE_DEVICE_ATTR_RW(_name, _cm) \
309 EEEPC_ACPI_SHOW_FUNC(_name, _cm) \
310 EEEPC_ACPI_STORE_FUNC(_name, _cm) \
311 static DEVICE_ATTR_RW(_name)
313 #define EEEPC_CREATE_DEVICE_ATTR_WO(_name, _cm) \
314 EEEPC_ACPI_STORE_FUNC(_name, _cm) \
315 static DEVICE_ATTR_WO(_name)
317 EEEPC_CREATE_DEVICE_ATTR_RW(camera
, CM_ASL_CAMERA
);
318 EEEPC_CREATE_DEVICE_ATTR_RW(cardr
, CM_ASL_CARDREADER
);
319 EEEPC_CREATE_DEVICE_ATTR_WO(disp
, CM_ASL_DISPLAYSWITCH
);
326 static int get_cpufv(struct eeepc_laptop
*eeepc
, struct eeepc_cpufv
*c
)
328 c
->cur
= get_acpi(eeepc
, CM_ASL_CPUFV
);
332 c
->num
= (c
->cur
>> 8) & 0xff;
334 if (c
->num
== 0 || c
->num
> 12)
339 static ssize_t
available_cpufv_show(struct device
*dev
,
340 struct device_attribute
*attr
,
343 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
344 struct eeepc_cpufv c
;
348 if (get_cpufv(eeepc
, &c
))
350 for (i
= 0; i
< c
.num
; i
++)
351 len
+= sprintf(buf
+ len
, "%d ", i
);
352 len
+= sprintf(buf
+ len
, "\n");
356 static ssize_t
cpufv_show(struct device
*dev
,
357 struct device_attribute
*attr
,
360 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
361 struct eeepc_cpufv c
;
363 if (get_cpufv(eeepc
, &c
))
365 return sprintf(buf
, "%#x\n", (c
.num
<< 8) | c
.cur
);
368 static ssize_t
cpufv_store(struct device
*dev
,
369 struct device_attribute
*attr
,
370 const char *buf
, size_t count
)
372 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
373 struct eeepc_cpufv c
;
376 if (eeepc
->cpufv_disabled
)
378 if (get_cpufv(eeepc
, &c
))
380 rv
= parse_arg(buf
, &value
);
383 if (value
< 0 || value
>= c
.num
)
385 rv
= set_acpi(eeepc
, CM_ASL_CPUFV
, value
);
391 static ssize_t
cpufv_disabled_show(struct device
*dev
,
392 struct device_attribute
*attr
,
395 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
397 return sprintf(buf
, "%d\n", eeepc
->cpufv_disabled
);
400 static ssize_t
cpufv_disabled_store(struct device
*dev
,
401 struct device_attribute
*attr
,
402 const char *buf
, size_t count
)
404 struct eeepc_laptop
*eeepc
= dev_get_drvdata(dev
);
407 rv
= parse_arg(buf
, &value
);
413 if (eeepc
->cpufv_disabled
)
414 pr_warn("cpufv enabled (not officially supported on this model)\n");
415 eeepc
->cpufv_disabled
= false;
425 static DEVICE_ATTR_RW(cpufv
);
426 static DEVICE_ATTR_RO(available_cpufv
);
427 static DEVICE_ATTR_RW(cpufv_disabled
);
429 static struct attribute
*platform_attributes
[] = {
430 &dev_attr_camera
.attr
,
431 &dev_attr_cardr
.attr
,
433 &dev_attr_cpufv
.attr
,
434 &dev_attr_available_cpufv
.attr
,
435 &dev_attr_cpufv_disabled
.attr
,
439 static const struct attribute_group platform_attribute_group
= {
440 .attrs
= platform_attributes
443 static int eeepc_platform_init(struct eeepc_laptop
*eeepc
)
447 eeepc
->platform_device
= platform_device_alloc(EEEPC_LAPTOP_FILE
, -1);
448 if (!eeepc
->platform_device
)
450 platform_set_drvdata(eeepc
->platform_device
, eeepc
);
452 result
= platform_device_add(eeepc
->platform_device
);
454 goto fail_platform_device
;
456 result
= sysfs_create_group(&eeepc
->platform_device
->dev
.kobj
,
457 &platform_attribute_group
);
463 platform_device_del(eeepc
->platform_device
);
464 fail_platform_device
:
465 platform_device_put(eeepc
->platform_device
);
469 static void eeepc_platform_exit(struct eeepc_laptop
*eeepc
)
471 sysfs_remove_group(&eeepc
->platform_device
->dev
.kobj
,
472 &platform_attribute_group
);
473 platform_device_unregister(eeepc
->platform_device
);
480 * These functions actually update the LED's, and are called from a
481 * workqueue. By doing this as separate work rather than when the LED
482 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
483 * potentially bad time, such as a timer interrupt.
485 static void tpd_led_update(struct work_struct
*work
)
487 struct eeepc_laptop
*eeepc
;
489 eeepc
= container_of(work
, struct eeepc_laptop
, tpd_led_work
);
491 set_acpi(eeepc
, CM_ASL_TPD
, eeepc
->tpd_led_wk
);
494 static void tpd_led_set(struct led_classdev
*led_cdev
,
495 enum led_brightness value
)
497 struct eeepc_laptop
*eeepc
;
499 eeepc
= container_of(led_cdev
, struct eeepc_laptop
, tpd_led
);
501 eeepc
->tpd_led_wk
= (value
> 0) ? 1 : 0;
502 queue_work(eeepc
->led_workqueue
, &eeepc
->tpd_led_work
);
505 static enum led_brightness
tpd_led_get(struct led_classdev
*led_cdev
)
507 struct eeepc_laptop
*eeepc
;
509 eeepc
= container_of(led_cdev
, struct eeepc_laptop
, tpd_led
);
511 return get_acpi(eeepc
, CM_ASL_TPD
);
514 static int eeepc_led_init(struct eeepc_laptop
*eeepc
)
518 if (get_acpi(eeepc
, CM_ASL_TPD
) == -ENODEV
)
521 eeepc
->led_workqueue
= create_singlethread_workqueue("led_workqueue");
522 if (!eeepc
->led_workqueue
)
524 INIT_WORK(&eeepc
->tpd_led_work
, tpd_led_update
);
526 eeepc
->tpd_led
.name
= "eeepc::touchpad";
527 eeepc
->tpd_led
.brightness_set
= tpd_led_set
;
528 if (get_acpi(eeepc
, CM_ASL_TPD
) >= 0) /* if method is available */
529 eeepc
->tpd_led
.brightness_get
= tpd_led_get
;
530 eeepc
->tpd_led
.max_brightness
= 1;
532 rv
= led_classdev_register(&eeepc
->platform_device
->dev
,
535 destroy_workqueue(eeepc
->led_workqueue
);
542 static void eeepc_led_exit(struct eeepc_laptop
*eeepc
)
544 led_classdev_unregister(&eeepc
->tpd_led
);
545 if (eeepc
->led_workqueue
)
546 destroy_workqueue(eeepc
->led_workqueue
);
550 * PCI hotplug (for wlan rfkill)
552 static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop
*eeepc
)
554 if (get_acpi(eeepc
, CM_ASL_WLAN
) == 1)
559 static void eeepc_rfkill_hotplug(struct eeepc_laptop
*eeepc
, acpi_handle handle
)
561 struct pci_dev
*port
;
564 bool blocked
= eeepc_wlan_rfkill_blocked(eeepc
);
568 if (eeepc
->wlan_rfkill
)
569 rfkill_set_sw_state(eeepc
->wlan_rfkill
, blocked
);
571 mutex_lock(&eeepc
->hotplug_lock
);
572 pci_lock_rescan_remove();
574 if (!eeepc
->hotplug_slot
.ops
)
577 port
= acpi_get_pci_dev(handle
);
579 pr_warn("Unable to find port\n");
583 bus
= port
->subordinate
;
586 pr_warn("Unable to find PCI bus 1?\n");
590 if (pci_bus_read_config_dword(bus
, 0, PCI_VENDOR_ID
, &l
)) {
591 pr_err("Unable to read PCI config space?\n");
595 absent
= (l
== 0xffffffff);
597 if (blocked
!= absent
) {
598 pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
599 blocked
? "blocked" : "unblocked",
600 absent
? "absent" : "present");
601 pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
606 dev
= pci_get_slot(bus
, 0);
608 /* Device already present */
612 dev
= pci_scan_single_device(bus
, 0);
614 pci_bus_assign_resources(bus
);
615 pci_bus_add_device(dev
);
618 dev
= pci_get_slot(bus
, 0);
620 pci_stop_and_remove_bus_device(dev
);
628 pci_unlock_rescan_remove();
629 mutex_unlock(&eeepc
->hotplug_lock
);
632 static void eeepc_rfkill_hotplug_update(struct eeepc_laptop
*eeepc
, char *node
)
634 acpi_status status
= AE_OK
;
637 status
= acpi_get_handle(NULL
, node
, &handle
);
639 if (ACPI_SUCCESS(status
))
640 eeepc_rfkill_hotplug(eeepc
, handle
);
643 static void eeepc_rfkill_notify(acpi_handle handle
, u32 event
, void *data
)
645 struct eeepc_laptop
*eeepc
= data
;
647 if (event
!= ACPI_NOTIFY_BUS_CHECK
)
650 eeepc_rfkill_hotplug(eeepc
, handle
);
653 static int eeepc_register_rfkill_notifier(struct eeepc_laptop
*eeepc
,
659 status
= acpi_get_handle(NULL
, node
, &handle
);
661 if (ACPI_FAILURE(status
))
664 status
= acpi_install_notify_handler(handle
,
668 if (ACPI_FAILURE(status
))
669 pr_warn("Failed to register notify on %s\n", node
);
672 * Refresh pci hotplug in case the rfkill state was
673 * changed during setup.
675 eeepc_rfkill_hotplug(eeepc
, handle
);
679 static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop
*eeepc
,
682 acpi_status status
= AE_OK
;
685 status
= acpi_get_handle(NULL
, node
, &handle
);
687 if (ACPI_FAILURE(status
))
690 status
= acpi_remove_notify_handler(handle
,
692 eeepc_rfkill_notify
);
693 if (ACPI_FAILURE(status
))
694 pr_err("Error removing rfkill notify handler %s\n",
697 * Refresh pci hotplug in case the rfkill
698 * state was changed after
699 * eeepc_unregister_rfkill_notifier()
701 eeepc_rfkill_hotplug(eeepc
, handle
);
704 static int eeepc_get_adapter_status(struct hotplug_slot
*hotplug_slot
,
707 struct eeepc_laptop
*eeepc
;
710 eeepc
= container_of(hotplug_slot
, struct eeepc_laptop
, hotplug_slot
);
711 val
= get_acpi(eeepc
, CM_ASL_WLAN
);
713 if (val
== 1 || val
== 0)
721 static const struct hotplug_slot_ops eeepc_hotplug_slot_ops
= {
722 .get_adapter_status
= eeepc_get_adapter_status
,
723 .get_power_status
= eeepc_get_adapter_status
,
726 static int eeepc_setup_pci_hotplug(struct eeepc_laptop
*eeepc
)
729 struct pci_bus
*bus
= pci_find_bus(0, 1);
732 pr_err("Unable to find wifi PCI bus\n");
736 eeepc
->hotplug_slot
.ops
= &eeepc_hotplug_slot_ops
;
738 ret
= pci_hp_register(&eeepc
->hotplug_slot
, bus
, 0, "eeepc-wifi");
740 pr_err("Unable to register hotplug slot - %d\n", ret
);
747 eeepc
->hotplug_slot
.ops
= NULL
;
754 static int eeepc_rfkill_set(void *data
, bool blocked
)
756 acpi_handle handle
= data
;
758 return write_acpi_int(handle
, NULL
, !blocked
);
761 static const struct rfkill_ops eeepc_rfkill_ops
= {
762 .set_block
= eeepc_rfkill_set
,
765 static int eeepc_new_rfkill(struct eeepc_laptop
*eeepc
,
766 struct rfkill
**rfkill
,
768 enum rfkill_type type
, int cm
)
773 result
= acpi_setter_handle(eeepc
, cm
, &handle
);
777 *rfkill
= rfkill_alloc(name
, &eeepc
->platform_device
->dev
, type
,
778 &eeepc_rfkill_ops
, handle
);
783 rfkill_init_sw_state(*rfkill
, get_acpi(eeepc
, cm
) != 1);
784 result
= rfkill_register(*rfkill
);
786 rfkill_destroy(*rfkill
);
793 static char EEEPC_RFKILL_NODE_1
[] = "\\_SB.PCI0.P0P5";
794 static char EEEPC_RFKILL_NODE_2
[] = "\\_SB.PCI0.P0P6";
795 static char EEEPC_RFKILL_NODE_3
[] = "\\_SB.PCI0.P0P7";
797 static void eeepc_rfkill_exit(struct eeepc_laptop
*eeepc
)
799 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_1
);
800 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_2
);
801 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_3
);
802 if (eeepc
->wlan_rfkill
) {
803 rfkill_unregister(eeepc
->wlan_rfkill
);
804 rfkill_destroy(eeepc
->wlan_rfkill
);
805 eeepc
->wlan_rfkill
= NULL
;
808 if (eeepc
->hotplug_slot
.ops
)
809 pci_hp_deregister(&eeepc
->hotplug_slot
);
811 if (eeepc
->bluetooth_rfkill
) {
812 rfkill_unregister(eeepc
->bluetooth_rfkill
);
813 rfkill_destroy(eeepc
->bluetooth_rfkill
);
814 eeepc
->bluetooth_rfkill
= NULL
;
816 if (eeepc
->wwan3g_rfkill
) {
817 rfkill_unregister(eeepc
->wwan3g_rfkill
);
818 rfkill_destroy(eeepc
->wwan3g_rfkill
);
819 eeepc
->wwan3g_rfkill
= NULL
;
821 if (eeepc
->wimax_rfkill
) {
822 rfkill_unregister(eeepc
->wimax_rfkill
);
823 rfkill_destroy(eeepc
->wimax_rfkill
);
824 eeepc
->wimax_rfkill
= NULL
;
828 static int eeepc_rfkill_init(struct eeepc_laptop
*eeepc
)
832 mutex_init(&eeepc
->hotplug_lock
);
834 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wlan_rfkill
,
835 "eeepc-wlan", RFKILL_TYPE_WLAN
,
838 if (result
&& result
!= -ENODEV
)
841 result
= eeepc_new_rfkill(eeepc
, &eeepc
->bluetooth_rfkill
,
842 "eeepc-bluetooth", RFKILL_TYPE_BLUETOOTH
,
845 if (result
&& result
!= -ENODEV
)
848 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wwan3g_rfkill
,
849 "eeepc-wwan3g", RFKILL_TYPE_WWAN
,
852 if (result
&& result
!= -ENODEV
)
855 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wimax_rfkill
,
856 "eeepc-wimax", RFKILL_TYPE_WIMAX
,
859 if (result
&& result
!= -ENODEV
)
862 if (eeepc
->hotplug_disabled
)
865 result
= eeepc_setup_pci_hotplug(eeepc
);
867 * If we get -EBUSY then something else is handling the PCI hotplug -
868 * don't fail in this case
870 if (result
== -EBUSY
)
873 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_1
);
874 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_2
);
875 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_3
);
878 if (result
&& result
!= -ENODEV
)
879 eeepc_rfkill_exit(eeepc
);
884 * Platform driver - hibernate/resume callbacks
886 static int eeepc_hotk_thaw(struct device
*device
)
888 struct eeepc_laptop
*eeepc
= dev_get_drvdata(device
);
890 if (eeepc
->wlan_rfkill
) {
894 * Work around bios bug - acpi _PTS turns off the wireless led
895 * during suspend. Normally it restores it on resume, but
896 * we should kick it ourselves in case hibernation is aborted.
898 wlan
= get_acpi(eeepc
, CM_ASL_WLAN
);
900 set_acpi(eeepc
, CM_ASL_WLAN
, wlan
);
906 static int eeepc_hotk_restore(struct device
*device
)
908 struct eeepc_laptop
*eeepc
= dev_get_drvdata(device
);
910 /* Refresh both wlan rfkill state and pci hotplug */
911 if (eeepc
->wlan_rfkill
) {
912 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_1
);
913 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_2
);
914 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_3
);
917 if (eeepc
->bluetooth_rfkill
)
918 rfkill_set_sw_state(eeepc
->bluetooth_rfkill
,
919 get_acpi(eeepc
, CM_ASL_BLUETOOTH
) != 1);
920 if (eeepc
->wwan3g_rfkill
)
921 rfkill_set_sw_state(eeepc
->wwan3g_rfkill
,
922 get_acpi(eeepc
, CM_ASL_3G
) != 1);
923 if (eeepc
->wimax_rfkill
)
924 rfkill_set_sw_state(eeepc
->wimax_rfkill
,
925 get_acpi(eeepc
, CM_ASL_WIMAX
) != 1);
930 static const struct dev_pm_ops eeepc_pm_ops
= {
931 .thaw
= eeepc_hotk_thaw
,
932 .restore
= eeepc_hotk_restore
,
935 static struct platform_driver platform_driver
= {
937 .name
= EEEPC_LAPTOP_FILE
,
946 #define EEEPC_EC_SC00 0x61
947 #define EEEPC_EC_FAN_PWM (EEEPC_EC_SC00 + 2) /* Fan PWM duty cycle (%) */
948 #define EEEPC_EC_FAN_HRPM (EEEPC_EC_SC00 + 5) /* High byte, fan speed (RPM) */
949 #define EEEPC_EC_FAN_LRPM (EEEPC_EC_SC00 + 6) /* Low byte, fan speed (RPM) */
951 #define EEEPC_EC_SFB0 0xD0
952 #define EEEPC_EC_FAN_CTRL (EEEPC_EC_SFB0 + 3) /* Byte containing SF25 */
954 static inline int eeepc_pwm_to_lmsensors(int value
)
956 return value
* 255 / 100;
959 static inline int eeepc_lmsensors_to_pwm(int value
)
961 value
= clamp_val(value
, 0, 255);
962 return value
* 100 / 255;
965 static int eeepc_get_fan_pwm(void)
969 ec_read(EEEPC_EC_FAN_PWM
, &value
);
970 return eeepc_pwm_to_lmsensors(value
);
973 static void eeepc_set_fan_pwm(int value
)
975 value
= eeepc_lmsensors_to_pwm(value
);
976 ec_write(EEEPC_EC_FAN_PWM
, value
);
979 static int eeepc_get_fan_rpm(void)
984 ec_read(EEEPC_EC_FAN_HRPM
, &high
);
985 ec_read(EEEPC_EC_FAN_LRPM
, &low
);
986 return high
<< 8 | low
;
989 #define EEEPC_EC_FAN_CTRL_BIT 0x02
990 #define EEEPC_FAN_CTRL_MANUAL 1
991 #define EEEPC_FAN_CTRL_AUTO 2
993 static int eeepc_get_fan_ctrl(void)
997 ec_read(EEEPC_EC_FAN_CTRL
, &value
);
998 if (value
& EEEPC_EC_FAN_CTRL_BIT
)
999 return EEEPC_FAN_CTRL_MANUAL
;
1001 return EEEPC_FAN_CTRL_AUTO
;
1004 static void eeepc_set_fan_ctrl(int manual
)
1008 ec_read(EEEPC_EC_FAN_CTRL
, &value
);
1009 if (manual
== EEEPC_FAN_CTRL_MANUAL
)
1010 value
|= EEEPC_EC_FAN_CTRL_BIT
;
1012 value
&= ~EEEPC_EC_FAN_CTRL_BIT
;
1013 ec_write(EEEPC_EC_FAN_CTRL
, value
);
1016 static ssize_t
store_sys_hwmon(void (*set
)(int), const char *buf
, size_t count
)
1020 rv
= parse_arg(buf
, &value
);
1027 static ssize_t
show_sys_hwmon(int (*get
)(void), char *buf
)
1029 return sprintf(buf
, "%d\n", get());
1032 #define EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1033 static ssize_t _name##_show(struct device *dev, \
1034 struct device_attribute *attr, \
1037 return show_sys_hwmon(_get, buf); \
1040 #define EEEPC_SENSOR_STORE_FUNC(_name, _set) \
1041 static ssize_t _name##_store(struct device *dev, \
1042 struct device_attribute *attr, \
1043 const char *buf, size_t count) \
1045 return store_sys_hwmon(_set, buf, count); \
1048 #define EEEPC_CREATE_SENSOR_ATTR_RW(_name, _get, _set) \
1049 EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1050 EEEPC_SENSOR_STORE_FUNC(_name, _set) \
1051 static DEVICE_ATTR_RW(_name)
1053 #define EEEPC_CREATE_SENSOR_ATTR_RO(_name, _get) \
1054 EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1055 static DEVICE_ATTR_RO(_name)
1057 EEEPC_CREATE_SENSOR_ATTR_RO(fan1_input
, eeepc_get_fan_rpm
);
1058 EEEPC_CREATE_SENSOR_ATTR_RW(pwm1
, eeepc_get_fan_pwm
,
1060 EEEPC_CREATE_SENSOR_ATTR_RW(pwm1_enable
, eeepc_get_fan_ctrl
,
1061 eeepc_set_fan_ctrl
);
1063 static struct attribute
*hwmon_attrs
[] = {
1064 &dev_attr_pwm1
.attr
,
1065 &dev_attr_fan1_input
.attr
,
1066 &dev_attr_pwm1_enable
.attr
,
1069 ATTRIBUTE_GROUPS(hwmon
);
1071 static int eeepc_hwmon_init(struct eeepc_laptop
*eeepc
)
1073 struct device
*dev
= &eeepc
->platform_device
->dev
;
1074 struct device
*hwmon
;
1076 hwmon
= devm_hwmon_device_register_with_groups(dev
, "eeepc", NULL
,
1078 if (IS_ERR(hwmon
)) {
1079 pr_err("Could not register eeepc hwmon device\n");
1080 return PTR_ERR(hwmon
);
1088 static int read_brightness(struct backlight_device
*bd
)
1090 struct eeepc_laptop
*eeepc
= bl_get_data(bd
);
1092 return get_acpi(eeepc
, CM_ASL_PANELBRIGHT
);
1095 static int set_brightness(struct backlight_device
*bd
, int value
)
1097 struct eeepc_laptop
*eeepc
= bl_get_data(bd
);
1099 return set_acpi(eeepc
, CM_ASL_PANELBRIGHT
, value
);
1102 static int update_bl_status(struct backlight_device
*bd
)
1104 return set_brightness(bd
, bd
->props
.brightness
);
1107 static const struct backlight_ops eeepcbl_ops
= {
1108 .get_brightness
= read_brightness
,
1109 .update_status
= update_bl_status
,
1112 static int eeepc_backlight_notify(struct eeepc_laptop
*eeepc
)
1114 struct backlight_device
*bd
= eeepc
->backlight_device
;
1115 int old
= bd
->props
.brightness
;
1117 backlight_force_update(bd
, BACKLIGHT_UPDATE_HOTKEY
);
1122 static int eeepc_backlight_init(struct eeepc_laptop
*eeepc
)
1124 struct backlight_properties props
;
1125 struct backlight_device
*bd
;
1127 memset(&props
, 0, sizeof(struct backlight_properties
));
1128 props
.type
= BACKLIGHT_PLATFORM
;
1129 props
.max_brightness
= 15;
1130 bd
= backlight_device_register(EEEPC_LAPTOP_FILE
,
1131 &eeepc
->platform_device
->dev
, eeepc
,
1132 &eeepcbl_ops
, &props
);
1134 pr_err("Could not register eeepc backlight device\n");
1135 eeepc
->backlight_device
= NULL
;
1138 eeepc
->backlight_device
= bd
;
1139 bd
->props
.brightness
= read_brightness(bd
);
1140 bd
->props
.power
= FB_BLANK_UNBLANK
;
1141 backlight_update_status(bd
);
1145 static void eeepc_backlight_exit(struct eeepc_laptop
*eeepc
)
1147 backlight_device_unregister(eeepc
->backlight_device
);
1148 eeepc
->backlight_device
= NULL
;
1153 * Input device (i.e. hotkeys)
1155 static int eeepc_input_init(struct eeepc_laptop
*eeepc
)
1157 struct input_dev
*input
;
1160 input
= input_allocate_device();
1164 input
->name
= "Asus EeePC extra buttons";
1165 input
->phys
= EEEPC_LAPTOP_FILE
"/input0";
1166 input
->id
.bustype
= BUS_HOST
;
1167 input
->dev
.parent
= &eeepc
->platform_device
->dev
;
1169 error
= sparse_keymap_setup(input
, eeepc_keymap
, NULL
);
1171 pr_err("Unable to setup input device keymap\n");
1175 error
= input_register_device(input
);
1177 pr_err("Unable to register input device\n");
1181 eeepc
->inputdev
= input
;
1185 input_free_device(input
);
1189 static void eeepc_input_exit(struct eeepc_laptop
*eeepc
)
1191 if (eeepc
->inputdev
)
1192 input_unregister_device(eeepc
->inputdev
);
1193 eeepc
->inputdev
= NULL
;
1199 static void eeepc_input_notify(struct eeepc_laptop
*eeepc
, int event
)
1201 if (!eeepc
->inputdev
)
1203 if (!sparse_keymap_report_event(eeepc
->inputdev
, event
, 1, true))
1204 pr_info("Unknown key %x pressed\n", event
);
1207 static void eeepc_acpi_notify(struct acpi_device
*device
, u32 event
)
1209 struct eeepc_laptop
*eeepc
= acpi_driver_data(device
);
1210 int old_brightness
, new_brightness
;
1213 if (event
> ACPI_MAX_SYS_NOTIFY
)
1215 count
= eeepc
->event_count
[event
% 128]++;
1216 acpi_bus_generate_netlink_event(device
->pnp
.device_class
,
1217 dev_name(&device
->dev
), event
,
1220 /* Brightness events are special */
1221 if (event
< NOTIFY_BRN_MIN
|| event
> NOTIFY_BRN_MAX
) {
1222 eeepc_input_notify(eeepc
, event
);
1226 /* Ignore them completely if the acpi video driver is used */
1227 if (!eeepc
->backlight_device
)
1230 /* Update the backlight device. */
1231 old_brightness
= eeepc_backlight_notify(eeepc
);
1233 /* Convert event to keypress (obsolescent hack) */
1234 new_brightness
= event
- NOTIFY_BRN_MIN
;
1236 if (new_brightness
< old_brightness
) {
1237 event
= NOTIFY_BRN_MIN
; /* brightness down */
1238 } else if (new_brightness
> old_brightness
) {
1239 event
= NOTIFY_BRN_MAX
; /* brightness up */
1242 * no change in brightness - already at min/max,
1243 * event will be desired value (or else ignored)
1246 eeepc_input_notify(eeepc
, event
);
1249 static void eeepc_dmi_check(struct eeepc_laptop
*eeepc
)
1253 model
= dmi_get_system_info(DMI_PRODUCT_NAME
);
1258 * Blacklist for setting cpufv (cpu speed).
1260 * EeePC 4G ("701") implements CFVS, but it is not supported
1261 * by the pre-installed OS, and the original option to change it
1262 * in the BIOS setup screen was removed in later versions.
1264 * Judging by the lack of "Super Hybrid Engine" on Asus product pages,
1265 * this applies to all "701" models (4G/4G Surf/2G Surf).
1267 * So Asus made a deliberate decision not to support it on this model.
1268 * We have several reports that using it can cause the system to hang
1270 * The hang has also been reported on a "702" (Model name "8G"?).
1272 * We avoid dmi_check_system() / dmi_match(), because they use
1273 * substring matching. We don't want to affect the "701SD"
1274 * and "701SDX" models, because they do support S.H.E.
1276 if (strcmp(model
, "701") == 0 || strcmp(model
, "702") == 0) {
1277 eeepc
->cpufv_disabled
= true;
1278 pr_info("model %s does not officially support setting cpu speed\n",
1280 pr_info("cpufv disabled to avoid instability\n");
1284 * Blacklist for wlan hotplug
1286 * Eeepc 1005HA doesn't work like others models and don't need the
1287 * hotplug code. In fact, current hotplug code seems to unplug another
1290 if (strcmp(model
, "1005HA") == 0 || strcmp(model
, "1201N") == 0 ||
1291 strcmp(model
, "1005PE") == 0) {
1292 eeepc
->hotplug_disabled
= true;
1293 pr_info("wlan hotplug disabled\n");
1297 static void cmsg_quirk(struct eeepc_laptop
*eeepc
, int cm
, const char *name
)
1301 /* Some BIOSes do not report cm although it is available.
1302 Check if cm_getv[cm] works and, if yes, assume cm should be set. */
1303 if (!(eeepc
->cm_supported
& (1 << cm
))
1304 && !read_acpi_int(eeepc
->handle
, cm_getv
[cm
], &dummy
)) {
1305 pr_info("%s (%x) not reported by BIOS, enabling anyway\n",
1307 eeepc
->cm_supported
|= 1 << cm
;
1311 static void cmsg_quirks(struct eeepc_laptop
*eeepc
)
1313 cmsg_quirk(eeepc
, CM_ASL_LID
, "LID");
1314 cmsg_quirk(eeepc
, CM_ASL_TYPE
, "TYPE");
1315 cmsg_quirk(eeepc
, CM_ASL_PANELPOWER
, "PANELPOWER");
1316 cmsg_quirk(eeepc
, CM_ASL_TPD
, "TPD");
1319 static int eeepc_acpi_init(struct eeepc_laptop
*eeepc
)
1321 unsigned int init_flags
;
1324 result
= acpi_bus_get_status(eeepc
->device
);
1327 if (!eeepc
->device
->status
.present
) {
1328 pr_err("Hotkey device not present, aborting\n");
1332 init_flags
= DISABLE_ASL_WLAN
| DISABLE_ASL_DISPLAYSWITCH
;
1333 pr_notice("Hotkey init flags 0x%x\n", init_flags
);
1335 if (write_acpi_int(eeepc
->handle
, "INIT", init_flags
)) {
1336 pr_err("Hotkey initialization failed\n");
1340 /* get control methods supported */
1341 if (read_acpi_int(eeepc
->handle
, "CMSG", &eeepc
->cm_supported
)) {
1342 pr_err("Get control methods supported failed\n");
1346 pr_info("Get control methods supported: 0x%x\n", eeepc
->cm_supported
);
1351 static void eeepc_enable_camera(struct eeepc_laptop
*eeepc
)
1354 * If the following call to set_acpi() fails, it's because there's no
1355 * camera so we can ignore the error.
1357 if (get_acpi(eeepc
, CM_ASL_CAMERA
) == 0)
1358 set_acpi(eeepc
, CM_ASL_CAMERA
, 1);
1361 static bool eeepc_device_present
;
1363 static int eeepc_acpi_add(struct acpi_device
*device
)
1365 struct eeepc_laptop
*eeepc
;
1368 pr_notice(EEEPC_LAPTOP_NAME
"\n");
1369 eeepc
= kzalloc(sizeof(struct eeepc_laptop
), GFP_KERNEL
);
1372 eeepc
->handle
= device
->handle
;
1373 strcpy(acpi_device_name(device
), EEEPC_ACPI_DEVICE_NAME
);
1374 strcpy(acpi_device_class(device
), EEEPC_ACPI_CLASS
);
1375 device
->driver_data
= eeepc
;
1376 eeepc
->device
= device
;
1378 eeepc
->hotplug_disabled
= hotplug_disabled
;
1380 eeepc_dmi_check(eeepc
);
1382 result
= eeepc_acpi_init(eeepc
);
1385 eeepc_enable_camera(eeepc
);
1388 * Register the platform device first. It is used as a parent for the
1389 * sub-devices below.
1391 * Note that if there are multiple instances of this ACPI device it
1392 * will bail out, because the platform device is registered with a
1393 * fixed name. Of course it doesn't make sense to have more than one,
1394 * and machine-specific scripts find the fixed name convenient. But
1395 * It's also good for us to exclude multiple instances because both
1396 * our hwmon and our wlan rfkill subdevice use global ACPI objects
1397 * (the EC and the wlan PCI slot respectively).
1399 result
= eeepc_platform_init(eeepc
);
1403 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
) {
1404 result
= eeepc_backlight_init(eeepc
);
1406 goto fail_backlight
;
1409 result
= eeepc_input_init(eeepc
);
1413 result
= eeepc_hwmon_init(eeepc
);
1417 result
= eeepc_led_init(eeepc
);
1421 result
= eeepc_rfkill_init(eeepc
);
1425 eeepc_device_present
= true;
1429 eeepc_led_exit(eeepc
);
1432 eeepc_input_exit(eeepc
);
1434 eeepc_backlight_exit(eeepc
);
1436 eeepc_platform_exit(eeepc
);
1443 static int eeepc_acpi_remove(struct acpi_device
*device
)
1445 struct eeepc_laptop
*eeepc
= acpi_driver_data(device
);
1447 eeepc_backlight_exit(eeepc
);
1448 eeepc_rfkill_exit(eeepc
);
1449 eeepc_input_exit(eeepc
);
1450 eeepc_led_exit(eeepc
);
1451 eeepc_platform_exit(eeepc
);
1458 static const struct acpi_device_id eeepc_device_ids
[] = {
1459 {EEEPC_ACPI_HID
, 0},
1462 MODULE_DEVICE_TABLE(acpi
, eeepc_device_ids
);
1464 static struct acpi_driver eeepc_acpi_driver
= {
1465 .name
= EEEPC_LAPTOP_NAME
,
1466 .class = EEEPC_ACPI_CLASS
,
1467 .owner
= THIS_MODULE
,
1468 .ids
= eeepc_device_ids
,
1469 .flags
= ACPI_DRIVER_ALL_NOTIFY_EVENTS
,
1471 .add
= eeepc_acpi_add
,
1472 .remove
= eeepc_acpi_remove
,
1473 .notify
= eeepc_acpi_notify
,
1478 static int __init
eeepc_laptop_init(void)
1482 result
= platform_driver_register(&platform_driver
);
1486 result
= acpi_bus_register_driver(&eeepc_acpi_driver
);
1488 goto fail_acpi_driver
;
1490 if (!eeepc_device_present
) {
1492 goto fail_no_device
;
1498 acpi_bus_unregister_driver(&eeepc_acpi_driver
);
1500 platform_driver_unregister(&platform_driver
);
1504 static void __exit
eeepc_laptop_exit(void)
1506 acpi_bus_unregister_driver(&eeepc_acpi_driver
);
1507 platform_driver_unregister(&platform_driver
);
1510 module_init(eeepc_laptop_init
);
1511 module_exit(eeepc_laptop_exit
);