eeepc-laptop.c

Adi A., 11/01/2009 07:33 pm

Download (30.4 kB)

 
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
static void eeepc_rfkill_hotplug(bool real);
154

    
155
/* Platform device/driver */
156
static int eeepc_hotk_thaw(struct device *device);
157
static int eeepc_hotk_restore(struct device *device);
158

    
159
static struct dev_pm_ops eeepc_pm_ops = {
160
        .thaw = eeepc_hotk_thaw,
161
        .restore = eeepc_hotk_restore,
162
};
163

    
164
static struct platform_driver platform_driver = {
165
        .driver = {
166
                .name = EEEPC_HOTK_FILE,
167
                .owner = THIS_MODULE,
168
                .pm = &eeepc_pm_ops,
169
        }
170
};
171

    
172
static struct platform_device *platform_device;
173

    
174
struct key_entry {
175
        char type;
176
        u8 code;
177
        u16 keycode;
178
};
179

    
180
enum { KE_KEY, KE_END };
181

    
182
static struct key_entry eeepc_keymap[] = {
183
        /* Sleep already handled via generic ACPI code */
184
        {KE_KEY, 0x10, KEY_WLAN },
185
        {KE_KEY, 0x11, KEY_WLAN },
186
        {KE_KEY, 0x12, KEY_PROG1 },
187
        {KE_KEY, 0x13, KEY_MUTE },
188
        {KE_KEY, 0x14, KEY_VOLUMEDOWN },
189
        {KE_KEY, 0x15, KEY_VOLUMEUP },
190
        {KE_KEY, 0x1a, KEY_COFFEE },
191
        {KE_KEY, 0x1b, KEY_ZOOM },
192
        {KE_KEY, 0x1c, KEY_PROG2 },
193
        {KE_KEY, 0x1d, KEY_PROG3 },
194
        {KE_KEY, NOTIFY_BRN_MIN,     KEY_BRIGHTNESSDOWN },
195
        {KE_KEY, NOTIFY_BRN_MIN + 2, KEY_BRIGHTNESSUP },
196
        {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
197
        {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
198
        {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
199
        {KE_END, 0},
200
};
201

    
202
/*
203
 * The hotkey driver declaration
204
 */
205
static int eeepc_hotk_add(struct acpi_device *device);
206
static int eeepc_hotk_remove(struct acpi_device *device, int type);
207
static void eeepc_hotk_notify(struct acpi_device *device, u32 event);
208

    
209
static const struct acpi_device_id eeepc_device_ids[] = {
210
        {EEEPC_HOTK_HID, 0},
211
        {"", 0},
212
};
213
MODULE_DEVICE_TABLE(acpi, eeepc_device_ids);
214

    
215
static struct acpi_driver eeepc_hotk_driver = {
216
        .name = EEEPC_HOTK_NAME,
217
        .class = EEEPC_HOTK_CLASS,
218
        .ids = eeepc_device_ids,
219
        .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
220
        .ops = {
221
                .add = eeepc_hotk_add,
222
                .remove = eeepc_hotk_remove,
223
                .notify = eeepc_hotk_notify,
224
        },
225
};
226

    
227
/* PCI hotplug ops */
228
static int eeepc_get_adapter_status(struct hotplug_slot *slot, u8 *value);
229

    
230
static struct hotplug_slot_ops eeepc_hotplug_slot_ops = {
231
        .owner = THIS_MODULE,
232
        .get_adapter_status = eeepc_get_adapter_status,
233
        .get_power_status = eeepc_get_adapter_status,
234
};
235

    
236
/* The backlight device /sys/class/backlight */
237
static struct backlight_device *eeepc_backlight_device;
238

    
239
/* The hwmon device */
240
static struct device *eeepc_hwmon_device;
241

    
242
/*
243
 * The backlight class declaration
244
 */
245
static int read_brightness(struct backlight_device *bd);
246
static int update_bl_status(struct backlight_device *bd);
247
static struct backlight_ops eeepcbl_ops = {
248
        .get_brightness = read_brightness,
249
        .update_status = update_bl_status,
250
};
251

    
252
MODULE_AUTHOR("Corentin Chary, Eric Cooper");
253
MODULE_DESCRIPTION(EEEPC_HOTK_NAME);
254
MODULE_LICENSE("GPL");
255

    
256
/*
257
 * ACPI Helpers
258
 */
259
static int write_acpi_int(acpi_handle handle, const char *method, int val,
260
                          struct acpi_buffer *output)
261
{
262
        struct acpi_object_list params;
263
        union acpi_object in_obj;
264
        acpi_status status;
265

    
266
        params.count = 1;
267
        params.pointer = &in_obj;
268
        in_obj.type = ACPI_TYPE_INTEGER;
269
        in_obj.integer.value = val;
270

    
271
        status = acpi_evaluate_object(handle, (char *)method, &params, output);
272
        return (status == AE_OK ? 0 : -1);
273
}
274

    
275
static int read_acpi_int(acpi_handle handle, const char *method, int *val)
276
{
277
        acpi_status status;
278
        unsigned long long result;
279

    
280
        status = acpi_evaluate_integer(handle, (char *)method, NULL, &result);
281
        if (ACPI_FAILURE(status)) {
282
                *val = -1;
283
                return -1;
284
        } else {
285
                *val = result;
286
                return 0;
287
        }
288
}
289

    
290
static int set_acpi(int cm, int value)
291
{
292
        if (ehotk->cm_supported & (0x1 << cm)) {
293
                const char *method = cm_setv[cm];
294
                if (method == NULL)
295
                        return -ENODEV;
296
                if (write_acpi_int(ehotk->handle, method, value, NULL))
297
                        pr_warning("Error writing %s\n", method);
298
        }
299
        return 0;
300
}
301

    
302
static int get_acpi(int cm)
303
{
304
        int value = -ENODEV;
305
        if ((ehotk->cm_supported & (0x1 << cm))) {
306
                const char *method = cm_getv[cm];
307
                if (method == NULL)
308
                        return -ENODEV;
309
                if (read_acpi_int(ehotk->handle, method, &value))
310
                        pr_warning("Error reading %s\n", method);
311
        }
312
        return value;
313
}
314

    
315
/*
316
 * Backlight
317
 */
318
static int read_brightness(struct backlight_device *bd)
319
{
320
        return get_acpi(CM_ASL_PANELBRIGHT);
321
}
322

    
323
static int set_brightness(struct backlight_device *bd, int value)
324
{
325
        value = max(0, min(15, value));
326
        return set_acpi(CM_ASL_PANELBRIGHT, value);
327
}
328

    
329
static int update_bl_status(struct backlight_device *bd)
330
{
331
        return set_brightness(bd, bd->props.brightness);
332
}
333

    
334
/*
335
 * Rfkill helpers
336
 */
337

    
338
static bool eeepc_wlan_rfkill_blocked(void)
339
{
340
        if (get_acpi(CM_ASL_WLAN) == 1)
341
                return false;
342
        return true;
343
}
344

    
345
static int eeepc_rfkill_set(void *data, bool blocked)
346
{
347
        unsigned long asl = (unsigned long)data;
348
        int ret;
349

    
350
        if (asl != CM_ASL_WLAN)
351
                return set_acpi(asl, !blocked);
352

    
353
        /* hack to avoid panic with rt2860sta */
354
        if (blocked)
355
                eeepc_rfkill_hotplug(false);
356
        ret = set_acpi(asl, !blocked);
357
        return ret;
358
}
359

    
360
static const struct rfkill_ops eeepc_rfkill_ops = {
361
        .set_block = eeepc_rfkill_set,
362
};
363

    
364
static void __devinit eeepc_enable_camera(void)
365
{
366
        /*
367
         * If the following call to set_acpi() fails, it's because there's no
368
         * camera so we can ignore the error.
369
         */
370
        set_acpi(CM_ASL_CAMERA, 1);
371
}
372

    
373
/*
374
 * Sys helpers
375
 */
376
static int parse_arg(const char *buf, unsigned long count, int *val)
377
{
378
        if (!count)
379
                return 0;
380
        if (sscanf(buf, "%i", val) != 1)
381
                return -EINVAL;
382
        return count;
383
}
384

    
385
static ssize_t store_sys_acpi(int cm, const char *buf, size_t count)
386
{
387
        int rv, value;
388

    
389
        rv = parse_arg(buf, count, &value);
390
        if (rv > 0)
391
                value = set_acpi(cm, value);
392
        if (value < 0)
393
                return value;
394
        return rv;
395
}
396

    
397
static ssize_t show_sys_acpi(int cm, char *buf)
398
{
399
        int value = get_acpi(cm);
400

    
401
        if (value < 0)
402
                return value;
403
        return sprintf(buf, "%d\n", value);
404
}
405

    
406
#define EEEPC_CREATE_DEVICE_ATTR(_name, _cm)                                \
407
        static ssize_t show_##_name(struct device *dev,                        \
408
                                    struct device_attribute *attr,        \
409
                                    char *buf)                                \
410
        {                                                                \
411
                return show_sys_acpi(_cm, buf);                                \
412
        }                                                                \
413
        static ssize_t store_##_name(struct device *dev,                \
414
                                     struct device_attribute *attr,        \
415
                                     const char *buf, size_t count)        \
416
        {                                                                \
417
                return store_sys_acpi(_cm, buf, count);                        \
418
        }                                                                \
419
        static struct device_attribute dev_attr_##_name = {                \
420
                .attr = {                                                \
421
                        .name = __stringify(_name),                        \
422
                        .mode = 0644 },                                        \
423
                .show   = show_##_name,                                        \
424
                .store  = store_##_name,                                \
425
        }
426

    
427
EEEPC_CREATE_DEVICE_ATTR(camera, CM_ASL_CAMERA);
428
EEEPC_CREATE_DEVICE_ATTR(cardr, CM_ASL_CARDREADER);
429
EEEPC_CREATE_DEVICE_ATTR(disp, CM_ASL_DISPLAYSWITCH);
430

    
431
struct eeepc_cpufv {
432
        int num;
433
        int cur;
434
};
435

    
436
static int get_cpufv(struct eeepc_cpufv *c)
437
{
438
        c->cur = get_acpi(CM_ASL_CPUFV);
439
        c->num = (c->cur >> 8) & 0xff;
440
        c->cur &= 0xff;
441
        if (c->cur < 0 || c->num <= 0 || c->num > 12)
442
                return -ENODEV;
443
        return 0;
444
}
445

    
446
static ssize_t show_available_cpufv(struct device *dev,
447
                                    struct device_attribute *attr,
448
                                    char *buf)
449
{
450
        struct eeepc_cpufv c;
451
        int i;
452
        ssize_t len = 0;
453

    
454
        if (get_cpufv(&c))
455
                return -ENODEV;
456
        for (i = 0; i < c.num; i++)
457
                len += sprintf(buf + len, "%d ", i);
458
        len += sprintf(buf + len, "\n");
459
        return len;
460
}
461

    
462
static ssize_t show_cpufv(struct device *dev,
463
                          struct device_attribute *attr,
464
                          char *buf)
465
{
466
        struct eeepc_cpufv c;
467

    
468
        if (get_cpufv(&c))
469
                return -ENODEV;
470
        return sprintf(buf, "%#x\n", (c.num << 8) | c.cur);
471
}
472

    
473
static ssize_t store_cpufv(struct device *dev,
474
                           struct device_attribute *attr,
475
                           const char *buf, size_t count)
476
{
477
        struct eeepc_cpufv c;
478
        int rv, value;
479

    
480
        if (get_cpufv(&c))
481
                return -ENODEV;
482
        rv = parse_arg(buf, count, &value);
483
        if (rv < 0)
484
                return rv;
485
        if (!rv || value < 0 || value >= c.num)
486
                return -EINVAL;
487
        set_acpi(CM_ASL_CPUFV, value);
488
        return rv;
489
}
490

    
491
static struct device_attribute dev_attr_cpufv = {
492
        .attr = {
493
                .name = "cpufv",
494
                .mode = 0644 },
495
        .show   = show_cpufv,
496
        .store  = store_cpufv
497
};
498

    
499
static struct device_attribute dev_attr_available_cpufv = {
500
        .attr = {
501
                .name = "available_cpufv",
502
                .mode = 0444 },
503
        .show   = show_available_cpufv
504
};
505

    
506
static struct attribute *platform_attributes[] = {
507
        &dev_attr_camera.attr,
508
        &dev_attr_cardr.attr,
509
        &dev_attr_disp.attr,
510
        &dev_attr_cpufv.attr,
511
        &dev_attr_available_cpufv.attr,
512
        NULL
513
};
514

    
515
static struct attribute_group platform_attribute_group = {
516
        .attrs = platform_attributes
517
};
518

    
519
/*
520
 * Hotkey functions
521
 */
522
static struct key_entry *eepc_get_entry_by_scancode(int code)
523
{
524
        struct key_entry *key;
525

    
526
        for (key = eeepc_keymap; key->type != KE_END; key++)
527
                if (code == key->code)
528
                        return key;
529

    
530
        return NULL;
531
}
532

    
533
static struct key_entry *eepc_get_entry_by_keycode(int code)
534
{
535
        struct key_entry *key;
536

    
537
        for (key = eeepc_keymap; key->type != KE_END; key++)
538
                if (code == key->keycode && key->type == KE_KEY)
539
                        return key;
540

    
541
        return NULL;
542
}
543

    
544
static int eeepc_getkeycode(struct input_dev *dev, int scancode, int *keycode)
545
{
546
        struct key_entry *key = eepc_get_entry_by_scancode(scancode);
547

    
548
        if (key && key->type == KE_KEY) {
549
                *keycode = key->keycode;
550
                return 0;
551
        }
552

    
553
        return -EINVAL;
554
}
555

    
556
static int eeepc_setkeycode(struct input_dev *dev, int scancode, int keycode)
557
{
558
        struct key_entry *key;
559
        int old_keycode;
560

    
561
        if (keycode < 0 || keycode > KEY_MAX)
562
                return -EINVAL;
563

    
564
        key = eepc_get_entry_by_scancode(scancode);
565
        if (key && key->type == KE_KEY) {
566
                old_keycode = key->keycode;
567
                key->keycode = keycode;
568
                set_bit(keycode, dev->keybit);
569
                if (!eepc_get_entry_by_keycode(old_keycode))
570
                        clear_bit(old_keycode, dev->keybit);
571
                return 0;
572
        }
573

    
574
        return -EINVAL;
575
}
576

    
577
static void cmsg_quirk(int cm, const char *name)
578
{
579
        int dummy;
580

    
581
        /* Some BIOSes do not report cm although it is avaliable.
582
           Check if cm_getv[cm] works and, if yes, assume cm should be set. */
583
        if (!(ehotk->cm_supported & (1 << cm))
584
            && !read_acpi_int(ehotk->handle, cm_getv[cm], &dummy)) {
585
                pr_info("%s (%x) not reported by BIOS,"
586
                        " enabling anyway\n", name, 1 << cm);
587
                ehotk->cm_supported |= 1 << cm;
588
        }
589
}
590

    
591
static void cmsg_quirks(void)
592
{
593
        cmsg_quirk(CM_ASL_LID, "LID");
594
        cmsg_quirk(CM_ASL_TYPE, "TYPE");
595
        cmsg_quirk(CM_ASL_PANELPOWER, "PANELPOWER");
596
        cmsg_quirk(CM_ASL_TPD, "TPD");
597
}
598

    
599
static int eeepc_hotk_check(void)
600
{
601
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
602
        int result;
603

    
604
        pr_info("check 1\n");
605
        result = acpi_bus_get_status(ehotk->device);
606
        if (result)
607
                return result;
608
        pr_info("init 2\n");
609
        if (ehotk->device->status.present) {
610
                if (write_acpi_int(ehotk->handle, "INIT", ehotk->init_flag,
611
                                    &buffer)) {
612
                        pr_err("Hotkey initialization failed\n");
613
                        return -ENODEV;
614
                } else {
615
                        pr_notice("Hotkey init flags 0x%x\n", ehotk->init_flag);
616
                }
617
                /* get control methods supported */
618
                if (read_acpi_int(ehotk->handle, "CMSG"
619
                                   , &ehotk->cm_supported)) {
620
                        pr_err("Get control methods supported failed\n");
621
                        return -ENODEV;
622
                } else {
623
                        cmsg_quirks();
624
                        pr_info("Get control methods supported: 0x%x\n",
625
                                ehotk->cm_supported);
626
                }
627
        } else {
628
                pr_err("Hotkey device not present, aborting\n");
629
                return -EINVAL;
630
        }
631
        return 0;
632
}
633

    
634
static int notify_brn(void)
635
{
636
        /* returns the *previous* brightness, or -1 */
637
        struct backlight_device *bd = eeepc_backlight_device;
638
        if (bd) {
639
                int old = bd->props.brightness;
640
                backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
641
                return old;
642
        }
643
        return -1;
644
}
645

    
646
static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
647
                                    u8 *value)
648
{
649
        int val = get_acpi(CM_ASL_WLAN);
650

    
651
        if (val == 1 || val == 0)
652
                *value = val;
653
        else
654
                return -EINVAL;
655

    
656
        return 0;
657
}
658

    
659
static void eeepc_rfkill_hotplug(bool real)
660
{
661
        struct pci_dev *dev;
662
        struct pci_bus *bus;
663
        bool blocked = real ? eeepc_wlan_rfkill_blocked() : true;
664

    
665
        if (real && ehotk->wlan_rfkill)
666
                rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
667

    
668
        mutex_lock(&ehotk->hotplug_lock);
669

    
670
        if (ehotk->hotplug_slot) {
671
                bus = pci_find_bus(0, 1);
672
                if (!bus) {
673
                        pr_warning("Unable to find PCI bus 1?\n");
674
                        goto out_unlock;
675
                }
676

    
677
                if (!blocked) {
678
                        dev = pci_get_slot(bus, 0);
679
                        if (dev) {
680
                                /* Device already present */
681
                                pci_dev_put(dev);
682
                                goto out_unlock;
683
                        }
684
                        dev = pci_scan_single_device(bus, 0);
685
                        if (dev) {
686
                                pci_bus_assign_resources(bus);
687
                                if (pci_bus_add_device(dev))
688
                                        pr_err("Unable to hotplug wifi\n");
689
                        }
690
                } else {
691
                        dev = pci_get_slot(bus, 0);
692
                        if (dev) {
693
                                pci_remove_bus_device(dev);
694
                                pci_dev_put(dev);
695
                        }
696
                }
697
        }
698

    
699
out_unlock:
700
        mutex_unlock(&ehotk->hotplug_lock);
701
}
702

    
703
static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
704
{
705
        if (event != ACPI_NOTIFY_BUS_CHECK)
706
                return;
707

    
708
        eeepc_rfkill_hotplug(true);
709
}
710

    
711
static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
712
{
713
        static struct key_entry *key;
714
        u16 count;
715
        int brn = -ENODEV;
716

    
717
        if (!ehotk)
718
                return;
719
        if (event > ACPI_MAX_SYS_NOTIFY)
720
                return;
721
        if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
722
                brn = notify_brn();
723
        count = ehotk->event_count[event % 128]++;
724
        acpi_bus_generate_proc_event(ehotk->device, event, count);
725
        acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
726
                                        dev_name(&ehotk->device->dev), event,
727
                                        count);
728
        if (ehotk->inputdev) {
729
                if (brn != -ENODEV) {
730
                        /* brightness-change events need special
731
                         * handling for conversion to key events
732
                         */
733
                        if (brn < 0)
734
                                brn = event;
735
                        else
736
                                brn += NOTIFY_BRN_MIN;
737
                        if (event < brn)
738
                                event = NOTIFY_BRN_MIN; /* brightness down */
739
                        else if (event > brn)
740
                                event = NOTIFY_BRN_MIN + 2; /* ... up */
741
                        else
742
                                event = NOTIFY_BRN_MIN + 1; /* ... unchanged */
743
                }
744
                key = eepc_get_entry_by_scancode(event);
745
                if (key) {
746
                        switch (key->type) {
747
                        case KE_KEY:
748
                                input_report_key(ehotk->inputdev, key->keycode,
749
                                                 1);
750
                                input_sync(ehotk->inputdev);
751
                                input_report_key(ehotk->inputdev, key->keycode,
752
                                                 0);
753
                                input_sync(ehotk->inputdev);
754
                                break;
755
                        }
756
                }
757
        }
758
}
759

    
760
static int eeepc_register_rfkill_notifier(char *node)
761
{
762
        acpi_status status = AE_OK;
763
        acpi_handle handle;
764

    
765
        status = acpi_get_handle(NULL, node, &handle);
766

    
767
        if (ACPI_SUCCESS(status)) {
768
                status = acpi_install_notify_handler(handle,
769
                                                     ACPI_SYSTEM_NOTIFY,
770
                                                     eeepc_rfkill_notify,
771
                                                     NULL);
772
                if (ACPI_FAILURE(status))
773
                        pr_warning("Failed to register notify on %s\n", node);
774
        } else
775
                return -ENODEV;
776

    
777
        return 0;
778
}
779

    
780
static void eeepc_unregister_rfkill_notifier(char *node)
781
{
782
        acpi_status status = AE_OK;
783
        acpi_handle handle;
784

    
785
        status = acpi_get_handle(NULL, node, &handle);
786

    
787
        if (ACPI_SUCCESS(status)) {
788
                status = acpi_remove_notify_handler(handle,
789
                                                     ACPI_SYSTEM_NOTIFY,
790
                                                     eeepc_rfkill_notify);
791
                if (ACPI_FAILURE(status))
792
                        pr_err("Error removing rfkill notify handler %s\n",
793
                                node);
794
        }
795
}
796

    
797
static void eeepc_cleanup_pci_hotplug(struct hotplug_slot *hotplug_slot)
798
{
799
        kfree(hotplug_slot->info);
800
        kfree(hotplug_slot);
801
}
802

    
803
static int eeepc_setup_pci_hotplug(void)
804
{
805
        int ret = -ENOMEM;
806
        struct pci_bus *bus = pci_find_bus(0, 1);
807

    
808
        if (!bus) {
809
                pr_err("Unable to find wifi PCI bus\n");
810
                return -ENODEV;
811
        }
812

    
813
        ehotk->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
814
        if (!ehotk->hotplug_slot)
815
                goto error_slot;
816

    
817
        ehotk->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
818
                                            GFP_KERNEL);
819
        if (!ehotk->hotplug_slot->info)
820
                goto error_info;
821

    
822
        ehotk->hotplug_slot->private = ehotk;
823
        ehotk->hotplug_slot->release = &eeepc_cleanup_pci_hotplug;
824
        ehotk->hotplug_slot->ops = &eeepc_hotplug_slot_ops;
825
        eeepc_get_adapter_status(ehotk->hotplug_slot,
826
                                 &ehotk->hotplug_slot->info->adapter_status);
827

    
828
        ret = pci_hp_register(ehotk->hotplug_slot, bus, 0, "eeepc-wifi");
829
        if (ret) {
830
                pr_err("Unable to register hotplug slot - %d\n", ret);
831
                goto error_register;
832
        }
833

    
834
        return 0;
835

    
836
error_register:
837
        kfree(ehotk->hotplug_slot->info);
838
error_info:
839
        kfree(ehotk->hotplug_slot);
840
        ehotk->hotplug_slot = NULL;
841
error_slot:
842
        return ret;
843
}
844

    
845
static int eeepc_hotk_thaw(struct device *device)
846
{
847
        if (ehotk->wlan_rfkill) {
848
                bool wlan;
849

    
850
                /*
851
                 * Work around bios bug - acpi _PTS turns off the wireless led
852
                 * during suspend.  Normally it restores it on resume, but
853
                 * we should kick it ourselves in case hibernation is aborted.
854
                 */
855
                wlan = get_acpi(CM_ASL_WLAN);
856
                set_acpi(CM_ASL_WLAN, wlan);
857
        }
858

    
859
        return 0;
860
}
861

    
862
static int eeepc_hotk_restore(struct device *device)
863
{
864
        /* Refresh both wlan rfkill state and pci hotplug */
865
        if (ehotk->wlan_rfkill)
866
                eeepc_rfkill_hotplug(true);
867

    
868
        if (ehotk->bluetooth_rfkill)
869
                rfkill_set_sw_state(ehotk->bluetooth_rfkill,
870
                                    get_acpi(CM_ASL_BLUETOOTH) != 1);
871
        if (ehotk->wwan3g_rfkill)
872
                rfkill_set_sw_state(ehotk->wwan3g_rfkill,
873
                                    get_acpi(CM_ASL_3G) != 1);
874
        if (ehotk->wimax_rfkill)
875
                rfkill_set_sw_state(ehotk->wimax_rfkill,
876
                                    get_acpi(CM_ASL_WIMAX) != 1);
877

    
878
        return 0;
879
}
880

    
881
/*
882
 * Hwmon
883
 */
884
static int eeepc_get_fan_pwm(void)
885
{
886
        int value = 0;
887

    
888
        read_acpi_int(NULL, EEEPC_EC_FAN_PWM, &value);
889
        value = value * 255 / 100;
890
        return (value);
891
}
892

    
893
static void eeepc_set_fan_pwm(int value)
894
{
895
        value = SENSORS_LIMIT(value, 0, 255);
896
        value = value * 100 / 255;
897
        ec_write(EEEPC_EC_SC02, value);
898
}
899

    
900
static int eeepc_get_fan_rpm(void)
901
{
902
        int high = 0;
903
        int low = 0;
904

    
905
        read_acpi_int(NULL, EEEPC_EC_FAN_HRPM, &high);
906
        read_acpi_int(NULL, EEEPC_EC_FAN_LRPM, &low);
907
        return (high << 8 | low);
908
}
909

    
910
static int eeepc_get_fan_ctrl(void)
911
{
912
        int value = 0;
913

    
914
        read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
915
        return ((value & 0x02 ? 1 : 0));
916
}
917

    
918
static void eeepc_set_fan_ctrl(int manual)
919
{
920
        int value = 0;
921

    
922
        read_acpi_int(NULL, EEEPC_EC_FAN_CTRL, &value);
923
        if (manual)
924
                value |= 0x02;
925
        else
926
                value &= ~0x02;
927
        ec_write(EEEPC_EC_SFB3, value);
928
}
929

    
930
static ssize_t store_sys_hwmon(void (*set)(int), const char *buf, size_t count)
931
{
932
        int rv, value;
933

    
934
        rv = parse_arg(buf, count, &value);
935
        if (rv > 0)
936
                set(value);
937
        return rv;
938
}
939

    
940
static ssize_t show_sys_hwmon(int (*get)(void), char *buf)
941
{
942
        return sprintf(buf, "%d\n", get());
943
}
944

    
945
#define EEEPC_CREATE_SENSOR_ATTR(_name, _mode, _set, _get)                \
946
        static ssize_t show_##_name(struct device *dev,                        \
947
                                    struct device_attribute *attr,        \
948
                                    char *buf)                                \
949
        {                                                                \
950
                return show_sys_hwmon(_set, buf);                        \
951
        }                                                                \
952
        static ssize_t store_##_name(struct device *dev,                \
953
                                     struct device_attribute *attr,        \
954
                                     const char *buf, size_t count)        \
955
        {                                                                \
956
                return store_sys_hwmon(_get, buf, count);                \
957
        }                                                                \
958
        static SENSOR_DEVICE_ATTR(_name, _mode, show_##_name, store_##_name, 0);
959

    
960
EEEPC_CREATE_SENSOR_ATTR(fan1_input, S_IRUGO, eeepc_get_fan_rpm, NULL);
961
EEEPC_CREATE_SENSOR_ATTR(pwm1, S_IRUGO | S_IWUSR,
962
                         eeepc_get_fan_pwm, eeepc_set_fan_pwm);
963
EEEPC_CREATE_SENSOR_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
964
                         eeepc_get_fan_ctrl, eeepc_set_fan_ctrl);
965

    
966
static ssize_t
967
show_name(struct device *dev, struct device_attribute *attr, char *buf)
968
{
969
        return sprintf(buf, "eeepc\n");
970
}
971
static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
972

    
973
static struct attribute *hwmon_attributes[] = {
974
        &sensor_dev_attr_pwm1.dev_attr.attr,
975
        &sensor_dev_attr_fan1_input.dev_attr.attr,
976
        &sensor_dev_attr_pwm1_enable.dev_attr.attr,
977
        &sensor_dev_attr_name.dev_attr.attr,
978
        NULL
979
};
980

    
981
static struct attribute_group hwmon_attribute_group = {
982
        .attrs = hwmon_attributes
983
};
984

    
985
/*
986
 * exit/init
987
 */
988
static void eeepc_backlight_exit(void)
989
{
990
        if (eeepc_backlight_device)
991
                backlight_device_unregister(eeepc_backlight_device);
992
        eeepc_backlight_device = NULL;
993
}
994

    
995
static void eeepc_rfkill_exit(void)
996
{
997
        eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P5");
998
        eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
999
        eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
1000
        if (ehotk->wlan_rfkill) {
1001
                rfkill_unregister(ehotk->wlan_rfkill);
1002
                rfkill_destroy(ehotk->wlan_rfkill);
1003
                ehotk->wlan_rfkill = NULL;
1004
        }
1005
        /*
1006
         * Refresh pci hotplug in case the rfkill state was changed after
1007
         * eeepc_unregister_rfkill_notifier()
1008
         */
1009
        eeepc_rfkill_hotplug(true);
1010
        if (ehotk->hotplug_slot)
1011
                pci_hp_deregister(ehotk->hotplug_slot);
1012

    
1013
        if (ehotk->bluetooth_rfkill) {
1014
                rfkill_unregister(ehotk->bluetooth_rfkill);
1015
                rfkill_destroy(ehotk->bluetooth_rfkill);
1016
                ehotk->bluetooth_rfkill = NULL;
1017
        }
1018
        if (ehotk->wwan3g_rfkill) {
1019
                rfkill_unregister(ehotk->wwan3g_rfkill);
1020
                rfkill_destroy(ehotk->wwan3g_rfkill);
1021
                ehotk->wwan3g_rfkill = NULL;
1022
        }
1023
        if (ehotk->wimax_rfkill) {
1024
                rfkill_unregister(ehotk->wimax_rfkill);
1025
                rfkill_destroy(ehotk->wimax_rfkill);
1026
                ehotk->wimax_rfkill = NULL;
1027
        }
1028
}
1029

    
1030
static void eeepc_input_exit(void)
1031
{
1032
        if (ehotk->inputdev)
1033
                input_unregister_device(ehotk->inputdev);
1034
}
1035

    
1036
static void eeepc_hwmon_exit(void)
1037
{
1038
        struct device *hwmon;
1039

    
1040
        hwmon = eeepc_hwmon_device;
1041
        if (!hwmon)
1042
                return ;
1043
        sysfs_remove_group(&hwmon->kobj,
1044
                           &hwmon_attribute_group);
1045
        hwmon_device_unregister(hwmon);
1046
        eeepc_hwmon_device = NULL;
1047
}
1048

    
1049
static int eeepc_new_rfkill(struct rfkill **rfkill,
1050
                            const char *name, struct device *dev,
1051
                            enum rfkill_type type, int cm)
1052
{
1053
        int result;
1054

    
1055
        result = get_acpi(cm);
1056
        if (result < 0)
1057
                return result;
1058

    
1059
        *rfkill = rfkill_alloc(name, dev, type,
1060
                               &eeepc_rfkill_ops, (void *)(unsigned long)cm);
1061

    
1062
        if (!*rfkill)
1063
                return -EINVAL;
1064

    
1065
        rfkill_init_sw_state(*rfkill, get_acpi(cm) != 1);
1066
        result = rfkill_register(*rfkill);
1067
        if (result) {
1068
                rfkill_destroy(*rfkill);
1069
                *rfkill = NULL;
1070
                return result;
1071
        }
1072
        return 0;
1073
}
1074

    
1075

    
1076
static int eeepc_rfkill_init(struct device *dev)
1077
{
1078
        int result = 0;
1079

    
1080
        mutex_init(&ehotk->hotplug_lock);
1081

    
1082
        result = eeepc_new_rfkill(&ehotk->wlan_rfkill,
1083
                                  "eeepc-wlan", dev,
1084
                                  RFKILL_TYPE_WLAN, CM_ASL_WLAN);
1085

    
1086
        if (result && result != -ENODEV)
1087
                goto exit;
1088

    
1089
        result = eeepc_new_rfkill(&ehotk->bluetooth_rfkill,
1090
                                  "eeepc-bluetooth", dev,
1091
                                  RFKILL_TYPE_BLUETOOTH, CM_ASL_BLUETOOTH);
1092

    
1093
        if (result && result != -ENODEV)
1094
                goto exit;
1095

    
1096
        result = eeepc_new_rfkill(&ehotk->wwan3g_rfkill,
1097
                                  "eeepc-wwan3g", dev,
1098
                                  RFKILL_TYPE_WWAN, CM_ASL_3G);
1099

    
1100
        if (result && result != -ENODEV)
1101
                goto exit;
1102

    
1103
        result = eeepc_new_rfkill(&ehotk->wimax_rfkill,
1104
                                  "eeepc-wimax", dev,
1105
                                  RFKILL_TYPE_WIMAX, CM_ASL_WIMAX);
1106

    
1107
        if (result && result != -ENODEV)
1108
                goto exit;
1109

    
1110
        result = eeepc_setup_pci_hotplug();
1111
        /*
1112
         * If we get -EBUSY then something else is handling the PCI hotplug -
1113
         * don't fail in this case
1114
         */
1115
        if (result == -EBUSY)
1116
                result = 0;
1117

    
1118
        eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P5");
1119
        eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
1120
        eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
1121
        /*
1122
         * Refresh pci hotplug in case the rfkill state was changed during
1123
         * setup.
1124
         */
1125
        eeepc_rfkill_hotplug(true);
1126

    
1127
exit:
1128
        if (result && result != -ENODEV)
1129
                eeepc_rfkill_exit();
1130
        return result;
1131
}
1132

    
1133
static int eeepc_backlight_init(struct device *dev)
1134
{
1135
        struct backlight_device *bd;
1136

    
1137
        bd = backlight_device_register(EEEPC_HOTK_FILE, dev,
1138
                                       NULL, &eeepcbl_ops);
1139
        if (IS_ERR(bd)) {
1140
                pr_err("Could not register eeepc backlight device\n");
1141
                eeepc_backlight_device = NULL;
1142
                return PTR_ERR(bd);
1143
        }
1144
        eeepc_backlight_device = bd;
1145
        bd->props.max_brightness = 15;
1146
        bd->props.brightness = read_brightness(NULL);
1147
        bd->props.power = FB_BLANK_UNBLANK;
1148
        backlight_update_status(bd);
1149
        return 0;
1150
}
1151

    
1152
static int eeepc_hwmon_init(struct device *dev)
1153
{
1154
        struct device *hwmon;
1155
        int result;
1156

    
1157
        hwmon = hwmon_device_register(dev);
1158
        if (IS_ERR(hwmon)) {
1159
                pr_err("Could not register eeepc hwmon device\n");
1160
                eeepc_hwmon_device = NULL;
1161
                return PTR_ERR(hwmon);
1162
        }
1163
        eeepc_hwmon_device = hwmon;
1164
        result = sysfs_create_group(&hwmon->kobj,
1165
                                    &hwmon_attribute_group);
1166
        if (result)
1167
                eeepc_hwmon_exit();
1168
        return result;
1169
}
1170

    
1171
static int eeepc_input_init(struct device *dev)
1172
{
1173
        const struct key_entry *key;
1174
        int result;
1175

    
1176
        ehotk->inputdev = input_allocate_device();
1177
        if (!ehotk->inputdev) {
1178
                pr_info("Unable to allocate input device\n");
1179
                return -ENOMEM;
1180
        }
1181
        ehotk->inputdev->name = "Asus EeePC extra buttons";
1182
        ehotk->inputdev->dev.parent = dev;
1183
        ehotk->inputdev->phys = EEEPC_HOTK_FILE "/input0";
1184
        ehotk->inputdev->id.bustype = BUS_HOST;
1185
        ehotk->inputdev->getkeycode = eeepc_getkeycode;
1186
        ehotk->inputdev->setkeycode = eeepc_setkeycode;
1187

    
1188
        for (key = eeepc_keymap; key->type != KE_END; key++) {
1189
                switch (key->type) {
1190
                case KE_KEY:
1191
                        set_bit(EV_KEY, ehotk->inputdev->evbit);
1192
                        set_bit(key->keycode, ehotk->inputdev->keybit);
1193
                        break;
1194
                }
1195
        }
1196
        result = input_register_device(ehotk->inputdev);
1197
        if (result) {
1198
                pr_info("Unable to register input device\n");
1199
                input_free_device(ehotk->inputdev);
1200
                return result;
1201
        }
1202
        return 0;
1203
}
1204

    
1205
static int __devinit eeepc_hotk_add(struct acpi_device *device)
1206
{
1207
        struct device *dev;
1208
        int result;
1209

    
1210
        pr_info("add 1\n");
1211
        if (!device)
1212
                return -EINVAL;
1213
        pr_notice(EEEPC_HOTK_NAME "\n");
1214
        ehotk = kzalloc(sizeof(struct eeepc_hotk), GFP_KERNEL);
1215
        if (!ehotk)
1216
                return -ENOMEM;
1217
        ehotk->init_flag = DISABLE_ASL_WLAN | DISABLE_ASL_DISPLAYSWITCH;
1218
        ehotk->handle = device->handle;
1219
        strcpy(acpi_device_name(device), EEEPC_HOTK_DEVICE_NAME);
1220
        strcpy(acpi_device_class(device), EEEPC_HOTK_CLASS);
1221
        device->driver_data = ehotk;
1222
        ehotk->device = device;
1223

    
1224
        pr_info("add 2\n");
1225
        result = eeepc_hotk_check();
1226
        if (result)
1227
                goto fail_platform_driver;
1228
        pr_info("add 3\n");
1229
        eeepc_enable_camera();
1230

    
1231
        /* Register platform stuff */
1232
        result = platform_driver_register(&platform_driver);
1233
        if (result)
1234
                goto fail_platform_driver;
1235
        platform_device = platform_device_alloc(EEEPC_HOTK_FILE, -1);
1236
        if (!platform_device) {
1237
                result = -ENOMEM;
1238
                goto fail_platform_device1;
1239
        }
1240
        result = platform_device_add(platform_device);
1241
        if (result)
1242
                goto fail_platform_device2;
1243
        result = sysfs_create_group(&platform_device->dev.kobj,
1244
                                    &platform_attribute_group);
1245
        if (result)
1246
                goto fail_sysfs;
1247

    
1248
        dev = &platform_device->dev;
1249

    
1250
        if (!acpi_video_backlight_support()) {
1251
                result = eeepc_backlight_init(dev);
1252
                if (result)
1253
                        goto fail_backlight;
1254
        } else
1255
                pr_info("Backlight controlled by ACPI video "
1256
                        "driver\n");
1257

    
1258
        result = eeepc_input_init(dev);
1259
        if (result)
1260
                goto fail_input;
1261

    
1262
        result = eeepc_hwmon_init(dev);
1263
        if (result)
1264
                goto fail_hwmon;
1265

    
1266
        result = eeepc_rfkill_init(dev);
1267
        if (result)
1268
                goto fail_rfkill;
1269

    
1270
        return 0;
1271

    
1272
fail_rfkill:
1273
        eeepc_hwmon_exit();
1274
fail_hwmon:
1275
        eeepc_input_exit();
1276
fail_input:
1277
        eeepc_backlight_exit();
1278
fail_backlight:
1279
        sysfs_remove_group(&platform_device->dev.kobj,
1280
                           &platform_attribute_group);
1281
fail_sysfs:
1282
        platform_device_del(platform_device);
1283
fail_platform_device2:
1284
        platform_device_put(platform_device);
1285
fail_platform_device1:
1286
        platform_driver_unregister(&platform_driver);
1287
fail_platform_driver:
1288
        kfree(ehotk);
1289

    
1290
        return result;
1291
}
1292

    
1293
static int eeepc_hotk_remove(struct acpi_device *device, int type)
1294
{
1295
        if (!device || !acpi_driver_data(device))
1296
                return -EINVAL;
1297

    
1298
        eeepc_backlight_exit();
1299
        eeepc_rfkill_exit();
1300
        eeepc_input_exit();
1301
        eeepc_hwmon_exit();
1302
        sysfs_remove_group(&platform_device->dev.kobj,
1303
                           &platform_attribute_group);
1304
        platform_device_unregister(platform_device);
1305
        platform_driver_unregister(&platform_driver);
1306

    
1307
        kfree(ehotk);
1308
        return 0;
1309
}
1310

    
1311
static int __init eeepc_laptop_init(void)
1312
{
1313
        int result;
1314

    
1315
        pr_info("init 1\n");
1316
        if (acpi_disabled)
1317
                return -ENODEV;
1318
        pr_info("init 2\n");
1319
        result = acpi_bus_register_driver(&eeepc_hotk_driver);
1320
        pr_info("init 3: %d\n",result);
1321
        if (result < 0)
1322
                return result;
1323
        if (!ehotk) {
1324
                pr_info("init 4\n");
1325
                acpi_bus_unregister_driver(&eeepc_hotk_driver);
1326
                return -ENODEV;
1327
        }
1328
        pr_info("init 5\n");
1329
        return 0;
1330
}
1331

    
1332
static void __exit eeepc_laptop_exit(void)
1333
{
1334
        acpi_bus_unregister_driver(&eeepc_hotk_driver);
1335
}
1336

    
1337
module_init(eeepc_laptop_init);
1338
module_exit(eeepc_laptop_exit);