Merge tag 'devicetree-for-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / acpi / button.c
1 /*
2  *  button.c - ACPI Button Driver
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or (at
12  *  your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful, but
15  *  WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  General Public License for more details.
18  *
19  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20  */
21
22 #define pr_fmt(fmt) "ACPI: button: " fmt
23
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/init.h>
27 #include <linux/types.h>
28 #include <linux/proc_fs.h>
29 #include <linux/seq_file.h>
30 #include <linux/input.h>
31 #include <linux/slab.h>
32 #include <linux/acpi.h>
33 #include <acpi/button.h>
34
35 #define PREFIX "ACPI: "
36
37 #define ACPI_BUTTON_CLASS               "button"
38 #define ACPI_BUTTON_FILE_INFO           "info"
39 #define ACPI_BUTTON_FILE_STATE          "state"
40 #define ACPI_BUTTON_TYPE_UNKNOWN        0x00
41 #define ACPI_BUTTON_NOTIFY_STATUS       0x80
42
43 #define ACPI_BUTTON_SUBCLASS_POWER      "power"
44 #define ACPI_BUTTON_HID_POWER           "PNP0C0C"
45 #define ACPI_BUTTON_DEVICE_NAME_POWER   "Power Button"
46 #define ACPI_BUTTON_TYPE_POWER          0x01
47
48 #define ACPI_BUTTON_SUBCLASS_SLEEP      "sleep"
49 #define ACPI_BUTTON_HID_SLEEP           "PNP0C0E"
50 #define ACPI_BUTTON_DEVICE_NAME_SLEEP   "Sleep Button"
51 #define ACPI_BUTTON_TYPE_SLEEP          0x03
52
53 #define ACPI_BUTTON_SUBCLASS_LID        "lid"
54 #define ACPI_BUTTON_HID_LID             "PNP0C0D"
55 #define ACPI_BUTTON_DEVICE_NAME_LID     "Lid Switch"
56 #define ACPI_BUTTON_TYPE_LID            0x05
57
58 #define ACPI_BUTTON_LID_INIT_IGNORE     0x00
59 #define ACPI_BUTTON_LID_INIT_OPEN       0x01
60 #define ACPI_BUTTON_LID_INIT_METHOD     0x02
61
62 #define _COMPONENT              ACPI_BUTTON_COMPONENT
63 ACPI_MODULE_NAME("button");
64
65 MODULE_AUTHOR("Paul Diefenbaugh");
66 MODULE_DESCRIPTION("ACPI Button Driver");
67 MODULE_LICENSE("GPL");
68
69 static const struct acpi_device_id button_device_ids[] = {
70         {ACPI_BUTTON_HID_LID,    0},
71         {ACPI_BUTTON_HID_SLEEP,  0},
72         {ACPI_BUTTON_HID_SLEEPF, 0},
73         {ACPI_BUTTON_HID_POWER,  0},
74         {ACPI_BUTTON_HID_POWERF, 0},
75         {"", 0},
76 };
77 MODULE_DEVICE_TABLE(acpi, button_device_ids);
78
79 static int acpi_button_add(struct acpi_device *device);
80 static int acpi_button_remove(struct acpi_device *device);
81 static void acpi_button_notify(struct acpi_device *device, u32 event);
82
83 #ifdef CONFIG_PM_SLEEP
84 static int acpi_button_suspend(struct device *dev);
85 static int acpi_button_resume(struct device *dev);
86 #else
87 #define acpi_button_suspend NULL
88 #define acpi_button_resume NULL
89 #endif
90 static SIMPLE_DEV_PM_OPS(acpi_button_pm, acpi_button_suspend, acpi_button_resume);
91
92 static struct acpi_driver acpi_button_driver = {
93         .name = "button",
94         .class = ACPI_BUTTON_CLASS,
95         .ids = button_device_ids,
96         .ops = {
97                 .add = acpi_button_add,
98                 .remove = acpi_button_remove,
99                 .notify = acpi_button_notify,
100         },
101         .drv.pm = &acpi_button_pm,
102 };
103
104 struct acpi_button {
105         unsigned int type;
106         struct input_dev *input;
107         char phys[32];                  /* for input device */
108         unsigned long pushed;
109         int last_state;
110         ktime_t last_time;
111         bool suspended;
112 };
113
114 static BLOCKING_NOTIFIER_HEAD(acpi_lid_notifier);
115 static struct acpi_device *lid_device;
116 static u8 lid_init_state = ACPI_BUTTON_LID_INIT_METHOD;
117
118 static unsigned long lid_report_interval __read_mostly = 500;
119 module_param(lid_report_interval, ulong, 0644);
120 MODULE_PARM_DESC(lid_report_interval, "Interval (ms) between lid key events");
121
122 /* --------------------------------------------------------------------------
123                               FS Interface (/proc)
124    -------------------------------------------------------------------------- */
125
126 static struct proc_dir_entry *acpi_button_dir;
127 static struct proc_dir_entry *acpi_lid_dir;
128
129 static int acpi_lid_evaluate_state(struct acpi_device *device)
130 {
131         unsigned long long lid_state;
132         acpi_status status;
133
134         status = acpi_evaluate_integer(device->handle, "_LID", NULL, &lid_state);
135         if (ACPI_FAILURE(status))
136                 return -ENODEV;
137
138         return lid_state ? 1 : 0;
139 }
140
141 static int acpi_lid_notify_state(struct acpi_device *device, int state)
142 {
143         struct acpi_button *button = acpi_driver_data(device);
144         int ret;
145         ktime_t next_report;
146         bool do_update;
147
148         /*
149          * In lid_init_state=ignore mode, if user opens/closes lid
150          * frequently with "open" missing, and "last_time" is also updated
151          * frequently, "close" cannot be delivered to the userspace.
152          * So "last_time" is only updated after a timeout or an actual
153          * switch.
154          */
155         if (lid_init_state != ACPI_BUTTON_LID_INIT_IGNORE ||
156             button->last_state != !!state)
157                 do_update = true;
158         else
159                 do_update = false;
160
161         next_report = ktime_add(button->last_time,
162                                 ms_to_ktime(lid_report_interval));
163         if (button->last_state == !!state &&
164             ktime_after(ktime_get(), next_report)) {
165                 /* Complain the buggy firmware */
166                 pr_warn_once("The lid device is not compliant to SW_LID.\n");
167
168                 /*
169                  * Send the unreliable complement switch event:
170                  *
171                  * On most platforms, the lid device is reliable. However
172                  * there are exceptions:
173                  * 1. Platforms returning initial lid state as "close" by
174                  *    default after booting/resuming:
175                  *     https://bugzilla.kernel.org/show_bug.cgi?id=89211
176                  *     https://bugzilla.kernel.org/show_bug.cgi?id=106151
177                  * 2. Platforms never reporting "open" events:
178                  *     https://bugzilla.kernel.org/show_bug.cgi?id=106941
179                  * On these buggy platforms, the usage model of the ACPI
180                  * lid device actually is:
181                  * 1. The initial returning value of _LID may not be
182                  *    reliable.
183                  * 2. The open event may not be reliable.
184                  * 3. The close event is reliable.
185                  *
186                  * But SW_LID is typed as input switch event, the input
187                  * layer checks if the event is redundant. Hence if the
188                  * state is not switched, the userspace cannot see this
189                  * platform triggered reliable event. By inserting a
190                  * complement switch event, it then is guaranteed that the
191                  * platform triggered reliable one can always be seen by
192                  * the userspace.
193                  */
194                 if (lid_init_state == ACPI_BUTTON_LID_INIT_IGNORE) {
195                         do_update = true;
196                         /*
197                          * Do generate complement switch event for "close"
198                          * as "close" is reliable and wrong "open" won't
199                          * trigger unexpected behaviors.
200                          * Do not generate complement switch event for
201                          * "open" as "open" is not reliable and wrong
202                          * "close" will trigger unexpected behaviors.
203                          */
204                         if (!state) {
205                                 input_report_switch(button->input,
206                                                     SW_LID, state);
207                                 input_sync(button->input);
208                         }
209                 }
210         }
211         /* Send the platform triggered reliable event */
212         if (do_update) {
213                 input_report_switch(button->input, SW_LID, !state);
214                 input_sync(button->input);
215                 button->last_state = !!state;
216                 button->last_time = ktime_get();
217         }
218
219         if (state)
220                 acpi_pm_wakeup_event(&device->dev);
221
222         ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, device);
223         if (ret == NOTIFY_DONE)
224                 ret = blocking_notifier_call_chain(&acpi_lid_notifier, state,
225                                                    device);
226         if (ret == NOTIFY_DONE || ret == NOTIFY_OK) {
227                 /*
228                  * It is also regarded as success if the notifier_chain
229                  * returns NOTIFY_OK or NOTIFY_DONE.
230                  */
231                 ret = 0;
232         }
233         return ret;
234 }
235
236 static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
237 {
238         struct acpi_device *device = seq->private;
239         int state;
240
241         state = acpi_lid_evaluate_state(device);
242         seq_printf(seq, "state:      %s\n",
243                    state < 0 ? "unsupported" : (state ? "open" : "closed"));
244         return 0;
245 }
246
247 static int acpi_button_state_open_fs(struct inode *inode, struct file *file)
248 {
249         return single_open(file, acpi_button_state_seq_show, PDE_DATA(inode));
250 }
251
252 static const struct file_operations acpi_button_state_fops = {
253         .owner = THIS_MODULE,
254         .open = acpi_button_state_open_fs,
255         .read = seq_read,
256         .llseek = seq_lseek,
257         .release = single_release,
258 };
259
260 static int acpi_button_add_fs(struct acpi_device *device)
261 {
262         struct acpi_button *button = acpi_driver_data(device);
263         struct proc_dir_entry *entry = NULL;
264         int ret = 0;
265
266         /* procfs I/F for ACPI lid device only */
267         if (button->type != ACPI_BUTTON_TYPE_LID)
268                 return 0;
269
270         if (acpi_button_dir || acpi_lid_dir) {
271                 printk(KERN_ERR PREFIX "More than one Lid device found!\n");
272                 return -EEXIST;
273         }
274
275         /* create /proc/acpi/button */
276         acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir);
277         if (!acpi_button_dir)
278                 return -ENODEV;
279
280         /* create /proc/acpi/button/lid */
281         acpi_lid_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_LID, acpi_button_dir);
282         if (!acpi_lid_dir) {
283                 ret = -ENODEV;
284                 goto remove_button_dir;
285         }
286
287         /* create /proc/acpi/button/lid/LID/ */
288         acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), acpi_lid_dir);
289         if (!acpi_device_dir(device)) {
290                 ret = -ENODEV;
291                 goto remove_lid_dir;
292         }
293
294         /* create /proc/acpi/button/lid/LID/state */
295         entry = proc_create_data(ACPI_BUTTON_FILE_STATE,
296                                  S_IRUGO, acpi_device_dir(device),
297                                  &acpi_button_state_fops, device);
298         if (!entry) {
299                 ret = -ENODEV;
300                 goto remove_dev_dir;
301         }
302
303 done:
304         return ret;
305
306 remove_dev_dir:
307         remove_proc_entry(acpi_device_bid(device),
308                           acpi_lid_dir);
309         acpi_device_dir(device) = NULL;
310 remove_lid_dir:
311         remove_proc_entry(ACPI_BUTTON_SUBCLASS_LID, acpi_button_dir);
312         acpi_lid_dir = NULL;
313 remove_button_dir:
314         remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
315         acpi_button_dir = NULL;
316         goto done;
317 }
318
319 static int acpi_button_remove_fs(struct acpi_device *device)
320 {
321         struct acpi_button *button = acpi_driver_data(device);
322
323         if (button->type != ACPI_BUTTON_TYPE_LID)
324                 return 0;
325
326         remove_proc_entry(ACPI_BUTTON_FILE_STATE,
327                           acpi_device_dir(device));
328         remove_proc_entry(acpi_device_bid(device),
329                           acpi_lid_dir);
330         acpi_device_dir(device) = NULL;
331         remove_proc_entry(ACPI_BUTTON_SUBCLASS_LID, acpi_button_dir);
332         acpi_lid_dir = NULL;
333         remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
334         acpi_button_dir = NULL;
335
336         return 0;
337 }
338
339 /* --------------------------------------------------------------------------
340                                 Driver Interface
341    -------------------------------------------------------------------------- */
342 int acpi_lid_notifier_register(struct notifier_block *nb)
343 {
344         return blocking_notifier_chain_register(&acpi_lid_notifier, nb);
345 }
346 EXPORT_SYMBOL(acpi_lid_notifier_register);
347
348 int acpi_lid_notifier_unregister(struct notifier_block *nb)
349 {
350         return blocking_notifier_chain_unregister(&acpi_lid_notifier, nb);
351 }
352 EXPORT_SYMBOL(acpi_lid_notifier_unregister);
353
354 int acpi_lid_open(void)
355 {
356         if (!lid_device)
357                 return -ENODEV;
358
359         return acpi_lid_evaluate_state(lid_device);
360 }
361 EXPORT_SYMBOL(acpi_lid_open);
362
363 static int acpi_lid_update_state(struct acpi_device *device)
364 {
365         int state;
366
367         state = acpi_lid_evaluate_state(device);
368         if (state < 0)
369                 return state;
370
371         return acpi_lid_notify_state(device, state);
372 }
373
374 static void acpi_lid_initialize_state(struct acpi_device *device)
375 {
376         switch (lid_init_state) {
377         case ACPI_BUTTON_LID_INIT_OPEN:
378                 (void)acpi_lid_notify_state(device, 1);
379                 break;
380         case ACPI_BUTTON_LID_INIT_METHOD:
381                 (void)acpi_lid_update_state(device);
382                 break;
383         case ACPI_BUTTON_LID_INIT_IGNORE:
384         default:
385                 break;
386         }
387 }
388
389 static void acpi_button_notify(struct acpi_device *device, u32 event)
390 {
391         struct acpi_button *button = acpi_driver_data(device);
392         struct input_dev *input;
393         int users;
394
395         switch (event) {
396         case ACPI_FIXED_HARDWARE_EVENT:
397                 event = ACPI_BUTTON_NOTIFY_STATUS;
398                 /* fall through */
399         case ACPI_BUTTON_NOTIFY_STATUS:
400                 input = button->input;
401                 if (button->type == ACPI_BUTTON_TYPE_LID) {
402                         mutex_lock(&button->input->mutex);
403                         users = button->input->users;
404                         mutex_unlock(&button->input->mutex);
405                         if (users)
406                                 acpi_lid_update_state(device);
407                 } else {
408                         int keycode;
409
410                         acpi_pm_wakeup_event(&device->dev);
411                         if (button->suspended)
412                                 break;
413
414                         keycode = test_bit(KEY_SLEEP, input->keybit) ?
415                                                 KEY_SLEEP : KEY_POWER;
416                         input_report_key(input, keycode, 1);
417                         input_sync(input);
418                         input_report_key(input, keycode, 0);
419                         input_sync(input);
420
421                         acpi_bus_generate_netlink_event(
422                                         device->pnp.device_class,
423                                         dev_name(&device->dev),
424                                         event, ++button->pushed);
425                 }
426                 break;
427         default:
428                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
429                                   "Unsupported event [0x%x]\n", event));
430                 break;
431         }
432 }
433
434 #ifdef CONFIG_PM_SLEEP
435 static int acpi_button_suspend(struct device *dev)
436 {
437         struct acpi_device *device = to_acpi_device(dev);
438         struct acpi_button *button = acpi_driver_data(device);
439
440         button->suspended = true;
441         return 0;
442 }
443
444 static int acpi_button_resume(struct device *dev)
445 {
446         struct acpi_device *device = to_acpi_device(dev);
447         struct acpi_button *button = acpi_driver_data(device);
448
449         button->suspended = false;
450         if (button->type == ACPI_BUTTON_TYPE_LID && button->input->users)
451                 acpi_lid_initialize_state(device);
452         return 0;
453 }
454 #endif
455
456 static int acpi_lid_input_open(struct input_dev *input)
457 {
458         struct acpi_device *device = input_get_drvdata(input);
459         struct acpi_button *button = acpi_driver_data(device);
460
461         button->last_state = !!acpi_lid_evaluate_state(device);
462         button->last_time = ktime_get();
463         acpi_lid_initialize_state(device);
464
465         return 0;
466 }
467
468 static int acpi_button_add(struct acpi_device *device)
469 {
470         struct acpi_button *button;
471         struct input_dev *input;
472         const char *hid = acpi_device_hid(device);
473         char *name, *class;
474         int error;
475
476         button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL);
477         if (!button)
478                 return -ENOMEM;
479
480         device->driver_data = button;
481
482         button->input = input = input_allocate_device();
483         if (!input) {
484                 error = -ENOMEM;
485                 goto err_free_button;
486         }
487
488         name = acpi_device_name(device);
489         class = acpi_device_class(device);
490
491         if (!strcmp(hid, ACPI_BUTTON_HID_POWER) ||
492             !strcmp(hid, ACPI_BUTTON_HID_POWERF)) {
493                 button->type = ACPI_BUTTON_TYPE_POWER;
494                 strcpy(name, ACPI_BUTTON_DEVICE_NAME_POWER);
495                 sprintf(class, "%s/%s",
496                         ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER);
497         } else if (!strcmp(hid, ACPI_BUTTON_HID_SLEEP) ||
498                    !strcmp(hid, ACPI_BUTTON_HID_SLEEPF)) {
499                 button->type = ACPI_BUTTON_TYPE_SLEEP;
500                 strcpy(name, ACPI_BUTTON_DEVICE_NAME_SLEEP);
501                 sprintf(class, "%s/%s",
502                         ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP);
503         } else if (!strcmp(hid, ACPI_BUTTON_HID_LID)) {
504                 button->type = ACPI_BUTTON_TYPE_LID;
505                 strcpy(name, ACPI_BUTTON_DEVICE_NAME_LID);
506                 sprintf(class, "%s/%s",
507                         ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID);
508                 input->open = acpi_lid_input_open;
509         } else {
510                 printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", hid);
511                 error = -ENODEV;
512                 goto err_free_input;
513         }
514
515         error = acpi_button_add_fs(device);
516         if (error)
517                 goto err_free_input;
518
519         snprintf(button->phys, sizeof(button->phys), "%s/button/input0", hid);
520
521         input->name = name;
522         input->phys = button->phys;
523         input->id.bustype = BUS_HOST;
524         input->id.product = button->type;
525         input->dev.parent = &device->dev;
526
527         switch (button->type) {
528         case ACPI_BUTTON_TYPE_POWER:
529                 input_set_capability(input, EV_KEY, KEY_POWER);
530                 break;
531
532         case ACPI_BUTTON_TYPE_SLEEP:
533                 input_set_capability(input, EV_KEY, KEY_SLEEP);
534                 break;
535
536         case ACPI_BUTTON_TYPE_LID:
537                 input_set_capability(input, EV_SW, SW_LID);
538                 break;
539         }
540
541         input_set_drvdata(input, device);
542         error = input_register_device(input);
543         if (error)
544                 goto err_remove_fs;
545         if (button->type == ACPI_BUTTON_TYPE_LID) {
546                 /*
547                  * This assumes there's only one lid device, or if there are
548                  * more we only care about the last one...
549                  */
550                 lid_device = device;
551         }
552
553         device_init_wakeup(&device->dev, true);
554         printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device));
555         return 0;
556
557  err_remove_fs:
558         acpi_button_remove_fs(device);
559  err_free_input:
560         input_free_device(input);
561  err_free_button:
562         kfree(button);
563         return error;
564 }
565
566 static int acpi_button_remove(struct acpi_device *device)
567 {
568         struct acpi_button *button = acpi_driver_data(device);
569
570         acpi_button_remove_fs(device);
571         input_unregister_device(button->input);
572         kfree(button);
573         return 0;
574 }
575
576 static int param_set_lid_init_state(const char *val, struct kernel_param *kp)
577 {
578         int result = 0;
579
580         if (!strncmp(val, "open", sizeof("open") - 1)) {
581                 lid_init_state = ACPI_BUTTON_LID_INIT_OPEN;
582                 pr_info("Notify initial lid state as open\n");
583         } else if (!strncmp(val, "method", sizeof("method") - 1)) {
584                 lid_init_state = ACPI_BUTTON_LID_INIT_METHOD;
585                 pr_info("Notify initial lid state with _LID return value\n");
586         } else if (!strncmp(val, "ignore", sizeof("ignore") - 1)) {
587                 lid_init_state = ACPI_BUTTON_LID_INIT_IGNORE;
588                 pr_info("Do not notify initial lid state\n");
589         } else
590                 result = -EINVAL;
591         return result;
592 }
593
594 static int param_get_lid_init_state(char *buffer, struct kernel_param *kp)
595 {
596         switch (lid_init_state) {
597         case ACPI_BUTTON_LID_INIT_OPEN:
598                 return sprintf(buffer, "open");
599         case ACPI_BUTTON_LID_INIT_METHOD:
600                 return sprintf(buffer, "method");
601         case ACPI_BUTTON_LID_INIT_IGNORE:
602                 return sprintf(buffer, "ignore");
603         default:
604                 return sprintf(buffer, "invalid");
605         }
606         return 0;
607 }
608
609 module_param_call(lid_init_state,
610                   param_set_lid_init_state, param_get_lid_init_state,
611                   NULL, 0644);
612 MODULE_PARM_DESC(lid_init_state, "Behavior for reporting LID initial state");
613
614 module_acpi_driver(acpi_button_driver);