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