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