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>
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>
37 #include <linux/leds.h>
39 #define EEEPC_LAPTOP_VERSION "0.1"
41 #define EEEPC_HOTK_NAME "Eee PC Hotkey Driver"
42 #define EEEPC_HOTK_FILE "eeepc"
43 #define EEEPC_HOTK_CLASS "hotkey"
44 #define EEEPC_HOTK_DEVICE_NAME "Hotkey"
45 #define EEEPC_HOTK_HID "ASUS010"
49 * Definitions for Asus EeePC
51 #define NOTIFY_WLAN_ON 0x10
52 #define NOTIFY_BRN_MIN 0x20
53 #define NOTIFY_BRN_MAX 0x2f
56 DISABLE_ASL_WLAN = 0x0001,
57 DISABLE_ASL_BLUETOOTH = 0x0002,
58 DISABLE_ASL_IRDA = 0x0004,
59 DISABLE_ASL_CAMERA = 0x0008,
60 DISABLE_ASL_TV = 0x0010,
61 DISABLE_ASL_GPS = 0x0020,
62 DISABLE_ASL_DISPLAYSWITCH = 0x0040,
63 DISABLE_ASL_MODEM = 0x0080,
64 DISABLE_ASL_CARDREADER = 0x0100,
65 DISABLE_ASL_3G = 0x0200,
66 DISABLE_ASL_WIMAX = 0x0400,
67 DISABLE_ASL_HWCF = 0x0800
84 CM_ASL_CPUTEMPERATURE,
97 CM_ASL_PANELPOWER, /*P901*/
101 static const char *cm_getv[] = {
102 "WLDG", "BTHG", NULL, NULL,
103 "CAMG", NULL, NULL, NULL,
104 NULL, "PBLG", NULL, NULL,
105 "CFVG", NULL, NULL, NULL,
106 "USBG", NULL, NULL, "MODG",
107 "CRDG", "M3GG", "WIMG", "HWCF",
108 "LIDG", "TYPE", "PBPG", "TPDG"
111 static const char *cm_setv[] = {
112 "WLDS", "BTHS", NULL, NULL,
113 "CAMS", NULL, NULL, NULL,
114 "SDSP", "PBLS", "HDPS", NULL,
115 "CFVS", NULL, NULL, NULL,
116 "USBG", NULL, NULL, "MODS",
117 "CRDS", "M3GS", "WIMS", NULL,
118 NULL, NULL, "PBPS", "TPDS"
121 #define EEEPC_EC "\\_SB.PCI0.SBRG.EC0."
123 #define EEEPC_EC_FAN_PWM EEEPC_EC "SC02" /* Fan PWM duty cycle (%) */
124 #define EEEPC_EC_SC02 0x63
125 #define EEEPC_EC_FAN_HRPM EEEPC_EC "SC05" /* High byte, fan speed (RPM) */
126 #define EEEPC_EC_FAN_LRPM EEEPC_EC "SC06" /* Low byte, fan speed (RPM) */
127 #define EEEPC_EC_FAN_CTRL EEEPC_EC "SFB3" /* Byte containing SF25 */
128 #define EEEPC_EC_SFB3 0xD3
131 * This is the main structure, we can use it to store useful information
132 * about the hotk device
135 struct acpi_device *device; /* the device we are in */
136 acpi_handle handle; /* the handle of the hotk device */
137 u32 cm_supported; /* the control methods supported
139 uint init_flag; /* Init flags */
140 u16 event_count[128]; /* count for each event */
141 struct input_dev *inputdev;
143 struct rfkill *wlan_rfkill;
144 struct rfkill *bluetooth_rfkill;
145 struct rfkill *wwan3g_rfkill;
146 struct rfkill *wimax_rfkill;
147 struct hotplug_slot *hotplug_slot;
148 struct mutex hotplug_lock;
151 /* The actual device the driver binds to */
152 static struct eeepc_hotk *ehotk;
154 /* Platform device/driver */
155 static int eeepc_hotk_thaw(struct device *device);
156 static int eeepc_hotk_restore(struct device *device);
158 static struct dev_pm_ops eeepc_pm_ops = {
159 .thaw = eeepc_hotk_thaw,
160 .restore = eeepc_hotk_restore,
163 static struct platform_driver platform_driver = {
165 .name = EEEPC_HOTK_FILE,
166 .owner = THIS_MODULE,
171 static struct platform_device *platform_device;
179 enum { KE_KEY, KE_END };
181 static struct key_entry eeepc_keymap[] = {
182 /* Sleep already handled via generic ACPI code */
183 {KE_KEY, 0x10, KEY_WLAN },
184 {KE_KEY, 0x11, KEY_WLAN },
185 {KE_KEY, 0x12, KEY_PROG1 },
186 {KE_KEY, 0x13, KEY_MUTE },
187 {KE_KEY, 0x14, KEY_VOLUMEDOWN },
188 {KE_KEY, 0x15, KEY_VOLUMEUP },
189 {KE_KEY, 0x1a, KEY_COFFEE },
190 {KE_KEY, 0x1b, KEY_ZOOM },
191 {KE_KEY, 0x1c, KEY_PROG2 },
192 {KE_KEY, 0x1d, KEY_PROG3 },
193 {KE_KEY, NOTIFY_BRN_MIN, KEY_BRIGHTNESSDOWN },
194 {KE_KEY, NOTIFY_BRN_MIN + 2, KEY_BRIGHTNESSUP },
195 {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
196 {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
197 {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
202 * The hotkey driver declaration
204 static int eeepc_hotk_add(struct acpi_device *device);
205 static int eeepc_hotk_remove(struct acpi_device *device, int type);
206 static void eeepc_hotk_notify(struct acpi_device *device, u32 event);
208 static const struct acpi_device_id eeepc_device_ids[] = {
212 MODULE_DEVICE_TABLE(acpi, eeepc_device_ids);
214 static struct acpi_driver eeepc_hotk_driver = {
215 .name = EEEPC_HOTK_NAME,
216 .class = EEEPC_HOTK_CLASS,
217 .owner = THIS_MODULE,
218 .ids = eeepc_device_ids,
219 .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
221 .add = eeepc_hotk_add,
222 .remove = eeepc_hotk_remove,
223 .notify = eeepc_hotk_notify,
227 /* PCI hotplug ops */
228 static int eeepc_get_adapter_status(struct hotplug_slot *slot, u8 *value);
230 static struct hotplug_slot_ops eeepc_hotplug_slot_ops = {
231 .owner = THIS_MODULE,
232 .get_adapter_status = eeepc_get_adapter_status,
233 .get_power_status = eeepc_get_adapter_status,
236 /* The backlight device /sys/class/backlight */
237 static struct backlight_device *eeepc_backlight_device;
239 /* The hwmon device */
240 static struct device *eeepc_hwmon_device;
243 * The backlight class declaration
245 static int read_brightness(struct backlight_device *bd);
246 static int update_bl_status(struct backlight_device *bd);
247 static struct backlight_ops eeepcbl_ops = {
248 .get_brightness = read_brightness,
249 .update_status = update_bl_status,
252 MODULE_AUTHOR("Corentin Chary, Eric Cooper");
253 MODULE_DESCRIPTION(EEEPC_HOTK_NAME);
254 MODULE_LICENSE("GPL");
259 static int write_acpi_int(acpi_handle handle, const char *method, int val,
260 struct acpi_buffer *output)
262 struct acpi_object_list params;
263 union acpi_object in_obj;
267 params.pointer = &in_obj;
268 in_obj.type = ACPI_TYPE_INTEGER;
269 in_obj.integer.value = val;
271 status = acpi_evaluate_object(handle, (char *)method, ¶ms, output);
272 return (status == AE_OK ? 0 : -1);
275 static int read_acpi_int(acpi_handle handle, const char *method, int *val)
278 unsigned long long result;
280 status = acpi_evaluate_integer(handle, (char *)method, NULL, &result);
281 if (ACPI_FAILURE(status)) {
290 static int set_acpi(int cm, int value)
292 const char *method = cm_setv[cm];
296 if ((ehotk->cm_supported & (0x1 << cm)) == 0)
299 if (write_acpi_int(ehotk->handle, method, value, NULL))
300 pr_warning("Error writing %s\n", method);
304 static int get_acpi(int cm)
306 const char *method = cm_getv[cm];
311 if ((ehotk->cm_supported & (0x1 << cm)) == 0)
314 if (read_acpi_int(ehotk->handle, method, &value))
315 pr_warning("Error reading %s\n", method);
322 static int read_brightness(struct backlight_device *bd)
324 return get_acpi(CM_ASL_PANELBRIGHT);
327 static int set_brightness(struct backlight_device *bd, int value)
329 return set_acpi(CM_ASL_PANELBRIGHT, value);
332 static int update_bl_status(struct backlight_device *bd)
334 return set_brightness(bd, bd->props.brightness);
341 static bool eeepc_wlan_rfkill_blocked(void)
343 if (get_acpi(CM_ASL_WLAN) == 1)
348 static int eeepc_rfkill_set(void *data, bool blocked)
350 unsigned long asl = (unsigned long)data;
351 return set_acpi(asl, !blocked);
354 static const struct rfkill_ops eeepc_rfkill_ops = {
355 .set_block = eeepc_rfkill_set,
358 static void __devinit eeepc_enable_camera(void)
361 * If the following call to set_acpi() fails, it's because there's no
362 * camera so we can ignore the error.
364 if (get_acpi(CM_ASL_CAMERA) == 0)
365 set_acpi(CM_ASL_CAMERA, 1);
371 static int parse_arg(const char *buf, unsigned long count, int *val)
375 if (sscanf(buf, "%i", val) != 1)
380 static ssize_t store_sys_acpi(int cm, const char *buf, size_t count)
384 rv = parse_arg(buf, count, &value);
386 value = set_acpi(cm, value);
392 static ssize_t show_sys_acpi(int cm, char *buf)
394 int value = get_acpi(cm);
398 return sprintf(buf, "%d\n", value);
401 #define EEEPC_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
402 static ssize_t show_##_name(struct device *dev, \
403 struct device_attribute *attr, \
406 return show_sys_acpi(_cm, buf); \
408 static ssize_t store_##_name(struct device *dev, \
409 struct device_attribute *attr, \
410 const char *buf, size_t count) \
412 return store_sys_acpi(_cm, buf, count); \
414 static struct device_attribute dev_attr_##_name = { \
416 .name = __stringify(_name), \
418 .show = show_##_name, \
419 .store = store_##_name, \
422 EEEPC_CREATE_DEVICE_ATTR(camera, 0644, CM_ASL_CAMERA);
423 EEEPC_CREATE_DEVICE_ATTR(cardr, 0644, CM_ASL_CARDREADER);
424 EEEPC_CREATE_DEVICE_ATTR(disp, 0200, CM_ASL_DISPLAYSWITCH);
431 static int get_cpufv(struct eeepc_cpufv *c)
433 c->cur = get_acpi(CM_ASL_CPUFV);
434 c->num = (c->cur >> 8) & 0xff;
436 if (c->cur < 0 || c->num <= 0 || c->num > 12)
441 static ssize_t show_available_cpufv(struct device *dev,
442 struct device_attribute *attr,
445 struct eeepc_cpufv c;
451 for (i = 0; i < c.num; i++)
452 len += sprintf(buf + len, "%d ", i);
453 len += sprintf(buf + len, "\n");
457 static ssize_t show_cpufv(struct device *dev,
458 struct device_attribute *attr,
461 struct eeepc_cpufv c;
465 return sprintf(buf, "%#x\n", (c.num << 8) | c.cur);
468 static ssize_t store_cpufv(struct device *dev,
469 struct device_attribute *attr,
470 const char *buf, size_t count)
472 struct eeepc_cpufv c;
477 rv = parse_arg(buf, count, &value);
480 if (!rv || value < 0 || value >= c.num)
482 set_acpi(CM_ASL_CPUFV, value);
486 static struct device_attribute dev_attr_cpufv = {
494 static struct device_attribute dev_attr_available_cpufv = {
496 .name = "available_cpufv",
498 .show = show_available_cpufv
501 static struct attribute *platform_attributes[] = {
502 &dev_attr_camera.attr,
503 &dev_attr_cardr.attr,
505 &dev_attr_cpufv.attr,
506 &dev_attr_available_cpufv.attr,
510 static struct attribute_group platform_attribute_group = {
511 .attrs = platform_attributes
518 * These functions actually update the LED's, and are called from a
519 * workqueue. By doing this as separate work rather than when the LED
520 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
521 * potentially bad time, such as a timer interrupt.
523 static int tpd_led_wk;
525 static void tpd_led_update(struct work_struct *ignored)
527 int value = tpd_led_wk;
528 set_acpi(CM_ASL_TPD, value);
531 static struct workqueue_struct *led_workqueue;
532 static DECLARE_WORK(tpd_led_work, tpd_led_update);
534 static void tpd_led_set(struct led_classdev *led_cdev,
535 enum led_brightness value)
537 tpd_led_wk = (value > 0) ? 1 : 0;
538 queue_work(led_workqueue, &tpd_led_work);
541 static struct led_classdev tpd_led = {
542 .name = "eeepc::touchpad",
543 .brightness_set = tpd_led_set,
550 static struct key_entry *eepc_get_entry_by_scancode(int code)
552 struct key_entry *key;
554 for (key = eeepc_keymap; key->type != KE_END; key++)
555 if (code == key->code)
561 static struct key_entry *eepc_get_entry_by_keycode(int code)
563 struct key_entry *key;
565 for (key = eeepc_keymap; key->type != KE_END; key++)
566 if (code == key->keycode && key->type == KE_KEY)
572 static int eeepc_getkeycode(struct input_dev *dev, int scancode, int *keycode)
574 struct key_entry *key = eepc_get_entry_by_scancode(scancode);
576 if (key && key->type == KE_KEY) {
577 *keycode = key->keycode;
584 static int eeepc_setkeycode(struct input_dev *dev, int scancode, int keycode)
586 struct key_entry *key;
589 if (keycode < 0 || keycode > KEY_MAX)
592 key = eepc_get_entry_by_scancode(scancode);
593 if (key && key->type == KE_KEY) {
594 old_keycode = key->keycode;
595 key->keycode = keycode;
596 set_bit(keycode, dev->keybit);
597 if (!eepc_get_entry_by_keycode(old_keycode))
598 clear_bit(old_keycode, dev->keybit);
605 static void cmsg_quirk(int cm, const char *name)
609 /* Some BIOSes do not report cm although it is avaliable.
610 Check if cm_getv[cm] works and, if yes, assume cm should be set. */
611 if (!(ehotk->cm_supported & (1 << cm))
612 && !read_acpi_int(ehotk->handle, cm_getv[cm], &dummy)) {
613 pr_info("%s (%x) not reported by BIOS,"
614 " enabling anyway\n", name, 1 << cm);
615 ehotk->cm_supported |= 1 << cm;
619 static void cmsg_quirks(void)
621 cmsg_quirk(CM_ASL_LID, "LID");
622 cmsg_quirk(CM_ASL_TYPE, "TYPE");
623 cmsg_quirk(CM_ASL_PANELPOWER, "PANELPOWER");
624 cmsg_quirk(CM_ASL_TPD, "TPD");
627 static int eeepc_hotk_check(void)
629 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
632 result = acpi_bus_get_status(ehotk->device);
635 if (ehotk->device->status.present) {
636 if (write_acpi_int(ehotk->handle, "INIT", ehotk->init_flag,
638 pr_err("Hotkey initialization failed\n");
641 pr_notice("Hotkey init flags 0x%x\n", ehotk->init_flag);
643 /* get control methods supported */
644 if (read_acpi_int(ehotk->handle, "CMSG"
645 , &ehotk->cm_supported)) {
646 pr_err("Get control methods supported failed\n");
650 pr_info("Get control methods supported: 0x%x\n",
651 ehotk->cm_supported);
654 pr_err("Hotkey device not present, aborting\n");
660 static int notify_brn(void)
662 /* returns the *previous* brightness, or -1 */
663 struct backlight_device *bd = eeepc_backlight_device;
664 int old = bd->props.brightness;
666 backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
671 static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
674 int val = get_acpi(CM_ASL_WLAN);
676 if (val == 1 || val == 0)
684 static void eeepc_rfkill_hotplug(void)
688 bool blocked = eeepc_wlan_rfkill_blocked();
690 if (ehotk->wlan_rfkill)
691 rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
693 mutex_lock(&ehotk->hotplug_lock);
695 if (ehotk->hotplug_slot) {
696 bus = pci_find_bus(0, 1);
698 pr_warning("Unable to find PCI bus 1?\n");
703 dev = pci_get_slot(bus, 0);
705 /* Device already present */
709 dev = pci_scan_single_device(bus, 0);
711 pci_bus_assign_resources(bus);
712 if (pci_bus_add_device(dev))
713 pr_err("Unable to hotplug wifi\n");
716 dev = pci_get_slot(bus, 0);
718 pci_remove_bus_device(dev);
725 mutex_unlock(&ehotk->hotplug_lock);
728 static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
730 if (event != ACPI_NOTIFY_BUS_CHECK)
733 eeepc_rfkill_hotplug();
736 static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
738 static struct key_entry *key;
742 if (event > ACPI_MAX_SYS_NOTIFY)
744 if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
746 count = ehotk->event_count[event % 128]++;
747 acpi_bus_generate_proc_event(ehotk->device, event, count);
748 acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
749 dev_name(&ehotk->device->dev), event,
751 if (ehotk->inputdev) {
752 /* brightness-change events need special
753 * handling for conversion to key events
758 brn += NOTIFY_BRN_MIN;
760 event = NOTIFY_BRN_MIN; /* brightness down */
761 else if (event > brn)
762 event = NOTIFY_BRN_MIN + 2; /* ... up */
764 event = NOTIFY_BRN_MIN + 1; /* ... unchanged */
766 key = eepc_get_entry_by_scancode(event);
770 input_report_key(ehotk->inputdev, key->keycode,
772 input_sync(ehotk->inputdev);
773 input_report_key(ehotk->inputdev, key->keycode,
775 input_sync(ehotk->inputdev);
782 static int eeepc_register_rfkill_notifier(char *node)
784 acpi_status status = AE_OK;
787 status = acpi_get_handle(NULL, node, &handle);
789 if (ACPI_SUCCESS(status)) {
790 status = acpi_install_notify_handler(handle,
794 if (ACPI_FAILURE(status))
795 pr_warning("Failed to register notify on %s\n", node);
802 static void eeepc_unregister_rfkill_notifier(char *node)
804 acpi_status status = AE_OK;
807 status = acpi_get_handle(NULL, node, &handle);
809 if (ACPI_SUCCESS(status)) {
810 status = acpi_remove_notify_handler(handle,
812 eeepc_rfkill_notify);
813 if (ACPI_FAILURE(status))
814 pr_err("Error removing rfkill notify handler %s\n",
819 static void eeepc_cleanup_pci_hotplug(struct hotplug_slot *hotplug_slot)
821 kfree(hotplug_slot->info);
825 static int eeepc_setup_pci_hotplug(void)
828 struct pci_bus *bus = pci_find_bus(0, 1);
831 pr_err("Unable to find wifi PCI bus\n");
835 ehotk->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
836 if (!ehotk->hotplug_slot)
839 ehotk->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
841 if (!ehotk->hotplug_slot->info)
844 ehotk->hotplug_slot->private = ehotk;
845 ehotk->hotplug_slot->release = &eeepc_cleanup_pci_hotplug;
846 ehotk->hotplug_slot->ops = &eeepc_hotplug_slot_ops;
847 eeepc_get_adapter_status(ehotk->hotplug_slot,
848 &ehotk->hotplug_slot->info->adapter_status);
850 ret = pci_hp_register(ehotk->hotplug_slot, bus, 0, "eeepc-wifi");
852 pr_err("Unable to register hotplug slot - %d\n", ret);
859 kfree(ehotk->hotplug_slot->info);
861 kfree(ehotk->hotplug_slot);
862 ehotk->hotplug_slot = NULL;
867 static int eeepc_hotk_thaw(struct device *device)
869 if (ehotk->wlan_rfkill) {
873 * Work around bios bug - acpi _PTS turns off the wireless led
874 * during suspend. Normally it restores it on resume, but
875 * we should kick it ourselves in case hibernation is aborted.
877 wlan = get_acpi(CM_ASL_WLAN);
878 set_acpi(CM_ASL_WLAN, wlan);
884 static int eeepc_hotk_restore(struct device *device)
886 /* Refresh both wlan rfkill state and pci hotplug */
887 if (ehotk->wlan_rfkill)
888 eeepc_rfkill_hotplug();
890 if (ehotk->bluetooth_rfkill)
891 rfkill_set_sw_state(ehotk->bluetooth_rfkill,
892 get_acpi(CM_ASL_BLUETOOTH) != 1);
893 if (ehotk->wwan3g_rfkill)
894 rfkill_set_sw_state(ehotk->wwan3g_rfkill,
895 get_acpi(CM_ASL_3G) != 1);
896 if (ehotk->wimax_rfkill)
897 rfkill_set_sw_state(ehotk->wimax_rfkill,
898 get_acpi(CM_ASL_WIMAX) != 1);
906 static int eeepc_get_fan_pwm(void)
910 read_acpi_int(NULL, EEEPC_EC_FAN_PWM, &value);
911 value = value * 255 / 100;
915 static void eeepc_set_fan_pwm(int value)
917 value = SENSORS_LIMIT(value, 0, 255);
918 value = value * 100 / 255;
919 ec_write(EEEPC_EC_SC02, value);
922 static int eeepc_get_fan_rpm(void)
927 read_acpi_int(NULL, EEEPC_EC_FAN_HRPM, &high);
928 read_acpi_int(NULL, EEEPC_EC_FAN_LRPM, &low);
929 return (high << 8 | low);
932 static int eeepc_get_fan_ctrl(void)
936 read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
938 return 1; /* manual */
940 return 2; /* automatic */
943 static void eeepc_set_fan_ctrl(int manual)
947 read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
952 ec_write(EEEPC_EC_SFB3, value);
955 static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
959 rv = parse_arg(buf, count, &value);
965 static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
967 return sprintf(buf, "%d\n", get());
970 #define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _set, _get) \
971 static ssize_t show_##_name(struct device *dev, \
972 struct device_attribute *attr, \
975 return show_sys_hwmon(_set, buf); \
977 static ssize_t store_##_name(struct device *dev, \
978 struct device_attribute *attr, \
979 const char *buf, size_t count) \
981 return store_sys_hwmon(_get, buf, count); \
983 static SENSOR_DEVICE_ATTR(_name, _mode, show_##_name, store_##_name, 0);
985 EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL);
986 EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR,
987 eeepc_get_fan_pwm, eeepc_set_fan_pwm);
988 EEEPC_CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
989 eeepc_get_fan_ctrl, eeepc_set_fan_ctrl);
992 show_name(struct device *dev, struct device_attribute *attr, char *buf)
994 return sprintf(buf, "eeepc\n");
996 static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
998 static struct attribute *hwmon_attributes[] = {
999 &sensor_dev_attr_pwm1.dev_attr.attr,
1000 &sensor_dev_attr_fan1_input.dev_attr.attr,
1001 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
1002 &sensor_dev_attr_name.dev_attr.attr,
1006 static struct attribute_group hwmon_attribute_group = {
1007 .attrs = hwmon_attributes
1013 static void eeepc_backlight_exit(void)
1015 if (eeepc_backlight_device)
1016 backlight_device_unregister(eeepc_backlight_device);
1017 eeepc_backlight_device = NULL;
1020 static void eeepc_rfkill_exit(void)
1022 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P5");
1023 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
1024 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
1025 if (ehotk->wlan_rfkill) {
1026 rfkill_unregister(ehotk->wlan_rfkill);
1027 rfkill_destroy(ehotk->wlan_rfkill);
1028 ehotk->wlan_rfkill = NULL;
1031 * Refresh pci hotplug in case the rfkill state was changed after
1032 * eeepc_unregister_rfkill_notifier()
1034 eeepc_rfkill_hotplug();
1035 if (ehotk->hotplug_slot)
1036 pci_hp_deregister(ehotk->hotplug_slot);
1038 if (ehotk->bluetooth_rfkill) {
1039 rfkill_unregister(ehotk->bluetooth_rfkill);
1040 rfkill_destroy(ehotk->bluetooth_rfkill);
1041 ehotk->bluetooth_rfkill = NULL;
1043 if (ehotk->wwan3g_rfkill) {
1044 rfkill_unregister(ehotk->wwan3g_rfkill);
1045 rfkill_destroy(ehotk->wwan3g_rfkill);
1046 ehotk->wwan3g_rfkill = NULL;
1048 if (ehotk->wimax_rfkill) {
1049 rfkill_unregister(ehotk->wimax_rfkill);
1050 rfkill_destroy(ehotk->wimax_rfkill);
1051 ehotk->wimax_rfkill = NULL;
1055 static void eeepc_input_exit(void)
1057 if (ehotk->inputdev)
1058 input_unregister_device(ehotk->inputdev);
1061 static void eeepc_hwmon_exit(void)
1063 struct device *hwmon;
1065 hwmon = eeepc_hwmon_device;
1068 sysfs_remove_group(&hwmon->kobj,
1069 &hwmon_attribute_group);
1070 hwmon_device_unregister(hwmon);
1071 eeepc_hwmon_device = NULL;
1074 static void eeepc_led_exit(void)
1077 led_classdev_unregister(&tpd_led);
1079 destroy_workqueue(led_workqueue);
1082 static int eeepc_new_rfkill(struct rfkill **rfkill,
1083 const char *name, struct device *dev,
1084 enum rfkill_type type, int cm)
1088 result = get_acpi(cm);
1092 *rfkill = rfkill_alloc(name, dev, type,
1093 &eeepc_rfkill_ops, (void *)(unsigned long)cm);
1098 rfkill_init_sw_state(*rfkill, get_acpi(cm) != 1);
1099 result = rfkill_register(*rfkill);
1101 rfkill_destroy(*rfkill);
1109 static int eeepc_rfkill_init(struct device *dev)
1113 mutex_init(&ehotk->hotplug_lock);
1115 result = eeepc_new_rfkill(&ehotk->wlan_rfkill,
1117 RFKILL_TYPE_WLAN, CM_ASL_WLAN);
1119 if (result && result != -ENODEV)
1122 result = eeepc_new_rfkill(&ehotk->bluetooth_rfkill,
1123 "eeepc-bluetooth", dev,
1124 RFKILL_TYPE_BLUETOOTH, CM_ASL_BLUETOOTH);
1126 if (result && result != -ENODEV)
1129 result = eeepc_new_rfkill(&ehotk->wwan3g_rfkill,
1130 "eeepc-wwan3g", dev,
1131 RFKILL_TYPE_WWAN, CM_ASL_3G);
1133 if (result && result != -ENODEV)
1136 result = eeepc_new_rfkill(&ehotk->wimax_rfkill,
1138 RFKILL_TYPE_WIMAX, CM_ASL_WIMAX);
1140 if (result && result != -ENODEV)
1143 result = eeepc_setup_pci_hotplug();
1145 * If we get -EBUSY then something else is handling the PCI hotplug -
1146 * don't fail in this case
1148 if (result == -EBUSY)
1151 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P5");
1152 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
1153 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
1155 * Refresh pci hotplug in case the rfkill state was changed during
1158 eeepc_rfkill_hotplug();
1161 if (result && result != -ENODEV)
1162 eeepc_rfkill_exit();
1166 static int eeepc_backlight_init(struct device *dev)
1168 struct backlight_device *bd;
1170 bd = backlight_device_register(EEEPC_HOTK_FILE, dev,
1171 NULL, &eeepcbl_ops);
1173 pr_err("Could not register eeepc backlight device\n");
1174 eeepc_backlight_device = NULL;
1177 eeepc_backlight_device = bd;
1178 bd->props.max_brightness = 15;
1179 bd->props.brightness = read_brightness(NULL);
1180 bd->props.power = FB_BLANK_UNBLANK;
1181 backlight_update_status(bd);
1185 static int eeepc_hwmon_init(struct device *dev)
1187 struct device *hwmon;
1190 hwmon = hwmon_device_register(dev);
1191 if (IS_ERR(hwmon)) {
1192 pr_err("Could not register eeepc hwmon device\n");
1193 eeepc_hwmon_device = NULL;
1194 return PTR_ERR(hwmon);
1196 eeepc_hwmon_device = hwmon;
1197 result = sysfs_create_group(&hwmon->kobj,
1198 &hwmon_attribute_group);
1204 static int eeepc_input_init(struct device *dev)
1206 const struct key_entry *key;
1209 ehotk->inputdev = input_allocate_device();
1210 if (!ehotk->inputdev) {
1211 pr_info("Unable to allocate input device\n");
1214 ehotk->inputdev->name = "Asus EeePC extra buttons";
1215 ehotk->inputdev->dev.parent = dev;
1216 ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0";
1217 ehotk->inputdev->id.bustype = BUS_HOST;
1218 ehotk->inputdev->getkeycode = eeepc_getkeycode;
1219 ehotk->inputdev->setkeycode = eeepc_setkeycode;
1221 for (key = eeepc_keymap; key->type != KE_END; key++) {
1222 switch (key->type) {
1224 set_bit(EV_KEY, ehotk->inputdev->evbit);
1225 set_bit(key->keycode, ehotk->inputdev->keybit);
1229 result = input_register_device(ehotk->inputdev);
1231 pr_info("Unable to register input device\n");
1232 input_free_device(ehotk->inputdev);
1238 static int eeepc_led_init(struct device *dev)
1242 if (get_acpi(CM_ASL_TPD) == -ENODEV)
1245 led_workqueue = create_singlethread_workqueue("led_workqueue");
1249 rv = led_classdev_register(dev, &tpd_led);
1251 destroy_workqueue(led_workqueue);
1258 static int __devinit eeepc_hotk_add(struct acpi_device *device)
1263 pr_notice(EEEPC_HOTK_NAME "\n");
1264 ehotk = kzalloc(sizeof(struct eeepc_hotk), GFP_KERNEL);
1267 ehotk->init_flag = DISABLE_ASL_WLAN | DISABLE_ASL_DISPLAYSWITCH;
1268 ehotk->handle = device->handle;
1269 strcpy(acpi_device_name(device), EEEPC_HOTK_DEVICE_NAME);
1270 strcpy(acpi_device_class(device), EEEPC_HOTK_CLASS);
1271 device->driver_data = ehotk;
1272 ehotk->device = device;
1274 result = eeepc_hotk_check();
1276 goto fail_platform_driver;
1277 eeepc_enable_camera();
1279 /* Register platform stuff */
1280 result = platform_driver_register(&platform_driver);
1282 goto fail_platform_driver;
1283 platform_device = platform_device_alloc(EEEPC_HOTK_FILE, -1);
1284 if (!platform_device) {
1286 goto fail_platform_device1;
1288 result = platform_device_add(platform_device);
1290 goto fail_platform_device2;
1291 result = sysfs_create_group(&platform_device->dev.kobj,
1292 &platform_attribute_group);
1296 dev = &platform_device->dev;
1298 if (!acpi_video_backlight_support()) {
1299 result = eeepc_backlight_init(dev);
1301 goto fail_backlight;
1303 pr_info("Backlight controlled by ACPI video "
1306 result = eeepc_input_init(dev);
1310 result = eeepc_hwmon_init(dev);
1314 result = eeepc_led_init(dev);
1318 result = eeepc_rfkill_init(dev);
1331 eeepc_backlight_exit();
1333 sysfs_remove_group(&platform_device->dev.kobj,
1334 &platform_attribute_group);
1336 platform_device_del(platform_device);
1337 fail_platform_device2:
1338 platform_device_put(platform_device);
1339 fail_platform_device1:
1340 platform_driver_unregister(&platform_driver);
1341 fail_platform_driver:
1347 static int eeepc_hotk_remove(struct acpi_device *device, int type)
1349 eeepc_backlight_exit();
1350 eeepc_rfkill_exit();
1354 sysfs_remove_group(&platform_device->dev.kobj,
1355 &platform_attribute_group);
1356 platform_device_unregister(platform_device);
1357 platform_driver_unregister(&platform_driver);
1363 static int __init eeepc_laptop_init(void)
1367 result = acpi_bus_register_driver(&eeepc_hotk_driver);
1371 acpi_bus_unregister_driver(&eeepc_hotk_driver);
1377 static void __exit eeepc_laptop_exit(void)
1379 acpi_bus_unregister_driver(&eeepc_hotk_driver);
1382 module_init(eeepc_laptop_init);
1383 module_exit(eeepc_laptop_exit);