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 if (!IS_ERR_OR_NULL(eeepc
->tpd_led
.dev
))
545 led_classdev_unregister(&eeepc
->tpd_led
);
546 if (eeepc
->led_workqueue
)
547 destroy_workqueue(eeepc
->led_workqueue
);
552 * PCI hotplug (for wlan rfkill)
554 static bool eeepc_wlan_rfkill_blocked(struct eeepc_laptop
*eeepc
)
556 if (get_acpi(eeepc
, CM_ASL_WLAN
) == 1)
561 static void eeepc_rfkill_hotplug(struct eeepc_laptop
*eeepc
, acpi_handle handle
)
563 struct pci_dev
*port
;
566 bool blocked
= eeepc_wlan_rfkill_blocked(eeepc
);
570 if (eeepc
->wlan_rfkill
)
571 rfkill_set_sw_state(eeepc
->wlan_rfkill
, blocked
);
573 mutex_lock(&eeepc
->hotplug_lock
);
574 pci_lock_rescan_remove();
576 if (!eeepc
->hotplug_slot
.ops
)
579 port
= acpi_get_pci_dev(handle
);
581 pr_warn("Unable to find port\n");
585 bus
= port
->subordinate
;
588 pr_warn("Unable to find PCI bus 1?\n");
592 if (pci_bus_read_config_dword(bus
, 0, PCI_VENDOR_ID
, &l
)) {
593 pr_err("Unable to read PCI config space?\n");
597 absent
= (l
== 0xffffffff);
599 if (blocked
!= absent
) {
600 pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
601 blocked
? "blocked" : "unblocked",
602 absent
? "absent" : "present");
603 pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
608 dev
= pci_get_slot(bus
, 0);
610 /* Device already present */
614 dev
= pci_scan_single_device(bus
, 0);
616 pci_bus_assign_resources(bus
);
617 pci_bus_add_device(dev
);
620 dev
= pci_get_slot(bus
, 0);
622 pci_stop_and_remove_bus_device(dev
);
630 pci_unlock_rescan_remove();
631 mutex_unlock(&eeepc
->hotplug_lock
);
634 static void eeepc_rfkill_hotplug_update(struct eeepc_laptop
*eeepc
, char *node
)
636 acpi_status status
= AE_OK
;
639 status
= acpi_get_handle(NULL
, node
, &handle
);
641 if (ACPI_SUCCESS(status
))
642 eeepc_rfkill_hotplug(eeepc
, handle
);
645 static void eeepc_rfkill_notify(acpi_handle handle
, u32 event
, void *data
)
647 struct eeepc_laptop
*eeepc
= data
;
649 if (event
!= ACPI_NOTIFY_BUS_CHECK
)
652 eeepc_rfkill_hotplug(eeepc
, handle
);
655 static int eeepc_register_rfkill_notifier(struct eeepc_laptop
*eeepc
,
661 status
= acpi_get_handle(NULL
, node
, &handle
);
663 if (ACPI_FAILURE(status
))
666 status
= acpi_install_notify_handler(handle
,
670 if (ACPI_FAILURE(status
))
671 pr_warn("Failed to register notify on %s\n", node
);
674 * Refresh pci hotplug in case the rfkill state was
675 * changed during setup.
677 eeepc_rfkill_hotplug(eeepc
, handle
);
681 static void eeepc_unregister_rfkill_notifier(struct eeepc_laptop
*eeepc
,
684 acpi_status status
= AE_OK
;
687 status
= acpi_get_handle(NULL
, node
, &handle
);
689 if (ACPI_FAILURE(status
))
692 status
= acpi_remove_notify_handler(handle
,
694 eeepc_rfkill_notify
);
695 if (ACPI_FAILURE(status
))
696 pr_err("Error removing rfkill notify handler %s\n",
699 * Refresh pci hotplug in case the rfkill
700 * state was changed after
701 * eeepc_unregister_rfkill_notifier()
703 eeepc_rfkill_hotplug(eeepc
, handle
);
706 static int eeepc_get_adapter_status(struct hotplug_slot
*hotplug_slot
,
709 struct eeepc_laptop
*eeepc
;
712 eeepc
= container_of(hotplug_slot
, struct eeepc_laptop
, hotplug_slot
);
713 val
= get_acpi(eeepc
, CM_ASL_WLAN
);
715 if (val
== 1 || val
== 0)
723 static const struct hotplug_slot_ops eeepc_hotplug_slot_ops
= {
724 .get_adapter_status
= eeepc_get_adapter_status
,
725 .get_power_status
= eeepc_get_adapter_status
,
728 static int eeepc_setup_pci_hotplug(struct eeepc_laptop
*eeepc
)
731 struct pci_bus
*bus
= pci_find_bus(0, 1);
734 pr_err("Unable to find wifi PCI bus\n");
738 eeepc
->hotplug_slot
.ops
= &eeepc_hotplug_slot_ops
;
740 ret
= pci_hp_register(&eeepc
->hotplug_slot
, bus
, 0, "eeepc-wifi");
742 pr_err("Unable to register hotplug slot - %d\n", ret
);
749 eeepc
->hotplug_slot
.ops
= NULL
;
756 static int eeepc_rfkill_set(void *data
, bool blocked
)
758 acpi_handle handle
= data
;
760 return write_acpi_int(handle
, NULL
, !blocked
);
763 static const struct rfkill_ops eeepc_rfkill_ops
= {
764 .set_block
= eeepc_rfkill_set
,
767 static int eeepc_new_rfkill(struct eeepc_laptop
*eeepc
,
768 struct rfkill
**rfkill
,
770 enum rfkill_type type
, int cm
)
775 result
= acpi_setter_handle(eeepc
, cm
, &handle
);
779 *rfkill
= rfkill_alloc(name
, &eeepc
->platform_device
->dev
, type
,
780 &eeepc_rfkill_ops
, handle
);
785 rfkill_init_sw_state(*rfkill
, get_acpi(eeepc
, cm
) != 1);
786 result
= rfkill_register(*rfkill
);
788 rfkill_destroy(*rfkill
);
795 static char EEEPC_RFKILL_NODE_1
[] = "\\_SB.PCI0.P0P5";
796 static char EEEPC_RFKILL_NODE_2
[] = "\\_SB.PCI0.P0P6";
797 static char EEEPC_RFKILL_NODE_3
[] = "\\_SB.PCI0.P0P7";
799 static void eeepc_rfkill_exit(struct eeepc_laptop
*eeepc
)
801 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_1
);
802 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_2
);
803 eeepc_unregister_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_3
);
804 if (eeepc
->wlan_rfkill
) {
805 rfkill_unregister(eeepc
->wlan_rfkill
);
806 rfkill_destroy(eeepc
->wlan_rfkill
);
807 eeepc
->wlan_rfkill
= NULL
;
810 if (eeepc
->hotplug_slot
.ops
)
811 pci_hp_deregister(&eeepc
->hotplug_slot
);
813 if (eeepc
->bluetooth_rfkill
) {
814 rfkill_unregister(eeepc
->bluetooth_rfkill
);
815 rfkill_destroy(eeepc
->bluetooth_rfkill
);
816 eeepc
->bluetooth_rfkill
= NULL
;
818 if (eeepc
->wwan3g_rfkill
) {
819 rfkill_unregister(eeepc
->wwan3g_rfkill
);
820 rfkill_destroy(eeepc
->wwan3g_rfkill
);
821 eeepc
->wwan3g_rfkill
= NULL
;
823 if (eeepc
->wimax_rfkill
) {
824 rfkill_unregister(eeepc
->wimax_rfkill
);
825 rfkill_destroy(eeepc
->wimax_rfkill
);
826 eeepc
->wimax_rfkill
= NULL
;
830 static int eeepc_rfkill_init(struct eeepc_laptop
*eeepc
)
834 mutex_init(&eeepc
->hotplug_lock
);
836 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wlan_rfkill
,
837 "eeepc-wlan", RFKILL_TYPE_WLAN
,
840 if (result
&& result
!= -ENODEV
)
843 result
= eeepc_new_rfkill(eeepc
, &eeepc
->bluetooth_rfkill
,
844 "eeepc-bluetooth", RFKILL_TYPE_BLUETOOTH
,
847 if (result
&& result
!= -ENODEV
)
850 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wwan3g_rfkill
,
851 "eeepc-wwan3g", RFKILL_TYPE_WWAN
,
854 if (result
&& result
!= -ENODEV
)
857 result
= eeepc_new_rfkill(eeepc
, &eeepc
->wimax_rfkill
,
858 "eeepc-wimax", RFKILL_TYPE_WIMAX
,
861 if (result
&& result
!= -ENODEV
)
864 if (eeepc
->hotplug_disabled
)
867 result
= eeepc_setup_pci_hotplug(eeepc
);
869 * If we get -EBUSY then something else is handling the PCI hotplug -
870 * don't fail in this case
872 if (result
== -EBUSY
)
875 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_1
);
876 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_2
);
877 eeepc_register_rfkill_notifier(eeepc
, EEEPC_RFKILL_NODE_3
);
880 if (result
&& result
!= -ENODEV
)
881 eeepc_rfkill_exit(eeepc
);
886 * Platform driver - hibernate/resume callbacks
888 static int eeepc_hotk_thaw(struct device
*device
)
890 struct eeepc_laptop
*eeepc
= dev_get_drvdata(device
);
892 if (eeepc
->wlan_rfkill
) {
896 * Work around bios bug - acpi _PTS turns off the wireless led
897 * during suspend. Normally it restores it on resume, but
898 * we should kick it ourselves in case hibernation is aborted.
900 wlan
= get_acpi(eeepc
, CM_ASL_WLAN
);
902 set_acpi(eeepc
, CM_ASL_WLAN
, wlan
);
908 static int eeepc_hotk_restore(struct device
*device
)
910 struct eeepc_laptop
*eeepc
= dev_get_drvdata(device
);
912 /* Refresh both wlan rfkill state and pci hotplug */
913 if (eeepc
->wlan_rfkill
) {
914 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_1
);
915 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_2
);
916 eeepc_rfkill_hotplug_update(eeepc
, EEEPC_RFKILL_NODE_3
);
919 if (eeepc
->bluetooth_rfkill
)
920 rfkill_set_sw_state(eeepc
->bluetooth_rfkill
,
921 get_acpi(eeepc
, CM_ASL_BLUETOOTH
) != 1);
922 if (eeepc
->wwan3g_rfkill
)
923 rfkill_set_sw_state(eeepc
->wwan3g_rfkill
,
924 get_acpi(eeepc
, CM_ASL_3G
) != 1);
925 if (eeepc
->wimax_rfkill
)
926 rfkill_set_sw_state(eeepc
->wimax_rfkill
,
927 get_acpi(eeepc
, CM_ASL_WIMAX
) != 1);
932 static const struct dev_pm_ops eeepc_pm_ops
= {
933 .thaw
= eeepc_hotk_thaw
,
934 .restore
= eeepc_hotk_restore
,
937 static struct platform_driver platform_driver
= {
939 .name
= EEEPC_LAPTOP_FILE
,
948 #define EEEPC_EC_SC00 0x61
949 #define EEEPC_EC_FAN_PWM (EEEPC_EC_SC00 + 2) /* Fan PWM duty cycle (%) */
950 #define EEEPC_EC_FAN_HRPM (EEEPC_EC_SC00 + 5) /* High byte, fan speed (RPM) */
951 #define EEEPC_EC_FAN_LRPM (EEEPC_EC_SC00 + 6) /* Low byte, fan speed (RPM) */
953 #define EEEPC_EC_SFB0 0xD0
954 #define EEEPC_EC_FAN_CTRL (EEEPC_EC_SFB0 + 3) /* Byte containing SF25 */
956 static inline int eeepc_pwm_to_lmsensors(int value
)
958 return value
* 255 / 100;
961 static inline int eeepc_lmsensors_to_pwm(int value
)
963 value
= clamp_val(value
, 0, 255);
964 return value
* 100 / 255;
967 static int eeepc_get_fan_pwm(void)
971 ec_read(EEEPC_EC_FAN_PWM
, &value
);
972 return eeepc_pwm_to_lmsensors(value
);
975 static void eeepc_set_fan_pwm(int value
)
977 value
= eeepc_lmsensors_to_pwm(value
);
978 ec_write(EEEPC_EC_FAN_PWM
, value
);
981 static int eeepc_get_fan_rpm(void)
986 ec_read(EEEPC_EC_FAN_HRPM
, &high
);
987 ec_read(EEEPC_EC_FAN_LRPM
, &low
);
988 return high
<< 8 | low
;
991 #define EEEPC_EC_FAN_CTRL_BIT 0x02
992 #define EEEPC_FAN_CTRL_MANUAL 1
993 #define EEEPC_FAN_CTRL_AUTO 2
995 static int eeepc_get_fan_ctrl(void)
999 ec_read(EEEPC_EC_FAN_CTRL
, &value
);
1000 if (value
& EEEPC_EC_FAN_CTRL_BIT
)
1001 return EEEPC_FAN_CTRL_MANUAL
;
1003 return EEEPC_FAN_CTRL_AUTO
;
1006 static void eeepc_set_fan_ctrl(int manual
)
1010 ec_read(EEEPC_EC_FAN_CTRL
, &value
);
1011 if (manual
== EEEPC_FAN_CTRL_MANUAL
)
1012 value
|= EEEPC_EC_FAN_CTRL_BIT
;
1014 value
&= ~EEEPC_EC_FAN_CTRL_BIT
;
1015 ec_write(EEEPC_EC_FAN_CTRL
, value
);
1018 static ssize_t
store_sys_hwmon(void (*set
)(int), const char *buf
, size_t count
)
1022 rv
= parse_arg(buf
, &value
);
1029 static ssize_t
show_sys_hwmon(int (*get
)(void), char *buf
)
1031 return sprintf(buf
, "%d\n", get());
1034 #define EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1035 static ssize_t _name##_show(struct device *dev, \
1036 struct device_attribute *attr, \
1039 return show_sys_hwmon(_get, buf); \
1042 #define EEEPC_SENSOR_STORE_FUNC(_name, _set) \
1043 static ssize_t _name##_store(struct device *dev, \
1044 struct device_attribute *attr, \
1045 const char *buf, size_t count) \
1047 return store_sys_hwmon(_set, buf, count); \
1050 #define EEEPC_CREATE_SENSOR_ATTR_RW(_name, _get, _set) \
1051 EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1052 EEEPC_SENSOR_STORE_FUNC(_name, _set) \
1053 static DEVICE_ATTR_RW(_name)
1055 #define EEEPC_CREATE_SENSOR_ATTR_RO(_name, _get) \
1056 EEEPC_SENSOR_SHOW_FUNC(_name, _get) \
1057 static DEVICE_ATTR_RO(_name)
1059 EEEPC_CREATE_SENSOR_ATTR_RO(fan1_input
, eeepc_get_fan_rpm
);
1060 EEEPC_CREATE_SENSOR_ATTR_RW(pwm1
, eeepc_get_fan_pwm
,
1062 EEEPC_CREATE_SENSOR_ATTR_RW(pwm1_enable
, eeepc_get_fan_ctrl
,
1063 eeepc_set_fan_ctrl
);
1065 static struct attribute
*hwmon_attrs
[] = {
1066 &dev_attr_pwm1
.attr
,
1067 &dev_attr_fan1_input
.attr
,
1068 &dev_attr_pwm1_enable
.attr
,
1071 ATTRIBUTE_GROUPS(hwmon
);
1073 static int eeepc_hwmon_init(struct eeepc_laptop
*eeepc
)
1075 struct device
*dev
= &eeepc
->platform_device
->dev
;
1076 struct device
*hwmon
;
1078 hwmon
= devm_hwmon_device_register_with_groups(dev
, "eeepc", NULL
,
1080 if (IS_ERR(hwmon
)) {
1081 pr_err("Could not register eeepc hwmon device\n");
1082 return PTR_ERR(hwmon
);
1090 static int read_brightness(struct backlight_device
*bd
)
1092 struct eeepc_laptop
*eeepc
= bl_get_data(bd
);
1094 return get_acpi(eeepc
, CM_ASL_PANELBRIGHT
);
1097 static int set_brightness(struct backlight_device
*bd
, int value
)
1099 struct eeepc_laptop
*eeepc
= bl_get_data(bd
);
1101 return set_acpi(eeepc
, CM_ASL_PANELBRIGHT
, value
);
1104 static int update_bl_status(struct backlight_device
*bd
)
1106 return set_brightness(bd
, bd
->props
.brightness
);
1109 static const struct backlight_ops eeepcbl_ops
= {
1110 .get_brightness
= read_brightness
,
1111 .update_status
= update_bl_status
,
1114 static int eeepc_backlight_notify(struct eeepc_laptop
*eeepc
)
1116 struct backlight_device
*bd
= eeepc
->backlight_device
;
1117 int old
= bd
->props
.brightness
;
1119 backlight_force_update(bd
, BACKLIGHT_UPDATE_HOTKEY
);
1124 static int eeepc_backlight_init(struct eeepc_laptop
*eeepc
)
1126 struct backlight_properties props
;
1127 struct backlight_device
*bd
;
1129 memset(&props
, 0, sizeof(struct backlight_properties
));
1130 props
.type
= BACKLIGHT_PLATFORM
;
1131 props
.max_brightness
= 15;
1132 bd
= backlight_device_register(EEEPC_LAPTOP_FILE
,
1133 &eeepc
->platform_device
->dev
, eeepc
,
1134 &eeepcbl_ops
, &props
);
1136 pr_err("Could not register eeepc backlight device\n");
1137 eeepc
->backlight_device
= NULL
;
1140 eeepc
->backlight_device
= bd
;
1141 bd
->props
.brightness
= read_brightness(bd
);
1142 bd
->props
.power
= FB_BLANK_UNBLANK
;
1143 backlight_update_status(bd
);
1147 static void eeepc_backlight_exit(struct eeepc_laptop
*eeepc
)
1149 backlight_device_unregister(eeepc
->backlight_device
);
1150 eeepc
->backlight_device
= NULL
;
1155 * Input device (i.e. hotkeys)
1157 static int eeepc_input_init(struct eeepc_laptop
*eeepc
)
1159 struct input_dev
*input
;
1162 input
= input_allocate_device();
1166 input
->name
= "Asus EeePC extra buttons";
1167 input
->phys
= EEEPC_LAPTOP_FILE
"/input0";
1168 input
->id
.bustype
= BUS_HOST
;
1169 input
->dev
.parent
= &eeepc
->platform_device
->dev
;
1171 error
= sparse_keymap_setup(input
, eeepc_keymap
, NULL
);
1173 pr_err("Unable to setup input device keymap\n");
1177 error
= input_register_device(input
);
1179 pr_err("Unable to register input device\n");
1183 eeepc
->inputdev
= input
;
1187 input_free_device(input
);
1191 static void eeepc_input_exit(struct eeepc_laptop
*eeepc
)
1193 if (eeepc
->inputdev
)
1194 input_unregister_device(eeepc
->inputdev
);
1195 eeepc
->inputdev
= NULL
;
1201 static void eeepc_input_notify(struct eeepc_laptop
*eeepc
, int event
)
1203 if (!eeepc
->inputdev
)
1205 if (!sparse_keymap_report_event(eeepc
->inputdev
, event
, 1, true))
1206 pr_info("Unknown key %x pressed\n", event
);
1209 static void eeepc_acpi_notify(struct acpi_device
*device
, u32 event
)
1211 struct eeepc_laptop
*eeepc
= acpi_driver_data(device
);
1212 int old_brightness
, new_brightness
;
1215 if (event
> ACPI_MAX_SYS_NOTIFY
)
1217 count
= eeepc
->event_count
[event
% 128]++;
1218 acpi_bus_generate_netlink_event(device
->pnp
.device_class
,
1219 dev_name(&device
->dev
), event
,
1222 /* Brightness events are special */
1223 if (event
< NOTIFY_BRN_MIN
|| event
> NOTIFY_BRN_MAX
) {
1224 eeepc_input_notify(eeepc
, event
);
1228 /* Ignore them completely if the acpi video driver is used */
1229 if (!eeepc
->backlight_device
)
1232 /* Update the backlight device. */
1233 old_brightness
= eeepc_backlight_notify(eeepc
);
1235 /* Convert event to keypress (obsolescent hack) */
1236 new_brightness
= event
- NOTIFY_BRN_MIN
;
1238 if (new_brightness
< old_brightness
) {
1239 event
= NOTIFY_BRN_MIN
; /* brightness down */
1240 } else if (new_brightness
> old_brightness
) {
1241 event
= NOTIFY_BRN_MAX
; /* brightness up */
1244 * no change in brightness - already at min/max,
1245 * event will be desired value (or else ignored)
1248 eeepc_input_notify(eeepc
, event
);
1251 static void eeepc_dmi_check(struct eeepc_laptop
*eeepc
)
1255 model
= dmi_get_system_info(DMI_PRODUCT_NAME
);
1260 * Blacklist for setting cpufv (cpu speed).
1262 * EeePC 4G ("701") implements CFVS, but it is not supported
1263 * by the pre-installed OS, and the original option to change it
1264 * in the BIOS setup screen was removed in later versions.
1266 * Judging by the lack of "Super Hybrid Engine" on Asus product pages,
1267 * this applies to all "701" models (4G/4G Surf/2G Surf).
1269 * So Asus made a deliberate decision not to support it on this model.
1270 * We have several reports that using it can cause the system to hang
1272 * The hang has also been reported on a "702" (Model name "8G"?).
1274 * We avoid dmi_check_system() / dmi_match(), because they use
1275 * substring matching. We don't want to affect the "701SD"
1276 * and "701SDX" models, because they do support S.H.E.
1278 if (strcmp(model
, "701") == 0 || strcmp(model
, "702") == 0) {
1279 eeepc
->cpufv_disabled
= true;
1280 pr_info("model %s does not officially support setting cpu speed\n",
1282 pr_info("cpufv disabled to avoid instability\n");
1286 * Blacklist for wlan hotplug
1288 * Eeepc 1005HA doesn't work like others models and don't need the
1289 * hotplug code. In fact, current hotplug code seems to unplug another
1292 if (strcmp(model
, "1005HA") == 0 || strcmp(model
, "1201N") == 0 ||
1293 strcmp(model
, "1005PE") == 0) {
1294 eeepc
->hotplug_disabled
= true;
1295 pr_info("wlan hotplug disabled\n");
1299 static void cmsg_quirk(struct eeepc_laptop
*eeepc
, int cm
, const char *name
)
1303 /* Some BIOSes do not report cm although it is available.
1304 Check if cm_getv[cm] works and, if yes, assume cm should be set. */
1305 if (!(eeepc
->cm_supported
& (1 << cm
))
1306 && !read_acpi_int(eeepc
->handle
, cm_getv
[cm
], &dummy
)) {
1307 pr_info("%s (%x) not reported by BIOS, enabling anyway\n",
1309 eeepc
->cm_supported
|= 1 << cm
;
1313 static void cmsg_quirks(struct eeepc_laptop
*eeepc
)
1315 cmsg_quirk(eeepc
, CM_ASL_LID
, "LID");
1316 cmsg_quirk(eeepc
, CM_ASL_TYPE
, "TYPE");
1317 cmsg_quirk(eeepc
, CM_ASL_PANELPOWER
, "PANELPOWER");
1318 cmsg_quirk(eeepc
, CM_ASL_TPD
, "TPD");
1321 static int eeepc_acpi_init(struct eeepc_laptop
*eeepc
)
1323 unsigned int init_flags
;
1326 result
= acpi_bus_get_status(eeepc
->device
);
1329 if (!eeepc
->device
->status
.present
) {
1330 pr_err("Hotkey device not present, aborting\n");
1334 init_flags
= DISABLE_ASL_WLAN
| DISABLE_ASL_DISPLAYSWITCH
;
1335 pr_notice("Hotkey init flags 0x%x\n", init_flags
);
1337 if (write_acpi_int(eeepc
->handle
, "INIT", init_flags
)) {
1338 pr_err("Hotkey initialization failed\n");
1342 /* get control methods supported */
1343 if (read_acpi_int(eeepc
->handle
, "CMSG", &eeepc
->cm_supported
)) {
1344 pr_err("Get control methods supported failed\n");
1348 pr_info("Get control methods supported: 0x%x\n", eeepc
->cm_supported
);
1353 static void eeepc_enable_camera(struct eeepc_laptop
*eeepc
)
1356 * If the following call to set_acpi() fails, it's because there's no
1357 * camera so we can ignore the error.
1359 if (get_acpi(eeepc
, CM_ASL_CAMERA
) == 0)
1360 set_acpi(eeepc
, CM_ASL_CAMERA
, 1);
1363 static bool eeepc_device_present
;
1365 static int eeepc_acpi_add(struct acpi_device
*device
)
1367 struct eeepc_laptop
*eeepc
;
1370 pr_notice(EEEPC_LAPTOP_NAME
"\n");
1371 eeepc
= kzalloc(sizeof(struct eeepc_laptop
), GFP_KERNEL
);
1374 eeepc
->handle
= device
->handle
;
1375 strcpy(acpi_device_name(device
), EEEPC_ACPI_DEVICE_NAME
);
1376 strcpy(acpi_device_class(device
), EEEPC_ACPI_CLASS
);
1377 device
->driver_data
= eeepc
;
1378 eeepc
->device
= device
;
1380 eeepc
->hotplug_disabled
= hotplug_disabled
;
1382 eeepc_dmi_check(eeepc
);
1384 result
= eeepc_acpi_init(eeepc
);
1387 eeepc_enable_camera(eeepc
);
1390 * Register the platform device first. It is used as a parent for the
1391 * sub-devices below.
1393 * Note that if there are multiple instances of this ACPI device it
1394 * will bail out, because the platform device is registered with a
1395 * fixed name. Of course it doesn't make sense to have more than one,
1396 * and machine-specific scripts find the fixed name convenient. But
1397 * It's also good for us to exclude multiple instances because both
1398 * our hwmon and our wlan rfkill subdevice use global ACPI objects
1399 * (the EC and the wlan PCI slot respectively).
1401 result
= eeepc_platform_init(eeepc
);
1405 if (acpi_video_get_backlight_type() == acpi_backlight_vendor
) {
1406 result
= eeepc_backlight_init(eeepc
);
1408 goto fail_backlight
;
1411 result
= eeepc_input_init(eeepc
);
1415 result
= eeepc_hwmon_init(eeepc
);
1419 result
= eeepc_led_init(eeepc
);
1423 result
= eeepc_rfkill_init(eeepc
);
1427 eeepc_device_present
= true;
1431 eeepc_led_exit(eeepc
);
1434 eeepc_input_exit(eeepc
);
1436 eeepc_backlight_exit(eeepc
);
1438 eeepc_platform_exit(eeepc
);
1445 static int eeepc_acpi_remove(struct acpi_device
*device
)
1447 struct eeepc_laptop
*eeepc
= acpi_driver_data(device
);
1449 eeepc_backlight_exit(eeepc
);
1450 eeepc_rfkill_exit(eeepc
);
1451 eeepc_input_exit(eeepc
);
1452 eeepc_led_exit(eeepc
);
1453 eeepc_platform_exit(eeepc
);
1460 static const struct acpi_device_id eeepc_device_ids
[] = {
1461 {EEEPC_ACPI_HID
, 0},
1464 MODULE_DEVICE_TABLE(acpi
, eeepc_device_ids
);
1466 static struct acpi_driver eeepc_acpi_driver
= {
1467 .name
= EEEPC_LAPTOP_NAME
,
1468 .class = EEEPC_ACPI_CLASS
,
1469 .owner
= THIS_MODULE
,
1470 .ids
= eeepc_device_ids
,
1471 .flags
= ACPI_DRIVER_ALL_NOTIFY_EVENTS
,
1473 .add
= eeepc_acpi_add
,
1474 .remove
= eeepc_acpi_remove
,
1475 .notify
= eeepc_acpi_notify
,
1480 static int __init
eeepc_laptop_init(void)
1484 result
= platform_driver_register(&platform_driver
);
1488 result
= acpi_bus_register_driver(&eeepc_acpi_driver
);
1490 goto fail_acpi_driver
;
1492 if (!eeepc_device_present
) {
1494 goto fail_no_device
;
1500 acpi_bus_unregister_driver(&eeepc_acpi_driver
);
1502 platform_driver_unregister(&platform_driver
);
1506 static void __exit
eeepc_laptop_exit(void)
1508 acpi_bus_unregister_driver(&eeepc_acpi_driver
);
1509 platform_driver_unregister(&platform_driver
);
1512 module_init(eeepc_laptop_init
);
1513 module_exit(eeepc_laptop_exit
);