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);
1318