]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/platform/x86/eeepc-laptop.c
eeepc-laptop: revise names
[mirror_ubuntu-bionic-kernel.git] / drivers / platform / x86 / eeepc-laptop.c
1 /*
2 * eeepc-laptop.c - Asus Eee PC extras
3 *
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
7 *
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.
12 *
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.
17 */
18
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/types.h>
25 #include <linux/platform_device.h>
26 #include <linux/backlight.h>
27 #include <linux/fb.h>
28 #include <linux/hwmon.h>
29 #include <linux/hwmon-sysfs.h>
30 #include <acpi/acpi_drivers.h>
31 #include <acpi/acpi_bus.h>
32 #include <linux/uaccess.h>
33 #include <linux/input.h>
34 #include <linux/rfkill.h>
35 #include <linux/pci.h>
36 #include <linux/pci_hotplug.h>
37 #include <linux/leds.h>
38
39 #define EEEPC_LAPTOP_VERSION "0.1"
40 #define EEEPC_LAPTOP_NAME "Eee PC Hotkey Driver"
41 #define EEEPC_LAPTOP_FILE "eeepc"
42
43 #define EEEPC_ACPI_CLASS "hotkey"
44 #define EEEPC_ACPI_DEVICE_NAME "Hotkey"
45 #define EEEPC_ACPI_HID "ASUS010"
46
47 MODULE_AUTHOR("Corentin Chary, Eric Cooper");
48 MODULE_DESCRIPTION(EEEPC_LAPTOP_NAME);
49 MODULE_LICENSE("GPL");
50
51 /*
52 * Definitions for Asus EeePC
53 */
54 #define NOTIFY_BRN_MIN 0x20
55 #define NOTIFY_BRN_MAX 0x2f
56
57 enum {
58 DISABLE_ASL_WLAN = 0x0001,
59 DISABLE_ASL_BLUETOOTH = 0x0002,
60 DISABLE_ASL_IRDA = 0x0004,
61 DISABLE_ASL_CAMERA = 0x0008,
62 DISABLE_ASL_TV = 0x0010,
63 DISABLE_ASL_GPS = 0x0020,
64 DISABLE_ASL_DISPLAYSWITCH = 0x0040,
65 DISABLE_ASL_MODEM = 0x0080,
66 DISABLE_ASL_CARDREADER = 0x0100,
67 DISABLE_ASL_3G = 0x0200,
68 DISABLE_ASL_WIMAX = 0x0400,
69 DISABLE_ASL_HWCF = 0x0800
70 };
71
72 enum {
73 CM_ASL_WLAN = 0,
74 CM_ASL_BLUETOOTH,
75 CM_ASL_IRDA,
76 CM_ASL_1394,
77 CM_ASL_CAMERA,
78 CM_ASL_TV,
79 CM_ASL_GPS,
80 CM_ASL_DVDROM,
81 CM_ASL_DISPLAYSWITCH,
82 CM_ASL_PANELBRIGHT,
83 CM_ASL_BIOSFLASH,
84 CM_ASL_ACPIFLASH,
85 CM_ASL_CPUFV,
86 CM_ASL_CPUTEMPERATURE,
87 CM_ASL_FANCPU,
88 CM_ASL_FANCHASSIS,
89 CM_ASL_USBPORT1,
90 CM_ASL_USBPORT2,
91 CM_ASL_USBPORT3,
92 CM_ASL_MODEM,
93 CM_ASL_CARDREADER,
94 CM_ASL_3G,
95 CM_ASL_WIMAX,
96 CM_ASL_HWCF,
97 CM_ASL_LID,
98 CM_ASL_TYPE,
99 CM_ASL_PANELPOWER, /*P901*/
100 CM_ASL_TPD
101 };
102
103 static const char *cm_getv[] = {
104 "WLDG", "BTHG", NULL, NULL,
105 "CAMG", NULL, NULL, NULL,
106 NULL, "PBLG", NULL, NULL,
107 "CFVG", NULL, NULL, NULL,
108 "USBG", NULL, NULL, "MODG",
109 "CRDG", "M3GG", "WIMG", "HWCF",
110 "LIDG", "TYPE", "PBPG", "TPDG"
111 };
112
113 static const char *cm_setv[] = {
114 "WLDS", "BTHS", NULL, NULL,
115 "CAMS", NULL, NULL, NULL,
116 "SDSP", "PBLS", "HDPS", NULL,
117 "CFVS", NULL, NULL, NULL,
118 "USBG", NULL, NULL, "MODS",
119 "CRDS", "M3GS", "WIMS", NULL,
120 NULL, NULL, "PBPS", "TPDS"
121 };
122
123 struct key_entry {
124 char type;
125 u8 code;
126 u16 keycode;
127 };
128
129 enum { KE_KEY, KE_END };
130
131 static struct key_entry eeepc_keymap[] = {
132 /* Sleep already handled via generic ACPI code */
133 {KE_KEY, 0x10, KEY_WLAN },
134 {KE_KEY, 0x11, KEY_WLAN },
135 {KE_KEY, 0x12, KEY_PROG1 },
136 {KE_KEY, 0x13, KEY_MUTE },
137 {KE_KEY, 0x14, KEY_VOLUMEDOWN },
138 {KE_KEY, 0x15, KEY_VOLUMEUP },
139 {KE_KEY, 0x1a, KEY_COFFEE },
140 {KE_KEY, 0x1b, KEY_ZOOM },
141 {KE_KEY, 0x1c, KEY_PROG2 },
142 {KE_KEY, 0x1d, KEY_PROG3 },
143 {KE_KEY, NOTIFY_BRN_MIN, KEY_BRIGHTNESSDOWN },
144 {KE_KEY, NOTIFY_BRN_MAX, KEY_BRIGHTNESSUP },
145 {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
146 {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
147 {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
148 {KE_END, 0},
149 };
150
151
152 /*
153 * This is the main structure, we can use it to store useful information
154 */
155 struct eeepc_laptop {
156 struct acpi_device *device; /* the device we are in */
157 acpi_handle handle; /* the handle of the hotk device */
158 u32 cm_supported; /* the control methods supported
159 by this BIOS */
160 u16 event_count[128]; /* count for each event */
161 struct input_dev *inputdev;
162 u16 *keycode_map;
163 struct rfkill *wlan_rfkill;
164 struct rfkill *bluetooth_rfkill;
165 struct rfkill *wwan3g_rfkill;
166 struct rfkill *wimax_rfkill;
167 struct hotplug_slot *hotplug_slot;
168 struct mutex hotplug_lock;
169 };
170
171 /* The actual device the driver binds to */
172 static struct eeepc_laptop *eeepc;
173
174 /* The platform device */
175 static struct platform_device *platform_device;
176
177 /* The backlight device /sys/class/backlight */
178 static struct backlight_device *eeepc_backlight_device;
179
180 /* The hwmon device */
181 static struct device *eeepc_hwmon_device;
182
183
184 /*
185 * ACPI Helpers
186 */
187 static int write_acpi_int(acpi_handle handle, const char *method, int val)
188 {
189 struct acpi_object_list params;
190 union acpi_object in_obj;
191 acpi_status status;
192
193 params.count = 1;
194 params.pointer = &in_obj;
195 in_obj.type = ACPI_TYPE_INTEGER;
196 in_obj.integer.value = val;
197
198 status = acpi_evaluate_object(handle, (char *)method, &params, NULL);
199 return (status == AE_OK ? 0 : -1);
200 }
201
202 static int read_acpi_int(acpi_handle handle, const char *method, int *val)
203 {
204 acpi_status status;
205 unsigned long long result;
206
207 status = acpi_evaluate_integer(handle, (char *)method, NULL, &result);
208 if (ACPI_FAILURE(status)) {
209 *val = -1;
210 return -1;
211 } else {
212 *val = result;
213 return 0;
214 }
215 }
216
217 static int set_acpi(int cm, int value)
218 {
219 const char *method = cm_setv[cm];
220
221 if (method == NULL)
222 return -ENODEV;
223 if ((eeepc->cm_supported & (0x1 << cm)) == 0)
224 return -ENODEV;
225
226 if (write_acpi_int(eeepc->handle, method, value))
227 pr_warning("Error writing %s\n", method);
228 return 0;
229 }
230
231 static int get_acpi(int cm)
232 {
233 const char *method = cm_getv[cm];
234 int value;
235
236 if (method == NULL)
237 return -ENODEV;
238 if ((eeepc->cm_supported & (0x1 << cm)) == 0)
239 return -ENODEV;
240
241 if (read_acpi_int(eeepc->handle, method, &value))
242 pr_warning("Error reading %s\n", method);
243 return value;
244 }
245
246 /*
247 * Sys helpers
248 */
249 static int parse_arg(const char *buf, unsigned long count, int *val)
250 {
251 if (!count)
252 return 0;
253 if (sscanf(buf, "%i", val) != 1)
254 return -EINVAL;
255 return count;
256 }
257
258 static ssize_t store_sys_acpi(int cm, const char *buf, size_t count)
259 {
260 int rv, value;
261
262 rv = parse_arg(buf, count, &value);
263 if (rv > 0)
264 value = set_acpi(cm, value);
265 if (value < 0)
266 return -EIO;
267 return rv;
268 }
269
270 static ssize_t show_sys_acpi(int cm, char *buf)
271 {
272 int value = get_acpi(cm);
273
274 if (value < 0)
275 return -EIO;
276 return sprintf(buf, "%d\n", value);
277 }
278
279 #define EEEPC_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
280 static ssize_t show_##_name(struct device *dev, \
281 struct device_attribute *attr, \
282 char *buf) \
283 { \
284 return show_sys_acpi(_cm, buf); \
285 } \
286 static ssize_t store_##_name(struct device *dev, \
287 struct device_attribute *attr, \
288 const char *buf, size_t count) \
289 { \
290 return store_sys_acpi(_cm, buf, count); \
291 } \
292 static struct device_attribute dev_attr_##_name = { \
293 .attr = { \
294 .name = __stringify(_name), \
295 .mode = _mode }, \
296 .show = show_##_name, \
297 .store = store_##_name, \
298 }
299
300 EEEPC_CREATE_DEVICE_ATTR(camera, 0644, CM_ASL_CAMERA);
301 EEEPC_CREATE_DEVICE_ATTR(cardr, 0644, CM_ASL_CARDREADER);
302 EEEPC_CREATE_DEVICE_ATTR(disp, 0200, CM_ASL_DISPLAYSWITCH);
303
304 struct eeepc_cpufv {
305 int num;
306 int cur;
307 };
308
309 static int get_cpufv(struct eeepc_cpufv *c)
310 {
311 c->cur = get_acpi(CM_ASL_CPUFV);
312 c->num = (c->cur >> 8) & 0xff;
313 c->cur &= 0xff;
314 if (c->cur < 0 || c->num <= 0 || c->num > 12)
315 return -ENODEV;
316 return 0;
317 }
318
319 static ssize_t show_available_cpufv(struct device *dev,
320 struct device_attribute *attr,
321 char *buf)
322 {
323 struct eeepc_cpufv c;
324 int i;
325 ssize_t len = 0;
326
327 if (get_cpufv(&c))
328 return -ENODEV;
329 for (i = 0; i < c.num; i++)
330 len += sprintf(buf + len, "%d ", i);
331 len += sprintf(buf + len, "\n");
332 return len;
333 }
334
335 static ssize_t show_cpufv(struct device *dev,
336 struct device_attribute *attr,
337 char *buf)
338 {
339 struct eeepc_cpufv c;
340
341 if (get_cpufv(&c))
342 return -ENODEV;
343 return sprintf(buf, "%#x\n", (c.num << 8) | c.cur);
344 }
345
346 static ssize_t store_cpufv(struct device *dev,
347 struct device_attribute *attr,
348 const char *buf, size_t count)
349 {
350 struct eeepc_cpufv c;
351 int rv, value;
352
353 if (get_cpufv(&c))
354 return -ENODEV;
355 rv = parse_arg(buf, count, &value);
356 if (rv < 0)
357 return rv;
358 if (!rv || value < 0 || value >= c.num)
359 return -EINVAL;
360 set_acpi(CM_ASL_CPUFV, value);
361 return rv;
362 }
363
364 static struct device_attribute dev_attr_cpufv = {
365 .attr = {
366 .name = "cpufv",
367 .mode = 0644 },
368 .show = show_cpufv,
369 .store = store_cpufv
370 };
371
372 static struct device_attribute dev_attr_available_cpufv = {
373 .attr = {
374 .name = "available_cpufv",
375 .mode = 0444 },
376 .show = show_available_cpufv
377 };
378
379 static struct attribute *platform_attributes[] = {
380 &dev_attr_camera.attr,
381 &dev_attr_cardr.attr,
382 &dev_attr_disp.attr,
383 &dev_attr_cpufv.attr,
384 &dev_attr_available_cpufv.attr,
385 NULL
386 };
387
388 static struct attribute_group platform_attribute_group = {
389 .attrs = platform_attributes
390 };
391
392 static int eeepc_platform_init(void)
393 {
394 int result;
395
396 platform_device = platform_device_alloc(EEEPC_LAPTOP_FILE, -1);
397 if (!platform_device)
398 return -ENOMEM;
399
400 result = platform_device_add(platform_device);
401 if (result)
402 goto fail_platform_device;
403
404 result = sysfs_create_group(&platform_device->dev.kobj,
405 &platform_attribute_group);
406 if (result)
407 goto fail_sysfs;
408 return 0;
409
410 fail_sysfs:
411 platform_device_del(platform_device);
412 fail_platform_device:
413 platform_device_put(platform_device);
414 return result;
415 }
416
417 static void eeepc_platform_exit(void)
418 {
419 sysfs_remove_group(&platform_device->dev.kobj,
420 &platform_attribute_group);
421 platform_device_unregister(platform_device);
422 }
423
424 /*
425 * LEDs
426 */
427 /*
428 * These functions actually update the LED's, and are called from a
429 * workqueue. By doing this as separate work rather than when the LED
430 * subsystem asks, we avoid messing with the Asus ACPI stuff during a
431 * potentially bad time, such as a timer interrupt.
432 */
433 static int tpd_led_wk;
434
435 static void tpd_led_update(struct work_struct *ignored)
436 {
437 int value = tpd_led_wk;
438 set_acpi(CM_ASL_TPD, value);
439 }
440
441 static struct workqueue_struct *led_workqueue;
442 static DECLARE_WORK(tpd_led_work, tpd_led_update);
443
444 static void tpd_led_set(struct led_classdev *led_cdev,
445 enum led_brightness value)
446 {
447 tpd_led_wk = (value > 0) ? 1 : 0;
448 queue_work(led_workqueue, &tpd_led_work);
449 }
450
451 static struct led_classdev tpd_led = {
452 .name = "eeepc::touchpad",
453 .brightness_set = tpd_led_set,
454 .max_brightness = 1
455 };
456
457 static int eeepc_led_init(struct device *dev)
458 {
459 int rv;
460
461 if (get_acpi(CM_ASL_TPD) == -ENODEV)
462 return 0;
463
464 led_workqueue = create_singlethread_workqueue("led_workqueue");
465 if (!led_workqueue)
466 return -ENOMEM;
467
468 rv = led_classdev_register(dev, &tpd_led);
469 if (rv) {
470 destroy_workqueue(led_workqueue);
471 return rv;
472 }
473
474 return 0;
475 }
476
477 static void eeepc_led_exit(void)
478 {
479 if (tpd_led.dev)
480 led_classdev_unregister(&tpd_led);
481 if (led_workqueue)
482 destroy_workqueue(led_workqueue);
483 }
484
485
486 /*
487 * PCI hotplug (for wlan rfkill)
488 */
489 static bool eeepc_wlan_rfkill_blocked(void)
490 {
491 if (get_acpi(CM_ASL_WLAN) == 1)
492 return false;
493 return true;
494 }
495
496 static void eeepc_rfkill_hotplug(void)
497 {
498 struct pci_dev *dev;
499 struct pci_bus *bus;
500 bool blocked = eeepc_wlan_rfkill_blocked();
501
502 if (eeepc->wlan_rfkill)
503 rfkill_set_sw_state(eeepc->wlan_rfkill, blocked);
504
505 mutex_lock(&eeepc->hotplug_lock);
506
507 if (eeepc->hotplug_slot) {
508 bus = pci_find_bus(0, 1);
509 if (!bus) {
510 pr_warning("Unable to find PCI bus 1?\n");
511 goto out_unlock;
512 }
513
514 if (!blocked) {
515 dev = pci_get_slot(bus, 0);
516 if (dev) {
517 /* Device already present */
518 pci_dev_put(dev);
519 goto out_unlock;
520 }
521 dev = pci_scan_single_device(bus, 0);
522 if (dev) {
523 pci_bus_assign_resources(bus);
524 if (pci_bus_add_device(dev))
525 pr_err("Unable to hotplug wifi\n");
526 }
527 } else {
528 dev = pci_get_slot(bus, 0);
529 if (dev) {
530 pci_remove_bus_device(dev);
531 pci_dev_put(dev);
532 }
533 }
534 }
535
536 out_unlock:
537 mutex_unlock(&eeepc->hotplug_lock);
538 }
539
540 static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
541 {
542 if (event != ACPI_NOTIFY_BUS_CHECK)
543 return;
544
545 eeepc_rfkill_hotplug();
546 }
547
548 static int eeepc_register_rfkill_notifier(char *node)
549 {
550 acpi_status status = AE_OK;
551 acpi_handle handle;
552
553 status = acpi_get_handle(NULL, node, &handle);
554
555 if (ACPI_SUCCESS(status)) {
556 status = acpi_install_notify_handler(handle,
557 ACPI_SYSTEM_NOTIFY,
558 eeepc_rfkill_notify,
559 NULL);
560 if (ACPI_FAILURE(status))
561 pr_warning("Failed to register notify on %s\n", node);
562 } else
563 return -ENODEV;
564
565 return 0;
566 }
567
568 static void eeepc_unregister_rfkill_notifier(char *node)
569 {
570 acpi_status status = AE_OK;
571 acpi_handle handle;
572
573 status = acpi_get_handle(NULL, node, &handle);
574
575 if (ACPI_SUCCESS(status)) {
576 status = acpi_remove_notify_handler(handle,
577 ACPI_SYSTEM_NOTIFY,
578 eeepc_rfkill_notify);
579 if (ACPI_FAILURE(status))
580 pr_err("Error removing rfkill notify handler %s\n",
581 node);
582 }
583 }
584
585 static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
586 u8 *value)
587 {
588 int val = get_acpi(CM_ASL_WLAN);
589
590 if (val == 1 || val == 0)
591 *value = val;
592 else
593 return -EINVAL;
594
595 return 0;
596 }
597
598 static void eeepc_cleanup_pci_hotplug(struct hotplug_slot *hotplug_slot)
599 {
600 kfree(hotplug_slot->info);
601 kfree(hotplug_slot);
602 }
603
604 static struct hotplug_slot_ops eeepc_hotplug_slot_ops = {
605 .owner = THIS_MODULE,
606 .get_adapter_status = eeepc_get_adapter_status,
607 .get_power_status = eeepc_get_adapter_status,
608 };
609
610 static int eeepc_setup_pci_hotplug(void)
611 {
612 int ret = -ENOMEM;
613 struct pci_bus *bus = pci_find_bus(0, 1);
614
615 if (!bus) {
616 pr_err("Unable to find wifi PCI bus\n");
617 return -ENODEV;
618 }
619
620 eeepc->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
621 if (!eeepc->hotplug_slot)
622 goto error_slot;
623
624 eeepc->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
625 GFP_KERNEL);
626 if (!eeepc->hotplug_slot->info)
627 goto error_info;
628
629 eeepc->hotplug_slot->private = eeepc;
630 eeepc->hotplug_slot->release = &eeepc_cleanup_pci_hotplug;
631 eeepc->hotplug_slot->ops = &eeepc_hotplug_slot_ops;
632 eeepc_get_adapter_status(eeepc->hotplug_slot,
633 &eeepc->hotplug_slot->info->adapter_status);
634
635 ret = pci_hp_register(eeepc->hotplug_slot, bus, 0, "eeepc-wifi");
636 if (ret) {
637 pr_err("Unable to register hotplug slot - %d\n", ret);
638 goto error_register;
639 }
640
641 return 0;
642
643 error_register:
644 kfree(eeepc->hotplug_slot->info);
645 error_info:
646 kfree(eeepc->hotplug_slot);
647 eeepc->hotplug_slot = NULL;
648 error_slot:
649 return ret;
650 }
651
652 /*
653 * Rfkill devices
654 */
655 static int eeepc_rfkill_set(void *data, bool blocked)
656 {
657 unsigned long asl = (unsigned long)data;
658 return set_acpi(asl, !blocked);
659 }
660
661 static const struct rfkill_ops eeepc_rfkill_ops = {
662 .set_block = eeepc_rfkill_set,
663 };
664
665 static int eeepc_new_rfkill(struct rfkill **rfkill,
666 const char *name, struct device *dev,
667 enum rfkill_type type, int cm)
668 {
669 int result;
670
671 result = get_acpi(cm);
672 if (result < 0)
673 return result;
674
675 *rfkill = rfkill_alloc(name, dev, type,
676 &eeepc_rfkill_ops, (void *)(unsigned long)cm);
677
678 if (!*rfkill)
679 return -EINVAL;
680
681 rfkill_init_sw_state(*rfkill, get_acpi(cm) != 1);
682 result = rfkill_register(*rfkill);
683 if (result) {
684 rfkill_destroy(*rfkill);
685 *rfkill = NULL;
686 return result;
687 }
688 return 0;
689 }
690
691 static void eeepc_rfkill_exit(void)
692 {
693 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P5");
694 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
695 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
696 if (eeepc->wlan_rfkill) {
697 rfkill_unregister(eeepc->wlan_rfkill);
698 rfkill_destroy(eeepc->wlan_rfkill);
699 eeepc->wlan_rfkill = NULL;
700 }
701 /*
702 * Refresh pci hotplug in case the rfkill state was changed after
703 * eeepc_unregister_rfkill_notifier()
704 */
705 eeepc_rfkill_hotplug();
706 if (eeepc->hotplug_slot)
707 pci_hp_deregister(eeepc->hotplug_slot);
708
709 if (eeepc->bluetooth_rfkill) {
710 rfkill_unregister(eeepc->bluetooth_rfkill);
711 rfkill_destroy(eeepc->bluetooth_rfkill);
712 eeepc->bluetooth_rfkill = NULL;
713 }
714 if (eeepc->wwan3g_rfkill) {
715 rfkill_unregister(eeepc->wwan3g_rfkill);
716 rfkill_destroy(eeepc->wwan3g_rfkill);
717 eeepc->wwan3g_rfkill = NULL;
718 }
719 if (eeepc->wimax_rfkill) {
720 rfkill_unregister(eeepc->wimax_rfkill);
721 rfkill_destroy(eeepc->wimax_rfkill);
722 eeepc->wimax_rfkill = NULL;
723 }
724 }
725
726 static int eeepc_rfkill_init(struct device *dev)
727 {
728 int result = 0;
729
730 mutex_init(&eeepc->hotplug_lock);
731
732 result = eeepc_new_rfkill(&eeepc->wlan_rfkill,
733 "eeepc-wlan", dev,
734 RFKILL_TYPE_WLAN, CM_ASL_WLAN);
735
736 if (result && result != -ENODEV)
737 goto exit;
738
739 result = eeepc_new_rfkill(&eeepc->bluetooth_rfkill,
740 "eeepc-bluetooth", dev,
741 RFKILL_TYPE_BLUETOOTH, CM_ASL_BLUETOOTH);
742
743 if (result && result != -ENODEV)
744 goto exit;
745
746 result = eeepc_new_rfkill(&eeepc->wwan3g_rfkill,
747 "eeepc-wwan3g", dev,
748 RFKILL_TYPE_WWAN, CM_ASL_3G);
749
750 if (result && result != -ENODEV)
751 goto exit;
752
753 result = eeepc_new_rfkill(&eeepc->wimax_rfkill,
754 "eeepc-wimax", dev,
755 RFKILL_TYPE_WIMAX, CM_ASL_WIMAX);
756
757 if (result && result != -ENODEV)
758 goto exit;
759
760 result = eeepc_setup_pci_hotplug();
761 /*
762 * If we get -EBUSY then something else is handling the PCI hotplug -
763 * don't fail in this case
764 */
765 if (result == -EBUSY)
766 result = 0;
767
768 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P5");
769 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
770 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
771 /*
772 * Refresh pci hotplug in case the rfkill state was changed during
773 * setup.
774 */
775 eeepc_rfkill_hotplug();
776
777 exit:
778 if (result && result != -ENODEV)
779 eeepc_rfkill_exit();
780 return result;
781 }
782
783 /*
784 * Platform driver - hibernate/resume callbacks
785 */
786 static int eeepc_thaw(struct device *device)
787 {
788 if (eeepc->wlan_rfkill) {
789 bool wlan;
790
791 /*
792 * Work around bios bug - acpi _PTS turns off the wireless led
793 * during suspend. Normally it restores it on resume, but
794 * we should kick it ourselves in case hibernation is aborted.
795 */
796 wlan = get_acpi(CM_ASL_WLAN);
797 set_acpi(CM_ASL_WLAN, wlan);
798 }
799
800 return 0;
801 }
802
803 static int eeepc_restore(struct device *device)
804 {
805 /* Refresh both wlan rfkill state and pci hotplug */
806 if (eeepc->wlan_rfkill)
807 eeepc_rfkill_hotplug();
808
809 if (eeepc->bluetooth_rfkill)
810 rfkill_set_sw_state(eeepc->bluetooth_rfkill,
811 get_acpi(CM_ASL_BLUETOOTH) != 1);
812 if (eeepc->wwan3g_rfkill)
813 rfkill_set_sw_state(eeepc->wwan3g_rfkill,
814 get_acpi(CM_ASL_3G) != 1);
815 if (eeepc->wimax_rfkill)
816 rfkill_set_sw_state(eeepc->wimax_rfkill,
817 get_acpi(CM_ASL_WIMAX) != 1);
818
819 return 0;
820 }
821
822 static struct dev_pm_ops eeepc_pm_ops = {
823 .thaw = eeepc_thaw,
824 .restore = eeepc_restore,
825 };
826
827 static struct platform_driver platform_driver = {
828 .driver = {
829 .name = EEEPC_LAPTOP_FILE,
830 .owner = THIS_MODULE,
831 .pm = &eeepc_pm_ops,
832 }
833 };
834
835 /*
836 * Hwmon device
837 */
838
839 #define EEEPC_EC_SC00 0x61
840 #define EEEPC_EC_FAN_PWM (EEEPC_EC_SC00 + 2) /* Fan PWM duty cycle (%) */
841 #define EEEPC_EC_FAN_HRPM (EEEPC_EC_SC00 + 5) /* High byte, fan speed (RPM) */
842 #define EEEPC_EC_FAN_LRPM (EEEPC_EC_SC00 + 6) /* Low byte, fan speed (RPM) */
843
844 #define EEEPC_EC_SFB0 0xD0
845 #define EEEPC_EC_FAN_CTRL (EEEPC_EC_SFB0 + 3) /* Byte containing SF25 */
846
847 static int eeepc_get_fan_pwm(void)
848 {
849 u8 value = 0;
850
851 ec_read(EEEPC_EC_FAN_PWM, &value);
852 return value * 255 / 100;
853 }
854
855 static void eeepc_set_fan_pwm(int value)
856 {
857 value = SENSORS_LIMIT(value, 0, 255);
858 value = value * 100 / 255;
859 ec_write(EEEPC_EC_FAN_PWM, value);
860 }
861
862 static int eeepc_get_fan_rpm(void)
863 {
864 u8 high = 0;
865 u8 low = 0;
866
867 ec_read(EEEPC_EC_FAN_HRPM, &high);
868 ec_read(EEEPC_EC_FAN_LRPM, &low);
869 return high << 8 | low;
870 }
871
872 static int eeepc_get_fan_ctrl(void)
873 {
874 u8 value = 0;
875
876 ec_read(EEEPC_EC_FAN_CTRL, &value);
877 if (value & 0x02)
878 return 1; /* manual */
879 else
880 return 2; /* automatic */
881 }
882
883 static void eeepc_set_fan_ctrl(int manual)
884 {
885 u8 value = 0;
886
887 ec_read(EEEPC_EC_FAN_CTRL, &value);
888 if (manual == 1)
889 value |= 0x02;
890 else
891 value &= ~0x02;
892 ec_write(EEEPC_EC_FAN_CTRL, value);
893 }
894
895 static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
896 {
897 int rv, value;
898
899 rv = parse_arg(buf, count, &value);
900 if (rv > 0)
901 set(value);
902 return rv;
903 }
904
905 static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
906 {
907 return sprintf(buf, "%d\n", get());
908 }
909
910 #define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _set, _get) \
911 static ssize_t show_##_name(struct device *dev, \
912 struct device_attribute *attr, \
913 char *buf) \
914 { \
915 return show_sys_hwmon(_set, buf); \
916 } \
917 static ssize_t store_##_name(struct device *dev, \
918 struct device_attribute *attr, \
919 const char *buf, size_t count) \
920 { \
921 return store_sys_hwmon(_get, buf, count); \
922 } \
923 static SENSOR_DEVICE_ATTR(_name, _mode, show_##_name, store_##_name, 0);
924
925 EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL);
926 EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR,
927 eeepc_get_fan_pwm, eeepc_set_fan_pwm);
928 EEEPC_CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
929 eeepc_get_fan_ctrl, eeepc_set_fan_ctrl);
930
931 static ssize_t
932 show_name(struct device *dev, struct device_attribute *attr, char *buf)
933 {
934 return sprintf(buf, "eeepc\n");
935 }
936 static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
937
938 static struct attribute *hwmon_attributes[] = {
939 &sensor_dev_attr_pwm1.dev_attr.attr,
940 &sensor_dev_attr_fan1_input.dev_attr.attr,
941 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
942 &sensor_dev_attr_name.dev_attr.attr,
943 NULL
944 };
945
946 static struct attribute_group hwmon_attribute_group = {
947 .attrs = hwmon_attributes
948 };
949
950 static void eeepc_hwmon_exit(void)
951 {
952 struct device *hwmon;
953
954 hwmon = eeepc_hwmon_device;
955 if (!hwmon)
956 return ;
957 sysfs_remove_group(&hwmon->kobj,
958 &hwmon_attribute_group);
959 hwmon_device_unregister(hwmon);
960 eeepc_hwmon_device = NULL;
961 }
962
963 static int eeepc_hwmon_init(struct device *dev)
964 {
965 struct device *hwmon;
966 int result;
967
968 hwmon = hwmon_device_register(dev);
969 if (IS_ERR(hwmon)) {
970 pr_err("Could not register eeepc hwmon device\n");
971 eeepc_hwmon_device = NULL;
972 return PTR_ERR(hwmon);
973 }
974 eeepc_hwmon_device = hwmon;
975 result = sysfs_create_group(&hwmon->kobj,
976 &hwmon_attribute_group);
977 if (result)
978 eeepc_hwmon_exit();
979 return result;
980 }
981
982 /*
983 * Backlight device
984 */
985 static int read_brightness(struct backlight_device *bd)
986 {
987 return get_acpi(CM_ASL_PANELBRIGHT);
988 }
989
990 static int set_brightness(struct backlight_device *bd, int value)
991 {
992 return set_acpi(CM_ASL_PANELBRIGHT, value);
993 }
994
995 static int update_bl_status(struct backlight_device *bd)
996 {
997 return set_brightness(bd, bd->props.brightness);
998 }
999
1000 static struct backlight_ops eeepcbl_ops = {
1001 .get_brightness = read_brightness,
1002 .update_status = update_bl_status,
1003 };
1004
1005 static int eeepc_backlight_notify(void)
1006 {
1007 struct backlight_device *bd = eeepc_backlight_device;
1008 int old = bd->props.brightness;
1009
1010 backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
1011
1012 return old;
1013 }
1014
1015 static int eeepc_backlight_init(struct device *dev)
1016 {
1017 struct backlight_device *bd;
1018
1019 bd = backlight_device_register(EEEPC_LAPTOP_FILE, dev,
1020 NULL, &eeepcbl_ops);
1021 if (IS_ERR(bd)) {
1022 pr_err("Could not register eeepc backlight device\n");
1023 eeepc_backlight_device = NULL;
1024 return PTR_ERR(bd);
1025 }
1026 eeepc_backlight_device = bd;
1027 bd->props.max_brightness = 15;
1028 bd->props.brightness = read_brightness(NULL);
1029 bd->props.power = FB_BLANK_UNBLANK;
1030 backlight_update_status(bd);
1031 return 0;
1032 }
1033
1034 static void eeepc_backlight_exit(void)
1035 {
1036 if (eeepc_backlight_device)
1037 backlight_device_unregister(eeepc_backlight_device);
1038 eeepc_backlight_device = NULL;
1039 }
1040
1041
1042 /*
1043 * Input device (i.e. hotkeys)
1044 */
1045 static struct key_entry *eeepc_get_entry_by_scancode(int code)
1046 {
1047 struct key_entry *key;
1048
1049 for (key = eeepc_keymap; key->type != KE_END; key++)
1050 if (code == key->code)
1051 return key;
1052
1053 return NULL;
1054 }
1055
1056 static void eeepc_input_notify(int event)
1057 {
1058 static struct key_entry *key;
1059
1060 key = eeepc_get_entry_by_scancode(event);
1061 if (key) {
1062 switch (key->type) {
1063 case KE_KEY:
1064 input_report_key(eeepc->inputdev, key->keycode,
1065 1);
1066 input_sync(eeepc->inputdev);
1067 input_report_key(eeepc->inputdev, key->keycode,
1068 0);
1069 input_sync(eeepc->inputdev);
1070 break;
1071 }
1072 }
1073 }
1074
1075 static struct key_entry *eepc_get_entry_by_keycode(int code)
1076 {
1077 struct key_entry *key;
1078
1079 for (key = eeepc_keymap; key->type != KE_END; key++)
1080 if (code == key->keycode && key->type == KE_KEY)
1081 return key;
1082
1083 return NULL;
1084 }
1085
1086 static int eeepc_getkeycode(struct input_dev *dev, int scancode, int *keycode)
1087 {
1088 struct key_entry *key = eeepc_get_entry_by_scancode(scancode);
1089
1090 if (key && key->type == KE_KEY) {
1091 *keycode = key->keycode;
1092 return 0;
1093 }
1094
1095 return -EINVAL;
1096 }
1097
1098 static int eeepc_setkeycode(struct input_dev *dev, int scancode, int keycode)
1099 {
1100 struct key_entry *key;
1101 int old_keycode;
1102
1103 if (keycode < 0 || keycode > KEY_MAX)
1104 return -EINVAL;
1105
1106 key = eeepc_get_entry_by_scancode(scancode);
1107 if (key && key->type == KE_KEY) {
1108 old_keycode = key->keycode;
1109 key->keycode = keycode;
1110 set_bit(keycode, dev->keybit);
1111 if (!eepc_get_entry_by_keycode(old_keycode))
1112 clear_bit(old_keycode, dev->keybit);
1113 return 0;
1114 }
1115
1116 return -EINVAL;
1117 }
1118
1119 static int eeepc_input_init(struct device *dev)
1120 {
1121 const struct key_entry *key;
1122 int result;
1123
1124 eeepc->inputdev = input_allocate_device();
1125 if (!eeepc->inputdev) {
1126 pr_info("Unable to allocate input device\n");
1127 return -ENOMEM;
1128 }
1129 eeepc->inputdev->name = "Asus EeePC extra buttons";
1130 eeepc->inputdev->dev.parent = dev;
1131 eeepc->inputdev->phys = EEEPC_LAPTOP_FILE "/input0";
1132 eeepc->inputdev->id.bustype = BUS_HOST;
1133 eeepc->inputdev->getkeycode = eeepc_getkeycode;
1134 eeepc->inputdev->setkeycode = eeepc_setkeycode;
1135
1136 for (key = eeepc_keymap; key->type != KE_END; key++) {
1137 switch (key->type) {
1138 case KE_KEY:
1139 set_bit(EV_KEY, eeepc->inputdev->evbit);
1140 set_bit(key->keycode, eeepc->inputdev->keybit);
1141 break;
1142 }
1143 }
1144 result = input_register_device(eeepc->inputdev);
1145 if (result) {
1146 pr_info("Unable to register input device\n");
1147 input_free_device(eeepc->inputdev);
1148 return result;
1149 }
1150 return 0;
1151 }
1152
1153 static void eeepc_input_exit(void)
1154 {
1155 if (eeepc->inputdev)
1156 input_unregister_device(eeepc->inputdev);
1157 }
1158
1159 /*
1160 * ACPI driver
1161 */
1162 static void eeepc_acpi_notify(struct acpi_device *device, u32 event)
1163 {
1164 u16 count;
1165
1166 if (event > ACPI_MAX_SYS_NOTIFY)
1167 return;
1168 count = eeepc->event_count[event % 128]++;
1169 acpi_bus_generate_proc_event(eeepc->device, event, count);
1170 acpi_bus_generate_netlink_event(eeepc->device->pnp.device_class,
1171 dev_name(&eeepc->device->dev), event,
1172 count);
1173
1174 if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX) {
1175 int old_brightness, new_brightness;
1176
1177 /* Update backlight device. */
1178 old_brightness = eeepc_backlight_notify();
1179
1180 /* Convert brightness event to keypress (obsolescent hack). */
1181 new_brightness = event - NOTIFY_BRN_MIN;
1182
1183 if (new_brightness < old_brightness) {
1184 event = NOTIFY_BRN_MIN; /* brightness down */
1185 } else if (new_brightness > old_brightness) {
1186 event = NOTIFY_BRN_MAX; /* brightness up */
1187 } else {
1188 /*
1189 * no change in brightness - already at min/max,
1190 * event will be desired value (or else ignored).
1191 */
1192 }
1193 }
1194 eeepc_input_notify(event);
1195 }
1196
1197 static void cmsg_quirk(int cm, const char *name)
1198 {
1199 int dummy;
1200
1201 /* Some BIOSes do not report cm although it is avaliable.
1202 Check if cm_getv[cm] works and, if yes, assume cm should be set. */
1203 if (!(eeepc->cm_supported & (1 << cm))
1204 && !read_acpi_int(eeepc->handle, cm_getv[cm], &dummy)) {
1205 pr_info("%s (%x) not reported by BIOS,"
1206 " enabling anyway\n", name, 1 << cm);
1207 eeepc->cm_supported |= 1 << cm;
1208 }
1209 }
1210
1211 static void cmsg_quirks(void)
1212 {
1213 cmsg_quirk(CM_ASL_LID, "LID");
1214 cmsg_quirk(CM_ASL_TYPE, "TYPE");
1215 cmsg_quirk(CM_ASL_PANELPOWER, "PANELPOWER");
1216 cmsg_quirk(CM_ASL_TPD, "TPD");
1217 }
1218
1219 static int eeepc_acpi_init(void)
1220 {
1221 unsigned int init_flags;
1222 int result;
1223
1224 result = acpi_bus_get_status(eeepc->device);
1225 if (result)
1226 return result;
1227 if (!eeepc->device->status.present) {
1228 pr_err("Hotkey device not present, aborting\n");
1229 return -ENODEV;
1230 }
1231
1232 init_flags = DISABLE_ASL_WLAN | DISABLE_ASL_DISPLAYSWITCH;
1233 pr_notice("Hotkey init flags 0x%x\n", init_flags);
1234
1235 if (write_acpi_int(eeepc->handle, "INIT", init_flags)) {
1236 pr_err("Hotkey initialization failed\n");
1237 return -ENODEV;
1238 }
1239
1240 /* get control methods supported */
1241 if (read_acpi_int(eeepc->handle, "CMSG", &eeepc->cm_supported)) {
1242 pr_err("Get control methods supported failed\n");
1243 return -ENODEV;
1244 }
1245 cmsg_quirks();
1246 pr_info("Get control methods supported: 0x%x\n", eeepc->cm_supported);
1247
1248 return 0;
1249 }
1250
1251 static void __devinit eeepc_enable_camera(void)
1252 {
1253 /*
1254 * If the following call to set_acpi() fails, it's because there's no
1255 * camera so we can ignore the error.
1256 */
1257 if (get_acpi(CM_ASL_CAMERA) == 0)
1258 set_acpi(CM_ASL_CAMERA, 1);
1259 }
1260
1261 static int __devinit eeepc_acpi_add(struct acpi_device *device)
1262 {
1263 struct device *dev;
1264 int result;
1265
1266 pr_notice(EEEPC_LAPTOP_NAME "\n");
1267 eeepc = kzalloc(sizeof(struct eeepc_laptop), GFP_KERNEL);
1268 if (!eeepc)
1269 return -ENOMEM;
1270 eeepc->handle = device->handle;
1271 strcpy(acpi_device_name(device), EEEPC_ACPI_DEVICE_NAME);
1272 strcpy(acpi_device_class(device), EEEPC_ACPI_CLASS);
1273 device->driver_data = eeepc;
1274 eeepc->device = device;
1275
1276 result = eeepc_acpi_init();
1277 if (result)
1278 goto fail_platform;
1279 eeepc_enable_camera();
1280
1281 result = eeepc_platform_init();
1282 if (result)
1283 goto fail_platform;
1284 dev = &platform_device->dev;
1285
1286 if (!acpi_video_backlight_support()) {
1287 result = eeepc_backlight_init(dev);
1288 if (result)
1289 goto fail_backlight;
1290 } else
1291 pr_info("Backlight controlled by ACPI video driver\n");
1292
1293 result = eeepc_input_init(dev);
1294 if (result)
1295 goto fail_input;
1296
1297 result = eeepc_hwmon_init(dev);
1298 if (result)
1299 goto fail_hwmon;
1300
1301 result = eeepc_led_init(dev);
1302 if (result)
1303 goto fail_led;
1304
1305 result = eeepc_rfkill_init(dev);
1306 if (result)
1307 goto fail_rfkill;
1308
1309 return 0;
1310
1311 fail_rfkill:
1312 eeepc_led_exit();
1313 fail_led:
1314 eeepc_hwmon_exit();
1315 fail_hwmon:
1316 eeepc_input_exit();
1317 fail_input:
1318 eeepc_backlight_exit();
1319 fail_backlight:
1320 eeepc_platform_exit();
1321 fail_platform:
1322 kfree(eeepc);
1323
1324 return result;
1325 }
1326
1327 static int eeepc_acpi_remove(struct acpi_device *device, int type)
1328 {
1329 eeepc_backlight_exit();
1330 eeepc_rfkill_exit();
1331 eeepc_input_exit();
1332 eeepc_hwmon_exit();
1333 eeepc_led_exit();
1334 eeepc_platform_exit();
1335
1336 kfree(eeepc);
1337 return 0;
1338 }
1339
1340
1341 static const struct acpi_device_id eeepc_device_ids[] = {
1342 {EEEPC_ACPI_HID, 0},
1343 {"", 0},
1344 };
1345 MODULE_DEVICE_TABLE(acpi, eeepc_device_ids);
1346
1347 static struct acpi_driver eeepc_acpi_driver = {
1348 .name = EEEPC_LAPTOP_NAME,
1349 .class = EEEPC_ACPI_CLASS,
1350 .owner = THIS_MODULE,
1351 .ids = eeepc_device_ids,
1352 .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
1353 .ops = {
1354 .add = eeepc_acpi_add,
1355 .remove = eeepc_acpi_remove,
1356 .notify = eeepc_acpi_notify,
1357 },
1358 };
1359
1360
1361 static int __init eeepc_laptop_init(void)
1362 {
1363 int result;
1364
1365 result = platform_driver_register(&platform_driver);
1366 if (result < 0)
1367 return result;
1368
1369 result = acpi_bus_register_driver(&eeepc_acpi_driver);
1370 if (result < 0)
1371 goto fail_acpi_driver;
1372 if (!eeepc) {
1373 result = -ENODEV;
1374 goto fail_no_device;
1375 }
1376 return 0;
1377
1378 fail_no_device:
1379 acpi_bus_unregister_driver(&eeepc_acpi_driver);
1380 fail_acpi_driver:
1381 platform_driver_unregister(&platform_driver);
1382 return result;
1383 }
1384
1385 static void __exit eeepc_laptop_exit(void)
1386 {
1387 acpi_bus_unregister_driver(&eeepc_acpi_driver);
1388 platform_driver_unregister(&platform_driver);
1389 }
1390
1391 module_init(eeepc_laptop_init);
1392 module_exit(eeepc_laptop_exit);