0001
0002
0003
0004
0005
0006
0007
0008
0009 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0010
0011 #define TPACPI_VERSION "0.26"
0012 #define TPACPI_SYSFS_VERSION 0x030000
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #include <linux/acpi.h>
0038 #include <linux/backlight.h>
0039 #include <linux/bitops.h>
0040 #include <linux/delay.h>
0041 #include <linux/dmi.h>
0042 #include <linux/fb.h>
0043 #include <linux/freezer.h>
0044 #include <linux/hwmon.h>
0045 #include <linux/hwmon-sysfs.h>
0046 #include <linux/init.h>
0047 #include <linux/input.h>
0048 #include <linux/jiffies.h>
0049 #include <linux/kernel.h>
0050 #include <linux/kthread.h>
0051 #include <linux/leds.h>
0052 #include <linux/list.h>
0053 #include <linux/module.h>
0054 #include <linux/mutex.h>
0055 #include <linux/nvram.h>
0056 #include <linux/pci.h>
0057 #include <linux/platform_device.h>
0058 #include <linux/platform_profile.h>
0059 #include <linux/power_supply.h>
0060 #include <linux/proc_fs.h>
0061 #include <linux/rfkill.h>
0062 #include <linux/sched.h>
0063 #include <linux/sched/signal.h>
0064 #include <linux/seq_file.h>
0065 #include <linux/slab.h>
0066 #include <linux/string.h>
0067 #include <linux/string_helpers.h>
0068 #include <linux/sysfs.h>
0069 #include <linux/types.h>
0070 #include <linux/uaccess.h>
0071 #include <linux/workqueue.h>
0072
0073 #include <acpi/battery.h>
0074 #include <acpi/video.h>
0075
0076 #include <drm/drm_privacy_screen_driver.h>
0077
0078 #include <sound/control.h>
0079 #include <sound/core.h>
0080 #include <sound/initval.h>
0081
0082 #include "dual_accel_detect.h"
0083
0084
0085 #define TP_CMOS_VOLUME_DOWN 0
0086 #define TP_CMOS_VOLUME_UP 1
0087 #define TP_CMOS_VOLUME_MUTE 2
0088 #define TP_CMOS_BRIGHTNESS_UP 4
0089 #define TP_CMOS_BRIGHTNESS_DOWN 5
0090 #define TP_CMOS_THINKLIGHT_ON 12
0091 #define TP_CMOS_THINKLIGHT_OFF 13
0092
0093
0094 enum tp_nvram_addr {
0095 TP_NVRAM_ADDR_HK2 = 0x57,
0096 TP_NVRAM_ADDR_THINKLIGHT = 0x58,
0097 TP_NVRAM_ADDR_VIDEO = 0x59,
0098 TP_NVRAM_ADDR_BRIGHTNESS = 0x5e,
0099 TP_NVRAM_ADDR_MIXER = 0x60,
0100 };
0101
0102
0103 enum {
0104 TP_NVRAM_MASK_HKT_THINKPAD = 0x08,
0105 TP_NVRAM_MASK_HKT_ZOOM = 0x20,
0106 TP_NVRAM_MASK_HKT_DISPLAY = 0x40,
0107 TP_NVRAM_MASK_HKT_HIBERNATE = 0x80,
0108 TP_NVRAM_MASK_THINKLIGHT = 0x10,
0109 TP_NVRAM_MASK_HKT_DISPEXPND = 0x30,
0110 TP_NVRAM_MASK_HKT_BRIGHTNESS = 0x20,
0111 TP_NVRAM_MASK_LEVEL_BRIGHTNESS = 0x0f,
0112 TP_NVRAM_POS_LEVEL_BRIGHTNESS = 0,
0113 TP_NVRAM_MASK_MUTE = 0x40,
0114 TP_NVRAM_MASK_HKT_VOLUME = 0x80,
0115 TP_NVRAM_MASK_LEVEL_VOLUME = 0x0f,
0116 TP_NVRAM_POS_LEVEL_VOLUME = 0,
0117 };
0118
0119
0120 enum {
0121 TP_NVRAM_LEVEL_VOLUME_MAX = 14,
0122 };
0123
0124
0125 #define TPACPI_ACPI_IBM_HKEY_HID "IBM0068"
0126 #define TPACPI_ACPI_LENOVO_HKEY_HID "LEN0068"
0127 #define TPACPI_ACPI_LENOVO_HKEY_V2_HID "LEN0268"
0128 #define TPACPI_ACPI_EC_HID "PNP0C09"
0129
0130
0131 #define TPACPI_HKEY_INPUT_PRODUCT 0x5054
0132 #define TPACPI_HKEY_INPUT_VERSION 0x4101
0133
0134
0135 enum {
0136 TP_ACPI_WGSV_GET_STATE = 0x01,
0137 TP_ACPI_WGSV_PWR_ON_ON_RESUME = 0x02,
0138 TP_ACPI_WGSV_PWR_OFF_ON_RESUME = 0x03,
0139 TP_ACPI_WGSV_SAVE_STATE = 0x04,
0140 };
0141
0142
0143 enum {
0144 TP_ACPI_WGSV_STATE_WWANEXIST = 0x0001,
0145 TP_ACPI_WGSV_STATE_WWANPWR = 0x0002,
0146 TP_ACPI_WGSV_STATE_WWANPWRRES = 0x0004,
0147 TP_ACPI_WGSV_STATE_WWANBIOSOFF = 0x0008,
0148 TP_ACPI_WGSV_STATE_BLTHEXIST = 0x0001,
0149 TP_ACPI_WGSV_STATE_BLTHPWR = 0x0002,
0150 TP_ACPI_WGSV_STATE_BLTHPWRRES = 0x0004,
0151 TP_ACPI_WGSV_STATE_BLTHBIOSOFF = 0x0008,
0152 TP_ACPI_WGSV_STATE_UWBEXIST = 0x0010,
0153 TP_ACPI_WGSV_STATE_UWBPWR = 0x0020,
0154 };
0155
0156
0157 enum tpacpi_hkey_event_t {
0158
0159 TP_HKEY_EV_HOTKEY_BASE = 0x1001,
0160 TP_HKEY_EV_BRGHT_UP = 0x1010,
0161 TP_HKEY_EV_BRGHT_DOWN = 0x1011,
0162 TP_HKEY_EV_KBD_LIGHT = 0x1012,
0163 TP_HKEY_EV_VOL_UP = 0x1015,
0164 TP_HKEY_EV_VOL_DOWN = 0x1016,
0165 TP_HKEY_EV_VOL_MUTE = 0x1017,
0166 TP_HKEY_EV_PRIVACYGUARD_TOGGLE = 0x130f,
0167 TP_HKEY_EV_AMT_TOGGLE = 0x131a,
0168
0169
0170 TP_HKEY_EV_WKUP_S3_UNDOCK = 0x2304,
0171 TP_HKEY_EV_WKUP_S4_UNDOCK = 0x2404,
0172 TP_HKEY_EV_WKUP_S3_BAYEJ = 0x2305,
0173 TP_HKEY_EV_WKUP_S4_BAYEJ = 0x2405,
0174 TP_HKEY_EV_WKUP_S3_BATLOW = 0x2313,
0175 TP_HKEY_EV_WKUP_S4_BATLOW = 0x2413,
0176
0177
0178 TP_HKEY_EV_BAYEJ_ACK = 0x3003,
0179 TP_HKEY_EV_UNDOCK_ACK = 0x4003,
0180
0181
0182 TP_HKEY_EV_OPTDRV_EJ = 0x3006,
0183 TP_HKEY_EV_HOTPLUG_DOCK = 0x4010,
0184
0185 TP_HKEY_EV_HOTPLUG_UNDOCK = 0x4011,
0186
0187
0188
0189
0190
0191 TP_HKEY_EV_KBD_COVER_ATTACH = 0x4012,
0192 TP_HKEY_EV_KBD_COVER_DETACH = 0x4013,
0193
0194
0195 TP_HKEY_EV_LID_CLOSE = 0x5001,
0196 TP_HKEY_EV_LID_OPEN = 0x5002,
0197 TP_HKEY_EV_TABLET_TABLET = 0x5009,
0198 TP_HKEY_EV_TABLET_NOTEBOOK = 0x500a,
0199 TP_HKEY_EV_TABLET_CHANGED = 0x60c0,
0200
0201
0202 TP_HKEY_EV_PEN_INSERTED = 0x500b,
0203 TP_HKEY_EV_PEN_REMOVED = 0x500c,
0204 TP_HKEY_EV_BRGHT_CHANGED = 0x5010,
0205
0206
0207 TP_HKEY_EV_KEY_NUMLOCK = 0x6000,
0208 TP_HKEY_EV_KEY_FN = 0x6005,
0209 TP_HKEY_EV_KEY_FN_ESC = 0x6060,
0210
0211
0212 TP_HKEY_EV_ALARM_BAT_HOT = 0x6011,
0213 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012,
0214 TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021,
0215 TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022,
0216 TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030,
0217 TP_HKEY_EV_THM_CSM_COMPLETED = 0x6032,
0218
0219
0220 TP_HKEY_EV_THM_TRANSFM_CHANGED = 0x60F0,
0221
0222
0223
0224 TP_HKEY_EV_AC_CHANGED = 0x6040,
0225
0226
0227 TP_HKEY_EV_PALM_DETECTED = 0x60b0,
0228 TP_HKEY_EV_PALM_UNDETECTED = 0x60b1,
0229
0230
0231 TP_HKEY_EV_RFKILL_CHANGED = 0x7000,
0232 };
0233
0234
0235
0236
0237
0238 #define TPACPI_NAME "thinkpad"
0239 #define TPACPI_DESC "ThinkPad ACPI Extras"
0240 #define TPACPI_FILE TPACPI_NAME "_acpi"
0241 #define TPACPI_URL "http://ibm-acpi.sf.net/"
0242 #define TPACPI_MAIL "ibm-acpi-devel@lists.sourceforge.net"
0243
0244 #define TPACPI_PROC_DIR "ibm"
0245 #define TPACPI_ACPI_EVENT_PREFIX "ibm"
0246 #define TPACPI_DRVR_NAME TPACPI_FILE
0247 #define TPACPI_DRVR_SHORTNAME "tpacpi"
0248 #define TPACPI_HWMON_DRVR_NAME TPACPI_NAME "_hwmon"
0249
0250 #define TPACPI_NVRAM_KTHREAD_NAME "ktpacpi_nvramd"
0251 #define TPACPI_WORKQUEUE_NAME "ktpacpid"
0252
0253 #define TPACPI_MAX_ACPI_ARGS 3
0254
0255
0256 #define TPACPI_DBG_ALL 0xffff
0257 #define TPACPI_DBG_DISCLOSETASK 0x8000
0258 #define TPACPI_DBG_INIT 0x0001
0259 #define TPACPI_DBG_EXIT 0x0002
0260 #define TPACPI_DBG_RFKILL 0x0004
0261 #define TPACPI_DBG_HKEY 0x0008
0262 #define TPACPI_DBG_FAN 0x0010
0263 #define TPACPI_DBG_BRGHT 0x0020
0264 #define TPACPI_DBG_MIXER 0x0040
0265
0266 #define strlencmp(a, b) (strncmp((a), (b), strlen(b)))
0267
0268
0269
0270
0271
0272
0273 struct ibm_struct;
0274
0275 struct tp_acpi_drv_struct {
0276 const struct acpi_device_id *hid;
0277 struct acpi_driver *driver;
0278
0279 void (*notify) (struct ibm_struct *, u32);
0280 acpi_handle *handle;
0281 u32 type;
0282 struct acpi_device *device;
0283 };
0284
0285 struct ibm_struct {
0286 char *name;
0287
0288 int (*read) (struct seq_file *);
0289 int (*write) (char *);
0290 void (*exit) (void);
0291 void (*resume) (void);
0292 void (*suspend) (void);
0293 void (*shutdown) (void);
0294
0295 struct list_head all_drivers;
0296
0297 struct tp_acpi_drv_struct *acpi;
0298
0299 struct {
0300 u8 acpi_driver_registered:1;
0301 u8 acpi_notify_installed:1;
0302 u8 proc_created:1;
0303 u8 init_called:1;
0304 u8 experimental:1;
0305 } flags;
0306 };
0307
0308 struct ibm_init_struct {
0309 char param[32];
0310
0311 int (*init) (struct ibm_init_struct *);
0312 umode_t base_procfs_mode;
0313 struct ibm_struct *data;
0314 };
0315
0316
0317 struct quirk_entry {
0318 bool btusb_bug;
0319 u32 s2idle_bug_mmio;
0320 };
0321
0322 static struct quirk_entry quirk_btusb_bug = {
0323 .btusb_bug = true,
0324 };
0325
0326 static struct quirk_entry quirk_s2idle_bug = {
0327 .s2idle_bug_mmio = 0xfed80380,
0328 };
0329
0330 static struct {
0331 u32 bluetooth:1;
0332 u32 hotkey:1;
0333 u32 hotkey_mask:1;
0334 u32 hotkey_wlsw:1;
0335 enum {
0336 TP_HOTKEY_TABLET_NONE = 0,
0337 TP_HOTKEY_TABLET_USES_MHKG,
0338 TP_HOTKEY_TABLET_USES_GMMS,
0339 } hotkey_tablet;
0340 u32 kbdlight:1;
0341 u32 light:1;
0342 u32 light_status:1;
0343 u32 bright_acpimode:1;
0344 u32 bright_unkfw:1;
0345 u32 wan:1;
0346 u32 uwb:1;
0347 u32 fan_ctrl_status_undef:1;
0348 u32 second_fan:1;
0349 u32 second_fan_ctl:1;
0350 u32 beep_needs_two_args:1;
0351 u32 mixer_no_level_control:1;
0352 u32 battery_force_primary:1;
0353 u32 input_device_registered:1;
0354 u32 platform_drv_registered:1;
0355 u32 sensors_pdrv_registered:1;
0356 u32 hotkey_poll_active:1;
0357 u32 has_adaptive_kbd:1;
0358 u32 kbd_lang:1;
0359 struct quirk_entry *quirks;
0360 } tp_features;
0361
0362 static struct {
0363 u16 hotkey_mask_ff:1;
0364 u16 volume_ctrl_forbidden:1;
0365 } tp_warned;
0366
0367 struct thinkpad_id_data {
0368 unsigned int vendor;
0369
0370
0371 char *bios_version_str;
0372 char *ec_version_str;
0373
0374 u32 bios_model;
0375 u32 ec_model;
0376 u16 bios_release;
0377 u16 ec_release;
0378
0379 char *model_str;
0380 char *nummodel_str;
0381 };
0382 static struct thinkpad_id_data thinkpad_id;
0383
0384 static enum {
0385 TPACPI_LIFE_INIT = 0,
0386 TPACPI_LIFE_RUNNING,
0387 TPACPI_LIFE_EXITING,
0388 } tpacpi_lifecycle;
0389
0390 static int experimental;
0391 static u32 dbg_level;
0392
0393 static struct workqueue_struct *tpacpi_wq;
0394
0395 enum led_status_t {
0396 TPACPI_LED_OFF = 0,
0397 TPACPI_LED_ON,
0398 TPACPI_LED_BLINK,
0399 };
0400
0401
0402 struct tpacpi_led_classdev {
0403 struct led_classdev led_classdev;
0404 int led;
0405 };
0406
0407
0408 static unsigned int bright_maxlvl;
0409
0410 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
0411 static int dbg_wlswemul;
0412 static bool tpacpi_wlsw_emulstate;
0413 static int dbg_bluetoothemul;
0414 static bool tpacpi_bluetooth_emulstate;
0415 static int dbg_wwanemul;
0416 static bool tpacpi_wwan_emulstate;
0417 static int dbg_uwbemul;
0418 static bool tpacpi_uwb_emulstate;
0419 #endif
0420
0421
0422
0423
0424
0425
0426 #define dbg_printk(a_dbg_level, format, arg...) \
0427 do { \
0428 if (dbg_level & (a_dbg_level)) \
0429 printk(KERN_DEBUG pr_fmt("%s: " format), \
0430 __func__, ##arg); \
0431 } while (0)
0432
0433 #ifdef CONFIG_THINKPAD_ACPI_DEBUG
0434 #define vdbg_printk dbg_printk
0435 static const char *str_supported(int is_supported);
0436 #else
0437 static inline const char *str_supported(int is_supported) { return ""; }
0438 #define vdbg_printk(a_dbg_level, format, arg...) \
0439 do { if (0) no_printk(format, ##arg); } while (0)
0440 #endif
0441
0442 static void tpacpi_log_usertask(const char * const what)
0443 {
0444 printk(KERN_DEBUG pr_fmt("%s: access by process with PID %d\n"),
0445 what, task_tgid_vnr(current));
0446 }
0447
0448 #define tpacpi_disclose_usertask(what, format, arg...) \
0449 do { \
0450 if (unlikely((dbg_level & TPACPI_DBG_DISCLOSETASK) && \
0451 (tpacpi_lifecycle == TPACPI_LIFE_RUNNING))) { \
0452 printk(KERN_DEBUG pr_fmt("%s: PID %d: " format), \
0453 what, task_tgid_vnr(current), ## arg); \
0454 } \
0455 } while (0)
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466 #define TPACPI_MATCH_ANY 0xffffffffU
0467 #define TPACPI_MATCH_ANY_VERSION 0xffffU
0468 #define TPACPI_MATCH_UNKNOWN 0U
0469
0470
0471 #define TPID(__c1, __c2) (((__c1) << 8) | (__c2))
0472 #define TPID3(__c1, __c2, __c3) (((__c1) << 16) | ((__c2) << 8) | (__c3))
0473 #define TPVER TPID
0474
0475 #define TPACPI_Q_IBM(__id1, __id2, __quirk) \
0476 { .vendor = PCI_VENDOR_ID_IBM, \
0477 .bios = TPID(__id1, __id2), \
0478 .ec = TPACPI_MATCH_ANY, \
0479 .quirks = (__quirk) }
0480
0481 #define TPACPI_Q_LNV(__id1, __id2, __quirk) \
0482 { .vendor = PCI_VENDOR_ID_LENOVO, \
0483 .bios = TPID(__id1, __id2), \
0484 .ec = TPACPI_MATCH_ANY, \
0485 .quirks = (__quirk) }
0486
0487 #define TPACPI_Q_LNV3(__id1, __id2, __id3, __quirk) \
0488 { .vendor = PCI_VENDOR_ID_LENOVO, \
0489 .bios = TPID3(__id1, __id2, __id3), \
0490 .ec = TPACPI_MATCH_ANY, \
0491 .quirks = (__quirk) }
0492
0493 #define TPACPI_QEC_IBM(__id1, __id2, __quirk) \
0494 { .vendor = PCI_VENDOR_ID_IBM, \
0495 .bios = TPACPI_MATCH_ANY, \
0496 .ec = TPID(__id1, __id2), \
0497 .quirks = (__quirk) }
0498
0499 #define TPACPI_QEC_LNV(__id1, __id2, __quirk) \
0500 { .vendor = PCI_VENDOR_ID_LENOVO, \
0501 .bios = TPACPI_MATCH_ANY, \
0502 .ec = TPID(__id1, __id2), \
0503 .quirks = (__quirk) }
0504
0505 struct tpacpi_quirk {
0506 unsigned int vendor;
0507 u32 bios;
0508 u32 ec;
0509 unsigned long quirks;
0510 };
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525 static unsigned long __init tpacpi_check_quirks(
0526 const struct tpacpi_quirk *qlist,
0527 unsigned int qlist_size)
0528 {
0529 while (qlist_size) {
0530 if ((qlist->vendor == thinkpad_id.vendor ||
0531 qlist->vendor == TPACPI_MATCH_ANY) &&
0532 (qlist->bios == thinkpad_id.bios_model ||
0533 qlist->bios == TPACPI_MATCH_ANY) &&
0534 (qlist->ec == thinkpad_id.ec_model ||
0535 qlist->ec == TPACPI_MATCH_ANY))
0536 return qlist->quirks;
0537
0538 qlist_size--;
0539 qlist++;
0540 }
0541 return 0;
0542 }
0543
0544 static inline bool __pure __init tpacpi_is_lenovo(void)
0545 {
0546 return thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO;
0547 }
0548
0549 static inline bool __pure __init tpacpi_is_ibm(void)
0550 {
0551 return thinkpad_id.vendor == PCI_VENDOR_ID_IBM;
0552 }
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566 static acpi_handle root_handle;
0567 static acpi_handle ec_handle;
0568
0569 #define TPACPI_HANDLE(object, parent, paths...) \
0570 static acpi_handle object##_handle; \
0571 static const acpi_handle * const object##_parent __initconst = \
0572 &parent##_handle; \
0573 static char *object##_paths[] __initdata = { paths }
0574
0575 TPACPI_HANDLE(ecrd, ec, "ECRD");
0576 TPACPI_HANDLE(ecwr, ec, "ECWR");
0577
0578 TPACPI_HANDLE(cmos, root, "\\UCMS",
0579
0580 "\\CMOS",
0581 "\\CMS",
0582 );
0583
0584 TPACPI_HANDLE(hkey, ec, "\\_SB.HKEY",
0585 "^HKEY",
0586 "HKEY",
0587 );
0588
0589
0590
0591
0592
0593 static int acpi_evalf(acpi_handle handle,
0594 int *res, char *method, char *fmt, ...)
0595 {
0596 char *fmt0 = fmt;
0597 struct acpi_object_list params;
0598 union acpi_object in_objs[TPACPI_MAX_ACPI_ARGS];
0599 struct acpi_buffer result, *resultp;
0600 union acpi_object out_obj;
0601 acpi_status status;
0602 va_list ap;
0603 char res_type;
0604 int success;
0605 int quiet;
0606
0607 if (!*fmt) {
0608 pr_err("acpi_evalf() called with empty format\n");
0609 return 0;
0610 }
0611
0612 if (*fmt == 'q') {
0613 quiet = 1;
0614 fmt++;
0615 } else
0616 quiet = 0;
0617
0618 res_type = *(fmt++);
0619
0620 params.count = 0;
0621 params.pointer = &in_objs[0];
0622
0623 va_start(ap, fmt);
0624 while (*fmt) {
0625 char c = *(fmt++);
0626 switch (c) {
0627 case 'd':
0628 in_objs[params.count].integer.value = va_arg(ap, int);
0629 in_objs[params.count++].type = ACPI_TYPE_INTEGER;
0630 break;
0631
0632 default:
0633 pr_err("acpi_evalf() called with invalid format character '%c'\n",
0634 c);
0635 va_end(ap);
0636 return 0;
0637 }
0638 }
0639 va_end(ap);
0640
0641 if (res_type != 'v') {
0642 result.length = sizeof(out_obj);
0643 result.pointer = &out_obj;
0644 resultp = &result;
0645 } else
0646 resultp = NULL;
0647
0648 status = acpi_evaluate_object(handle, method, ¶ms, resultp);
0649
0650 switch (res_type) {
0651 case 'd':
0652 success = (status == AE_OK &&
0653 out_obj.type == ACPI_TYPE_INTEGER);
0654 if (success && res)
0655 *res = out_obj.integer.value;
0656 break;
0657 case 'v':
0658 success = status == AE_OK;
0659 break;
0660
0661 default:
0662 pr_err("acpi_evalf() called with invalid format character '%c'\n",
0663 res_type);
0664 return 0;
0665 }
0666
0667 if (!success && !quiet)
0668 pr_err("acpi_evalf(%s, %s, ...) failed: %s\n",
0669 method, fmt0, acpi_format_exception(status));
0670
0671 return success;
0672 }
0673
0674 static int acpi_ec_read(int i, u8 *p)
0675 {
0676 int v;
0677
0678 if (ecrd_handle) {
0679 if (!acpi_evalf(ecrd_handle, &v, NULL, "dd", i))
0680 return 0;
0681 *p = v;
0682 } else {
0683 if (ec_read(i, p) < 0)
0684 return 0;
0685 }
0686
0687 return 1;
0688 }
0689
0690 static int acpi_ec_write(int i, u8 v)
0691 {
0692 if (ecwr_handle) {
0693 if (!acpi_evalf(ecwr_handle, NULL, NULL, "vdd", i, v))
0694 return 0;
0695 } else {
0696 if (ec_write(i, v) < 0)
0697 return 0;
0698 }
0699
0700 return 1;
0701 }
0702
0703 static int issue_thinkpad_cmos_command(int cmos_cmd)
0704 {
0705 if (!cmos_handle)
0706 return -ENXIO;
0707
0708 if (!acpi_evalf(cmos_handle, NULL, NULL, "vd", cmos_cmd))
0709 return -EIO;
0710
0711 return 0;
0712 }
0713
0714
0715
0716
0717
0718 #define TPACPI_ACPIHANDLE_INIT(object) \
0719 drv_acpi_handle_init(#object, &object##_handle, *object##_parent, \
0720 object##_paths, ARRAY_SIZE(object##_paths))
0721
0722 static void __init drv_acpi_handle_init(const char *name,
0723 acpi_handle *handle, const acpi_handle parent,
0724 char **paths, const int num_paths)
0725 {
0726 int i;
0727 acpi_status status;
0728
0729 vdbg_printk(TPACPI_DBG_INIT, "trying to locate ACPI handle for %s\n",
0730 name);
0731
0732 for (i = 0; i < num_paths; i++) {
0733 status = acpi_get_handle(parent, paths[i], handle);
0734 if (ACPI_SUCCESS(status)) {
0735 dbg_printk(TPACPI_DBG_INIT,
0736 "Found ACPI handle %s for %s\n",
0737 paths[i], name);
0738 return;
0739 }
0740 }
0741
0742 vdbg_printk(TPACPI_DBG_INIT, "ACPI handle for %s not found\n",
0743 name);
0744 *handle = NULL;
0745 }
0746
0747 static acpi_status __init tpacpi_acpi_handle_locate_callback(acpi_handle handle,
0748 u32 level, void *context, void **return_value)
0749 {
0750 if (!strcmp(context, "video")) {
0751 struct acpi_device *dev = acpi_fetch_acpi_dev(handle);
0752
0753 if (!dev || strcmp(ACPI_VIDEO_HID, acpi_device_hid(dev)))
0754 return AE_OK;
0755 }
0756
0757 *(acpi_handle *)return_value = handle;
0758
0759 return AE_CTRL_TERMINATE;
0760 }
0761
0762 static void __init tpacpi_acpi_handle_locate(const char *name,
0763 const char *hid,
0764 acpi_handle *handle)
0765 {
0766 acpi_status status;
0767 acpi_handle device_found;
0768
0769 BUG_ON(!name || !handle);
0770 vdbg_printk(TPACPI_DBG_INIT,
0771 "trying to locate ACPI handle for %s, using HID %s\n",
0772 name, hid ? hid : "NULL");
0773
0774 memset(&device_found, 0, sizeof(device_found));
0775 status = acpi_get_devices(hid, tpacpi_acpi_handle_locate_callback,
0776 (void *)name, &device_found);
0777
0778 *handle = NULL;
0779
0780 if (ACPI_SUCCESS(status)) {
0781 *handle = device_found;
0782 dbg_printk(TPACPI_DBG_INIT,
0783 "Found ACPI handle for %s\n", name);
0784 } else {
0785 vdbg_printk(TPACPI_DBG_INIT,
0786 "Could not locate an ACPI handle for %s: %s\n",
0787 name, acpi_format_exception(status));
0788 }
0789 }
0790
0791 static void dispatch_acpi_notify(acpi_handle handle, u32 event, void *data)
0792 {
0793 struct ibm_struct *ibm = data;
0794
0795 if (tpacpi_lifecycle != TPACPI_LIFE_RUNNING)
0796 return;
0797
0798 if (!ibm || !ibm->acpi || !ibm->acpi->notify)
0799 return;
0800
0801 ibm->acpi->notify(ibm, event);
0802 }
0803
0804 static int __init setup_acpi_notify(struct ibm_struct *ibm)
0805 {
0806 acpi_status status;
0807
0808 BUG_ON(!ibm->acpi);
0809
0810 if (!*ibm->acpi->handle)
0811 return 0;
0812
0813 vdbg_printk(TPACPI_DBG_INIT,
0814 "setting up ACPI notify for %s\n", ibm->name);
0815
0816 ibm->acpi->device = acpi_fetch_acpi_dev(*ibm->acpi->handle);
0817 if (!ibm->acpi->device) {
0818 pr_err("acpi_fetch_acpi_dev(%s) failed\n", ibm->name);
0819 return -ENODEV;
0820 }
0821
0822 ibm->acpi->device->driver_data = ibm;
0823 sprintf(acpi_device_class(ibm->acpi->device), "%s/%s",
0824 TPACPI_ACPI_EVENT_PREFIX,
0825 ibm->name);
0826
0827 status = acpi_install_notify_handler(*ibm->acpi->handle,
0828 ibm->acpi->type, dispatch_acpi_notify, ibm);
0829 if (ACPI_FAILURE(status)) {
0830 if (status == AE_ALREADY_EXISTS) {
0831 pr_notice("another device driver is already handling %s events\n",
0832 ibm->name);
0833 } else {
0834 pr_err("acpi_install_notify_handler(%s) failed: %s\n",
0835 ibm->name, acpi_format_exception(status));
0836 }
0837 return -ENODEV;
0838 }
0839 ibm->flags.acpi_notify_installed = 1;
0840 return 0;
0841 }
0842
0843 static int __init tpacpi_device_add(struct acpi_device *device)
0844 {
0845 return 0;
0846 }
0847
0848 static int __init register_tpacpi_subdriver(struct ibm_struct *ibm)
0849 {
0850 int rc;
0851
0852 dbg_printk(TPACPI_DBG_INIT,
0853 "registering %s as an ACPI driver\n", ibm->name);
0854
0855 BUG_ON(!ibm->acpi);
0856
0857 ibm->acpi->driver = kzalloc(sizeof(struct acpi_driver), GFP_KERNEL);
0858 if (!ibm->acpi->driver) {
0859 pr_err("failed to allocate memory for ibm->acpi->driver\n");
0860 return -ENOMEM;
0861 }
0862
0863 sprintf(ibm->acpi->driver->name, "%s_%s", TPACPI_NAME, ibm->name);
0864 ibm->acpi->driver->ids = ibm->acpi->hid;
0865
0866 ibm->acpi->driver->ops.add = &tpacpi_device_add;
0867
0868 rc = acpi_bus_register_driver(ibm->acpi->driver);
0869 if (rc < 0) {
0870 pr_err("acpi_bus_register_driver(%s) failed: %d\n",
0871 ibm->name, rc);
0872 kfree(ibm->acpi->driver);
0873 ibm->acpi->driver = NULL;
0874 } else if (!rc)
0875 ibm->flags.acpi_driver_registered = 1;
0876
0877 return rc;
0878 }
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889 static int dispatch_proc_show(struct seq_file *m, void *v)
0890 {
0891 struct ibm_struct *ibm = m->private;
0892
0893 if (!ibm || !ibm->read)
0894 return -EINVAL;
0895 return ibm->read(m);
0896 }
0897
0898 static int dispatch_proc_open(struct inode *inode, struct file *file)
0899 {
0900 return single_open(file, dispatch_proc_show, pde_data(inode));
0901 }
0902
0903 static ssize_t dispatch_proc_write(struct file *file,
0904 const char __user *userbuf,
0905 size_t count, loff_t *pos)
0906 {
0907 struct ibm_struct *ibm = pde_data(file_inode(file));
0908 char *kernbuf;
0909 int ret;
0910
0911 if (!ibm || !ibm->write)
0912 return -EINVAL;
0913 if (count > PAGE_SIZE - 1)
0914 return -EINVAL;
0915
0916 kernbuf = kmalloc(count + 1, GFP_KERNEL);
0917 if (!kernbuf)
0918 return -ENOMEM;
0919
0920 if (copy_from_user(kernbuf, userbuf, count)) {
0921 kfree(kernbuf);
0922 return -EFAULT;
0923 }
0924
0925 kernbuf[count] = 0;
0926 ret = ibm->write(kernbuf);
0927 if (ret == 0)
0928 ret = count;
0929
0930 kfree(kernbuf);
0931
0932 return ret;
0933 }
0934
0935 static const struct proc_ops dispatch_proc_ops = {
0936 .proc_open = dispatch_proc_open,
0937 .proc_read = seq_read,
0938 .proc_lseek = seq_lseek,
0939 .proc_release = single_release,
0940 .proc_write = dispatch_proc_write,
0941 };
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951 static struct platform_device *tpacpi_pdev;
0952 static struct platform_device *tpacpi_sensors_pdev;
0953 static struct device *tpacpi_hwmon;
0954 static struct input_dev *tpacpi_inputdev;
0955 static struct mutex tpacpi_inputdev_send_mutex;
0956 static LIST_HEAD(tpacpi_all_drivers);
0957
0958 #ifdef CONFIG_PM_SLEEP
0959 static int tpacpi_suspend_handler(struct device *dev)
0960 {
0961 struct ibm_struct *ibm, *itmp;
0962
0963 list_for_each_entry_safe(ibm, itmp,
0964 &tpacpi_all_drivers,
0965 all_drivers) {
0966 if (ibm->suspend)
0967 (ibm->suspend)();
0968 }
0969
0970 return 0;
0971 }
0972
0973 static int tpacpi_resume_handler(struct device *dev)
0974 {
0975 struct ibm_struct *ibm, *itmp;
0976
0977 list_for_each_entry_safe(ibm, itmp,
0978 &tpacpi_all_drivers,
0979 all_drivers) {
0980 if (ibm->resume)
0981 (ibm->resume)();
0982 }
0983
0984 return 0;
0985 }
0986 #endif
0987
0988 static SIMPLE_DEV_PM_OPS(tpacpi_pm,
0989 tpacpi_suspend_handler, tpacpi_resume_handler);
0990
0991 static void tpacpi_shutdown_handler(struct platform_device *pdev)
0992 {
0993 struct ibm_struct *ibm, *itmp;
0994
0995 list_for_each_entry_safe(ibm, itmp,
0996 &tpacpi_all_drivers,
0997 all_drivers) {
0998 if (ibm->shutdown)
0999 (ibm->shutdown)();
1000 }
1001 }
1002
1003
1004
1005
1006
1007 static int parse_strtoul(const char *buf,
1008 unsigned long max, unsigned long *value)
1009 {
1010 char *endp;
1011
1012 *value = simple_strtoul(skip_spaces(buf), &endp, 0);
1013 endp = skip_spaces(endp);
1014 if (*endp || *value > max)
1015 return -EINVAL;
1016
1017 return 0;
1018 }
1019
1020 static void tpacpi_disable_brightness_delay(void)
1021 {
1022 if (acpi_evalf(hkey_handle, NULL, "PWMS", "qvd", 0))
1023 pr_notice("ACPI backlight control delay disabled\n");
1024 }
1025
1026 static void printk_deprecated_attribute(const char * const what,
1027 const char * const details)
1028 {
1029 tpacpi_log_usertask("deprecated sysfs attribute");
1030 pr_warn("WARNING: sysfs attribute %s is deprecated and will be removed. %s\n",
1031 what, details);
1032 }
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058 enum tpacpi_rfkill_state {
1059 TPACPI_RFK_RADIO_OFF = 0,
1060 TPACPI_RFK_RADIO_ON
1061 };
1062
1063
1064 enum tpacpi_rfk_id {
1065 TPACPI_RFK_BLUETOOTH_SW_ID = 0,
1066 TPACPI_RFK_WWAN_SW_ID,
1067 TPACPI_RFK_UWB_SW_ID,
1068 TPACPI_RFK_SW_MAX
1069 };
1070
1071 static const char *tpacpi_rfkill_names[] = {
1072 [TPACPI_RFK_BLUETOOTH_SW_ID] = "bluetooth",
1073 [TPACPI_RFK_WWAN_SW_ID] = "wwan",
1074 [TPACPI_RFK_UWB_SW_ID] = "uwb",
1075 [TPACPI_RFK_SW_MAX] = NULL
1076 };
1077
1078
1079 struct tpacpi_rfk {
1080 struct rfkill *rfkill;
1081 enum tpacpi_rfk_id id;
1082 const struct tpacpi_rfk_ops *ops;
1083 };
1084
1085 struct tpacpi_rfk_ops {
1086
1087 int (*get_status)(void);
1088 int (*set_status)(const enum tpacpi_rfkill_state);
1089 };
1090
1091 static struct tpacpi_rfk *tpacpi_rfkill_switches[TPACPI_RFK_SW_MAX];
1092
1093
1094 static int tpacpi_rfk_update_swstate(const struct tpacpi_rfk *tp_rfk)
1095 {
1096 int status;
1097
1098 if (!tp_rfk)
1099 return -ENODEV;
1100
1101 status = (tp_rfk->ops->get_status)();
1102 if (status < 0)
1103 return status;
1104
1105 rfkill_set_sw_state(tp_rfk->rfkill,
1106 (status == TPACPI_RFK_RADIO_OFF));
1107
1108 return status;
1109 }
1110
1111
1112
1113
1114
1115 static void tpacpi_rfk_update_hwblock_state(bool blocked)
1116 {
1117 unsigned int i;
1118 struct tpacpi_rfk *tp_rfk;
1119
1120 for (i = 0; i < TPACPI_RFK_SW_MAX; i++) {
1121 tp_rfk = tpacpi_rfkill_switches[i];
1122 if (tp_rfk) {
1123 if (rfkill_set_hw_state(tp_rfk->rfkill,
1124 blocked)) {
1125
1126 }
1127 }
1128 }
1129 }
1130
1131
1132 static int hotkey_get_wlsw(void);
1133
1134
1135 static bool tpacpi_rfk_check_hwblock_state(void)
1136 {
1137 int res = hotkey_get_wlsw();
1138 int hw_blocked;
1139
1140
1141 if (res < 0)
1142 return false;
1143
1144 hw_blocked = (res == TPACPI_RFK_RADIO_OFF);
1145 tpacpi_rfk_update_hwblock_state(hw_blocked);
1146
1147 return hw_blocked;
1148 }
1149
1150 static int tpacpi_rfk_hook_set_block(void *data, bool blocked)
1151 {
1152 struct tpacpi_rfk *tp_rfk = data;
1153 int res;
1154
1155 dbg_printk(TPACPI_DBG_RFKILL,
1156 "request to change radio state to %s\n",
1157 blocked ? "blocked" : "unblocked");
1158
1159
1160 res = (tp_rfk->ops->set_status)(blocked ?
1161 TPACPI_RFK_RADIO_OFF : TPACPI_RFK_RADIO_ON);
1162
1163
1164 tpacpi_rfk_update_swstate(tp_rfk);
1165
1166 return (res < 0) ? res : 0;
1167 }
1168
1169 static const struct rfkill_ops tpacpi_rfk_rfkill_ops = {
1170 .set_block = tpacpi_rfk_hook_set_block,
1171 };
1172
1173 static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id,
1174 const struct tpacpi_rfk_ops *tp_rfkops,
1175 const enum rfkill_type rfktype,
1176 const char *name,
1177 const bool set_default)
1178 {
1179 struct tpacpi_rfk *atp_rfk;
1180 int res;
1181 bool sw_state = false;
1182 bool hw_state;
1183 int sw_status;
1184
1185 BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]);
1186
1187 atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL);
1188 if (atp_rfk)
1189 atp_rfk->rfkill = rfkill_alloc(name,
1190 &tpacpi_pdev->dev,
1191 rfktype,
1192 &tpacpi_rfk_rfkill_ops,
1193 atp_rfk);
1194 if (!atp_rfk || !atp_rfk->rfkill) {
1195 pr_err("failed to allocate memory for rfkill class\n");
1196 kfree(atp_rfk);
1197 return -ENOMEM;
1198 }
1199
1200 atp_rfk->id = id;
1201 atp_rfk->ops = tp_rfkops;
1202
1203 sw_status = (tp_rfkops->get_status)();
1204 if (sw_status < 0) {
1205 pr_err("failed to read initial state for %s, error %d\n",
1206 name, sw_status);
1207 } else {
1208 sw_state = (sw_status == TPACPI_RFK_RADIO_OFF);
1209 if (set_default) {
1210
1211
1212 rfkill_init_sw_state(atp_rfk->rfkill, sw_state);
1213 }
1214 }
1215 hw_state = tpacpi_rfk_check_hwblock_state();
1216 rfkill_set_hw_state(atp_rfk->rfkill, hw_state);
1217
1218 res = rfkill_register(atp_rfk->rfkill);
1219 if (res < 0) {
1220 pr_err("failed to register %s rfkill switch: %d\n", name, res);
1221 rfkill_destroy(atp_rfk->rfkill);
1222 kfree(atp_rfk);
1223 return res;
1224 }
1225
1226 tpacpi_rfkill_switches[id] = atp_rfk;
1227
1228 pr_info("rfkill switch %s: radio is %sblocked\n",
1229 name, (sw_state || hw_state) ? "" : "un");
1230 return 0;
1231 }
1232
1233 static void tpacpi_destroy_rfkill(const enum tpacpi_rfk_id id)
1234 {
1235 struct tpacpi_rfk *tp_rfk;
1236
1237 BUG_ON(id >= TPACPI_RFK_SW_MAX);
1238
1239 tp_rfk = tpacpi_rfkill_switches[id];
1240 if (tp_rfk) {
1241 rfkill_unregister(tp_rfk->rfkill);
1242 rfkill_destroy(tp_rfk->rfkill);
1243 tpacpi_rfkill_switches[id] = NULL;
1244 kfree(tp_rfk);
1245 }
1246 }
1247
1248 static void printk_deprecated_rfkill_attribute(const char * const what)
1249 {
1250 printk_deprecated_attribute(what,
1251 "Please switch to generic rfkill before year 2010");
1252 }
1253
1254
1255 static ssize_t tpacpi_rfk_sysfs_enable_show(const enum tpacpi_rfk_id id,
1256 struct device_attribute *attr,
1257 char *buf)
1258 {
1259 int status;
1260
1261 printk_deprecated_rfkill_attribute(attr->attr.name);
1262
1263
1264 if (tpacpi_rfk_check_hwblock_state()) {
1265 status = TPACPI_RFK_RADIO_OFF;
1266 } else {
1267 status = tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]);
1268 if (status < 0)
1269 return status;
1270 }
1271
1272 return sysfs_emit(buf, "%d\n",
1273 (status == TPACPI_RFK_RADIO_ON) ? 1 : 0);
1274 }
1275
1276 static ssize_t tpacpi_rfk_sysfs_enable_store(const enum tpacpi_rfk_id id,
1277 struct device_attribute *attr,
1278 const char *buf, size_t count)
1279 {
1280 unsigned long t;
1281 int res;
1282
1283 printk_deprecated_rfkill_attribute(attr->attr.name);
1284
1285 if (parse_strtoul(buf, 1, &t))
1286 return -EINVAL;
1287
1288 tpacpi_disclose_usertask(attr->attr.name, "set to %ld\n", t);
1289
1290
1291 if (tpacpi_rfk_check_hwblock_state() && !!t)
1292 return -EPERM;
1293
1294 res = tpacpi_rfkill_switches[id]->ops->set_status((!!t) ?
1295 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF);
1296 tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]);
1297
1298 return (res < 0) ? res : count;
1299 }
1300
1301
1302 static int tpacpi_rfk_procfs_read(const enum tpacpi_rfk_id id, struct seq_file *m)
1303 {
1304 if (id >= TPACPI_RFK_SW_MAX)
1305 seq_printf(m, "status:\t\tnot supported\n");
1306 else {
1307 int status;
1308
1309
1310 if (tpacpi_rfk_check_hwblock_state()) {
1311 status = TPACPI_RFK_RADIO_OFF;
1312 } else {
1313 status = tpacpi_rfk_update_swstate(
1314 tpacpi_rfkill_switches[id]);
1315 if (status < 0)
1316 return status;
1317 }
1318
1319 seq_printf(m, "status:\t\t%s\n", str_enabled_disabled(status == TPACPI_RFK_RADIO_ON));
1320 seq_printf(m, "commands:\tenable, disable\n");
1321 }
1322
1323 return 0;
1324 }
1325
1326 static int tpacpi_rfk_procfs_write(const enum tpacpi_rfk_id id, char *buf)
1327 {
1328 char *cmd;
1329 int status = -1;
1330 int res = 0;
1331
1332 if (id >= TPACPI_RFK_SW_MAX)
1333 return -ENODEV;
1334
1335 while ((cmd = strsep(&buf, ","))) {
1336 if (strlencmp(cmd, "enable") == 0)
1337 status = TPACPI_RFK_RADIO_ON;
1338 else if (strlencmp(cmd, "disable") == 0)
1339 status = TPACPI_RFK_RADIO_OFF;
1340 else
1341 return -EINVAL;
1342 }
1343
1344 if (status != -1) {
1345 tpacpi_disclose_usertask("procfs", "attempt to %s %s\n",
1346 str_enable_disable(status == TPACPI_RFK_RADIO_ON),
1347 tpacpi_rfkill_names[id]);
1348 res = (tpacpi_rfkill_switches[id]->ops->set_status)(status);
1349 tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]);
1350 }
1351
1352 return res;
1353 }
1354
1355
1356
1357
1358
1359
1360 static ssize_t interface_version_show(struct device_driver *drv, char *buf)
1361 {
1362 return sysfs_emit(buf, "0x%08x\n", TPACPI_SYSFS_VERSION);
1363 }
1364 static DRIVER_ATTR_RO(interface_version);
1365
1366
1367 static ssize_t debug_level_show(struct device_driver *drv, char *buf)
1368 {
1369 return sysfs_emit(buf, "0x%04x\n", dbg_level);
1370 }
1371
1372 static ssize_t debug_level_store(struct device_driver *drv, const char *buf,
1373 size_t count)
1374 {
1375 unsigned long t;
1376
1377 if (parse_strtoul(buf, 0xffff, &t))
1378 return -EINVAL;
1379
1380 dbg_level = t;
1381
1382 return count;
1383 }
1384 static DRIVER_ATTR_RW(debug_level);
1385
1386
1387 static ssize_t version_show(struct device_driver *drv, char *buf)
1388 {
1389 return sysfs_emit(buf, "%s v%s\n",
1390 TPACPI_DESC, TPACPI_VERSION);
1391 }
1392 static DRIVER_ATTR_RO(version);
1393
1394
1395
1396 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
1397
1398
1399 static ssize_t wlsw_emulstate_show(struct device_driver *drv, char *buf)
1400 {
1401 return sysfs_emit(buf, "%d\n", !!tpacpi_wlsw_emulstate);
1402 }
1403
1404 static ssize_t wlsw_emulstate_store(struct device_driver *drv, const char *buf,
1405 size_t count)
1406 {
1407 unsigned long t;
1408
1409 if (parse_strtoul(buf, 1, &t))
1410 return -EINVAL;
1411
1412 if (tpacpi_wlsw_emulstate != !!t) {
1413 tpacpi_wlsw_emulstate = !!t;
1414 tpacpi_rfk_update_hwblock_state(!t);
1415 }
1416
1417 return count;
1418 }
1419 static DRIVER_ATTR_RW(wlsw_emulstate);
1420
1421
1422 static ssize_t bluetooth_emulstate_show(struct device_driver *drv, char *buf)
1423 {
1424 return sysfs_emit(buf, "%d\n", !!tpacpi_bluetooth_emulstate);
1425 }
1426
1427 static ssize_t bluetooth_emulstate_store(struct device_driver *drv,
1428 const char *buf, size_t count)
1429 {
1430 unsigned long t;
1431
1432 if (parse_strtoul(buf, 1, &t))
1433 return -EINVAL;
1434
1435 tpacpi_bluetooth_emulstate = !!t;
1436
1437 return count;
1438 }
1439 static DRIVER_ATTR_RW(bluetooth_emulstate);
1440
1441
1442 static ssize_t wwan_emulstate_show(struct device_driver *drv, char *buf)
1443 {
1444 return sysfs_emit(buf, "%d\n", !!tpacpi_wwan_emulstate);
1445 }
1446
1447 static ssize_t wwan_emulstate_store(struct device_driver *drv, const char *buf,
1448 size_t count)
1449 {
1450 unsigned long t;
1451
1452 if (parse_strtoul(buf, 1, &t))
1453 return -EINVAL;
1454
1455 tpacpi_wwan_emulstate = !!t;
1456
1457 return count;
1458 }
1459 static DRIVER_ATTR_RW(wwan_emulstate);
1460
1461
1462 static ssize_t uwb_emulstate_show(struct device_driver *drv, char *buf)
1463 {
1464 return sysfs_emit(buf, "%d\n", !!tpacpi_uwb_emulstate);
1465 }
1466
1467 static ssize_t uwb_emulstate_store(struct device_driver *drv, const char *buf,
1468 size_t count)
1469 {
1470 unsigned long t;
1471
1472 if (parse_strtoul(buf, 1, &t))
1473 return -EINVAL;
1474
1475 tpacpi_uwb_emulstate = !!t;
1476
1477 return count;
1478 }
1479 static DRIVER_ATTR_RW(uwb_emulstate);
1480 #endif
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507 #define TPV_Q(__v, __id1, __id2, __bv1, __bv2) \
1508 { .vendor = (__v), \
1509 .bios = TPID(__id1, __id2), \
1510 .ec = TPACPI_MATCH_ANY, \
1511 .quirks = TPACPI_MATCH_ANY_VERSION << 16 \
1512 | TPVER(__bv1, __bv2) }
1513
1514 #define TPV_Q_X(__v, __bid1, __bid2, __bv1, __bv2, \
1515 __eid, __ev1, __ev2) \
1516 { .vendor = (__v), \
1517 .bios = TPID(__bid1, __bid2), \
1518 .ec = __eid, \
1519 .quirks = TPVER(__ev1, __ev2) << 16 \
1520 | TPVER(__bv1, __bv2) }
1521
1522 #define TPV_QI0(__id1, __id2, __bv1, __bv2) \
1523 TPV_Q(PCI_VENDOR_ID_IBM, __id1, __id2, __bv1, __bv2)
1524
1525
1526 #define TPV_QI1(__id1, __id2, __bv1, __bv2, __ev1, __ev2) \
1527 TPV_Q_X(PCI_VENDOR_ID_IBM, __id1, __id2, \
1528 __bv1, __bv2, TPID(__id1, __id2), \
1529 __ev1, __ev2), \
1530 TPV_Q_X(PCI_VENDOR_ID_IBM, __id1, __id2, \
1531 __bv1, __bv2, TPACPI_MATCH_UNKNOWN, \
1532 __ev1, __ev2)
1533
1534
1535 #define TPV_QI2(__bid1, __bid2, __bv1, __bv2, \
1536 __eid1, __eid2, __ev1, __ev2) \
1537 TPV_Q_X(PCI_VENDOR_ID_IBM, __bid1, __bid2, \
1538 __bv1, __bv2, TPID(__eid1, __eid2), \
1539 __ev1, __ev2), \
1540 TPV_Q_X(PCI_VENDOR_ID_IBM, __bid1, __bid2, \
1541 __bv1, __bv2, TPACPI_MATCH_UNKNOWN, \
1542 __ev1, __ev2)
1543
1544 #define TPV_QL0(__id1, __id2, __bv1, __bv2) \
1545 TPV_Q(PCI_VENDOR_ID_LENOVO, __id1, __id2, __bv1, __bv2)
1546
1547 #define TPV_QL1(__id1, __id2, __bv1, __bv2, __ev1, __ev2) \
1548 TPV_Q_X(PCI_VENDOR_ID_LENOVO, __id1, __id2, \
1549 __bv1, __bv2, TPID(__id1, __id2), \
1550 __ev1, __ev2)
1551
1552 #define TPV_QL2(__bid1, __bid2, __bv1, __bv2, \
1553 __eid1, __eid2, __ev1, __ev2) \
1554 TPV_Q_X(PCI_VENDOR_ID_LENOVO, __bid1, __bid2, \
1555 __bv1, __bv2, TPID(__eid1, __eid2), \
1556 __ev1, __ev2)
1557
1558 static const struct tpacpi_quirk tpacpi_bios_version_qtable[] __initconst = {
1559
1560
1561 TPV_QI0('I', 'M', '6', '5'),
1562 TPV_QI0('I', 'U', '2', '6'),
1563 TPV_QI0('I', 'B', '5', '4'),
1564 TPV_QI0('I', 'H', '4', '7'),
1565 TPV_QI0('I', 'N', '3', '6'),
1566 TPV_QI0('I', 'T', '5', '5'),
1567 TPV_QI0('I', 'D', '4', '8'),
1568 TPV_QI0('I', 'I', '4', '2'),
1569 TPV_QI0('I', 'O', '2', '3'),
1570
1571
1572
1573 TPV_QI0('I', 'W', '5', '9'),
1574 TPV_QI0('I', 'V', '6', '9'),
1575 TPV_QI0('1', '0', '2', '6'),
1576 TPV_QI0('K', 'U', '3', '6'),
1577 TPV_QI0('K', 'X', '3', '6'),
1578 TPV_QI0('K', 'Y', '3', '8'),
1579 TPV_QI0('1', 'B', '1', '7'),
1580 TPV_QI0('1', '3', '2', '0'),
1581 TPV_QI0('1', 'E', '7', '3'),
1582 TPV_QI1('1', 'G', '4', '1', '1', '7'),
1583 TPV_QI1('1', 'N', '1', '6', '0', '7'),
1584
1585
1586
1587 TPV_QI0('1', 'T', 'A', '6'),
1588 TPV_QI0('1', 'X', '5', '7'),
1589
1590
1591
1592 TPV_QI0('1', 'C', 'F', '0'),
1593 TPV_QI0('1', 'F', 'F', '1'),
1594 TPV_QI0('1', 'M', '9', '7'),
1595 TPV_QI0('1', 'O', '6', '1'),
1596 TPV_QI0('1', 'P', '6', '5'),
1597 TPV_QI0('1', 'S', '7', '0'),
1598 TPV_QI1('1', 'R', 'D', 'R', '7', '1'),
1599
1600 TPV_QI1('1', 'V', '7', '1', '2', '8'),
1601 TPV_QI1('7', '8', '7', '1', '0', '6'),
1602 TPV_QI1('7', '6', '6', '9', '1', '6'),
1603 TPV_QI1('7', '0', '6', '9', '2', '8'),
1604
1605 TPV_QI0('I', 'Y', '6', '1'),
1606 TPV_QI0('K', 'Z', '3', '4'),
1607 TPV_QI0('1', '6', '3', '2'),
1608 TPV_QI1('1', 'A', '6', '4', '2', '3'),
1609 TPV_QI1('1', 'I', '7', '1', '2', '0'),
1610 TPV_QI1('1', 'Y', '6', '5', '2', '9'),
1611
1612 TPV_QL1('7', '9', 'E', '3', '5', '0'),
1613 TPV_QL1('7', 'C', 'D', '2', '2', '2'),
1614 TPV_QL1('7', 'E', 'D', '0', '1', '5'),
1615
1616
1617 TPV_QI2('1', 'W', '9', '0', '1', 'V', '2', '8'),
1618 TPV_QL2('7', 'I', '3', '4', '7', '9', '5', '0'),
1619
1620
1621
1622 TPV_QI0('I', 'Z', '9', 'D'),
1623 TPV_QI0('1', 'D', '7', '0'),
1624 TPV_QI1('1', 'K', '4', '8', '1', '8'),
1625 TPV_QI1('1', 'Q', '9', '7', '2', '3'),
1626 TPV_QI1('1', 'U', 'D', '3', 'B', '2'),
1627 TPV_QI1('7', '4', '6', '4', '2', '7'),
1628 TPV_QI1('7', '5', '6', '0', '2', '0'),
1629
1630 TPV_QL1('7', 'B', 'D', '7', '4', '0'),
1631 TPV_QL1('7', 'J', '3', '0', '1', '3'),
1632
1633
1634
1635 };
1636
1637 #undef TPV_QL1
1638 #undef TPV_QL0
1639 #undef TPV_QI2
1640 #undef TPV_QI1
1641 #undef TPV_QI0
1642 #undef TPV_Q_X
1643 #undef TPV_Q
1644
1645 static void __init tpacpi_check_outdated_fw(void)
1646 {
1647 unsigned long fwvers;
1648 u16 ec_version, bios_version;
1649
1650 fwvers = tpacpi_check_quirks(tpacpi_bios_version_qtable,
1651 ARRAY_SIZE(tpacpi_bios_version_qtable));
1652
1653 if (!fwvers)
1654 return;
1655
1656 bios_version = fwvers & 0xffffU;
1657 ec_version = (fwvers >> 16) & 0xffffU;
1658
1659
1660 if ((bios_version > thinkpad_id.bios_release) ||
1661 (ec_version > thinkpad_id.ec_release &&
1662 ec_version != TPACPI_MATCH_ANY_VERSION)) {
1663
1664
1665
1666
1667
1668
1669
1670 pr_warn("WARNING: Outdated ThinkPad BIOS/EC firmware\n");
1671 pr_warn("WARNING: This firmware may be missing critical bug fixes and/or important features\n");
1672 }
1673 }
1674
1675 static bool __init tpacpi_is_fw_known(void)
1676 {
1677 return tpacpi_check_quirks(tpacpi_bios_version_qtable,
1678 ARRAY_SIZE(tpacpi_bios_version_qtable)) != 0;
1679 }
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693 static int thinkpad_acpi_driver_read(struct seq_file *m)
1694 {
1695 seq_printf(m, "driver:\t\t%s\n", TPACPI_DESC);
1696 seq_printf(m, "version:\t%s\n", TPACPI_VERSION);
1697 return 0;
1698 }
1699
1700 static struct ibm_struct thinkpad_acpi_driver_data = {
1701 .name = "driver",
1702 .read = thinkpad_acpi_driver_read,
1703 };
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730 enum {
1731 TP_ACPI_HOTKEYSCAN_FNF1 = 0,
1732 TP_ACPI_HOTKEYSCAN_FNF2,
1733 TP_ACPI_HOTKEYSCAN_FNF3,
1734 TP_ACPI_HOTKEYSCAN_FNF4,
1735 TP_ACPI_HOTKEYSCAN_FNF5,
1736 TP_ACPI_HOTKEYSCAN_FNF6,
1737 TP_ACPI_HOTKEYSCAN_FNF7,
1738 TP_ACPI_HOTKEYSCAN_FNF8,
1739 TP_ACPI_HOTKEYSCAN_FNF9,
1740 TP_ACPI_HOTKEYSCAN_FNF10,
1741 TP_ACPI_HOTKEYSCAN_FNF11,
1742 TP_ACPI_HOTKEYSCAN_FNF12,
1743 TP_ACPI_HOTKEYSCAN_FNBACKSPACE,
1744 TP_ACPI_HOTKEYSCAN_FNINSERT,
1745 TP_ACPI_HOTKEYSCAN_FNDELETE,
1746 TP_ACPI_HOTKEYSCAN_FNHOME,
1747 TP_ACPI_HOTKEYSCAN_FNEND,
1748 TP_ACPI_HOTKEYSCAN_FNPAGEUP,
1749 TP_ACPI_HOTKEYSCAN_FNPAGEDOWN,
1750 TP_ACPI_HOTKEYSCAN_FNSPACE,
1751 TP_ACPI_HOTKEYSCAN_VOLUMEUP,
1752 TP_ACPI_HOTKEYSCAN_VOLUMEDOWN,
1753 TP_ACPI_HOTKEYSCAN_MUTE,
1754 TP_ACPI_HOTKEYSCAN_THINKPAD,
1755 TP_ACPI_HOTKEYSCAN_UNK1,
1756 TP_ACPI_HOTKEYSCAN_UNK2,
1757 TP_ACPI_HOTKEYSCAN_UNK3,
1758 TP_ACPI_HOTKEYSCAN_UNK4,
1759 TP_ACPI_HOTKEYSCAN_UNK5,
1760 TP_ACPI_HOTKEYSCAN_UNK6,
1761 TP_ACPI_HOTKEYSCAN_UNK7,
1762 TP_ACPI_HOTKEYSCAN_UNK8,
1763
1764
1765 TP_ACPI_HOTKEYSCAN_ADAPTIVE_START,
1766 TP_ACPI_HOTKEYSCAN_MUTE2 = TP_ACPI_HOTKEYSCAN_ADAPTIVE_START,
1767 TP_ACPI_HOTKEYSCAN_BRIGHTNESS_ZERO,
1768 TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL,
1769 TP_ACPI_HOTKEYSCAN_CLOUD,
1770 TP_ACPI_HOTKEYSCAN_UNK9,
1771 TP_ACPI_HOTKEYSCAN_VOICE,
1772 TP_ACPI_HOTKEYSCAN_UNK10,
1773 TP_ACPI_HOTKEYSCAN_GESTURES,
1774 TP_ACPI_HOTKEYSCAN_UNK11,
1775 TP_ACPI_HOTKEYSCAN_UNK12,
1776 TP_ACPI_HOTKEYSCAN_UNK13,
1777 TP_ACPI_HOTKEYSCAN_CONFIG,
1778 TP_ACPI_HOTKEYSCAN_NEW_TAB,
1779 TP_ACPI_HOTKEYSCAN_RELOAD,
1780 TP_ACPI_HOTKEYSCAN_BACK,
1781 TP_ACPI_HOTKEYSCAN_MIC_DOWN,
1782 TP_ACPI_HOTKEYSCAN_MIC_UP,
1783 TP_ACPI_HOTKEYSCAN_MIC_CANCELLATION,
1784 TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
1785 TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY,
1786
1787
1788 TP_ACPI_HOTKEYSCAN_EXTENDED_START,
1789
1790 TP_ACPI_HOTKEYSCAN_STAR = 69,
1791 TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL2,
1792 TP_ACPI_HOTKEYSCAN_CALCULATOR,
1793 TP_ACPI_HOTKEYSCAN_BLUETOOTH,
1794 TP_ACPI_HOTKEYSCAN_KEYBOARD,
1795 TP_ACPI_HOTKEYSCAN_FN_RIGHT_SHIFT,
1796 TP_ACPI_HOTKEYSCAN_NOTIFICATION_CENTER,
1797 TP_ACPI_HOTKEYSCAN_PICKUP_PHONE,
1798 TP_ACPI_HOTKEYSCAN_HANGUP_PHONE,
1799
1800
1801 TPACPI_HOTKEY_MAP_LEN
1802 };
1803
1804 enum {
1805 TPACPI_HKEY_NVRAM_KNOWN_MASK = 0x00fb88c0U,
1806 TPACPI_HKEY_NVRAM_GOOD_MASK = 0x00fb8000U,
1807 };
1808
1809 enum {
1810 TP_ACPI_HKEY_DISPSWTCH_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNF7,
1811 TP_ACPI_HKEY_DISPXPAND_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNF8,
1812 TP_ACPI_HKEY_HIBERNATE_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNF12,
1813 TP_ACPI_HKEY_BRGHTUP_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNHOME,
1814 TP_ACPI_HKEY_BRGHTDWN_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNEND,
1815 TP_ACPI_HKEY_KBD_LIGHT_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNPAGEUP,
1816 TP_ACPI_HKEY_ZOOM_MASK = 1 << TP_ACPI_HOTKEYSCAN_FNSPACE,
1817 TP_ACPI_HKEY_VOLUP_MASK = 1 << TP_ACPI_HOTKEYSCAN_VOLUMEUP,
1818 TP_ACPI_HKEY_VOLDWN_MASK = 1 << TP_ACPI_HOTKEYSCAN_VOLUMEDOWN,
1819 TP_ACPI_HKEY_MUTE_MASK = 1 << TP_ACPI_HOTKEYSCAN_MUTE,
1820 TP_ACPI_HKEY_THINKPAD_MASK = 1 << TP_ACPI_HOTKEYSCAN_THINKPAD,
1821 };
1822
1823 enum {
1824 TP_NVRAM_HKEY_GROUP_HK2 = TP_ACPI_HKEY_THINKPAD_MASK |
1825 TP_ACPI_HKEY_ZOOM_MASK |
1826 TP_ACPI_HKEY_DISPSWTCH_MASK |
1827 TP_ACPI_HKEY_HIBERNATE_MASK,
1828 TP_NVRAM_HKEY_GROUP_BRIGHTNESS = TP_ACPI_HKEY_BRGHTUP_MASK |
1829 TP_ACPI_HKEY_BRGHTDWN_MASK,
1830 TP_NVRAM_HKEY_GROUP_VOLUME = TP_ACPI_HKEY_VOLUP_MASK |
1831 TP_ACPI_HKEY_VOLDWN_MASK |
1832 TP_ACPI_HKEY_MUTE_MASK,
1833 };
1834
1835 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
1836 struct tp_nvram_state {
1837 u16 thinkpad_toggle:1;
1838 u16 zoom_toggle:1;
1839 u16 display_toggle:1;
1840 u16 thinklight_toggle:1;
1841 u16 hibernate_toggle:1;
1842 u16 displayexp_toggle:1;
1843 u16 display_state:1;
1844 u16 brightness_toggle:1;
1845 u16 volume_toggle:1;
1846 u16 mute:1;
1847
1848 u8 brightness_level;
1849 u8 volume_level;
1850 };
1851
1852
1853 static struct task_struct *tpacpi_hotkey_task;
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864 static struct mutex hotkey_thread_data_mutex;
1865 static unsigned int hotkey_config_change;
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877 static u32 hotkey_source_mask;
1878 static unsigned int hotkey_poll_freq = 10;
1879
1880 #define HOTKEY_CONFIG_CRITICAL_START \
1881 do { \
1882 mutex_lock(&hotkey_thread_data_mutex); \
1883 hotkey_config_change++; \
1884 } while (0);
1885 #define HOTKEY_CONFIG_CRITICAL_END \
1886 mutex_unlock(&hotkey_thread_data_mutex);
1887
1888 #else
1889
1890 #define hotkey_source_mask 0U
1891 #define HOTKEY_CONFIG_CRITICAL_START
1892 #define HOTKEY_CONFIG_CRITICAL_END
1893
1894 #endif
1895
1896 static struct mutex hotkey_mutex;
1897
1898 static enum {
1899 TP_ACPI_WAKEUP_NONE = 0,
1900 TP_ACPI_WAKEUP_BAYEJ,
1901 TP_ACPI_WAKEUP_UNDOCK,
1902 } hotkey_wakeup_reason;
1903
1904 static int hotkey_autosleep_ack;
1905
1906 static u32 hotkey_orig_mask;
1907 static u32 hotkey_all_mask;
1908 static u32 hotkey_adaptive_all_mask;
1909 static u32 hotkey_reserved_mask;
1910 static u32 hotkey_driver_mask;
1911 static u32 hotkey_user_mask;
1912 static u32 hotkey_acpi_mask;
1913
1914 static u16 *hotkey_keycode_map;
1915
1916 static void tpacpi_driver_event(const unsigned int hkey_event);
1917 static void hotkey_driver_event(const unsigned int scancode);
1918 static void hotkey_poll_setup(const bool may_warn);
1919
1920
1921 #define TP_HOTKEY_TABLET_MASK (1 << 3)
1922 enum {
1923 TP_ACPI_MULTI_MODE_INVALID = 0,
1924 TP_ACPI_MULTI_MODE_UNKNOWN = 1 << 0,
1925 TP_ACPI_MULTI_MODE_LAPTOP = 1 << 1,
1926 TP_ACPI_MULTI_MODE_TABLET = 1 << 2,
1927 TP_ACPI_MULTI_MODE_FLAT = 1 << 3,
1928 TP_ACPI_MULTI_MODE_STAND = 1 << 4,
1929 TP_ACPI_MULTI_MODE_TENT = 1 << 5,
1930 TP_ACPI_MULTI_MODE_STAND_TENT = 1 << 6,
1931 };
1932
1933 enum {
1934
1935
1936
1937
1938
1939 TP_ACPI_MULTI_MODE_TABLET_LIKE = TP_ACPI_MULTI_MODE_TABLET |
1940 TP_ACPI_MULTI_MODE_STAND |
1941 TP_ACPI_MULTI_MODE_TENT |
1942 TP_ACPI_MULTI_MODE_STAND_TENT,
1943 };
1944
1945 static int hotkey_get_wlsw(void)
1946 {
1947 int status;
1948
1949 if (!tp_features.hotkey_wlsw)
1950 return -ENODEV;
1951
1952 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
1953 if (dbg_wlswemul)
1954 return (tpacpi_wlsw_emulstate) ?
1955 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
1956 #endif
1957
1958 if (!acpi_evalf(hkey_handle, &status, "WLSW", "d"))
1959 return -EIO;
1960
1961 return (status) ? TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
1962 }
1963
1964 static int hotkey_gmms_get_tablet_mode(int s, int *has_tablet_mode)
1965 {
1966 int type = (s >> 16) & 0xffff;
1967 int value = s & 0xffff;
1968 int mode = TP_ACPI_MULTI_MODE_INVALID;
1969 int valid_modes = 0;
1970
1971 if (has_tablet_mode)
1972 *has_tablet_mode = 0;
1973
1974 switch (type) {
1975 case 1:
1976 valid_modes = TP_ACPI_MULTI_MODE_LAPTOP |
1977 TP_ACPI_MULTI_MODE_TABLET |
1978 TP_ACPI_MULTI_MODE_STAND_TENT;
1979 break;
1980 case 2:
1981 valid_modes = TP_ACPI_MULTI_MODE_LAPTOP |
1982 TP_ACPI_MULTI_MODE_FLAT |
1983 TP_ACPI_MULTI_MODE_TABLET |
1984 TP_ACPI_MULTI_MODE_STAND |
1985 TP_ACPI_MULTI_MODE_TENT;
1986 break;
1987 case 3:
1988 valid_modes = TP_ACPI_MULTI_MODE_LAPTOP |
1989 TP_ACPI_MULTI_MODE_FLAT;
1990 break;
1991 case 4:
1992 case 5:
1993
1994
1995
1996 valid_modes = TP_ACPI_MULTI_MODE_LAPTOP |
1997 TP_ACPI_MULTI_MODE_FLAT |
1998 TP_ACPI_MULTI_MODE_TABLET |
1999 TP_ACPI_MULTI_MODE_STAND |
2000 TP_ACPI_MULTI_MODE_TENT;
2001 break;
2002 default:
2003 pr_err("Unknown multi mode status type %d with value 0x%04X, please report this to %s\n",
2004 type, value, TPACPI_MAIL);
2005 return 0;
2006 }
2007
2008 if (has_tablet_mode && (valid_modes & TP_ACPI_MULTI_MODE_TABLET_LIKE))
2009 *has_tablet_mode = 1;
2010
2011 switch (value) {
2012 case 1:
2013 mode = TP_ACPI_MULTI_MODE_LAPTOP;
2014 break;
2015 case 2:
2016 mode = TP_ACPI_MULTI_MODE_FLAT;
2017 break;
2018 case 3:
2019 mode = TP_ACPI_MULTI_MODE_TABLET;
2020 break;
2021 case 4:
2022 if (type == 1)
2023 mode = TP_ACPI_MULTI_MODE_STAND_TENT;
2024 else
2025 mode = TP_ACPI_MULTI_MODE_STAND;
2026 break;
2027 case 5:
2028 mode = TP_ACPI_MULTI_MODE_TENT;
2029 break;
2030 default:
2031 if (type == 5 && value == 0xffff) {
2032 pr_warn("Multi mode status is undetected, assuming laptop\n");
2033 return 0;
2034 }
2035 }
2036
2037 if (!(mode & valid_modes)) {
2038 pr_err("Unknown/reserved multi mode value 0x%04X for type %d, please report this to %s\n",
2039 value, type, TPACPI_MAIL);
2040 return 0;
2041 }
2042
2043 return !!(mode & TP_ACPI_MULTI_MODE_TABLET_LIKE);
2044 }
2045
2046 static int hotkey_get_tablet_mode(int *status)
2047 {
2048 int s;
2049
2050 switch (tp_features.hotkey_tablet) {
2051 case TP_HOTKEY_TABLET_USES_MHKG:
2052 if (!acpi_evalf(hkey_handle, &s, "MHKG", "d"))
2053 return -EIO;
2054
2055 *status = ((s & TP_HOTKEY_TABLET_MASK) != 0);
2056 break;
2057 case TP_HOTKEY_TABLET_USES_GMMS:
2058 if (!acpi_evalf(hkey_handle, &s, "GMMS", "dd", 0))
2059 return -EIO;
2060
2061 *status = hotkey_gmms_get_tablet_mode(s, NULL);
2062 break;
2063 default:
2064 break;
2065 }
2066
2067 return 0;
2068 }
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078 static int hotkey_mask_get(void)
2079 {
2080 if (tp_features.hotkey_mask) {
2081 u32 m = 0;
2082
2083 if (!acpi_evalf(hkey_handle, &m, "DHKN", "d"))
2084 return -EIO;
2085
2086 hotkey_acpi_mask = m;
2087 } else {
2088
2089 hotkey_acpi_mask = hotkey_all_mask;
2090 }
2091
2092
2093 hotkey_user_mask &= (hotkey_acpi_mask | hotkey_source_mask);
2094
2095 return 0;
2096 }
2097
2098 static void hotkey_mask_warn_incomplete_mask(void)
2099 {
2100
2101 const u32 wantedmask = hotkey_driver_mask &
2102 ~(hotkey_acpi_mask | hotkey_source_mask) &
2103 (hotkey_all_mask | TPACPI_HKEY_NVRAM_KNOWN_MASK);
2104
2105 if (wantedmask)
2106 pr_notice("required events 0x%08x not enabled!\n", wantedmask);
2107 }
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118 static int hotkey_mask_set(u32 mask)
2119 {
2120 int i;
2121 int rc = 0;
2122
2123 const u32 fwmask = mask & ~hotkey_source_mask;
2124
2125 if (tp_features.hotkey_mask) {
2126 for (i = 0; i < 32; i++) {
2127 if (!acpi_evalf(hkey_handle,
2128 NULL, "MHKM", "vdd", i + 1,
2129 !!(mask & (1 << i)))) {
2130 rc = -EIO;
2131 break;
2132 }
2133 }
2134 }
2135
2136
2137
2138
2139
2140
2141
2142
2143 if (!hotkey_mask_get() && !rc && (fwmask & ~hotkey_acpi_mask)) {
2144 pr_notice("asked for hotkey mask 0x%08x, but firmware forced it to 0x%08x\n",
2145 fwmask, hotkey_acpi_mask);
2146 }
2147
2148 if (tpacpi_lifecycle != TPACPI_LIFE_EXITING)
2149 hotkey_mask_warn_incomplete_mask();
2150
2151 return rc;
2152 }
2153
2154
2155
2156
2157
2158
2159 static int hotkey_user_mask_set(const u32 mask)
2160 {
2161 int rc;
2162
2163
2164
2165 if (!tp_warned.hotkey_mask_ff &&
2166 (mask == 0xffff || mask == 0xffffff ||
2167 mask == 0xffffffff)) {
2168 tp_warned.hotkey_mask_ff = 1;
2169 pr_notice("setting the hotkey mask to 0x%08x is likely not the best way to go about it\n",
2170 mask);
2171 pr_notice("please consider using the driver defaults, and refer to up-to-date thinkpad-acpi documentation\n");
2172 }
2173
2174
2175
2176 rc = hotkey_mask_set((mask | hotkey_driver_mask) & ~hotkey_source_mask);
2177
2178
2179 hotkey_user_mask = mask & (hotkey_acpi_mask | hotkey_source_mask);
2180
2181 return rc;
2182 }
2183
2184
2185
2186
2187
2188
2189 static int tpacpi_hotkey_driver_mask_set(const u32 mask)
2190 {
2191 int rc;
2192
2193
2194 if (!tp_features.hotkey) {
2195 hotkey_driver_mask = mask;
2196 return 0;
2197 }
2198
2199 mutex_lock(&hotkey_mutex);
2200
2201 HOTKEY_CONFIG_CRITICAL_START
2202 hotkey_driver_mask = mask;
2203 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
2204 hotkey_source_mask |= (mask & ~hotkey_all_mask);
2205 #endif
2206 HOTKEY_CONFIG_CRITICAL_END
2207
2208 rc = hotkey_mask_set((hotkey_acpi_mask | hotkey_driver_mask) &
2209 ~hotkey_source_mask);
2210 hotkey_poll_setup(true);
2211
2212 mutex_unlock(&hotkey_mutex);
2213
2214 return rc;
2215 }
2216
2217 static int hotkey_status_get(int *status)
2218 {
2219 if (!acpi_evalf(hkey_handle, status, "DHKC", "d"))
2220 return -EIO;
2221
2222 return 0;
2223 }
2224
2225 static int hotkey_status_set(bool enable)
2226 {
2227 if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", enable ? 1 : 0))
2228 return -EIO;
2229
2230 return 0;
2231 }
2232
2233 static void tpacpi_input_send_tabletsw(void)
2234 {
2235 int state;
2236
2237 if (tp_features.hotkey_tablet &&
2238 !hotkey_get_tablet_mode(&state)) {
2239 mutex_lock(&tpacpi_inputdev_send_mutex);
2240
2241 input_report_switch(tpacpi_inputdev,
2242 SW_TABLET_MODE, !!state);
2243 input_sync(tpacpi_inputdev);
2244
2245 mutex_unlock(&tpacpi_inputdev_send_mutex);
2246 }
2247 }
2248
2249
2250 static void tpacpi_input_send_key(const unsigned int scancode)
2251 {
2252 const unsigned int keycode = hotkey_keycode_map[scancode];
2253
2254 if (keycode != KEY_RESERVED) {
2255 mutex_lock(&tpacpi_inputdev_send_mutex);
2256
2257 input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
2258 input_report_key(tpacpi_inputdev, keycode, 1);
2259 input_sync(tpacpi_inputdev);
2260
2261 input_event(tpacpi_inputdev, EV_MSC, MSC_SCAN, scancode);
2262 input_report_key(tpacpi_inputdev, keycode, 0);
2263 input_sync(tpacpi_inputdev);
2264
2265 mutex_unlock(&tpacpi_inputdev_send_mutex);
2266 }
2267 }
2268
2269
2270 static void tpacpi_input_send_key_masked(const unsigned int scancode)
2271 {
2272 hotkey_driver_event(scancode);
2273 if (hotkey_user_mask & (1 << scancode))
2274 tpacpi_input_send_key(scancode);
2275 }
2276
2277 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
2278 static struct tp_acpi_drv_struct ibm_hotkey_acpidriver;
2279
2280
2281 static void tpacpi_hotkey_send_key(unsigned int scancode)
2282 {
2283 tpacpi_input_send_key_masked(scancode);
2284 }
2285
2286 static void hotkey_read_nvram(struct tp_nvram_state *n, const u32 m)
2287 {
2288 u8 d;
2289
2290 if (m & TP_NVRAM_HKEY_GROUP_HK2) {
2291 d = nvram_read_byte(TP_NVRAM_ADDR_HK2);
2292 n->thinkpad_toggle = !!(d & TP_NVRAM_MASK_HKT_THINKPAD);
2293 n->zoom_toggle = !!(d & TP_NVRAM_MASK_HKT_ZOOM);
2294 n->display_toggle = !!(d & TP_NVRAM_MASK_HKT_DISPLAY);
2295 n->hibernate_toggle = !!(d & TP_NVRAM_MASK_HKT_HIBERNATE);
2296 }
2297 if (m & TP_ACPI_HKEY_KBD_LIGHT_MASK) {
2298 d = nvram_read_byte(TP_NVRAM_ADDR_THINKLIGHT);
2299 n->thinklight_toggle = !!(d & TP_NVRAM_MASK_THINKLIGHT);
2300 }
2301 if (m & TP_ACPI_HKEY_DISPXPAND_MASK) {
2302 d = nvram_read_byte(TP_NVRAM_ADDR_VIDEO);
2303 n->displayexp_toggle =
2304 !!(d & TP_NVRAM_MASK_HKT_DISPEXPND);
2305 }
2306 if (m & TP_NVRAM_HKEY_GROUP_BRIGHTNESS) {
2307 d = nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
2308 n->brightness_level = (d & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
2309 >> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
2310 n->brightness_toggle =
2311 !!(d & TP_NVRAM_MASK_HKT_BRIGHTNESS);
2312 }
2313 if (m & TP_NVRAM_HKEY_GROUP_VOLUME) {
2314 d = nvram_read_byte(TP_NVRAM_ADDR_MIXER);
2315 n->volume_level = (d & TP_NVRAM_MASK_LEVEL_VOLUME)
2316 >> TP_NVRAM_POS_LEVEL_VOLUME;
2317 n->mute = !!(d & TP_NVRAM_MASK_MUTE);
2318 n->volume_toggle = !!(d & TP_NVRAM_MASK_HKT_VOLUME);
2319 }
2320 }
2321
2322 #define TPACPI_COMPARE_KEY(__scancode, __member) \
2323 do { \
2324 if ((event_mask & (1 << __scancode)) && \
2325 oldn->__member != newn->__member) \
2326 tpacpi_hotkey_send_key(__scancode); \
2327 } while (0)
2328
2329 #define TPACPI_MAY_SEND_KEY(__scancode) \
2330 do { \
2331 if (event_mask & (1 << __scancode)) \
2332 tpacpi_hotkey_send_key(__scancode); \
2333 } while (0)
2334
2335 static void issue_volchange(const unsigned int oldvol,
2336 const unsigned int newvol,
2337 const u32 event_mask)
2338 {
2339 unsigned int i = oldvol;
2340
2341 while (i > newvol) {
2342 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_VOLUMEDOWN);
2343 i--;
2344 }
2345 while (i < newvol) {
2346 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_VOLUMEUP);
2347 i++;
2348 }
2349 }
2350
2351 static void issue_brightnesschange(const unsigned int oldbrt,
2352 const unsigned int newbrt,
2353 const u32 event_mask)
2354 {
2355 unsigned int i = oldbrt;
2356
2357 while (i > newbrt) {
2358 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_FNEND);
2359 i--;
2360 }
2361 while (i < newbrt) {
2362 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_FNHOME);
2363 i++;
2364 }
2365 }
2366
2367 static void hotkey_compare_and_issue_event(struct tp_nvram_state *oldn,
2368 struct tp_nvram_state *newn,
2369 const u32 event_mask)
2370 {
2371
2372 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_THINKPAD, thinkpad_toggle);
2373 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_FNSPACE, zoom_toggle);
2374 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_FNF7, display_toggle);
2375 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_FNF12, hibernate_toggle);
2376
2377 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_FNPAGEUP, thinklight_toggle);
2378
2379 TPACPI_COMPARE_KEY(TP_ACPI_HOTKEYSCAN_FNF8, displayexp_toggle);
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398 if (newn->mute) {
2399
2400 if (!oldn->mute ||
2401 oldn->volume_toggle != newn->volume_toggle ||
2402 oldn->volume_level != newn->volume_level) {
2403
2404
2405 issue_volchange(oldn->volume_level, newn->volume_level,
2406 event_mask);
2407 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_MUTE);
2408 }
2409 } else {
2410
2411 if (oldn->mute) {
2412
2413 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_VOLUMEUP);
2414 }
2415 if (oldn->volume_level != newn->volume_level) {
2416 issue_volchange(oldn->volume_level, newn->volume_level,
2417 event_mask);
2418 } else if (oldn->volume_toggle != newn->volume_toggle) {
2419
2420 if (newn->volume_level == 0)
2421 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_VOLUMEDOWN);
2422 else if (newn->volume_level >= TP_NVRAM_LEVEL_VOLUME_MAX)
2423 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_VOLUMEUP);
2424 }
2425 }
2426
2427
2428 if (oldn->brightness_level != newn->brightness_level) {
2429 issue_brightnesschange(oldn->brightness_level,
2430 newn->brightness_level, event_mask);
2431 } else if (oldn->brightness_toggle != newn->brightness_toggle) {
2432
2433 if (newn->brightness_level == 0)
2434 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_FNEND);
2435 else if (newn->brightness_level >= bright_maxlvl
2436 && !tp_features.bright_unkfw)
2437 TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_FNHOME);
2438 }
2439
2440 #undef TPACPI_COMPARE_KEY
2441 #undef TPACPI_MAY_SEND_KEY
2442 }
2443
2444
2445
2446
2447
2448
2449
2450
2451 static int hotkey_kthread(void *data)
2452 {
2453 struct tp_nvram_state s[2] = { 0 };
2454 u32 poll_mask, event_mask;
2455 unsigned int si, so;
2456 unsigned long t;
2457 unsigned int change_detector;
2458 unsigned int poll_freq;
2459 bool was_frozen;
2460
2461 if (tpacpi_lifecycle == TPACPI_LIFE_EXITING)
2462 goto exit;
2463
2464 set_freezable();
2465
2466 so = 0;
2467 si = 1;
2468 t = 0;
2469
2470
2471 mutex_lock(&hotkey_thread_data_mutex);
2472 change_detector = hotkey_config_change;
2473 poll_mask = hotkey_source_mask;
2474 event_mask = hotkey_source_mask &
2475 (hotkey_driver_mask | hotkey_user_mask);
2476 poll_freq = hotkey_poll_freq;
2477 mutex_unlock(&hotkey_thread_data_mutex);
2478 hotkey_read_nvram(&s[so], poll_mask);
2479
2480 while (!kthread_should_stop()) {
2481 if (t == 0) {
2482 if (likely(poll_freq))
2483 t = 1000/poll_freq;
2484 else
2485 t = 100;
2486 }
2487 t = msleep_interruptible(t);
2488 if (unlikely(kthread_freezable_should_stop(&was_frozen)))
2489 break;
2490
2491 if (t > 0 && !was_frozen)
2492 continue;
2493
2494 mutex_lock(&hotkey_thread_data_mutex);
2495 if (was_frozen || hotkey_config_change != change_detector) {
2496
2497 si = so;
2498 t = 0;
2499 change_detector = hotkey_config_change;
2500 }
2501 poll_mask = hotkey_source_mask;
2502 event_mask = hotkey_source_mask &
2503 (hotkey_driver_mask | hotkey_user_mask);
2504 poll_freq = hotkey_poll_freq;
2505 mutex_unlock(&hotkey_thread_data_mutex);
2506
2507 if (likely(poll_mask)) {
2508 hotkey_read_nvram(&s[si], poll_mask);
2509 if (likely(si != so)) {
2510 hotkey_compare_and_issue_event(&s[so], &s[si],
2511 event_mask);
2512 }
2513 }
2514
2515 so = si;
2516 si ^= 1;
2517 }
2518
2519 exit:
2520 return 0;
2521 }
2522
2523
2524 static void hotkey_poll_stop_sync(void)
2525 {
2526 if (tpacpi_hotkey_task) {
2527 kthread_stop(tpacpi_hotkey_task);
2528 tpacpi_hotkey_task = NULL;
2529 }
2530 }
2531
2532
2533 static void hotkey_poll_setup(const bool may_warn)
2534 {
2535 const u32 poll_driver_mask = hotkey_driver_mask & hotkey_source_mask;
2536 const u32 poll_user_mask = hotkey_user_mask & hotkey_source_mask;
2537
2538 if (hotkey_poll_freq > 0 &&
2539 (poll_driver_mask ||
2540 (poll_user_mask && tpacpi_inputdev->users > 0))) {
2541 if (!tpacpi_hotkey_task) {
2542 tpacpi_hotkey_task = kthread_run(hotkey_kthread,
2543 NULL, TPACPI_NVRAM_KTHREAD_NAME);
2544 if (IS_ERR(tpacpi_hotkey_task)) {
2545 tpacpi_hotkey_task = NULL;
2546 pr_err("could not create kernel thread for hotkey polling\n");
2547 }
2548 }
2549 } else {
2550 hotkey_poll_stop_sync();
2551 if (may_warn && (poll_driver_mask || poll_user_mask) &&
2552 hotkey_poll_freq == 0) {
2553 pr_notice("hot keys 0x%08x and/or events 0x%08x require polling, which is currently disabled\n",
2554 poll_user_mask, poll_driver_mask);
2555 }
2556 }
2557 }
2558
2559 static void hotkey_poll_setup_safe(const bool may_warn)
2560 {
2561 mutex_lock(&hotkey_mutex);
2562 hotkey_poll_setup(may_warn);
2563 mutex_unlock(&hotkey_mutex);
2564 }
2565
2566
2567 static void hotkey_poll_set_freq(unsigned int freq)
2568 {
2569 if (!freq)
2570 hotkey_poll_stop_sync();
2571
2572 hotkey_poll_freq = freq;
2573 }
2574
2575 #else
2576
2577 static void hotkey_poll_setup(const bool __unused)
2578 {
2579 }
2580
2581 static void hotkey_poll_setup_safe(const bool __unused)
2582 {
2583 }
2584
2585 #endif
2586
2587 static int hotkey_inputdev_open(struct input_dev *dev)
2588 {
2589 switch (tpacpi_lifecycle) {
2590 case TPACPI_LIFE_INIT:
2591 case TPACPI_LIFE_RUNNING:
2592 hotkey_poll_setup_safe(false);
2593 return 0;
2594 case TPACPI_LIFE_EXITING:
2595 return -EBUSY;
2596 }
2597
2598
2599 BUG();
2600 return -EBUSY;
2601 }
2602
2603 static void hotkey_inputdev_close(struct input_dev *dev)
2604 {
2605
2606 if (tpacpi_lifecycle != TPACPI_LIFE_EXITING &&
2607 !(hotkey_source_mask & hotkey_driver_mask))
2608 hotkey_poll_setup_safe(false);
2609 }
2610
2611
2612 static ssize_t hotkey_enable_show(struct device *dev,
2613 struct device_attribute *attr,
2614 char *buf)
2615 {
2616 int res, status;
2617
2618 printk_deprecated_attribute("hotkey_enable",
2619 "Hotkey reporting is always enabled");
2620
2621 res = hotkey_status_get(&status);
2622 if (res)
2623 return res;
2624
2625 return sysfs_emit(buf, "%d\n", status);
2626 }
2627
2628 static ssize_t hotkey_enable_store(struct device *dev,
2629 struct device_attribute *attr,
2630 const char *buf, size_t count)
2631 {
2632 unsigned long t;
2633
2634 printk_deprecated_attribute("hotkey_enable",
2635 "Hotkeys can be disabled through hotkey_mask");
2636
2637 if (parse_strtoul(buf, 1, &t))
2638 return -EINVAL;
2639
2640 if (t == 0)
2641 return -EPERM;
2642
2643 return count;
2644 }
2645
2646 static DEVICE_ATTR_RW(hotkey_enable);
2647
2648
2649 static ssize_t hotkey_mask_show(struct device *dev,
2650 struct device_attribute *attr,
2651 char *buf)
2652 {
2653 return sysfs_emit(buf, "0x%08x\n", hotkey_user_mask);
2654 }
2655
2656 static ssize_t hotkey_mask_store(struct device *dev,
2657 struct device_attribute *attr,
2658 const char *buf, size_t count)
2659 {
2660 unsigned long t;
2661 int res;
2662
2663 if (parse_strtoul(buf, 0xffffffffUL, &t))
2664 return -EINVAL;
2665
2666 if (mutex_lock_killable(&hotkey_mutex))
2667 return -ERESTARTSYS;
2668
2669 res = hotkey_user_mask_set(t);
2670
2671 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
2672 hotkey_poll_setup(true);
2673 #endif
2674
2675 mutex_unlock(&hotkey_mutex);
2676
2677 tpacpi_disclose_usertask("hotkey_mask", "set to 0x%08lx\n", t);
2678
2679 return (res) ? res : count;
2680 }
2681
2682 static DEVICE_ATTR_RW(hotkey_mask);
2683
2684
2685 static ssize_t hotkey_bios_enabled_show(struct device *dev,
2686 struct device_attribute *attr,
2687 char *buf)
2688 {
2689 return sprintf(buf, "0\n");
2690 }
2691
2692 static DEVICE_ATTR_RO(hotkey_bios_enabled);
2693
2694
2695 static ssize_t hotkey_bios_mask_show(struct device *dev,
2696 struct device_attribute *attr,
2697 char *buf)
2698 {
2699 printk_deprecated_attribute("hotkey_bios_mask",
2700 "This attribute is useless.");
2701 return sysfs_emit(buf, "0x%08x\n", hotkey_orig_mask);
2702 }
2703
2704 static DEVICE_ATTR_RO(hotkey_bios_mask);
2705
2706
2707 static ssize_t hotkey_all_mask_show(struct device *dev,
2708 struct device_attribute *attr,
2709 char *buf)
2710 {
2711 return sysfs_emit(buf, "0x%08x\n",
2712 hotkey_all_mask | hotkey_source_mask);
2713 }
2714
2715 static DEVICE_ATTR_RO(hotkey_all_mask);
2716
2717
2718 static ssize_t hotkey_adaptive_all_mask_show(struct device *dev,
2719 struct device_attribute *attr,
2720 char *buf)
2721 {
2722 return sysfs_emit(buf, "0x%08x\n",
2723 hotkey_adaptive_all_mask | hotkey_source_mask);
2724 }
2725
2726 static DEVICE_ATTR_RO(hotkey_adaptive_all_mask);
2727
2728
2729 static ssize_t hotkey_recommended_mask_show(struct device *dev,
2730 struct device_attribute *attr,
2731 char *buf)
2732 {
2733 return sysfs_emit(buf, "0x%08x\n",
2734 (hotkey_all_mask | hotkey_source_mask)
2735 & ~hotkey_reserved_mask);
2736 }
2737
2738 static DEVICE_ATTR_RO(hotkey_recommended_mask);
2739
2740 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
2741
2742
2743 static ssize_t hotkey_source_mask_show(struct device *dev,
2744 struct device_attribute *attr,
2745 char *buf)
2746 {
2747 return sysfs_emit(buf, "0x%08x\n", hotkey_source_mask);
2748 }
2749
2750 static ssize_t hotkey_source_mask_store(struct device *dev,
2751 struct device_attribute *attr,
2752 const char *buf, size_t count)
2753 {
2754 unsigned long t;
2755 u32 r_ev;
2756 int rc;
2757
2758 if (parse_strtoul(buf, 0xffffffffUL, &t) ||
2759 ((t & ~TPACPI_HKEY_NVRAM_KNOWN_MASK) != 0))
2760 return -EINVAL;
2761
2762 if (mutex_lock_killable(&hotkey_mutex))
2763 return -ERESTARTSYS;
2764
2765 HOTKEY_CONFIG_CRITICAL_START
2766 hotkey_source_mask = t;
2767 HOTKEY_CONFIG_CRITICAL_END
2768
2769 rc = hotkey_mask_set((hotkey_user_mask | hotkey_driver_mask) &
2770 ~hotkey_source_mask);
2771 hotkey_poll_setup(true);
2772
2773
2774 r_ev = hotkey_driver_mask & ~(hotkey_acpi_mask & hotkey_all_mask)
2775 & ~hotkey_source_mask & TPACPI_HKEY_NVRAM_KNOWN_MASK;
2776
2777 mutex_unlock(&hotkey_mutex);
2778
2779 if (rc < 0)
2780 pr_err("hotkey_source_mask: failed to update the firmware event mask!\n");
2781
2782 if (r_ev)
2783 pr_notice("hotkey_source_mask: some important events were disabled: 0x%04x\n",
2784 r_ev);
2785
2786 tpacpi_disclose_usertask("hotkey_source_mask", "set to 0x%08lx\n", t);
2787
2788 return (rc < 0) ? rc : count;
2789 }
2790
2791 static DEVICE_ATTR_RW(hotkey_source_mask);
2792
2793
2794 static ssize_t hotkey_poll_freq_show(struct device *dev,
2795 struct device_attribute *attr,
2796 char *buf)
2797 {
2798 return sysfs_emit(buf, "%d\n", hotkey_poll_freq);
2799 }
2800
2801 static ssize_t hotkey_poll_freq_store(struct device *dev,
2802 struct device_attribute *attr,
2803 const char *buf, size_t count)
2804 {
2805 unsigned long t;
2806
2807 if (parse_strtoul(buf, 25, &t))
2808 return -EINVAL;
2809
2810 if (mutex_lock_killable(&hotkey_mutex))
2811 return -ERESTARTSYS;
2812
2813 hotkey_poll_set_freq(t);
2814 hotkey_poll_setup(true);
2815
2816 mutex_unlock(&hotkey_mutex);
2817
2818 tpacpi_disclose_usertask("hotkey_poll_freq", "set to %lu\n", t);
2819
2820 return count;
2821 }
2822
2823 static DEVICE_ATTR_RW(hotkey_poll_freq);
2824
2825 #endif
2826
2827
2828 static ssize_t hotkey_radio_sw_show(struct device *dev,
2829 struct device_attribute *attr,
2830 char *buf)
2831 {
2832 int res;
2833 res = hotkey_get_wlsw();
2834 if (res < 0)
2835 return res;
2836
2837
2838 tpacpi_rfk_update_hwblock_state((res == TPACPI_RFK_RADIO_OFF));
2839
2840 return sysfs_emit(buf, "%d\n",
2841 (res == TPACPI_RFK_RADIO_OFF) ? 0 : 1);
2842 }
2843
2844 static DEVICE_ATTR_RO(hotkey_radio_sw);
2845
2846 static void hotkey_radio_sw_notify_change(void)
2847 {
2848 if (tp_features.hotkey_wlsw)
2849 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2850 "hotkey_radio_sw");
2851 }
2852
2853
2854 static ssize_t hotkey_tablet_mode_show(struct device *dev,
2855 struct device_attribute *attr,
2856 char *buf)
2857 {
2858 int res, s;
2859 res = hotkey_get_tablet_mode(&s);
2860 if (res < 0)
2861 return res;
2862
2863 return sysfs_emit(buf, "%d\n", !!s);
2864 }
2865
2866 static DEVICE_ATTR_RO(hotkey_tablet_mode);
2867
2868 static void hotkey_tablet_mode_notify_change(void)
2869 {
2870 if (tp_features.hotkey_tablet)
2871 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2872 "hotkey_tablet_mode");
2873 }
2874
2875
2876 static ssize_t hotkey_wakeup_reason_show(struct device *dev,
2877 struct device_attribute *attr,
2878 char *buf)
2879 {
2880 return sysfs_emit(buf, "%d\n", hotkey_wakeup_reason);
2881 }
2882
2883 static DEVICE_ATTR(wakeup_reason, S_IRUGO, hotkey_wakeup_reason_show, NULL);
2884
2885 static void hotkey_wakeup_reason_notify_change(void)
2886 {
2887 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2888 "wakeup_reason");
2889 }
2890
2891
2892 static ssize_t hotkey_wakeup_hotunplug_complete_show(struct device *dev,
2893 struct device_attribute *attr,
2894 char *buf)
2895 {
2896 return sysfs_emit(buf, "%d\n", hotkey_autosleep_ack);
2897 }
2898
2899 static DEVICE_ATTR(wakeup_hotunplug_complete, S_IRUGO,
2900 hotkey_wakeup_hotunplug_complete_show, NULL);
2901
2902 static void hotkey_wakeup_hotunplug_complete_notify_change(void)
2903 {
2904 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2905 "wakeup_hotunplug_complete");
2906 }
2907
2908
2909
2910 static int adaptive_keyboard_get_mode(void);
2911 static int adaptive_keyboard_set_mode(int new_mode);
2912
2913 enum ADAPTIVE_KEY_MODE {
2914 HOME_MODE,
2915 WEB_BROWSER_MODE,
2916 WEB_CONFERENCE_MODE,
2917 FUNCTION_MODE,
2918 LAYFLAT_MODE
2919 };
2920
2921 static ssize_t adaptive_kbd_mode_show(struct device *dev,
2922 struct device_attribute *attr,
2923 char *buf)
2924 {
2925 int current_mode;
2926
2927 current_mode = adaptive_keyboard_get_mode();
2928 if (current_mode < 0)
2929 return current_mode;
2930
2931 return sysfs_emit(buf, "%d\n", current_mode);
2932 }
2933
2934 static ssize_t adaptive_kbd_mode_store(struct device *dev,
2935 struct device_attribute *attr,
2936 const char *buf, size_t count)
2937 {
2938 unsigned long t;
2939 int res;
2940
2941 if (parse_strtoul(buf, LAYFLAT_MODE, &t))
2942 return -EINVAL;
2943
2944 res = adaptive_keyboard_set_mode(t);
2945 return (res < 0) ? res : count;
2946 }
2947
2948 static DEVICE_ATTR_RW(adaptive_kbd_mode);
2949
2950 static struct attribute *adaptive_kbd_attributes[] = {
2951 &dev_attr_adaptive_kbd_mode.attr,
2952 NULL
2953 };
2954
2955 static umode_t hadaptive_kbd_attr_is_visible(struct kobject *kobj,
2956 struct attribute *attr, int n)
2957 {
2958 return tp_features.has_adaptive_kbd ? attr->mode : 0;
2959 }
2960
2961 static const struct attribute_group adaptive_kbd_attr_group = {
2962 .is_visible = hadaptive_kbd_attr_is_visible,
2963 .attrs = adaptive_kbd_attributes,
2964 };
2965
2966
2967
2968 static struct attribute *hotkey_attributes[] = {
2969 &dev_attr_hotkey_enable.attr,
2970 &dev_attr_hotkey_bios_enabled.attr,
2971 &dev_attr_hotkey_bios_mask.attr,
2972 &dev_attr_wakeup_reason.attr,
2973 &dev_attr_wakeup_hotunplug_complete.attr,
2974 &dev_attr_hotkey_mask.attr,
2975 &dev_attr_hotkey_all_mask.attr,
2976 &dev_attr_hotkey_adaptive_all_mask.attr,
2977 &dev_attr_hotkey_recommended_mask.attr,
2978 &dev_attr_hotkey_tablet_mode.attr,
2979 &dev_attr_hotkey_radio_sw.attr,
2980 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
2981 &dev_attr_hotkey_source_mask.attr,
2982 &dev_attr_hotkey_poll_freq.attr,
2983 #endif
2984 NULL
2985 };
2986
2987 static umode_t hotkey_attr_is_visible(struct kobject *kobj,
2988 struct attribute *attr, int n)
2989 {
2990 if (attr == &dev_attr_hotkey_tablet_mode.attr) {
2991 if (!tp_features.hotkey_tablet)
2992 return 0;
2993 } else if (attr == &dev_attr_hotkey_radio_sw.attr) {
2994 if (!tp_features.hotkey_wlsw)
2995 return 0;
2996 }
2997
2998 return attr->mode;
2999 }
3000
3001 static const struct attribute_group hotkey_attr_group = {
3002 .is_visible = hotkey_attr_is_visible,
3003 .attrs = hotkey_attributes,
3004 };
3005
3006
3007
3008
3009 static void tpacpi_send_radiosw_update(void)
3010 {
3011 int wlsw;
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024 wlsw = hotkey_get_wlsw();
3025
3026
3027 if (wlsw == TPACPI_RFK_RADIO_OFF)
3028 tpacpi_rfk_update_hwblock_state(true);
3029
3030
3031 if (wlsw == TPACPI_RFK_RADIO_ON)
3032 tpacpi_rfk_update_hwblock_state(false);
3033
3034
3035 if (!(wlsw < 0)) {
3036 mutex_lock(&tpacpi_inputdev_send_mutex);
3037
3038 input_report_switch(tpacpi_inputdev,
3039 SW_RFKILL_ALL, (wlsw > 0));
3040 input_sync(tpacpi_inputdev);
3041
3042 mutex_unlock(&tpacpi_inputdev_send_mutex);
3043 }
3044
3045
3046
3047
3048
3049 hotkey_radio_sw_notify_change();
3050 }
3051
3052 static void hotkey_exit(void)
3053 {
3054 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
3055 mutex_lock(&hotkey_mutex);
3056 hotkey_poll_stop_sync();
3057 mutex_unlock(&hotkey_mutex);
3058 #endif
3059 dbg_printk(TPACPI_DBG_EXIT | TPACPI_DBG_HKEY,
3060 "restoring original HKEY status and mask\n");
3061
3062
3063 if (((tp_features.hotkey_mask &&
3064 hotkey_mask_set(hotkey_orig_mask)) |
3065 hotkey_status_set(false)) != 0)
3066 pr_err("failed to restore hot key mask to BIOS defaults\n");
3067 }
3068
3069 static void __init hotkey_unmap(const unsigned int scancode)
3070 {
3071 if (hotkey_keycode_map[scancode] != KEY_RESERVED) {
3072 clear_bit(hotkey_keycode_map[scancode],
3073 tpacpi_inputdev->keybit);
3074 hotkey_keycode_map[scancode] = KEY_RESERVED;
3075 }
3076 }
3077
3078
3079
3080
3081
3082
3083 #define TPACPI_HK_Q_INIMASK 0x0001
3084
3085 static const struct tpacpi_quirk tpacpi_hotkey_qtable[] __initconst = {
3086 TPACPI_Q_IBM('I', 'H', TPACPI_HK_Q_INIMASK),
3087 TPACPI_Q_IBM('I', 'N', TPACPI_HK_Q_INIMASK),
3088 TPACPI_Q_IBM('I', 'D', TPACPI_HK_Q_INIMASK),
3089 TPACPI_Q_IBM('I', 'W', TPACPI_HK_Q_INIMASK),
3090 TPACPI_Q_IBM('I', 'V', TPACPI_HK_Q_INIMASK),
3091 TPACPI_Q_IBM('1', '0', TPACPI_HK_Q_INIMASK),
3092 TPACPI_Q_IBM('K', 'U', TPACPI_HK_Q_INIMASK),
3093 TPACPI_Q_IBM('K', 'X', TPACPI_HK_Q_INIMASK),
3094 TPACPI_Q_IBM('K', 'Y', TPACPI_HK_Q_INIMASK),
3095 TPACPI_Q_IBM('1', 'B', TPACPI_HK_Q_INIMASK),
3096 TPACPI_Q_IBM('1', '3', TPACPI_HK_Q_INIMASK),
3097 TPACPI_Q_IBM('1', 'E', TPACPI_HK_Q_INIMASK),
3098 TPACPI_Q_IBM('1', 'C', TPACPI_HK_Q_INIMASK),
3099 TPACPI_Q_IBM('1', 'F', TPACPI_HK_Q_INIMASK),
3100 TPACPI_Q_IBM('I', 'Y', TPACPI_HK_Q_INIMASK),
3101 TPACPI_Q_IBM('K', 'Z', TPACPI_HK_Q_INIMASK),
3102 TPACPI_Q_IBM('1', '6', TPACPI_HK_Q_INIMASK),
3103 TPACPI_Q_IBM('I', 'Z', TPACPI_HK_Q_INIMASK),
3104 TPACPI_Q_IBM('1', 'D', TPACPI_HK_Q_INIMASK),
3105 };
3106
3107 typedef u16 tpacpi_keymap_entry_t;
3108 typedef tpacpi_keymap_entry_t tpacpi_keymap_t[TPACPI_HOTKEY_MAP_LEN];
3109
3110 static int hotkey_init_tablet_mode(void)
3111 {
3112 int in_tablet_mode = 0, res;
3113 char *type = NULL;
3114
3115 if (acpi_evalf(hkey_handle, &res, "GMMS", "qdd", 0)) {
3116 int has_tablet_mode;
3117
3118 in_tablet_mode = hotkey_gmms_get_tablet_mode(res,
3119 &has_tablet_mode);
3120
3121
3122
3123
3124
3125
3126
3127 if (has_tablet_mode && !dual_accel_detect())
3128 tp_features.hotkey_tablet = TP_HOTKEY_TABLET_USES_GMMS;
3129 type = "GMMS";
3130 } else if (acpi_evalf(hkey_handle, &res, "MHKG", "qd")) {
3131
3132 tp_features.hotkey_tablet = TP_HOTKEY_TABLET_USES_MHKG;
3133 in_tablet_mode = !!(res & TP_HOTKEY_TABLET_MASK);
3134 type = "MHKG";
3135 }
3136
3137 if (!tp_features.hotkey_tablet)
3138 return 0;
3139
3140 pr_info("Tablet mode switch found (type: %s), currently in %s mode\n",
3141 type, in_tablet_mode ? "tablet" : "laptop");
3142
3143 return in_tablet_mode;
3144 }
3145
3146 static int __init hotkey_init(struct ibm_init_struct *iibm)
3147 {
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178 enum keymap_index {
3179 TPACPI_KEYMAP_IBM_GENERIC = 0,
3180 TPACPI_KEYMAP_LENOVO_GENERIC,
3181 };
3182
3183 static const tpacpi_keymap_t tpacpi_keymaps[] __initconst = {
3184
3185 [TPACPI_KEYMAP_IBM_GENERIC] = {
3186
3187 KEY_FN_F1, KEY_BATTERY, KEY_COFFEE, KEY_SLEEP,
3188 KEY_WLAN, KEY_FN_F6, KEY_SWITCHVIDEOMODE, KEY_FN_F8,
3189 KEY_FN_F9, KEY_FN_F10, KEY_FN_F11, KEY_SUSPEND,
3190
3191
3192 KEY_UNKNOWN,
3193 KEY_UNKNOWN,
3194 KEY_UNKNOWN,
3195
3196
3197 KEY_RESERVED,
3198 KEY_RESERVED,
3199
3200
3201 KEY_RESERVED,
3202
3203 KEY_UNKNOWN,
3204 KEY_ZOOM,
3205
3206
3207
3208
3209 KEY_RESERVED,
3210 KEY_RESERVED,
3211 KEY_RESERVED,
3212
3213 KEY_VENDOR,
3214
3215
3216 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3217 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3218
3219
3220 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3221 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3222 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3223 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3224 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3225
3226
3227 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3228 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3229 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3230 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3231 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3232 KEY_UNKNOWN, KEY_UNKNOWN
3233
3234 },
3235
3236
3237 [TPACPI_KEYMAP_LENOVO_GENERIC] = {
3238
3239 KEY_FN_F1, KEY_COFFEE, KEY_BATTERY, KEY_SLEEP,
3240 KEY_WLAN, KEY_CAMERA, KEY_SWITCHVIDEOMODE, KEY_FN_F8,
3241 KEY_FN_F9, KEY_FN_F10, KEY_FN_F11, KEY_SUSPEND,
3242
3243
3244 KEY_UNKNOWN,
3245 KEY_UNKNOWN,
3246 KEY_UNKNOWN,
3247
3248
3249
3250
3251 KEY_BRIGHTNESSUP,
3252 KEY_BRIGHTNESSDOWN,
3253
3254 KEY_RESERVED,
3255
3256 KEY_UNKNOWN,
3257 KEY_ZOOM,
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270 KEY_RESERVED,
3271 KEY_RESERVED,
3272 KEY_RESERVED,
3273
3274 KEY_VENDOR,
3275
3276
3277 KEY_UNKNOWN, KEY_UNKNOWN,
3278
3279
3280
3281
3282
3283 KEY_MICMUTE,
3284
3285
3286 KEY_UNKNOWN,
3287
3288
3289 KEY_CONFIG, KEY_SEARCH, KEY_SCALE, KEY_FILE,
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299 KEY_RESERVED,
3300 KEY_BRIGHTNESS_MIN,
3301 KEY_RESERVED,
3302 KEY_RESERVED,
3303 KEY_RESERVED,
3304 KEY_VOICECOMMAND,
3305 KEY_RESERVED,
3306 KEY_RESERVED,
3307 KEY_RESERVED,
3308 KEY_RESERVED,
3309 KEY_RESERVED,
3310 KEY_CONFIG,
3311 KEY_RESERVED,
3312 KEY_REFRESH,
3313 KEY_BACK,
3314 KEY_RESERVED,
3315 KEY_RESERVED,
3316 KEY_RESERVED,
3317 KEY_RESERVED,
3318 KEY_RESERVED,
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3332 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3333 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3334 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3335 KEY_UNKNOWN,
3336
3337 KEY_BOOKMARKS,
3338 KEY_SELECTIVE_SCREENSHOT,
3339 KEY_CALC,
3340 KEY_BLUETOOTH,
3341 KEY_KEYBOARD,
3342 KEY_FN_RIGHT_SHIFT,
3343 KEY_NOTIFICATION_CENTER,
3344 KEY_PICKUP_PHONE,
3345 KEY_HANGUP_PHONE,
3346 },
3347 };
3348
3349 static const struct tpacpi_quirk tpacpi_keymap_qtable[] __initconst = {
3350
3351 {
3352 .vendor = PCI_VENDOR_ID_IBM,
3353 .bios = TPACPI_MATCH_ANY, .ec = TPACPI_MATCH_ANY,
3354 .quirks = TPACPI_KEYMAP_IBM_GENERIC,
3355 },
3356 {
3357 .vendor = PCI_VENDOR_ID_LENOVO,
3358 .bios = TPACPI_MATCH_ANY, .ec = TPACPI_MATCH_ANY,
3359 .quirks = TPACPI_KEYMAP_LENOVO_GENERIC,
3360 },
3361 };
3362
3363 #define TPACPI_HOTKEY_MAP_SIZE sizeof(tpacpi_keymap_t)
3364 #define TPACPI_HOTKEY_MAP_TYPESIZE sizeof(tpacpi_keymap_entry_t)
3365
3366 int res, i;
3367 int status;
3368 int hkeyv;
3369 bool radiosw_state = false;
3370 bool tabletsw_state = false;
3371
3372 unsigned long quirks;
3373 unsigned long keymap_id;
3374
3375 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3376 "initializing hotkey subdriver\n");
3377
3378 BUG_ON(!tpacpi_inputdev);
3379 BUG_ON(tpacpi_inputdev->open != NULL ||
3380 tpacpi_inputdev->close != NULL);
3381
3382 TPACPI_ACPIHANDLE_INIT(hkey);
3383 mutex_init(&hotkey_mutex);
3384
3385 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
3386 mutex_init(&hotkey_thread_data_mutex);
3387 #endif
3388
3389
3390 tp_features.hotkey = hkey_handle != NULL;
3391
3392 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3393 "hotkeys are %s\n",
3394 str_supported(tp_features.hotkey));
3395
3396 if (!tp_features.hotkey)
3397 return -ENODEV;
3398
3399 quirks = tpacpi_check_quirks(tpacpi_hotkey_qtable,
3400 ARRAY_SIZE(tpacpi_hotkey_qtable));
3401
3402 tpacpi_disable_brightness_delay();
3403
3404
3405
3406
3407 if (acpi_evalf(hkey_handle, &hkeyv, "MHKV", "qd")) {
3408 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3409 "firmware HKEY interface version: 0x%x\n",
3410 hkeyv);
3411
3412 switch (hkeyv >> 8) {
3413 case 1:
3414
3415
3416
3417
3418
3419
3420 if (!acpi_evalf(hkey_handle, &hotkey_all_mask,
3421 "MHKA", "qd")) {
3422 pr_err("missing MHKA handler, please report this to %s\n",
3423 TPACPI_MAIL);
3424
3425 hotkey_all_mask = 0x080cU;
3426 } else {
3427 tp_features.hotkey_mask = 1;
3428 }
3429 break;
3430
3431 case 2:
3432
3433
3434
3435
3436
3437 if (!acpi_evalf(hkey_handle, &hotkey_all_mask,
3438 "MHKA", "dd", 1)) {
3439 pr_err("missing MHKA handler, please report this to %s\n",
3440 TPACPI_MAIL);
3441
3442 hotkey_all_mask = 0x080cU;
3443 } else {
3444 tp_features.hotkey_mask = 1;
3445 }
3446
3447
3448
3449
3450
3451 if (acpi_evalf(hkey_handle, &hotkey_adaptive_all_mask,
3452 "MHKA", "dd", 2)) {
3453 if (hotkey_adaptive_all_mask != 0)
3454 tp_features.has_adaptive_kbd = true;
3455 } else {
3456 tp_features.has_adaptive_kbd = false;
3457 hotkey_adaptive_all_mask = 0x0U;
3458 }
3459 break;
3460
3461 default:
3462 pr_err("unknown version of the HKEY interface: 0x%x\n",
3463 hkeyv);
3464 pr_err("please report this to %s\n", TPACPI_MAIL);
3465 break;
3466 }
3467 }
3468
3469 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3470 "hotkey masks are %s\n",
3471 str_supported(tp_features.hotkey_mask));
3472
3473
3474 if (!tp_features.hotkey_mask && !hotkey_all_mask &&
3475 (quirks & TPACPI_HK_Q_INIMASK))
3476 hotkey_all_mask = 0x080cU;
3477
3478
3479 if (tp_features.hotkey_mask) {
3480
3481
3482 res = hotkey_mask_get();
3483 if (res)
3484 return res;
3485
3486 hotkey_orig_mask = hotkey_acpi_mask;
3487 } else {
3488 hotkey_orig_mask = hotkey_all_mask;
3489 hotkey_acpi_mask = hotkey_all_mask;
3490 }
3491
3492 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
3493 if (dbg_wlswemul) {
3494 tp_features.hotkey_wlsw = 1;
3495 radiosw_state = !!tpacpi_wlsw_emulstate;
3496 pr_info("radio switch emulation enabled\n");
3497 } else
3498 #endif
3499
3500 if (acpi_evalf(hkey_handle, &status, "WLSW", "qd")) {
3501 tp_features.hotkey_wlsw = 1;
3502 radiosw_state = !!status;
3503 pr_info("radio switch found; radios are %s\n", str_enabled_disabled(status & BIT(0)));
3504 }
3505
3506 tabletsw_state = hotkey_init_tablet_mode();
3507
3508
3509 keymap_id = tpacpi_check_quirks(tpacpi_keymap_qtable,
3510 ARRAY_SIZE(tpacpi_keymap_qtable));
3511 BUG_ON(keymap_id >= ARRAY_SIZE(tpacpi_keymaps));
3512 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3513 "using keymap number %lu\n", keymap_id);
3514
3515 hotkey_keycode_map = kmemdup(&tpacpi_keymaps[keymap_id],
3516 TPACPI_HOTKEY_MAP_SIZE, GFP_KERNEL);
3517 if (!hotkey_keycode_map) {
3518 pr_err("failed to allocate memory for key map\n");
3519 return -ENOMEM;
3520 }
3521
3522 input_set_capability(tpacpi_inputdev, EV_MSC, MSC_SCAN);
3523 tpacpi_inputdev->keycodesize = TPACPI_HOTKEY_MAP_TYPESIZE;
3524 tpacpi_inputdev->keycodemax = TPACPI_HOTKEY_MAP_LEN;
3525 tpacpi_inputdev->keycode = hotkey_keycode_map;
3526 for (i = 0; i < TPACPI_HOTKEY_MAP_LEN; i++) {
3527 if (hotkey_keycode_map[i] != KEY_RESERVED) {
3528 input_set_capability(tpacpi_inputdev, EV_KEY,
3529 hotkey_keycode_map[i]);
3530 } else {
3531 if (i < sizeof(hotkey_reserved_mask)*8)
3532 hotkey_reserved_mask |= 1 << i;
3533 }
3534 }
3535
3536 if (tp_features.hotkey_wlsw) {
3537 input_set_capability(tpacpi_inputdev, EV_SW, SW_RFKILL_ALL);
3538 input_report_switch(tpacpi_inputdev,
3539 SW_RFKILL_ALL, radiosw_state);
3540 }
3541 if (tp_features.hotkey_tablet) {
3542 input_set_capability(tpacpi_inputdev, EV_SW, SW_TABLET_MODE);
3543 input_report_switch(tpacpi_inputdev,
3544 SW_TABLET_MODE, tabletsw_state);
3545 }
3546
3547
3548
3549
3550 if (acpi_video_get_backlight_type() != acpi_backlight_vendor) {
3551 pr_info("This ThinkPad has standard ACPI backlight brightness control, supported by the ACPI video driver\n");
3552 pr_notice("Disabling thinkpad-acpi brightness events by default...\n");
3553
3554
3555
3556
3557 hotkey_reserved_mask |=
3558 (1 << TP_ACPI_HOTKEYSCAN_FNHOME)
3559 | (1 << TP_ACPI_HOTKEYSCAN_FNEND);
3560 hotkey_unmap(TP_ACPI_HOTKEYSCAN_FNHOME);
3561 hotkey_unmap(TP_ACPI_HOTKEYSCAN_FNEND);
3562 }
3563
3564 #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL
3565 hotkey_source_mask = TPACPI_HKEY_NVRAM_GOOD_MASK
3566 & ~hotkey_all_mask
3567 & ~hotkey_reserved_mask;
3568
3569 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3570 "hotkey source mask 0x%08x, polling freq %u\n",
3571 hotkey_source_mask, hotkey_poll_freq);
3572 #endif
3573
3574 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3575 "enabling firmware HKEY event interface...\n");
3576 res = hotkey_status_set(true);
3577 if (res) {
3578 hotkey_exit();
3579 return res;
3580 }
3581 res = hotkey_mask_set(((hotkey_all_mask & ~hotkey_reserved_mask)
3582 | hotkey_driver_mask)
3583 & ~hotkey_source_mask);
3584 if (res < 0 && res != -ENXIO) {
3585 hotkey_exit();
3586 return res;
3587 }
3588 hotkey_user_mask = (hotkey_acpi_mask | hotkey_source_mask)
3589 & ~hotkey_reserved_mask;
3590 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_HKEY,
3591 "initial masks: user=0x%08x, fw=0x%08x, poll=0x%08x\n",
3592 hotkey_user_mask, hotkey_acpi_mask, hotkey_source_mask);
3593
3594 tpacpi_inputdev->open = &hotkey_inputdev_open;
3595 tpacpi_inputdev->close = &hotkey_inputdev_close;
3596
3597 hotkey_poll_setup_safe(true);
3598
3599 return 0;
3600 }
3601
3602
3603
3604
3605
3606
3607
3608
3609 static const int adaptive_keyboard_modes[] = {
3610 HOME_MODE,
3611
3612
3613 FUNCTION_MODE
3614 };
3615
3616 #define DFR_CHANGE_ROW 0x101
3617 #define DFR_SHOW_QUICKVIEW_ROW 0x102
3618 #define FIRST_ADAPTIVE_KEY 0x103
3619
3620
3621
3622
3623 static bool adaptive_keyboard_mode_is_saved;
3624 static int adaptive_keyboard_prev_mode;
3625
3626 static int adaptive_keyboard_get_mode(void)
3627 {
3628 int mode = 0;
3629
3630 if (!acpi_evalf(hkey_handle, &mode, "GTRW", "dd", 0)) {
3631 pr_err("Cannot read adaptive keyboard mode\n");
3632 return -EIO;
3633 }
3634
3635 return mode;
3636 }
3637
3638 static int adaptive_keyboard_set_mode(int new_mode)
3639 {
3640 if (new_mode < 0 ||
3641 new_mode > LAYFLAT_MODE)
3642 return -EINVAL;
3643
3644 if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd", new_mode)) {
3645 pr_err("Cannot set adaptive keyboard mode\n");
3646 return -EIO;
3647 }
3648
3649 return 0;
3650 }
3651
3652 static int adaptive_keyboard_get_next_mode(int mode)
3653 {
3654 size_t i;
3655 size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1;
3656
3657 for (i = 0; i <= max_mode; i++) {
3658 if (adaptive_keyboard_modes[i] == mode)
3659 break;
3660 }
3661
3662 if (i >= max_mode)
3663 i = 0;
3664 else
3665 i++;
3666
3667 return adaptive_keyboard_modes[i];
3668 }
3669
3670 static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode)
3671 {
3672 int current_mode = 0;
3673 int new_mode = 0;
3674 int keycode;
3675
3676 switch (scancode) {
3677 case DFR_CHANGE_ROW:
3678 if (adaptive_keyboard_mode_is_saved) {
3679 new_mode = adaptive_keyboard_prev_mode;
3680 adaptive_keyboard_mode_is_saved = false;
3681 } else {
3682 current_mode = adaptive_keyboard_get_mode();
3683 if (current_mode < 0)
3684 return false;
3685 new_mode = adaptive_keyboard_get_next_mode(
3686 current_mode);
3687 }
3688
3689 if (adaptive_keyboard_set_mode(new_mode) < 0)
3690 return false;
3691
3692 return true;
3693
3694 case DFR_SHOW_QUICKVIEW_ROW:
3695 current_mode = adaptive_keyboard_get_mode();
3696 if (current_mode < 0)
3697 return false;
3698
3699 adaptive_keyboard_prev_mode = current_mode;
3700 adaptive_keyboard_mode_is_saved = true;
3701
3702 if (adaptive_keyboard_set_mode (FUNCTION_MODE) < 0)
3703 return false;
3704 return true;
3705
3706 default:
3707 if (scancode < FIRST_ADAPTIVE_KEY ||
3708 scancode >= FIRST_ADAPTIVE_KEY +
3709 TP_ACPI_HOTKEYSCAN_EXTENDED_START -
3710 TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
3711 pr_info("Unhandled adaptive keyboard key: 0x%x\n",
3712 scancode);
3713 return false;
3714 }
3715 keycode = hotkey_keycode_map[scancode - FIRST_ADAPTIVE_KEY +
3716 TP_ACPI_HOTKEYSCAN_ADAPTIVE_START];
3717 if (keycode != KEY_RESERVED) {
3718 mutex_lock(&tpacpi_inputdev_send_mutex);
3719
3720 input_report_key(tpacpi_inputdev, keycode, 1);
3721 input_sync(tpacpi_inputdev);
3722
3723 input_report_key(tpacpi_inputdev, keycode, 0);
3724 input_sync(tpacpi_inputdev);
3725
3726 mutex_unlock(&tpacpi_inputdev_send_mutex);
3727 }
3728 return true;
3729 }
3730 }
3731
3732 static bool hotkey_notify_extended_hotkey(const u32 hkey)
3733 {
3734 unsigned int scancode;
3735
3736 switch (hkey) {
3737 case TP_HKEY_EV_PRIVACYGUARD_TOGGLE:
3738 case TP_HKEY_EV_AMT_TOGGLE:
3739 tpacpi_driver_event(hkey);
3740 return true;
3741 }
3742
3743
3744
3745
3746
3747 scancode = (hkey & 0xfff) - (0x300 - TP_ACPI_HOTKEYSCAN_EXTENDED_START);
3748 if (scancode >= TP_ACPI_HOTKEYSCAN_EXTENDED_START &&
3749 scancode < TPACPI_HOTKEY_MAP_LEN) {
3750 tpacpi_input_send_key(scancode);
3751 return true;
3752 }
3753
3754 return false;
3755 }
3756
3757 static bool hotkey_notify_hotkey(const u32 hkey,
3758 bool *send_acpi_ev,
3759 bool *ignore_acpi_ev)
3760 {
3761
3762 unsigned int scancode = hkey & 0xfff;
3763 *send_acpi_ev = true;
3764 *ignore_acpi_ev = false;
3765
3766
3767
3768
3769
3770
3771 switch ((hkey >> 8) & 0xf) {
3772 case 0:
3773 if (scancode > 0 &&
3774 scancode <= TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
3775
3776 scancode--;
3777 if (!(hotkey_source_mask & (1 << scancode))) {
3778 tpacpi_input_send_key_masked(scancode);
3779 *send_acpi_ev = false;
3780 } else {
3781 *ignore_acpi_ev = true;
3782 }
3783 return true;
3784 }
3785 break;
3786
3787 case 1:
3788 return adaptive_keyboard_hotkey_notify_hotkey(scancode);
3789
3790 case 3:
3791 return hotkey_notify_extended_hotkey(hkey);
3792 }
3793
3794 return false;
3795 }
3796
3797 static bool hotkey_notify_wakeup(const u32 hkey,
3798 bool *send_acpi_ev,
3799 bool *ignore_acpi_ev)
3800 {
3801
3802 *send_acpi_ev = true;
3803 *ignore_acpi_ev = false;
3804
3805 switch (hkey) {
3806 case TP_HKEY_EV_WKUP_S3_UNDOCK:
3807 case TP_HKEY_EV_WKUP_S4_UNDOCK:
3808 hotkey_wakeup_reason = TP_ACPI_WAKEUP_UNDOCK;
3809 *ignore_acpi_ev = true;
3810 break;
3811
3812 case TP_HKEY_EV_WKUP_S3_BAYEJ:
3813 case TP_HKEY_EV_WKUP_S4_BAYEJ:
3814 hotkey_wakeup_reason = TP_ACPI_WAKEUP_BAYEJ;
3815 *ignore_acpi_ev = true;
3816 break;
3817
3818 case TP_HKEY_EV_WKUP_S3_BATLOW:
3819 case TP_HKEY_EV_WKUP_S4_BATLOW:
3820 pr_alert("EMERGENCY WAKEUP: battery almost empty\n");
3821
3822
3823
3824 break;
3825
3826 default:
3827 return false;
3828 }
3829
3830 if (hotkey_wakeup_reason != TP_ACPI_WAKEUP_NONE) {
3831 pr_info("woke up due to a hot-unplug request...\n");
3832 hotkey_wakeup_reason_notify_change();
3833 }
3834 return true;
3835 }
3836
3837 static bool hotkey_notify_dockevent(const u32 hkey,
3838 bool *send_acpi_ev,
3839 bool *ignore_acpi_ev)
3840 {
3841
3842 *send_acpi_ev = true;
3843 *ignore_acpi_ev = false;
3844
3845 switch (hkey) {
3846 case TP_HKEY_EV_UNDOCK_ACK:
3847
3848 hotkey_autosleep_ack = 1;
3849 pr_info("undocked\n");
3850 hotkey_wakeup_hotunplug_complete_notify_change();
3851 return true;
3852
3853 case TP_HKEY_EV_HOTPLUG_DOCK:
3854 pr_info("docked into hotplug port replicator\n");
3855 return true;
3856 case TP_HKEY_EV_HOTPLUG_UNDOCK:
3857 pr_info("undocked from hotplug port replicator\n");
3858 return true;
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871 case TP_HKEY_EV_KBD_COVER_ATTACH:
3872 case TP_HKEY_EV_KBD_COVER_DETACH:
3873 *send_acpi_ev = false;
3874 *ignore_acpi_ev = true;
3875 return true;
3876
3877 default:
3878 return false;
3879 }
3880 }
3881
3882 static bool hotkey_notify_usrevent(const u32 hkey,
3883 bool *send_acpi_ev,
3884 bool *ignore_acpi_ev)
3885 {
3886
3887 *send_acpi_ev = true;
3888 *ignore_acpi_ev = false;
3889
3890 switch (hkey) {
3891 case TP_HKEY_EV_PEN_INSERTED:
3892 case TP_HKEY_EV_PEN_REMOVED:
3893 return true;
3894
3895 case TP_HKEY_EV_TABLET_TABLET:
3896 case TP_HKEY_EV_TABLET_NOTEBOOK:
3897 tpacpi_input_send_tabletsw();
3898 hotkey_tablet_mode_notify_change();
3899 *send_acpi_ev = false;
3900 return true;
3901
3902 case TP_HKEY_EV_LID_CLOSE:
3903 case TP_HKEY_EV_LID_OPEN:
3904 case TP_HKEY_EV_BRGHT_CHANGED:
3905
3906 *ignore_acpi_ev = true;
3907 return true;
3908
3909 default:
3910 return false;
3911 }
3912 }
3913
3914 static void thermal_dump_all_sensors(void);
3915 static void palmsensor_refresh(void);
3916
3917 static bool hotkey_notify_6xxx(const u32 hkey,
3918 bool *send_acpi_ev,
3919 bool *ignore_acpi_ev)
3920 {
3921
3922 *send_acpi_ev = true;
3923 *ignore_acpi_ev = false;
3924
3925 switch (hkey) {
3926 case TP_HKEY_EV_THM_TABLE_CHANGED:
3927 pr_debug("EC reports: Thermal Table has changed\n");
3928
3929
3930 return true;
3931 case TP_HKEY_EV_THM_CSM_COMPLETED:
3932 pr_debug("EC reports: Thermal Control Command set completed (DYTC)\n");
3933
3934 tpacpi_driver_event(hkey);
3935 return true;
3936 case TP_HKEY_EV_THM_TRANSFM_CHANGED:
3937 pr_debug("EC reports: Thermal Transformation changed (GMTS)\n");
3938
3939
3940 return true;
3941 case TP_HKEY_EV_ALARM_BAT_HOT:
3942 pr_crit("THERMAL ALARM: battery is too hot!\n");
3943
3944 break;
3945 case TP_HKEY_EV_ALARM_BAT_XHOT:
3946 pr_alert("THERMAL EMERGENCY: battery is extremely hot!\n");
3947
3948 break;
3949 case TP_HKEY_EV_ALARM_SENSOR_HOT:
3950 pr_crit("THERMAL ALARM: a sensor reports something is too hot!\n");
3951
3952
3953 break;
3954 case TP_HKEY_EV_ALARM_SENSOR_XHOT:
3955 pr_alert("THERMAL EMERGENCY: a sensor reports something is extremely hot!\n");
3956
3957 break;
3958 case TP_HKEY_EV_AC_CHANGED:
3959
3960
3961
3962
3963 fallthrough;
3964
3965 case TP_HKEY_EV_KEY_NUMLOCK:
3966 case TP_HKEY_EV_KEY_FN:
3967
3968
3969 *send_acpi_ev = false;
3970 *ignore_acpi_ev = true;
3971 return true;
3972
3973 case TP_HKEY_EV_KEY_FN_ESC:
3974
3975 acpi_evalf(hkey_handle, NULL, "GMKS", "v");
3976 *send_acpi_ev = false;
3977 *ignore_acpi_ev = true;
3978 return true;
3979
3980 case TP_HKEY_EV_TABLET_CHANGED:
3981 tpacpi_input_send_tabletsw();
3982 hotkey_tablet_mode_notify_change();
3983 *send_acpi_ev = false;
3984 return true;
3985
3986 case TP_HKEY_EV_PALM_DETECTED:
3987 case TP_HKEY_EV_PALM_UNDETECTED:
3988
3989 palmsensor_refresh();
3990 return true;
3991
3992 default:
3993
3994 return false;
3995 }
3996
3997 thermal_dump_all_sensors();
3998 return true;
3999 }
4000
4001 static void hotkey_notify(struct ibm_struct *ibm, u32 event)
4002 {
4003 u32 hkey;
4004 bool send_acpi_ev;
4005 bool ignore_acpi_ev;
4006 bool known_ev;
4007
4008 if (event != 0x80) {
4009 pr_err("unknown HKEY notification event %d\n", event);
4010
4011 acpi_bus_generate_netlink_event(
4012 ibm->acpi->device->pnp.device_class,
4013 dev_name(&ibm->acpi->device->dev),
4014 event, 0);
4015 return;
4016 }
4017
4018 while (1) {
4019 if (!acpi_evalf(hkey_handle, &hkey, "MHKP", "d")) {
4020 pr_err("failed to retrieve HKEY event\n");
4021 return;
4022 }
4023
4024 if (hkey == 0) {
4025
4026 return;
4027 }
4028
4029 send_acpi_ev = true;
4030 ignore_acpi_ev = false;
4031
4032 switch (hkey >> 12) {
4033 case 1:
4034
4035 known_ev = hotkey_notify_hotkey(hkey, &send_acpi_ev,
4036 &ignore_acpi_ev);
4037 break;
4038 case 2:
4039
4040 known_ev = hotkey_notify_wakeup(hkey, &send_acpi_ev,
4041 &ignore_acpi_ev);
4042 break;
4043 case 3:
4044
4045 switch (hkey) {
4046 case TP_HKEY_EV_BAYEJ_ACK:
4047 hotkey_autosleep_ack = 1;
4048 pr_info("bay ejected\n");
4049 hotkey_wakeup_hotunplug_complete_notify_change();
4050 known_ev = true;
4051 break;
4052 case TP_HKEY_EV_OPTDRV_EJ:
4053
4054 known_ev = true;
4055 break;
4056 default:
4057 known_ev = false;
4058 }
4059 break;
4060 case 4:
4061
4062 known_ev = hotkey_notify_dockevent(hkey, &send_acpi_ev,
4063 &ignore_acpi_ev);
4064 break;
4065 case 5:
4066
4067 known_ev = hotkey_notify_usrevent(hkey, &send_acpi_ev,
4068 &ignore_acpi_ev);
4069 break;
4070 case 6:
4071
4072
4073 known_ev = hotkey_notify_6xxx(hkey, &send_acpi_ev,
4074 &ignore_acpi_ev);
4075 break;
4076 case 7:
4077
4078 if (tp_features.hotkey_wlsw &&
4079 hkey == TP_HKEY_EV_RFKILL_CHANGED) {
4080 tpacpi_send_radiosw_update();
4081 send_acpi_ev = 0;
4082 known_ev = true;
4083 break;
4084 }
4085 fallthrough;
4086 default:
4087 known_ev = false;
4088 }
4089 if (!known_ev) {
4090 pr_notice("unhandled HKEY event 0x%04x\n", hkey);
4091 pr_notice("please report the conditions when this event happened to %s\n",
4092 TPACPI_MAIL);
4093 }
4094
4095
4096 if (!ignore_acpi_ev && send_acpi_ev) {
4097 acpi_bus_generate_netlink_event(
4098 ibm->acpi->device->pnp.device_class,
4099 dev_name(&ibm->acpi->device->dev),
4100 event, hkey);
4101 }
4102 }
4103 }
4104
4105 static void hotkey_suspend(void)
4106 {
4107
4108 hotkey_wakeup_reason = TP_ACPI_WAKEUP_NONE;
4109 hotkey_autosleep_ack = 0;
4110
4111
4112 if (tp_features.has_adaptive_kbd) {
4113 if (!acpi_evalf(hkey_handle, &adaptive_keyboard_prev_mode,
4114 "GTRW", "dd", 0)) {
4115 pr_err("Cannot read adaptive keyboard mode.\n");
4116 }
4117 }
4118 }
4119
4120 static void hotkey_resume(void)
4121 {
4122 tpacpi_disable_brightness_delay();
4123
4124 if (hotkey_status_set(true) < 0 ||
4125 hotkey_mask_set(hotkey_acpi_mask) < 0)
4126 pr_err("error while attempting to reset the event firmware interface\n");
4127
4128 tpacpi_send_radiosw_update();
4129 tpacpi_input_send_tabletsw();
4130 hotkey_tablet_mode_notify_change();
4131 hotkey_wakeup_reason_notify_change();
4132 hotkey_wakeup_hotunplug_complete_notify_change();
4133 hotkey_poll_setup_safe(false);
4134
4135
4136 if (tp_features.has_adaptive_kbd) {
4137 if (!acpi_evalf(hkey_handle, NULL, "STRW", "vd",
4138 adaptive_keyboard_prev_mode)) {
4139 pr_err("Cannot set adaptive keyboard mode.\n");
4140 }
4141 }
4142 }
4143
4144
4145 static int hotkey_read(struct seq_file *m)
4146 {
4147 int res, status;
4148
4149 if (!tp_features.hotkey) {
4150 seq_printf(m, "status:\t\tnot supported\n");
4151 return 0;
4152 }
4153
4154 if (mutex_lock_killable(&hotkey_mutex))
4155 return -ERESTARTSYS;
4156 res = hotkey_status_get(&status);
4157 if (!res)
4158 res = hotkey_mask_get();
4159 mutex_unlock(&hotkey_mutex);
4160 if (res)
4161 return res;
4162
4163 seq_printf(m, "status:\t\t%s\n", str_enabled_disabled(status & BIT(0)));
4164 if (hotkey_all_mask) {
4165 seq_printf(m, "mask:\t\t0x%08x\n", hotkey_user_mask);
4166 seq_printf(m, "commands:\tenable, disable, reset, <mask>\n");
4167 } else {
4168 seq_printf(m, "mask:\t\tnot supported\n");
4169 seq_printf(m, "commands:\tenable, disable, reset\n");
4170 }
4171
4172 return 0;
4173 }
4174
4175 static void hotkey_enabledisable_warn(bool enable)
4176 {
4177 tpacpi_log_usertask("procfs hotkey enable/disable");
4178 if (!WARN((tpacpi_lifecycle == TPACPI_LIFE_RUNNING || !enable),
4179 pr_fmt("hotkey enable/disable functionality has been removed from the driver. Hotkeys are always enabled.\n")))
4180 pr_err("Please remove the hotkey=enable module parameter, it is deprecated. Hotkeys are always enabled.\n");
4181 }
4182
4183 static int hotkey_write(char *buf)
4184 {
4185 int res;
4186 u32 mask;
4187 char *cmd;
4188
4189 if (!tp_features.hotkey)
4190 return -ENODEV;
4191
4192 if (mutex_lock_killable(&hotkey_mutex))
4193 return -ERESTARTSYS;
4194
4195 mask = hotkey_user_mask;
4196
4197 res = 0;
4198 while ((cmd = strsep(&buf, ","))) {
4199 if (strlencmp(cmd, "enable") == 0) {
4200 hotkey_enabledisable_warn(1);
4201 } else if (strlencmp(cmd, "disable") == 0) {
4202 hotkey_enabledisable_warn(0);
4203 res = -EPERM;
4204 } else if (strlencmp(cmd, "reset") == 0) {
4205 mask = (hotkey_all_mask | hotkey_source_mask)
4206 & ~hotkey_reserved_mask;
4207 } else if (sscanf(cmd, "0x%x", &mask) == 1) {
4208
4209 } else if (sscanf(cmd, "%x", &mask) == 1) {
4210
4211 } else {
4212 res = -EINVAL;
4213 goto errexit;
4214 }
4215 }
4216
4217 if (!res) {
4218 tpacpi_disclose_usertask("procfs hotkey",
4219 "set mask to 0x%08x\n", mask);
4220 res = hotkey_user_mask_set(mask);
4221 }
4222
4223 errexit:
4224 mutex_unlock(&hotkey_mutex);
4225 return res;
4226 }
4227
4228 static const struct acpi_device_id ibm_htk_device_ids[] = {
4229 {TPACPI_ACPI_IBM_HKEY_HID, 0},
4230 {TPACPI_ACPI_LENOVO_HKEY_HID, 0},
4231 {TPACPI_ACPI_LENOVO_HKEY_V2_HID, 0},
4232 {"", 0},
4233 };
4234
4235 static struct tp_acpi_drv_struct ibm_hotkey_acpidriver = {
4236 .hid = ibm_htk_device_ids,
4237 .notify = hotkey_notify,
4238 .handle = &hkey_handle,
4239 .type = ACPI_DEVICE_NOTIFY,
4240 };
4241
4242 static struct ibm_struct hotkey_driver_data = {
4243 .name = "hotkey",
4244 .read = hotkey_read,
4245 .write = hotkey_write,
4246 .exit = hotkey_exit,
4247 .resume = hotkey_resume,
4248 .suspend = hotkey_suspend,
4249 .acpi = &ibm_hotkey_acpidriver,
4250 };
4251
4252
4253
4254
4255
4256 enum {
4257
4258 TP_ACPI_BLUETOOTH_HWPRESENT = 0x01,
4259 TP_ACPI_BLUETOOTH_RADIOSSW = 0x02,
4260 TP_ACPI_BLUETOOTH_RESUMECTRL = 0x04,
4261
4262 };
4263
4264 enum {
4265
4266 TP_ACPI_BLTH_GET_ULTRAPORT_ID = 0x00,
4267 TP_ACPI_BLTH_GET_PWR_ON_RESUME = 0x01,
4268 TP_ACPI_BLTH_PWR_ON_ON_RESUME = 0x02,
4269 TP_ACPI_BLTH_PWR_OFF_ON_RESUME = 0x03,
4270 TP_ACPI_BLTH_SAVE_STATE = 0x05,
4271 };
4272
4273 #define TPACPI_RFK_BLUETOOTH_SW_NAME "tpacpi_bluetooth_sw"
4274
4275 static int bluetooth_get_status(void)
4276 {
4277 int status;
4278
4279 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4280 if (dbg_bluetoothemul)
4281 return (tpacpi_bluetooth_emulstate) ?
4282 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4283 #endif
4284
4285 if (!acpi_evalf(hkey_handle, &status, "GBDC", "d"))
4286 return -EIO;
4287
4288 return ((status & TP_ACPI_BLUETOOTH_RADIOSSW) != 0) ?
4289 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4290 }
4291
4292 static int bluetooth_set_status(enum tpacpi_rfkill_state state)
4293 {
4294 int status;
4295
4296 vdbg_printk(TPACPI_DBG_RFKILL, "will attempt to %s bluetooth\n",
4297 str_enable_disable(state == TPACPI_RFK_RADIO_ON));
4298
4299 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4300 if (dbg_bluetoothemul) {
4301 tpacpi_bluetooth_emulstate = (state == TPACPI_RFK_RADIO_ON);
4302 return 0;
4303 }
4304 #endif
4305
4306 if (state == TPACPI_RFK_RADIO_ON)
4307 status = TP_ACPI_BLUETOOTH_RADIOSSW
4308 | TP_ACPI_BLUETOOTH_RESUMECTRL;
4309 else
4310 status = 0;
4311
4312 if (!acpi_evalf(hkey_handle, NULL, "SBDC", "vd", status))
4313 return -EIO;
4314
4315 return 0;
4316 }
4317
4318
4319 static ssize_t bluetooth_enable_show(struct device *dev,
4320 struct device_attribute *attr,
4321 char *buf)
4322 {
4323 return tpacpi_rfk_sysfs_enable_show(TPACPI_RFK_BLUETOOTH_SW_ID,
4324 attr, buf);
4325 }
4326
4327 static ssize_t bluetooth_enable_store(struct device *dev,
4328 struct device_attribute *attr,
4329 const char *buf, size_t count)
4330 {
4331 return tpacpi_rfk_sysfs_enable_store(TPACPI_RFK_BLUETOOTH_SW_ID,
4332 attr, buf, count);
4333 }
4334
4335 static DEVICE_ATTR_RW(bluetooth_enable);
4336
4337
4338
4339 static struct attribute *bluetooth_attributes[] = {
4340 &dev_attr_bluetooth_enable.attr,
4341 NULL
4342 };
4343
4344 static umode_t bluetooth_attr_is_visible(struct kobject *kobj,
4345 struct attribute *attr, int n)
4346 {
4347 return tp_features.bluetooth ? attr->mode : 0;
4348 }
4349
4350 static const struct attribute_group bluetooth_attr_group = {
4351 .is_visible = bluetooth_attr_is_visible,
4352 .attrs = bluetooth_attributes,
4353 };
4354
4355 static const struct tpacpi_rfk_ops bluetooth_tprfk_ops = {
4356 .get_status = bluetooth_get_status,
4357 .set_status = bluetooth_set_status,
4358 };
4359
4360 static void bluetooth_shutdown(void)
4361 {
4362
4363 if (!acpi_evalf(NULL, NULL, "\\BLTH", "vd",
4364 TP_ACPI_BLTH_SAVE_STATE))
4365 pr_notice("failed to save bluetooth state to NVRAM\n");
4366 else
4367 vdbg_printk(TPACPI_DBG_RFKILL,
4368 "bluetooth state saved to NVRAM\n");
4369 }
4370
4371 static void bluetooth_exit(void)
4372 {
4373 tpacpi_destroy_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID);
4374 bluetooth_shutdown();
4375 }
4376
4377 static const struct dmi_system_id fwbug_list[] __initconst = {
4378 {
4379 .ident = "ThinkPad E485",
4380 .driver_data = &quirk_btusb_bug,
4381 .matches = {
4382 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4383 DMI_MATCH(DMI_BOARD_NAME, "20KU"),
4384 },
4385 },
4386 {
4387 .ident = "ThinkPad E585",
4388 .driver_data = &quirk_btusb_bug,
4389 .matches = {
4390 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4391 DMI_MATCH(DMI_BOARD_NAME, "20KV"),
4392 },
4393 },
4394 {
4395 .ident = "ThinkPad A285 - 20MW",
4396 .driver_data = &quirk_btusb_bug,
4397 .matches = {
4398 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4399 DMI_MATCH(DMI_BOARD_NAME, "20MW"),
4400 },
4401 },
4402 {
4403 .ident = "ThinkPad A285 - 20MX",
4404 .driver_data = &quirk_btusb_bug,
4405 .matches = {
4406 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4407 DMI_MATCH(DMI_BOARD_NAME, "20MX"),
4408 },
4409 },
4410 {
4411 .ident = "ThinkPad A485 - 20MU",
4412 .driver_data = &quirk_btusb_bug,
4413 .matches = {
4414 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4415 DMI_MATCH(DMI_BOARD_NAME, "20MU"),
4416 },
4417 },
4418 {
4419 .ident = "ThinkPad A485 - 20MV",
4420 .driver_data = &quirk_btusb_bug,
4421 .matches = {
4422 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4423 DMI_MATCH(DMI_BOARD_NAME, "20MV"),
4424 },
4425 },
4426 {
4427 .ident = "L14 Gen2 AMD",
4428 .driver_data = &quirk_s2idle_bug,
4429 .matches = {
4430 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4431 DMI_MATCH(DMI_PRODUCT_NAME, "20X5"),
4432 }
4433 },
4434 {
4435 .ident = "T14s Gen2 AMD",
4436 .driver_data = &quirk_s2idle_bug,
4437 .matches = {
4438 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4439 DMI_MATCH(DMI_PRODUCT_NAME, "20XF"),
4440 }
4441 },
4442 {
4443 .ident = "X13 Gen2 AMD",
4444 .driver_data = &quirk_s2idle_bug,
4445 .matches = {
4446 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4447 DMI_MATCH(DMI_PRODUCT_NAME, "20XH"),
4448 }
4449 },
4450 {
4451 .ident = "T14 Gen2 AMD",
4452 .driver_data = &quirk_s2idle_bug,
4453 .matches = {
4454 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4455 DMI_MATCH(DMI_PRODUCT_NAME, "20XK"),
4456 }
4457 },
4458 {
4459 .ident = "T14 Gen1 AMD",
4460 .driver_data = &quirk_s2idle_bug,
4461 .matches = {
4462 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4463 DMI_MATCH(DMI_PRODUCT_NAME, "20UD"),
4464 }
4465 },
4466 {
4467 .ident = "T14 Gen1 AMD",
4468 .driver_data = &quirk_s2idle_bug,
4469 .matches = {
4470 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4471 DMI_MATCH(DMI_PRODUCT_NAME, "20UE"),
4472 }
4473 },
4474 {
4475 .ident = "T14s Gen1 AMD",
4476 .driver_data = &quirk_s2idle_bug,
4477 .matches = {
4478 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4479 DMI_MATCH(DMI_PRODUCT_NAME, "20UH"),
4480 }
4481 },
4482 {
4483 .ident = "P14s Gen1 AMD",
4484 .driver_data = &quirk_s2idle_bug,
4485 .matches = {
4486 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4487 DMI_MATCH(DMI_PRODUCT_NAME, "20Y1"),
4488 }
4489 },
4490 {
4491 .ident = "P14s Gen2 AMD",
4492 .driver_data = &quirk_s2idle_bug,
4493 .matches = {
4494 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
4495 DMI_MATCH(DMI_PRODUCT_NAME, "21A0"),
4496 }
4497 },
4498 {}
4499 };
4500
4501 #ifdef CONFIG_SUSPEND
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511 static void thinkpad_acpi_amd_s2idle_restore(void)
4512 {
4513 struct resource *res;
4514 void __iomem *addr;
4515 u8 val;
4516
4517 res = request_mem_region_muxed(tp_features.quirks->s2idle_bug_mmio, 1,
4518 "thinkpad_acpi_pm80");
4519 if (!res)
4520 return;
4521
4522 addr = ioremap(tp_features.quirks->s2idle_bug_mmio, 1);
4523 if (!addr)
4524 goto cleanup_resource;
4525
4526 val = ioread8(addr);
4527 iowrite8(val & ~BIT(0), addr);
4528
4529 iounmap(addr);
4530 cleanup_resource:
4531 release_resource(res);
4532 kfree(res);
4533 }
4534
4535 static struct acpi_s2idle_dev_ops thinkpad_acpi_s2idle_dev_ops = {
4536 .restore = thinkpad_acpi_amd_s2idle_restore,
4537 };
4538 #endif
4539
4540 static const struct pci_device_id fwbug_cards_ids[] __initconst = {
4541 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24F3) },
4542 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x24FD) },
4543 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2526) },
4544 {}
4545 };
4546
4547
4548 static int __init have_bt_fwbug(void)
4549 {
4550
4551
4552
4553
4554 if (tp_features.quirks && tp_features.quirks->btusb_bug &&
4555 pci_dev_present(fwbug_cards_ids)) {
4556 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4557 FW_BUG "disable bluetooth subdriver for Intel cards\n");
4558 return 1;
4559 } else
4560 return 0;
4561 }
4562
4563 static int __init bluetooth_init(struct ibm_init_struct *iibm)
4564 {
4565 int res;
4566 int status = 0;
4567
4568 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4569 "initializing bluetooth subdriver\n");
4570
4571 TPACPI_ACPIHANDLE_INIT(hkey);
4572
4573
4574
4575 tp_features.bluetooth = !have_bt_fwbug() && hkey_handle &&
4576 acpi_evalf(hkey_handle, &status, "GBDC", "qd");
4577
4578 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4579 "bluetooth is %s, status 0x%02x\n",
4580 str_supported(tp_features.bluetooth),
4581 status);
4582
4583 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4584 if (dbg_bluetoothemul) {
4585 tp_features.bluetooth = 1;
4586 pr_info("bluetooth switch emulation enabled\n");
4587 } else
4588 #endif
4589 if (tp_features.bluetooth &&
4590 !(status & TP_ACPI_BLUETOOTH_HWPRESENT)) {
4591
4592 tp_features.bluetooth = 0;
4593 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4594 "bluetooth hardware not installed\n");
4595 }
4596
4597 if (!tp_features.bluetooth)
4598 return -ENODEV;
4599
4600 res = tpacpi_new_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID,
4601 &bluetooth_tprfk_ops,
4602 RFKILL_TYPE_BLUETOOTH,
4603 TPACPI_RFK_BLUETOOTH_SW_NAME,
4604 true);
4605 return res;
4606 }
4607
4608
4609 static int bluetooth_read(struct seq_file *m)
4610 {
4611 return tpacpi_rfk_procfs_read(TPACPI_RFK_BLUETOOTH_SW_ID, m);
4612 }
4613
4614 static int bluetooth_write(char *buf)
4615 {
4616 return tpacpi_rfk_procfs_write(TPACPI_RFK_BLUETOOTH_SW_ID, buf);
4617 }
4618
4619 static struct ibm_struct bluetooth_driver_data = {
4620 .name = "bluetooth",
4621 .read = bluetooth_read,
4622 .write = bluetooth_write,
4623 .exit = bluetooth_exit,
4624 .shutdown = bluetooth_shutdown,
4625 };
4626
4627
4628
4629
4630
4631 enum {
4632
4633 TP_ACPI_WANCARD_HWPRESENT = 0x01,
4634 TP_ACPI_WANCARD_RADIOSSW = 0x02,
4635 TP_ACPI_WANCARD_RESUMECTRL = 0x04,
4636
4637 };
4638
4639 #define TPACPI_RFK_WWAN_SW_NAME "tpacpi_wwan_sw"
4640
4641 static int wan_get_status(void)
4642 {
4643 int status;
4644
4645 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4646 if (dbg_wwanemul)
4647 return (tpacpi_wwan_emulstate) ?
4648 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4649 #endif
4650
4651 if (!acpi_evalf(hkey_handle, &status, "GWAN", "d"))
4652 return -EIO;
4653
4654 return ((status & TP_ACPI_WANCARD_RADIOSSW) != 0) ?
4655 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4656 }
4657
4658 static int wan_set_status(enum tpacpi_rfkill_state state)
4659 {
4660 int status;
4661
4662 vdbg_printk(TPACPI_DBG_RFKILL, "will attempt to %s wwan\n",
4663 str_enable_disable(state == TPACPI_RFK_RADIO_ON));
4664
4665 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4666 if (dbg_wwanemul) {
4667 tpacpi_wwan_emulstate = (state == TPACPI_RFK_RADIO_ON);
4668 return 0;
4669 }
4670 #endif
4671
4672 if (state == TPACPI_RFK_RADIO_ON)
4673 status = TP_ACPI_WANCARD_RADIOSSW
4674 | TP_ACPI_WANCARD_RESUMECTRL;
4675 else
4676 status = 0;
4677
4678 if (!acpi_evalf(hkey_handle, NULL, "SWAN", "vd", status))
4679 return -EIO;
4680
4681 return 0;
4682 }
4683
4684
4685 static ssize_t wan_enable_show(struct device *dev,
4686 struct device_attribute *attr,
4687 char *buf)
4688 {
4689 return tpacpi_rfk_sysfs_enable_show(TPACPI_RFK_WWAN_SW_ID,
4690 attr, buf);
4691 }
4692
4693 static ssize_t wan_enable_store(struct device *dev,
4694 struct device_attribute *attr,
4695 const char *buf, size_t count)
4696 {
4697 return tpacpi_rfk_sysfs_enable_store(TPACPI_RFK_WWAN_SW_ID,
4698 attr, buf, count);
4699 }
4700
4701 static DEVICE_ATTR(wwan_enable, S_IWUSR | S_IRUGO,
4702 wan_enable_show, wan_enable_store);
4703
4704
4705
4706 static struct attribute *wan_attributes[] = {
4707 &dev_attr_wwan_enable.attr,
4708 NULL
4709 };
4710
4711 static umode_t wan_attr_is_visible(struct kobject *kobj, struct attribute *attr,
4712 int n)
4713 {
4714 return tp_features.wan ? attr->mode : 0;
4715 }
4716
4717 static const struct attribute_group wan_attr_group = {
4718 .is_visible = wan_attr_is_visible,
4719 .attrs = wan_attributes,
4720 };
4721
4722 static const struct tpacpi_rfk_ops wan_tprfk_ops = {
4723 .get_status = wan_get_status,
4724 .set_status = wan_set_status,
4725 };
4726
4727 static void wan_shutdown(void)
4728 {
4729
4730 if (!acpi_evalf(NULL, NULL, "\\WGSV", "vd",
4731 TP_ACPI_WGSV_SAVE_STATE))
4732 pr_notice("failed to save WWAN state to NVRAM\n");
4733 else
4734 vdbg_printk(TPACPI_DBG_RFKILL,
4735 "WWAN state saved to NVRAM\n");
4736 }
4737
4738 static void wan_exit(void)
4739 {
4740 tpacpi_destroy_rfkill(TPACPI_RFK_WWAN_SW_ID);
4741 wan_shutdown();
4742 }
4743
4744 static int __init wan_init(struct ibm_init_struct *iibm)
4745 {
4746 int res;
4747 int status = 0;
4748
4749 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4750 "initializing wan subdriver\n");
4751
4752 TPACPI_ACPIHANDLE_INIT(hkey);
4753
4754 tp_features.wan = hkey_handle &&
4755 acpi_evalf(hkey_handle, &status, "GWAN", "qd");
4756
4757 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4758 "wan is %s, status 0x%02x\n",
4759 str_supported(tp_features.wan),
4760 status);
4761
4762 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4763 if (dbg_wwanemul) {
4764 tp_features.wan = 1;
4765 pr_info("wwan switch emulation enabled\n");
4766 } else
4767 #endif
4768 if (tp_features.wan &&
4769 !(status & TP_ACPI_WANCARD_HWPRESENT)) {
4770
4771 tp_features.wan = 0;
4772 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4773 "wan hardware not installed\n");
4774 }
4775
4776 if (!tp_features.wan)
4777 return -ENODEV;
4778
4779 res = tpacpi_new_rfkill(TPACPI_RFK_WWAN_SW_ID,
4780 &wan_tprfk_ops,
4781 RFKILL_TYPE_WWAN,
4782 TPACPI_RFK_WWAN_SW_NAME,
4783 true);
4784 return res;
4785 }
4786
4787
4788 static int wan_read(struct seq_file *m)
4789 {
4790 return tpacpi_rfk_procfs_read(TPACPI_RFK_WWAN_SW_ID, m);
4791 }
4792
4793 static int wan_write(char *buf)
4794 {
4795 return tpacpi_rfk_procfs_write(TPACPI_RFK_WWAN_SW_ID, buf);
4796 }
4797
4798 static struct ibm_struct wan_driver_data = {
4799 .name = "wan",
4800 .read = wan_read,
4801 .write = wan_write,
4802 .exit = wan_exit,
4803 .shutdown = wan_shutdown,
4804 };
4805
4806
4807
4808
4809
4810 enum {
4811
4812 TP_ACPI_UWB_HWPRESENT = 0x01,
4813 TP_ACPI_UWB_RADIOSSW = 0x02,
4814 };
4815
4816 #define TPACPI_RFK_UWB_SW_NAME "tpacpi_uwb_sw"
4817
4818 static int uwb_get_status(void)
4819 {
4820 int status;
4821
4822 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4823 if (dbg_uwbemul)
4824 return (tpacpi_uwb_emulstate) ?
4825 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4826 #endif
4827
4828 if (!acpi_evalf(hkey_handle, &status, "GUWB", "d"))
4829 return -EIO;
4830
4831 return ((status & TP_ACPI_UWB_RADIOSSW) != 0) ?
4832 TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF;
4833 }
4834
4835 static int uwb_set_status(enum tpacpi_rfkill_state state)
4836 {
4837 int status;
4838
4839 vdbg_printk(TPACPI_DBG_RFKILL, "will attempt to %s UWB\n",
4840 str_enable_disable(state == TPACPI_RFK_RADIO_ON));
4841
4842 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4843 if (dbg_uwbemul) {
4844 tpacpi_uwb_emulstate = (state == TPACPI_RFK_RADIO_ON);
4845 return 0;
4846 }
4847 #endif
4848
4849 if (state == TPACPI_RFK_RADIO_ON)
4850 status = TP_ACPI_UWB_RADIOSSW;
4851 else
4852 status = 0;
4853
4854 if (!acpi_evalf(hkey_handle, NULL, "SUWB", "vd", status))
4855 return -EIO;
4856
4857 return 0;
4858 }
4859
4860
4861
4862 static const struct tpacpi_rfk_ops uwb_tprfk_ops = {
4863 .get_status = uwb_get_status,
4864 .set_status = uwb_set_status,
4865 };
4866
4867 static void uwb_exit(void)
4868 {
4869 tpacpi_destroy_rfkill(TPACPI_RFK_UWB_SW_ID);
4870 }
4871
4872 static int __init uwb_init(struct ibm_init_struct *iibm)
4873 {
4874 int res;
4875 int status = 0;
4876
4877 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4878 "initializing uwb subdriver\n");
4879
4880 TPACPI_ACPIHANDLE_INIT(hkey);
4881
4882 tp_features.uwb = hkey_handle &&
4883 acpi_evalf(hkey_handle, &status, "GUWB", "qd");
4884
4885 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_RFKILL,
4886 "uwb is %s, status 0x%02x\n",
4887 str_supported(tp_features.uwb),
4888 status);
4889
4890 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
4891 if (dbg_uwbemul) {
4892 tp_features.uwb = 1;
4893 pr_info("uwb switch emulation enabled\n");
4894 } else
4895 #endif
4896 if (tp_features.uwb &&
4897 !(status & TP_ACPI_UWB_HWPRESENT)) {
4898
4899 tp_features.uwb = 0;
4900 dbg_printk(TPACPI_DBG_INIT,
4901 "uwb hardware not installed\n");
4902 }
4903
4904 if (!tp_features.uwb)
4905 return -ENODEV;
4906
4907 res = tpacpi_new_rfkill(TPACPI_RFK_UWB_SW_ID,
4908 &uwb_tprfk_ops,
4909 RFKILL_TYPE_UWB,
4910 TPACPI_RFK_UWB_SW_NAME,
4911 false);
4912 return res;
4913 }
4914
4915 static struct ibm_struct uwb_driver_data = {
4916 .name = "uwb",
4917 .exit = uwb_exit,
4918 .flags.experimental = 1,
4919 };
4920
4921
4922
4923
4924
4925 #ifdef CONFIG_THINKPAD_ACPI_VIDEO
4926
4927 enum video_access_mode {
4928 TPACPI_VIDEO_NONE = 0,
4929 TPACPI_VIDEO_570,
4930 TPACPI_VIDEO_770,
4931 TPACPI_VIDEO_NEW,
4932 };
4933
4934 enum {
4935 TP_ACPI_VIDEO_S_LCD = 0x01,
4936 TP_ACPI_VIDEO_S_CRT = 0x02,
4937 TP_ACPI_VIDEO_S_DVI = 0x08,
4938 };
4939
4940 enum {
4941 TP_ACPI_VIDEO_570_PHSCMD = 0x87,
4942 TP_ACPI_VIDEO_570_PHSMASK = 0x03,
4943
4944 TP_ACPI_VIDEO_570_PHS2CMD = 0x8b,
4945 TP_ACPI_VIDEO_570_PHS2SET = 0x80,
4946 };
4947
4948 static enum video_access_mode video_supported;
4949 static int video_orig_autosw;
4950
4951 static int video_autosw_get(void);
4952 static int video_autosw_set(int enable);
4953
4954 TPACPI_HANDLE(vid, root,
4955 "\\_SB.PCI.AGP.VGA",
4956 "\\_SB.PCI0.AGP0.VID0",
4957 "\\_SB.PCI0.VID0",
4958 "\\_SB.PCI0.VID",
4959 "\\_SB.PCI0.AGP.VGA",
4960 "\\_SB.PCI0.AGP.VID",
4961 );
4962
4963 TPACPI_HANDLE(vid2, root, "\\_SB.PCI0.AGPB.VID");
4964
4965 static int __init video_init(struct ibm_init_struct *iibm)
4966 {
4967 int ivga;
4968
4969 vdbg_printk(TPACPI_DBG_INIT, "initializing video subdriver\n");
4970
4971 TPACPI_ACPIHANDLE_INIT(vid);
4972 if (tpacpi_is_ibm())
4973 TPACPI_ACPIHANDLE_INIT(vid2);
4974
4975 if (vid2_handle && acpi_evalf(NULL, &ivga, "\\IVGA", "d") && ivga)
4976
4977 vid_handle = vid2_handle;
4978
4979 if (!vid_handle)
4980
4981 video_supported = TPACPI_VIDEO_NONE;
4982 else if (tpacpi_is_ibm() &&
4983 acpi_evalf(vid_handle, &video_orig_autosw, "SWIT", "qd"))
4984
4985 video_supported = TPACPI_VIDEO_570;
4986 else if (tpacpi_is_ibm() &&
4987 acpi_evalf(vid_handle, &video_orig_autosw, "^VADL", "qd"))
4988
4989 video_supported = TPACPI_VIDEO_770;
4990 else
4991
4992 video_supported = TPACPI_VIDEO_NEW;
4993
4994 vdbg_printk(TPACPI_DBG_INIT, "video is %s, mode %d\n",
4995 str_supported(video_supported != TPACPI_VIDEO_NONE),
4996 video_supported);
4997
4998 return (video_supported != TPACPI_VIDEO_NONE) ? 0 : -ENODEV;
4999 }
5000
5001 static void video_exit(void)
5002 {
5003 dbg_printk(TPACPI_DBG_EXIT,
5004 "restoring original video autoswitch mode\n");
5005 if (video_autosw_set(video_orig_autosw))
5006 pr_err("error while trying to restore original video autoswitch mode\n");
5007 }
5008
5009 static int video_outputsw_get(void)
5010 {
5011 int status = 0;
5012 int i;
5013
5014 switch (video_supported) {
5015 case TPACPI_VIDEO_570:
5016 if (!acpi_evalf(NULL, &i, "\\_SB.PHS", "dd",
5017 TP_ACPI_VIDEO_570_PHSCMD))
5018 return -EIO;
5019 status = i & TP_ACPI_VIDEO_570_PHSMASK;
5020 break;
5021 case TPACPI_VIDEO_770:
5022 if (!acpi_evalf(NULL, &i, "\\VCDL", "d"))
5023 return -EIO;
5024 if (i)
5025 status |= TP_ACPI_VIDEO_S_LCD;
5026 if (!acpi_evalf(NULL, &i, "\\VCDC", "d"))
5027 return -EIO;
5028 if (i)
5029 status |= TP_ACPI_VIDEO_S_CRT;
5030 break;
5031 case TPACPI_VIDEO_NEW:
5032 if (!acpi_evalf(NULL, NULL, "\\VUPS", "vd", 1) ||
5033 !acpi_evalf(NULL, &i, "\\VCDC", "d"))
5034 return -EIO;
5035 if (i)
5036 status |= TP_ACPI_VIDEO_S_CRT;
5037
5038 if (!acpi_evalf(NULL, NULL, "\\VUPS", "vd", 0) ||
5039 !acpi_evalf(NULL, &i, "\\VCDL", "d"))
5040 return -EIO;
5041 if (i)
5042 status |= TP_ACPI_VIDEO_S_LCD;
5043 if (!acpi_evalf(NULL, &i, "\\VCDD", "d"))
5044 return -EIO;
5045 if (i)
5046 status |= TP_ACPI_VIDEO_S_DVI;
5047 break;
5048 default:
5049 return -ENOSYS;
5050 }
5051
5052 return status;
5053 }
5054
5055 static int video_outputsw_set(int status)
5056 {
5057 int autosw;
5058 int res = 0;
5059
5060 switch (video_supported) {
5061 case TPACPI_VIDEO_570:
5062 res = acpi_evalf(NULL, NULL,
5063 "\\_SB.PHS2", "vdd",
5064 TP_ACPI_VIDEO_570_PHS2CMD,
5065 status | TP_ACPI_VIDEO_570_PHS2SET);
5066 break;
5067 case TPACPI_VIDEO_770:
5068 autosw = video_autosw_get();
5069 if (autosw < 0)
5070 return autosw;
5071
5072 res = video_autosw_set(1);
5073 if (res)
5074 return res;
5075 res = acpi_evalf(vid_handle, NULL,
5076 "ASWT", "vdd", status * 0x100, 0);
5077 if (!autosw && video_autosw_set(autosw)) {
5078 pr_err("video auto-switch left enabled due to error\n");
5079 return -EIO;
5080 }
5081 break;
5082 case TPACPI_VIDEO_NEW:
5083 res = acpi_evalf(NULL, NULL, "\\VUPS", "vd", 0x80) &&
5084 acpi_evalf(NULL, NULL, "\\VSDS", "vdd", status, 1);
5085 break;
5086 default:
5087 return -ENOSYS;
5088 }
5089
5090 return (res) ? 0 : -EIO;
5091 }
5092
5093 static int video_autosw_get(void)
5094 {
5095 int autosw = 0;
5096
5097 switch (video_supported) {
5098 case TPACPI_VIDEO_570:
5099 if (!acpi_evalf(vid_handle, &autosw, "SWIT", "d"))
5100 return -EIO;
5101 break;
5102 case TPACPI_VIDEO_770:
5103 case TPACPI_VIDEO_NEW:
5104 if (!acpi_evalf(vid_handle, &autosw, "^VDEE", "d"))
5105 return -EIO;
5106 break;
5107 default:
5108 return -ENOSYS;
5109 }
5110
5111 return autosw & 1;
5112 }
5113
5114 static int video_autosw_set(int enable)
5115 {
5116 if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", (enable) ? 1 : 0))
5117 return -EIO;
5118 return 0;
5119 }
5120
5121 static int video_outputsw_cycle(void)
5122 {
5123 int autosw = video_autosw_get();
5124 int res;
5125
5126 if (autosw < 0)
5127 return autosw;
5128
5129 switch (video_supported) {
5130 case TPACPI_VIDEO_570:
5131 res = video_autosw_set(1);
5132 if (res)
5133 return res;
5134 res = acpi_evalf(ec_handle, NULL, "_Q16", "v");
5135 break;
5136 case TPACPI_VIDEO_770:
5137 case TPACPI_VIDEO_NEW:
5138 res = video_autosw_set(1);
5139 if (res)
5140 return res;
5141 res = acpi_evalf(vid_handle, NULL, "VSWT", "v");
5142 break;
5143 default:
5144 return -ENOSYS;
5145 }
5146 if (!autosw && video_autosw_set(autosw)) {
5147 pr_err("video auto-switch left enabled due to error\n");
5148 return -EIO;
5149 }
5150
5151 return (res) ? 0 : -EIO;
5152 }
5153
5154 static int video_expand_toggle(void)
5155 {
5156 switch (video_supported) {
5157 case TPACPI_VIDEO_570:
5158 return acpi_evalf(ec_handle, NULL, "_Q17", "v") ?
5159 0 : -EIO;
5160 case TPACPI_VIDEO_770:
5161 return acpi_evalf(vid_handle, NULL, "VEXP", "v") ?
5162 0 : -EIO;
5163 case TPACPI_VIDEO_NEW:
5164 return acpi_evalf(NULL, NULL, "\\VEXP", "v") ?
5165 0 : -EIO;
5166 default:
5167 return -ENOSYS;
5168 }
5169
5170 }
5171
5172 static int video_read(struct seq_file *m)
5173 {
5174 int status, autosw;
5175
5176 if (video_supported == TPACPI_VIDEO_NONE) {
5177 seq_printf(m, "status:\t\tnot supported\n");
5178 return 0;
5179 }
5180
5181
5182 if (!capable(CAP_SYS_ADMIN))
5183 return -EPERM;
5184
5185 status = video_outputsw_get();
5186 if (status < 0)
5187 return status;
5188
5189 autosw = video_autosw_get();
5190 if (autosw < 0)
5191 return autosw;
5192
5193 seq_printf(m, "status:\t\tsupported\n");
5194 seq_printf(m, "lcd:\t\t%s\n", str_enabled_disabled(status & BIT(0)));
5195 seq_printf(m, "crt:\t\t%s\n", str_enabled_disabled(status & BIT(1)));
5196 if (video_supported == TPACPI_VIDEO_NEW)
5197 seq_printf(m, "dvi:\t\t%s\n", str_enabled_disabled(status & BIT(3)));
5198 seq_printf(m, "auto:\t\t%s\n", str_enabled_disabled(autosw & BIT(0)));
5199 seq_printf(m, "commands:\tlcd_enable, lcd_disable\n");
5200 seq_printf(m, "commands:\tcrt_enable, crt_disable\n");
5201 if (video_supported == TPACPI_VIDEO_NEW)
5202 seq_printf(m, "commands:\tdvi_enable, dvi_disable\n");
5203 seq_printf(m, "commands:\tauto_enable, auto_disable\n");
5204 seq_printf(m, "commands:\tvideo_switch, expand_toggle\n");
5205
5206 return 0;
5207 }
5208
5209 static int video_write(char *buf)
5210 {
5211 char *cmd;
5212 int enable, disable, status;
5213 int res;
5214
5215 if (video_supported == TPACPI_VIDEO_NONE)
5216 return -ENODEV;
5217
5218
5219 if (!capable(CAP_SYS_ADMIN))
5220 return -EPERM;
5221
5222 enable = 0;
5223 disable = 0;
5224
5225 while ((cmd = strsep(&buf, ","))) {
5226 if (strlencmp(cmd, "lcd_enable") == 0) {
5227 enable |= TP_ACPI_VIDEO_S_LCD;
5228 } else if (strlencmp(cmd, "lcd_disable") == 0) {
5229 disable |= TP_ACPI_VIDEO_S_LCD;
5230 } else if (strlencmp(cmd, "crt_enable") == 0) {
5231 enable |= TP_ACPI_VIDEO_S_CRT;
5232 } else if (strlencmp(cmd, "crt_disable") == 0) {
5233 disable |= TP_ACPI_VIDEO_S_CRT;
5234 } else if (video_supported == TPACPI_VIDEO_NEW &&
5235 strlencmp(cmd, "dvi_enable") == 0) {
5236 enable |= TP_ACPI_VIDEO_S_DVI;
5237 } else if (video_supported == TPACPI_VIDEO_NEW &&
5238 strlencmp(cmd, "dvi_disable") == 0) {
5239 disable |= TP_ACPI_VIDEO_S_DVI;
5240 } else if (strlencmp(cmd, "auto_enable") == 0) {
5241 res = video_autosw_set(1);
5242 if (res)
5243 return res;
5244 } else if (strlencmp(cmd, "auto_disable") == 0) {
5245 res = video_autosw_set(0);
5246 if (res)
5247 return res;
5248 } else if (strlencmp(cmd, "video_switch") == 0) {
5249 res = video_outputsw_cycle();
5250 if (res)
5251 return res;
5252 } else if (strlencmp(cmd, "expand_toggle") == 0) {
5253 res = video_expand_toggle();
5254 if (res)
5255 return res;
5256 } else
5257 return -EINVAL;
5258 }
5259
5260 if (enable || disable) {
5261 status = video_outputsw_get();
5262 if (status < 0)
5263 return status;
5264 res = video_outputsw_set((status & ~disable) | enable);
5265 if (res)
5266 return res;
5267 }
5268
5269 return 0;
5270 }
5271
5272 static struct ibm_struct video_driver_data = {
5273 .name = "video",
5274 .read = video_read,
5275 .write = video_write,
5276 .exit = video_exit,
5277 };
5278
5279 #endif
5280
5281
5282
5283
5284
5285 static enum led_brightness kbdlight_brightness;
5286 static DEFINE_MUTEX(kbdlight_mutex);
5287
5288 static int kbdlight_set_level(int level)
5289 {
5290 int ret = 0;
5291
5292 if (!hkey_handle)
5293 return -ENXIO;
5294
5295 mutex_lock(&kbdlight_mutex);
5296
5297 if (!acpi_evalf(hkey_handle, NULL, "MLCS", "dd", level))
5298 ret = -EIO;
5299 else
5300 kbdlight_brightness = level;
5301
5302 mutex_unlock(&kbdlight_mutex);
5303
5304 return ret;
5305 }
5306
5307 static int kbdlight_get_level(void)
5308 {
5309 int status = 0;
5310
5311 if (!hkey_handle)
5312 return -ENXIO;
5313
5314 if (!acpi_evalf(hkey_handle, &status, "MLCG", "dd", 0))
5315 return -EIO;
5316
5317 if (status < 0)
5318 return status;
5319
5320 return status & 0x3;
5321 }
5322
5323 static bool kbdlight_is_supported(void)
5324 {
5325 int status = 0;
5326
5327 if (!hkey_handle)
5328 return false;
5329
5330 if (!acpi_has_method(hkey_handle, "MLCG")) {
5331 vdbg_printk(TPACPI_DBG_INIT, "kbdlight MLCG is unavailable\n");
5332 return false;
5333 }
5334
5335 if (!acpi_evalf(hkey_handle, &status, "MLCG", "qdd", 0)) {
5336 vdbg_printk(TPACPI_DBG_INIT, "kbdlight MLCG failed\n");
5337 return false;
5338 }
5339
5340 if (status < 0) {
5341 vdbg_printk(TPACPI_DBG_INIT, "kbdlight MLCG err: %d\n", status);
5342 return false;
5343 }
5344
5345 vdbg_printk(TPACPI_DBG_INIT, "kbdlight MLCG returned 0x%x\n", status);
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365 return status & BIT(9);
5366 }
5367
5368 static int kbdlight_sysfs_set(struct led_classdev *led_cdev,
5369 enum led_brightness brightness)
5370 {
5371 return kbdlight_set_level(brightness);
5372 }
5373
5374 static enum led_brightness kbdlight_sysfs_get(struct led_classdev *led_cdev)
5375 {
5376 int level;
5377
5378 level = kbdlight_get_level();
5379 if (level < 0)
5380 return 0;
5381
5382 return level;
5383 }
5384
5385 static struct tpacpi_led_classdev tpacpi_led_kbdlight = {
5386 .led_classdev = {
5387 .name = "tpacpi::kbd_backlight",
5388 .max_brightness = 2,
5389 .flags = LED_BRIGHT_HW_CHANGED,
5390 .brightness_set_blocking = &kbdlight_sysfs_set,
5391 .brightness_get = &kbdlight_sysfs_get,
5392 }
5393 };
5394
5395 static int __init kbdlight_init(struct ibm_init_struct *iibm)
5396 {
5397 int rc;
5398
5399 vdbg_printk(TPACPI_DBG_INIT, "initializing kbdlight subdriver\n");
5400
5401 TPACPI_ACPIHANDLE_INIT(hkey);
5402
5403 if (!kbdlight_is_supported()) {
5404 tp_features.kbdlight = 0;
5405 vdbg_printk(TPACPI_DBG_INIT, "kbdlight is unsupported\n");
5406 return -ENODEV;
5407 }
5408
5409 kbdlight_brightness = kbdlight_sysfs_get(NULL);
5410 tp_features.kbdlight = 1;
5411
5412 rc = led_classdev_register(&tpacpi_pdev->dev,
5413 &tpacpi_led_kbdlight.led_classdev);
5414 if (rc < 0) {
5415 tp_features.kbdlight = 0;
5416 return rc;
5417 }
5418
5419 tpacpi_hotkey_driver_mask_set(hotkey_driver_mask |
5420 TP_ACPI_HKEY_KBD_LIGHT_MASK);
5421 return 0;
5422 }
5423
5424 static void kbdlight_exit(void)
5425 {
5426 led_classdev_unregister(&tpacpi_led_kbdlight.led_classdev);
5427 }
5428
5429 static int kbdlight_set_level_and_update(int level)
5430 {
5431 int ret;
5432 struct led_classdev *led_cdev;
5433
5434 ret = kbdlight_set_level(level);
5435 led_cdev = &tpacpi_led_kbdlight.led_classdev;
5436
5437 if (ret == 0 && !(led_cdev->flags & LED_SUSPENDED))
5438 led_cdev->brightness = level;
5439
5440 return ret;
5441 }
5442
5443 static int kbdlight_read(struct seq_file *m)
5444 {
5445 int level;
5446
5447 if (!tp_features.kbdlight) {
5448 seq_printf(m, "status:\t\tnot supported\n");
5449 } else {
5450 level = kbdlight_get_level();
5451 if (level < 0)
5452 seq_printf(m, "status:\t\terror %d\n", level);
5453 else
5454 seq_printf(m, "status:\t\t%d\n", level);
5455 seq_printf(m, "commands:\t0, 1, 2\n");
5456 }
5457
5458 return 0;
5459 }
5460
5461 static int kbdlight_write(char *buf)
5462 {
5463 char *cmd;
5464 int res, level = -EINVAL;
5465
5466 if (!tp_features.kbdlight)
5467 return -ENODEV;
5468
5469 while ((cmd = strsep(&buf, ","))) {
5470 res = kstrtoint(cmd, 10, &level);
5471 if (res < 0)
5472 return res;
5473 }
5474
5475 if (level >= 3 || level < 0)
5476 return -EINVAL;
5477
5478 return kbdlight_set_level_and_update(level);
5479 }
5480
5481 static void kbdlight_suspend(void)
5482 {
5483 struct led_classdev *led_cdev;
5484
5485 if (!tp_features.kbdlight)
5486 return;
5487
5488 led_cdev = &tpacpi_led_kbdlight.led_classdev;
5489 led_update_brightness(led_cdev);
5490 led_classdev_suspend(led_cdev);
5491 }
5492
5493 static void kbdlight_resume(void)
5494 {
5495 if (!tp_features.kbdlight)
5496 return;
5497
5498 led_classdev_resume(&tpacpi_led_kbdlight.led_classdev);
5499 }
5500
5501 static struct ibm_struct kbdlight_driver_data = {
5502 .name = "kbdlight",
5503 .read = kbdlight_read,
5504 .write = kbdlight_write,
5505 .suspend = kbdlight_suspend,
5506 .resume = kbdlight_resume,
5507 .exit = kbdlight_exit,
5508 };
5509
5510
5511
5512
5513
5514 TPACPI_HANDLE(lght, root, "\\LGHT");
5515 TPACPI_HANDLE(ledb, ec, "LEDB");
5516
5517 static int light_get_status(void)
5518 {
5519 int status = 0;
5520
5521 if (tp_features.light_status) {
5522 if (!acpi_evalf(ec_handle, &status, "KBLT", "d"))
5523 return -EIO;
5524 return (!!status);
5525 }
5526
5527 return -ENXIO;
5528 }
5529
5530 static int light_set_status(int status)
5531 {
5532 int rc;
5533
5534 if (tp_features.light) {
5535 if (cmos_handle) {
5536 rc = acpi_evalf(cmos_handle, NULL, NULL, "vd",
5537 (status) ?
5538 TP_CMOS_THINKLIGHT_ON :
5539 TP_CMOS_THINKLIGHT_OFF);
5540 } else {
5541 rc = acpi_evalf(lght_handle, NULL, NULL, "vd",
5542 (status) ? 1 : 0);
5543 }
5544 return (rc) ? 0 : -EIO;
5545 }
5546
5547 return -ENXIO;
5548 }
5549
5550 static int light_sysfs_set(struct led_classdev *led_cdev,
5551 enum led_brightness brightness)
5552 {
5553 return light_set_status((brightness != LED_OFF) ?
5554 TPACPI_LED_ON : TPACPI_LED_OFF);
5555 }
5556
5557 static enum led_brightness light_sysfs_get(struct led_classdev *led_cdev)
5558 {
5559 return (light_get_status() == 1) ? LED_FULL : LED_OFF;
5560 }
5561
5562 static struct tpacpi_led_classdev tpacpi_led_thinklight = {
5563 .led_classdev = {
5564 .name = "tpacpi::thinklight",
5565 .brightness_set_blocking = &light_sysfs_set,
5566 .brightness_get = &light_sysfs_get,
5567 }
5568 };
5569
5570 static int __init light_init(struct ibm_init_struct *iibm)
5571 {
5572 int rc;
5573
5574 vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n");
5575
5576 if (tpacpi_is_ibm()) {
5577 TPACPI_ACPIHANDLE_INIT(ledb);
5578 TPACPI_ACPIHANDLE_INIT(lght);
5579 }
5580 TPACPI_ACPIHANDLE_INIT(cmos);
5581
5582
5583 tp_features.light = (cmos_handle || lght_handle) && !ledb_handle;
5584
5585 if (tp_features.light)
5586
5587
5588 tp_features.light_status =
5589 acpi_evalf(ec_handle, NULL, "KBLT", "qv");
5590
5591 vdbg_printk(TPACPI_DBG_INIT, "light is %s, light status is %s\n",
5592 str_supported(tp_features.light),
5593 str_supported(tp_features.light_status));
5594
5595 if (!tp_features.light)
5596 return -ENODEV;
5597
5598 rc = led_classdev_register(&tpacpi_pdev->dev,
5599 &tpacpi_led_thinklight.led_classdev);
5600
5601 if (rc < 0) {
5602 tp_features.light = 0;
5603 tp_features.light_status = 0;
5604 } else {
5605 rc = 0;
5606 }
5607
5608 return rc;
5609 }
5610
5611 static void light_exit(void)
5612 {
5613 led_classdev_unregister(&tpacpi_led_thinklight.led_classdev);
5614 }
5615
5616 static int light_read(struct seq_file *m)
5617 {
5618 int status;
5619
5620 if (!tp_features.light) {
5621 seq_printf(m, "status:\t\tnot supported\n");
5622 } else if (!tp_features.light_status) {
5623 seq_printf(m, "status:\t\tunknown\n");
5624 seq_printf(m, "commands:\ton, off\n");
5625 } else {
5626 status = light_get_status();
5627 if (status < 0)
5628 return status;
5629 seq_printf(m, "status:\t\t%s\n", str_on_off(status & BIT(0)));
5630 seq_printf(m, "commands:\ton, off\n");
5631 }
5632
5633 return 0;
5634 }
5635
5636 static int light_write(char *buf)
5637 {
5638 char *cmd;
5639 int newstatus = 0;
5640
5641 if (!tp_features.light)
5642 return -ENODEV;
5643
5644 while ((cmd = strsep(&buf, ","))) {
5645 if (strlencmp(cmd, "on") == 0) {
5646 newstatus = 1;
5647 } else if (strlencmp(cmd, "off") == 0) {
5648 newstatus = 0;
5649 } else
5650 return -EINVAL;
5651 }
5652
5653 return light_set_status(newstatus);
5654 }
5655
5656 static struct ibm_struct light_driver_data = {
5657 .name = "light",
5658 .read = light_read,
5659 .write = light_write,
5660 .exit = light_exit,
5661 };
5662
5663
5664
5665
5666
5667
5668 static ssize_t cmos_command_store(struct device *dev,
5669 struct device_attribute *attr,
5670 const char *buf, size_t count)
5671 {
5672 unsigned long cmos_cmd;
5673 int res;
5674
5675 if (parse_strtoul(buf, 21, &cmos_cmd))
5676 return -EINVAL;
5677
5678 res = issue_thinkpad_cmos_command(cmos_cmd);
5679 return (res) ? res : count;
5680 }
5681
5682 static DEVICE_ATTR_WO(cmos_command);
5683
5684 static struct attribute *cmos_attributes[] = {
5685 &dev_attr_cmos_command.attr,
5686 NULL
5687 };
5688
5689 static umode_t cmos_attr_is_visible(struct kobject *kobj,
5690 struct attribute *attr, int n)
5691 {
5692 return cmos_handle ? attr->mode : 0;
5693 }
5694
5695 static const struct attribute_group cmos_attr_group = {
5696 .is_visible = cmos_attr_is_visible,
5697 .attrs = cmos_attributes,
5698 };
5699
5700
5701
5702 static int __init cmos_init(struct ibm_init_struct *iibm)
5703 {
5704 vdbg_printk(TPACPI_DBG_INIT,
5705 "initializing cmos commands subdriver\n");
5706
5707 TPACPI_ACPIHANDLE_INIT(cmos);
5708
5709 vdbg_printk(TPACPI_DBG_INIT, "cmos commands are %s\n",
5710 str_supported(cmos_handle != NULL));
5711
5712 return cmos_handle ? 0 : -ENODEV;
5713 }
5714
5715 static int cmos_read(struct seq_file *m)
5716 {
5717
5718
5719 if (!cmos_handle)
5720 seq_printf(m, "status:\t\tnot supported\n");
5721 else {
5722 seq_printf(m, "status:\t\tsupported\n");
5723 seq_printf(m, "commands:\t<cmd> (<cmd> is 0-21)\n");
5724 }
5725
5726 return 0;
5727 }
5728
5729 static int cmos_write(char *buf)
5730 {
5731 char *cmd;
5732 int cmos_cmd, res;
5733
5734 while ((cmd = strsep(&buf, ","))) {
5735 if (sscanf(cmd, "%u", &cmos_cmd) == 1 &&
5736 cmos_cmd >= 0 && cmos_cmd <= 21) {
5737
5738 } else
5739 return -EINVAL;
5740
5741 res = issue_thinkpad_cmos_command(cmos_cmd);
5742 if (res)
5743 return res;
5744 }
5745
5746 return 0;
5747 }
5748
5749 static struct ibm_struct cmos_driver_data = {
5750 .name = "cmos",
5751 .read = cmos_read,
5752 .write = cmos_write,
5753 };
5754
5755
5756
5757
5758
5759 enum led_access_mode {
5760 TPACPI_LED_NONE = 0,
5761 TPACPI_LED_570,
5762 TPACPI_LED_OLD,
5763 TPACPI_LED_NEW,
5764 };
5765
5766 enum {
5767 TPACPI_LED_EC_HLCL = 0x0c,
5768 TPACPI_LED_EC_HLBL = 0x0d,
5769 TPACPI_LED_EC_HLMS = 0x0e,
5770 };
5771
5772 static enum led_access_mode led_supported;
5773
5774 static acpi_handle led_handle;
5775
5776 #define TPACPI_LED_NUMLEDS 16
5777 static struct tpacpi_led_classdev *tpacpi_leds;
5778 static enum led_status_t tpacpi_led_state_cache[TPACPI_LED_NUMLEDS];
5779 static const char * const tpacpi_led_names[TPACPI_LED_NUMLEDS] = {
5780
5781 "tpacpi::power",
5782 "tpacpi:orange:batt",
5783 "tpacpi:green:batt",
5784 "tpacpi::dock_active",
5785 "tpacpi::bay_active",
5786 "tpacpi::dock_batt",
5787 "tpacpi::unknown_led",
5788 "tpacpi::standby",
5789 "tpacpi::dock_status1",
5790 "tpacpi::dock_status2",
5791 "tpacpi::lid_logo_dot",
5792 "tpacpi::unknown_led3",
5793 "tpacpi::thinkvantage",
5794 };
5795 #define TPACPI_SAFE_LEDS 0x1481U
5796
5797 static inline bool tpacpi_is_led_restricted(const unsigned int led)
5798 {
5799 #ifdef CONFIG_THINKPAD_ACPI_UNSAFE_LEDS
5800 return false;
5801 #else
5802 return (1U & (TPACPI_SAFE_LEDS >> led)) == 0;
5803 #endif
5804 }
5805
5806 static int led_get_status(const unsigned int led)
5807 {
5808 int status;
5809 enum led_status_t led_s;
5810
5811 switch (led_supported) {
5812 case TPACPI_LED_570:
5813 if (!acpi_evalf(ec_handle,
5814 &status, "GLED", "dd", 1 << led))
5815 return -EIO;
5816 led_s = (status == 0) ?
5817 TPACPI_LED_OFF :
5818 ((status == 1) ?
5819 TPACPI_LED_ON :
5820 TPACPI_LED_BLINK);
5821 tpacpi_led_state_cache[led] = led_s;
5822 return led_s;
5823 default:
5824 return -ENXIO;
5825 }
5826
5827
5828 }
5829
5830 static int led_set_status(const unsigned int led,
5831 const enum led_status_t ledstatus)
5832 {
5833
5834 static const unsigned int led_sled_arg1[] = { 0, 1, 3 };
5835 static const unsigned int led_led_arg1[] = { 0, 0x80, 0xc0 };
5836
5837 int rc = 0;
5838
5839 switch (led_supported) {
5840 case TPACPI_LED_570:
5841
5842 if (unlikely(led > 7))
5843 return -EINVAL;
5844 if (unlikely(tpacpi_is_led_restricted(led)))
5845 return -EPERM;
5846 if (!acpi_evalf(led_handle, NULL, NULL, "vdd",
5847 (1 << led), led_sled_arg1[ledstatus]))
5848 return -EIO;
5849 break;
5850 case TPACPI_LED_OLD:
5851
5852 if (unlikely(led > 7))
5853 return -EINVAL;
5854 if (unlikely(tpacpi_is_led_restricted(led)))
5855 return -EPERM;
5856 rc = ec_write(TPACPI_LED_EC_HLMS, (1 << led));
5857 if (rc >= 0)
5858 rc = ec_write(TPACPI_LED_EC_HLBL,
5859 (ledstatus == TPACPI_LED_BLINK) << led);
5860 if (rc >= 0)
5861 rc = ec_write(TPACPI_LED_EC_HLCL,
5862 (ledstatus != TPACPI_LED_OFF) << led);
5863 break;
5864 case TPACPI_LED_NEW:
5865
5866 if (unlikely(led >= TPACPI_LED_NUMLEDS))
5867 return -EINVAL;
5868 if (unlikely(tpacpi_is_led_restricted(led)))
5869 return -EPERM;
5870 if (!acpi_evalf(led_handle, NULL, NULL, "vdd",
5871 led, led_led_arg1[ledstatus]))
5872 return -EIO;
5873 break;
5874 default:
5875 return -ENXIO;
5876 }
5877
5878 if (!rc)
5879 tpacpi_led_state_cache[led] = ledstatus;
5880
5881 return rc;
5882 }
5883
5884 static int led_sysfs_set(struct led_classdev *led_cdev,
5885 enum led_brightness brightness)
5886 {
5887 struct tpacpi_led_classdev *data = container_of(led_cdev,
5888 struct tpacpi_led_classdev, led_classdev);
5889 enum led_status_t new_state;
5890
5891 if (brightness == LED_OFF)
5892 new_state = TPACPI_LED_OFF;
5893 else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK)
5894 new_state = TPACPI_LED_ON;
5895 else
5896 new_state = TPACPI_LED_BLINK;
5897
5898 return led_set_status(data->led, new_state);
5899 }
5900
5901 static int led_sysfs_blink_set(struct led_classdev *led_cdev,
5902 unsigned long *delay_on, unsigned long *delay_off)
5903 {
5904 struct tpacpi_led_classdev *data = container_of(led_cdev,
5905 struct tpacpi_led_classdev, led_classdev);
5906
5907
5908 if (*delay_on == 0 && *delay_off == 0) {
5909
5910 *delay_on = 500;
5911 *delay_off = 500;
5912 } else if ((*delay_on != 500) || (*delay_off != 500))
5913 return -EINVAL;
5914
5915 return led_set_status(data->led, TPACPI_LED_BLINK);
5916 }
5917
5918 static enum led_brightness led_sysfs_get(struct led_classdev *led_cdev)
5919 {
5920 int rc;
5921
5922 struct tpacpi_led_classdev *data = container_of(led_cdev,
5923 struct tpacpi_led_classdev, led_classdev);
5924
5925 rc = led_get_status(data->led);
5926
5927 if (rc == TPACPI_LED_OFF || rc < 0)
5928 rc = LED_OFF;
5929 else
5930 rc = LED_FULL;
5931
5932 return rc;
5933 }
5934
5935 static void led_exit(void)
5936 {
5937 unsigned int i;
5938
5939 for (i = 0; i < TPACPI_LED_NUMLEDS; i++)
5940 led_classdev_unregister(&tpacpi_leds[i].led_classdev);
5941
5942 kfree(tpacpi_leds);
5943 }
5944
5945 static int __init tpacpi_init_led(unsigned int led)
5946 {
5947
5948 if (!tpacpi_led_names[led])
5949 return 0;
5950
5951 tpacpi_leds[led].led_classdev.brightness_set_blocking = &led_sysfs_set;
5952 tpacpi_leds[led].led_classdev.blink_set = &led_sysfs_blink_set;
5953 if (led_supported == TPACPI_LED_570)
5954 tpacpi_leds[led].led_classdev.brightness_get = &led_sysfs_get;
5955
5956 tpacpi_leds[led].led_classdev.name = tpacpi_led_names[led];
5957 tpacpi_leds[led].led_classdev.flags = LED_RETAIN_AT_SHUTDOWN;
5958 tpacpi_leds[led].led = led;
5959
5960 return led_classdev_register(&tpacpi_pdev->dev, &tpacpi_leds[led].led_classdev);
5961 }
5962
5963 static const struct tpacpi_quirk led_useful_qtable[] __initconst = {
5964 TPACPI_Q_IBM('1', 'E', 0x009f),
5965 TPACPI_Q_IBM('1', 'N', 0x009f),
5966 TPACPI_Q_IBM('1', 'G', 0x009f),
5967
5968 TPACPI_Q_IBM('1', 'I', 0x0097),
5969 TPACPI_Q_IBM('1', 'R', 0x0097),
5970 TPACPI_Q_IBM('7', '0', 0x0097),
5971 TPACPI_Q_IBM('1', 'Y', 0x0097),
5972 TPACPI_Q_IBM('1', 'W', 0x0097),
5973 TPACPI_Q_IBM('1', 'V', 0x0097),
5974 TPACPI_Q_IBM('7', '8', 0x0097),
5975 TPACPI_Q_IBM('7', '6', 0x0097),
5976
5977 TPACPI_Q_IBM('1', 'K', 0x00bf),
5978 TPACPI_Q_IBM('1', 'Q', 0x00bf),
5979 TPACPI_Q_IBM('1', 'U', 0x00bf),
5980 TPACPI_Q_IBM('7', '4', 0x00bf),
5981 TPACPI_Q_IBM('7', '5', 0x00bf),
5982
5983 TPACPI_Q_IBM('7', '9', 0x1f97),
5984 TPACPI_Q_IBM('7', '7', 0x1f97),
5985 TPACPI_Q_IBM('7', 'F', 0x1f97),
5986 TPACPI_Q_IBM('7', 'B', 0x1fb7),
5987
5988
5989
5990
5991 {
5992 .vendor = PCI_VENDOR_ID_LENOVO,
5993 .bios = TPACPI_MATCH_ANY, .ec = TPACPI_MATCH_ANY,
5994 .quirks = 0x1fffU,
5995 },
5996 {
5997 .vendor = PCI_VENDOR_ID_IBM,
5998 .bios = TPACPI_MATCH_ANY, .ec = TPACPI_MATCH_UNKNOWN,
5999 .quirks = 0x00ffU,
6000 },
6001 {
6002 .vendor = PCI_VENDOR_ID_IBM,
6003 .bios = TPACPI_MATCH_ANY, .ec = TPACPI_MATCH_ANY,
6004 .quirks = 0x00bfU,
6005 },
6006 };
6007
6008 static enum led_access_mode __init led_init_detect_mode(void)
6009 {
6010 acpi_status status;
6011
6012 if (tpacpi_is_ibm()) {
6013
6014 status = acpi_get_handle(ec_handle, "SLED", &led_handle);
6015 if (ACPI_SUCCESS(status))
6016 return TPACPI_LED_570;
6017
6018
6019 status = acpi_get_handle(ec_handle, "SYSL", &led_handle);
6020 if (ACPI_SUCCESS(status))
6021 return TPACPI_LED_OLD;
6022 }
6023
6024
6025 status = acpi_get_handle(ec_handle, "LED", &led_handle);
6026 if (ACPI_SUCCESS(status))
6027 return TPACPI_LED_NEW;
6028
6029
6030 led_handle = NULL;
6031 return TPACPI_LED_NONE;
6032 }
6033
6034 static int __init led_init(struct ibm_init_struct *iibm)
6035 {
6036 unsigned int i;
6037 int rc;
6038 unsigned long useful_leds;
6039
6040 vdbg_printk(TPACPI_DBG_INIT, "initializing LED subdriver\n");
6041
6042 led_supported = led_init_detect_mode();
6043
6044 if (led_supported != TPACPI_LED_NONE) {
6045 useful_leds = tpacpi_check_quirks(led_useful_qtable,
6046 ARRAY_SIZE(led_useful_qtable));
6047
6048 if (!useful_leds) {
6049 led_handle = NULL;
6050 led_supported = TPACPI_LED_NONE;
6051 }
6052 }
6053
6054 vdbg_printk(TPACPI_DBG_INIT, "LED commands are %s, mode %d\n",
6055 str_supported(led_supported), led_supported);
6056
6057 if (led_supported == TPACPI_LED_NONE)
6058 return -ENODEV;
6059
6060 tpacpi_leds = kcalloc(TPACPI_LED_NUMLEDS, sizeof(*tpacpi_leds),
6061 GFP_KERNEL);
6062 if (!tpacpi_leds) {
6063 pr_err("Out of memory for LED data\n");
6064 return -ENOMEM;
6065 }
6066
6067 for (i = 0; i < TPACPI_LED_NUMLEDS; i++) {
6068 tpacpi_leds[i].led = -1;
6069
6070 if (!tpacpi_is_led_restricted(i) && test_bit(i, &useful_leds)) {
6071 rc = tpacpi_init_led(i);
6072 if (rc < 0) {
6073 led_exit();
6074 return rc;
6075 }
6076 }
6077 }
6078
6079 #ifdef CONFIG_THINKPAD_ACPI_UNSAFE_LEDS
6080 pr_notice("warning: userspace override of important firmware LEDs is enabled\n");
6081 #endif
6082 return 0;
6083 }
6084
6085 #define str_led_status(s) ((s) >= TPACPI_LED_BLINK ? "blinking" : str_on_off(s))
6086
6087 static int led_read(struct seq_file *m)
6088 {
6089 if (!led_supported) {
6090 seq_printf(m, "status:\t\tnot supported\n");
6091 return 0;
6092 }
6093 seq_printf(m, "status:\t\tsupported\n");
6094
6095 if (led_supported == TPACPI_LED_570) {
6096
6097 int i, status;
6098 for (i = 0; i < 8; i++) {
6099 status = led_get_status(i);
6100 if (status < 0)
6101 return -EIO;
6102 seq_printf(m, "%d:\t\t%s\n", i, str_led_status(status));
6103 }
6104 }
6105
6106 seq_printf(m, "commands:\t<led> on, <led> off, <led> blink (<led> is 0-15)\n");
6107
6108 return 0;
6109 }
6110
6111 static int led_write(char *buf)
6112 {
6113 char *cmd;
6114 int led, rc;
6115 enum led_status_t s;
6116
6117 if (!led_supported)
6118 return -ENODEV;
6119
6120 while ((cmd = strsep(&buf, ","))) {
6121 if (sscanf(cmd, "%d", &led) != 1)
6122 return -EINVAL;
6123
6124 if (led < 0 || led > (TPACPI_LED_NUMLEDS - 1))
6125 return -ENODEV;
6126
6127 if (tpacpi_leds[led].led < 0)
6128 return -ENODEV;
6129
6130 if (strstr(cmd, "off")) {
6131 s = TPACPI_LED_OFF;
6132 } else if (strstr(cmd, "on")) {
6133 s = TPACPI_LED_ON;
6134 } else if (strstr(cmd, "blink")) {
6135 s = TPACPI_LED_BLINK;
6136 } else {
6137 return -EINVAL;
6138 }
6139
6140 rc = led_set_status(led, s);
6141 if (rc < 0)
6142 return rc;
6143 }
6144
6145 return 0;
6146 }
6147
6148 static struct ibm_struct led_driver_data = {
6149 .name = "led",
6150 .read = led_read,
6151 .write = led_write,
6152 .exit = led_exit,
6153 };
6154
6155
6156
6157
6158
6159 TPACPI_HANDLE(beep, ec, "BEEP");
6160
6161 #define TPACPI_BEEP_Q1 0x0001
6162
6163 static const struct tpacpi_quirk beep_quirk_table[] __initconst = {
6164 TPACPI_Q_IBM('I', 'M', TPACPI_BEEP_Q1),
6165 TPACPI_Q_IBM('I', 'U', TPACPI_BEEP_Q1),
6166 };
6167
6168 static int __init beep_init(struct ibm_init_struct *iibm)
6169 {
6170 unsigned long quirks;
6171
6172 vdbg_printk(TPACPI_DBG_INIT, "initializing beep subdriver\n");
6173
6174 TPACPI_ACPIHANDLE_INIT(beep);
6175
6176 vdbg_printk(TPACPI_DBG_INIT, "beep is %s\n",
6177 str_supported(beep_handle != NULL));
6178
6179 quirks = tpacpi_check_quirks(beep_quirk_table,
6180 ARRAY_SIZE(beep_quirk_table));
6181
6182 tp_features.beep_needs_two_args = !!(quirks & TPACPI_BEEP_Q1);
6183
6184 return (beep_handle) ? 0 : -ENODEV;
6185 }
6186
6187 static int beep_read(struct seq_file *m)
6188 {
6189 if (!beep_handle)
6190 seq_printf(m, "status:\t\tnot supported\n");
6191 else {
6192 seq_printf(m, "status:\t\tsupported\n");
6193 seq_printf(m, "commands:\t<cmd> (<cmd> is 0-17)\n");
6194 }
6195
6196 return 0;
6197 }
6198
6199 static int beep_write(char *buf)
6200 {
6201 char *cmd;
6202 int beep_cmd;
6203
6204 if (!beep_handle)
6205 return -ENODEV;
6206
6207 while ((cmd = strsep(&buf, ","))) {
6208 if (sscanf(cmd, "%u", &beep_cmd) == 1 &&
6209 beep_cmd >= 0 && beep_cmd <= 17) {
6210
6211 } else
6212 return -EINVAL;
6213 if (tp_features.beep_needs_two_args) {
6214 if (!acpi_evalf(beep_handle, NULL, NULL, "vdd",
6215 beep_cmd, 0))
6216 return -EIO;
6217 } else {
6218 if (!acpi_evalf(beep_handle, NULL, NULL, "vd",
6219 beep_cmd))
6220 return -EIO;
6221 }
6222 }
6223
6224 return 0;
6225 }
6226
6227 static struct ibm_struct beep_driver_data = {
6228 .name = "beep",
6229 .read = beep_read,
6230 .write = beep_write,
6231 };
6232
6233
6234
6235
6236
6237 enum thermal_access_mode {
6238 TPACPI_THERMAL_NONE = 0,
6239 TPACPI_THERMAL_ACPI_TMP07,
6240 TPACPI_THERMAL_ACPI_UPDT,
6241 TPACPI_THERMAL_TPEC_8,
6242 TPACPI_THERMAL_TPEC_16,
6243 };
6244
6245 enum {
6246 TP_EC_THERMAL_TMP0 = 0x78,
6247 TP_EC_THERMAL_TMP8 = 0xC0,
6248 TP_EC_FUNCREV = 0xEF,
6249 TP_EC_THERMAL_TMP_NA = -128,
6250
6251 TPACPI_THERMAL_SENSOR_NA = -128000,
6252 };
6253
6254
6255 #define TPACPI_MAX_THERMAL_SENSORS 16
6256 struct ibm_thermal_sensors_struct {
6257 s32 temp[TPACPI_MAX_THERMAL_SENSORS];
6258 };
6259
6260 static enum thermal_access_mode thermal_read_mode;
6261 static bool thermal_use_labels;
6262
6263
6264 static int thermal_get_sensor(int idx, s32 *value)
6265 {
6266 int t;
6267 s8 tmp;
6268 char tmpi[5];
6269
6270 t = TP_EC_THERMAL_TMP0;
6271
6272 switch (thermal_read_mode) {
6273 #if TPACPI_MAX_THERMAL_SENSORS >= 16
6274 case TPACPI_THERMAL_TPEC_16:
6275 if (idx >= 8 && idx <= 15) {
6276 t = TP_EC_THERMAL_TMP8;
6277 idx -= 8;
6278 }
6279 #endif
6280 fallthrough;
6281 case TPACPI_THERMAL_TPEC_8:
6282 if (idx <= 7) {
6283 if (!acpi_ec_read(t + idx, &tmp))
6284 return -EIO;
6285 *value = tmp * 1000;
6286 return 0;
6287 }
6288 break;
6289
6290 case TPACPI_THERMAL_ACPI_UPDT:
6291 if (idx <= 7) {
6292 snprintf(tmpi, sizeof(tmpi), "TMP%c", '0' + idx);
6293 if (!acpi_evalf(ec_handle, NULL, "UPDT", "v"))
6294 return -EIO;
6295 if (!acpi_evalf(ec_handle, &t, tmpi, "d"))
6296 return -EIO;
6297 *value = (t - 2732) * 100;
6298 return 0;
6299 }
6300 break;
6301
6302 case TPACPI_THERMAL_ACPI_TMP07:
6303 if (idx <= 7) {
6304 snprintf(tmpi, sizeof(tmpi), "TMP%c", '0' + idx);
6305 if (!acpi_evalf(ec_handle, &t, tmpi, "d"))
6306 return -EIO;
6307 if (t > 127 || t < -127)
6308 t = TP_EC_THERMAL_TMP_NA;
6309 *value = t * 1000;
6310 return 0;
6311 }
6312 break;
6313
6314 case TPACPI_THERMAL_NONE:
6315 default:
6316 return -ENOSYS;
6317 }
6318
6319 return -EINVAL;
6320 }
6321
6322 static int thermal_get_sensors(struct ibm_thermal_sensors_struct *s)
6323 {
6324 int res, i;
6325 int n;
6326
6327 n = 8;
6328 i = 0;
6329
6330 if (!s)
6331 return -EINVAL;
6332
6333 if (thermal_read_mode == TPACPI_THERMAL_TPEC_16)
6334 n = 16;
6335
6336 for (i = 0 ; i < n; i++) {
6337 res = thermal_get_sensor(i, &s->temp[i]);
6338 if (res)
6339 return res;
6340 }
6341
6342 return n;
6343 }
6344
6345 static void thermal_dump_all_sensors(void)
6346 {
6347 int n, i;
6348 struct ibm_thermal_sensors_struct t;
6349
6350 n = thermal_get_sensors(&t);
6351 if (n <= 0)
6352 return;
6353
6354 pr_notice("temperatures (Celsius):");
6355
6356 for (i = 0; i < n; i++) {
6357 if (t.temp[i] != TPACPI_THERMAL_SENSOR_NA)
6358 pr_cont(" %d", (int)(t.temp[i] / 1000));
6359 else
6360 pr_cont(" N/A");
6361 }
6362
6363 pr_cont("\n");
6364 }
6365
6366
6367
6368 static ssize_t thermal_temp_input_show(struct device *dev,
6369 struct device_attribute *attr,
6370 char *buf)
6371 {
6372 struct sensor_device_attribute *sensor_attr =
6373 to_sensor_dev_attr(attr);
6374 int idx = sensor_attr->index;
6375 s32 value;
6376 int res;
6377
6378 res = thermal_get_sensor(idx, &value);
6379 if (res)
6380 return res;
6381 if (value == TPACPI_THERMAL_SENSOR_NA)
6382 return -ENXIO;
6383
6384 return sysfs_emit(buf, "%d\n", value);
6385 }
6386
6387 #define THERMAL_SENSOR_ATTR_TEMP(_idxA, _idxB) \
6388 SENSOR_ATTR(temp##_idxA##_input, S_IRUGO, \
6389 thermal_temp_input_show, NULL, _idxB)
6390
6391 static struct sensor_device_attribute sensor_dev_attr_thermal_temp_input[] = {
6392 THERMAL_SENSOR_ATTR_TEMP(1, 0),
6393 THERMAL_SENSOR_ATTR_TEMP(2, 1),
6394 THERMAL_SENSOR_ATTR_TEMP(3, 2),
6395 THERMAL_SENSOR_ATTR_TEMP(4, 3),
6396 THERMAL_SENSOR_ATTR_TEMP(5, 4),
6397 THERMAL_SENSOR_ATTR_TEMP(6, 5),
6398 THERMAL_SENSOR_ATTR_TEMP(7, 6),
6399 THERMAL_SENSOR_ATTR_TEMP(8, 7),
6400 THERMAL_SENSOR_ATTR_TEMP(9, 8),
6401 THERMAL_SENSOR_ATTR_TEMP(10, 9),
6402 THERMAL_SENSOR_ATTR_TEMP(11, 10),
6403 THERMAL_SENSOR_ATTR_TEMP(12, 11),
6404 THERMAL_SENSOR_ATTR_TEMP(13, 12),
6405 THERMAL_SENSOR_ATTR_TEMP(14, 13),
6406 THERMAL_SENSOR_ATTR_TEMP(15, 14),
6407 THERMAL_SENSOR_ATTR_TEMP(16, 15),
6408 };
6409
6410 #define THERMAL_ATTRS(X) \
6411 &sensor_dev_attr_thermal_temp_input[X].dev_attr.attr
6412
6413 static struct attribute *thermal_temp_input_attr[] = {
6414 THERMAL_ATTRS(0),
6415 THERMAL_ATTRS(1),
6416 THERMAL_ATTRS(2),
6417 THERMAL_ATTRS(3),
6418 THERMAL_ATTRS(4),
6419 THERMAL_ATTRS(5),
6420 THERMAL_ATTRS(6),
6421 THERMAL_ATTRS(7),
6422 THERMAL_ATTRS(8),
6423 THERMAL_ATTRS(9),
6424 THERMAL_ATTRS(10),
6425 THERMAL_ATTRS(11),
6426 THERMAL_ATTRS(12),
6427 THERMAL_ATTRS(13),
6428 THERMAL_ATTRS(14),
6429 THERMAL_ATTRS(15),
6430 NULL
6431 };
6432
6433 static umode_t thermal_attr_is_visible(struct kobject *kobj,
6434 struct attribute *attr, int n)
6435 {
6436 if (thermal_read_mode == TPACPI_THERMAL_NONE)
6437 return 0;
6438
6439 if (attr == THERMAL_ATTRS(8) || attr == THERMAL_ATTRS(9) ||
6440 attr == THERMAL_ATTRS(10) || attr == THERMAL_ATTRS(11) ||
6441 attr == THERMAL_ATTRS(12) || attr == THERMAL_ATTRS(13) ||
6442 attr == THERMAL_ATTRS(14) || attr == THERMAL_ATTRS(15)) {
6443 if (thermal_read_mode != TPACPI_THERMAL_TPEC_16)
6444 return 0;
6445 }
6446
6447 return attr->mode;
6448 }
6449
6450 static const struct attribute_group thermal_attr_group = {
6451 .is_visible = thermal_attr_is_visible,
6452 .attrs = thermal_temp_input_attr,
6453 };
6454
6455 #undef THERMAL_SENSOR_ATTR_TEMP
6456 #undef THERMAL_ATTRS
6457
6458 static ssize_t temp1_label_show(struct device *dev, struct device_attribute *attr, char *buf)
6459 {
6460 return sysfs_emit(buf, "CPU\n");
6461 }
6462 static DEVICE_ATTR_RO(temp1_label);
6463
6464 static ssize_t temp2_label_show(struct device *dev, struct device_attribute *attr, char *buf)
6465 {
6466 return sysfs_emit(buf, "GPU\n");
6467 }
6468 static DEVICE_ATTR_RO(temp2_label);
6469
6470 static struct attribute *temp_label_attributes[] = {
6471 &dev_attr_temp1_label.attr,
6472 &dev_attr_temp2_label.attr,
6473 NULL
6474 };
6475
6476 static umode_t temp_label_attr_is_visible(struct kobject *kobj,
6477 struct attribute *attr, int n)
6478 {
6479 return thermal_use_labels ? attr->mode : 0;
6480 }
6481
6482 static const struct attribute_group temp_label_attr_group = {
6483 .is_visible = temp_label_attr_is_visible,
6484 .attrs = temp_label_attributes,
6485 };
6486
6487
6488
6489 static int __init thermal_init(struct ibm_init_struct *iibm)
6490 {
6491 u8 t, ta1, ta2, ver = 0;
6492 int i;
6493 int acpi_tmp7;
6494
6495 vdbg_printk(TPACPI_DBG_INIT, "initializing thermal subdriver\n");
6496
6497 acpi_tmp7 = acpi_evalf(ec_handle, NULL, "TMP7", "qv");
6498
6499 if (thinkpad_id.ec_model) {
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511 if (!acpi_ec_read(TP_EC_FUNCREV, &ver))
6512 pr_warn("Thinkpad ACPI EC unable to access EC version\n");
6513
6514 ta1 = ta2 = 0;
6515 for (i = 0; i < 8; i++) {
6516 if (acpi_ec_read(TP_EC_THERMAL_TMP0 + i, &t)) {
6517 ta1 |= t;
6518 } else {
6519 ta1 = 0;
6520 break;
6521 }
6522 if (ver < 3) {
6523 if (acpi_ec_read(TP_EC_THERMAL_TMP8 + i, &t)) {
6524 ta2 |= t;
6525 } else {
6526 ta1 = 0;
6527 break;
6528 }
6529 }
6530 }
6531 if (ta1 == 0) {
6532
6533 if (acpi_tmp7) {
6534 pr_err("ThinkPad ACPI EC access misbehaving, falling back to ACPI TMPx access mode\n");
6535 thermal_read_mode = TPACPI_THERMAL_ACPI_TMP07;
6536 } else {
6537 pr_err("ThinkPad ACPI EC access misbehaving, disabling thermal sensors access\n");
6538 thermal_read_mode = TPACPI_THERMAL_NONE;
6539 }
6540 } else {
6541 if (ver >= 3) {
6542 thermal_read_mode = TPACPI_THERMAL_TPEC_8;
6543 thermal_use_labels = true;
6544 } else {
6545 thermal_read_mode =
6546 (ta2 != 0) ?
6547 TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
6548 }
6549 }
6550 } else if (acpi_tmp7) {
6551 if (tpacpi_is_ibm() &&
6552 acpi_evalf(ec_handle, NULL, "UPDT", "qv")) {
6553
6554 thermal_read_mode = TPACPI_THERMAL_ACPI_UPDT;
6555 } else {
6556
6557 thermal_read_mode = TPACPI_THERMAL_ACPI_TMP07;
6558 }
6559 } else {
6560
6561 thermal_read_mode = TPACPI_THERMAL_NONE;
6562 }
6563
6564 vdbg_printk(TPACPI_DBG_INIT, "thermal is %s, mode %d\n",
6565 str_supported(thermal_read_mode != TPACPI_THERMAL_NONE),
6566 thermal_read_mode);
6567
6568 return thermal_read_mode != TPACPI_THERMAL_NONE ? 0 : -ENODEV;
6569 }
6570
6571 static int thermal_read(struct seq_file *m)
6572 {
6573 int n, i;
6574 struct ibm_thermal_sensors_struct t;
6575
6576 n = thermal_get_sensors(&t);
6577 if (unlikely(n < 0))
6578 return n;
6579
6580 seq_printf(m, "temperatures:\t");
6581
6582 if (n > 0) {
6583 for (i = 0; i < (n - 1); i++)
6584 seq_printf(m, "%d ", t.temp[i] / 1000);
6585 seq_printf(m, "%d\n", t.temp[i] / 1000);
6586 } else
6587 seq_printf(m, "not supported\n");
6588
6589 return 0;
6590 }
6591
6592 static struct ibm_struct thermal_driver_data = {
6593 .name = "thermal",
6594 .read = thermal_read,
6595 };
6596
6597
6598
6599
6600
6601 #define TPACPI_BACKLIGHT_DEV_NAME "thinkpad_screen"
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621 enum {
6622 TP_EC_BACKLIGHT = 0x31,
6623
6624
6625 TP_EC_BACKLIGHT_LVLMSK = 0x1F,
6626 TP_EC_BACKLIGHT_CMDMSK = 0xE0,
6627 TP_EC_BACKLIGHT_MAPSW = 0x20,
6628 };
6629
6630 enum tpacpi_brightness_access_mode {
6631 TPACPI_BRGHT_MODE_AUTO = 0,
6632 TPACPI_BRGHT_MODE_EC,
6633 TPACPI_BRGHT_MODE_UCMS_STEP,
6634 TPACPI_BRGHT_MODE_ECNVRAM,
6635 TPACPI_BRGHT_MODE_MAX
6636 };
6637
6638 static struct backlight_device *ibm_backlight_device;
6639
6640 static enum tpacpi_brightness_access_mode brightness_mode =
6641 TPACPI_BRGHT_MODE_MAX;
6642
6643 static unsigned int brightness_enable = 2;
6644
6645 static struct mutex brightness_mutex;
6646
6647
6648
6649 static unsigned int tpacpi_brightness_nvram_get(void)
6650 {
6651 u8 lnvram;
6652
6653 lnvram = (nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS)
6654 & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
6655 >> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
6656 lnvram &= bright_maxlvl;
6657
6658 return lnvram;
6659 }
6660
6661 static void tpacpi_brightness_checkpoint_nvram(void)
6662 {
6663 u8 lec = 0;
6664 u8 b_nvram;
6665
6666 if (brightness_mode != TPACPI_BRGHT_MODE_ECNVRAM)
6667 return;
6668
6669 vdbg_printk(TPACPI_DBG_BRGHT,
6670 "trying to checkpoint backlight level to NVRAM...\n");
6671
6672 if (mutex_lock_killable(&brightness_mutex) < 0)
6673 return;
6674
6675 if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec)))
6676 goto unlock;
6677 lec &= TP_EC_BACKLIGHT_LVLMSK;
6678 b_nvram = nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS);
6679
6680 if (lec != ((b_nvram & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
6681 >> TP_NVRAM_POS_LEVEL_BRIGHTNESS)) {
6682
6683 b_nvram &= ~(TP_NVRAM_MASK_LEVEL_BRIGHTNESS <<
6684 TP_NVRAM_POS_LEVEL_BRIGHTNESS);
6685 b_nvram |= lec;
6686 nvram_write_byte(b_nvram, TP_NVRAM_ADDR_BRIGHTNESS);
6687 dbg_printk(TPACPI_DBG_BRGHT,
6688 "updated NVRAM backlight level to %u (0x%02x)\n",
6689 (unsigned int) lec, (unsigned int) b_nvram);
6690 } else
6691 vdbg_printk(TPACPI_DBG_BRGHT,
6692 "NVRAM backlight level already is %u (0x%02x)\n",
6693 (unsigned int) lec, (unsigned int) b_nvram);
6694
6695 unlock:
6696 mutex_unlock(&brightness_mutex);
6697 }
6698
6699
6700
6701 static int tpacpi_brightness_get_raw(int *status)
6702 {
6703 u8 lec = 0;
6704
6705 switch (brightness_mode) {
6706 case TPACPI_BRGHT_MODE_UCMS_STEP:
6707 *status = tpacpi_brightness_nvram_get();
6708 return 0;
6709 case TPACPI_BRGHT_MODE_EC:
6710 case TPACPI_BRGHT_MODE_ECNVRAM:
6711 if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec)))
6712 return -EIO;
6713 *status = lec;
6714 return 0;
6715 default:
6716 return -ENXIO;
6717 }
6718 }
6719
6720
6721
6722 static int tpacpi_brightness_set_ec(unsigned int value)
6723 {
6724 u8 lec = 0;
6725
6726 if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec)))
6727 return -EIO;
6728
6729 if (unlikely(!acpi_ec_write(TP_EC_BACKLIGHT,
6730 (lec & TP_EC_BACKLIGHT_CMDMSK) |
6731 (value & TP_EC_BACKLIGHT_LVLMSK))))
6732 return -EIO;
6733
6734 return 0;
6735 }
6736
6737
6738 static int tpacpi_brightness_set_ucmsstep(unsigned int value)
6739 {
6740 int cmos_cmd, inc;
6741 unsigned int current_value, i;
6742
6743 current_value = tpacpi_brightness_nvram_get();
6744
6745 if (value == current_value)
6746 return 0;
6747
6748 cmos_cmd = (value > current_value) ?
6749 TP_CMOS_BRIGHTNESS_UP :
6750 TP_CMOS_BRIGHTNESS_DOWN;
6751 inc = (value > current_value) ? 1 : -1;
6752
6753 for (i = current_value; i != value; i += inc)
6754 if (issue_thinkpad_cmos_command(cmos_cmd))
6755 return -EIO;
6756
6757 return 0;
6758 }
6759
6760
6761 static int brightness_set(unsigned int value)
6762 {
6763 int res;
6764
6765 if (value > bright_maxlvl)
6766 return -EINVAL;
6767
6768 vdbg_printk(TPACPI_DBG_BRGHT,
6769 "set backlight level to %d\n", value);
6770
6771 res = mutex_lock_killable(&brightness_mutex);
6772 if (res < 0)
6773 return res;
6774
6775 switch (brightness_mode) {
6776 case TPACPI_BRGHT_MODE_EC:
6777 case TPACPI_BRGHT_MODE_ECNVRAM:
6778 res = tpacpi_brightness_set_ec(value);
6779 break;
6780 case TPACPI_BRGHT_MODE_UCMS_STEP:
6781 res = tpacpi_brightness_set_ucmsstep(value);
6782 break;
6783 default:
6784 res = -ENXIO;
6785 }
6786
6787 mutex_unlock(&brightness_mutex);
6788 return res;
6789 }
6790
6791
6792
6793 static int brightness_update_status(struct backlight_device *bd)
6794 {
6795 int level = backlight_get_brightness(bd);
6796
6797 dbg_printk(TPACPI_DBG_BRGHT,
6798 "backlight: attempt to set level to %d\n",
6799 level);
6800
6801
6802
6803 return brightness_set(level);
6804 }
6805
6806 static int brightness_get(struct backlight_device *bd)
6807 {
6808 int status, res;
6809
6810 res = mutex_lock_killable(&brightness_mutex);
6811 if (res < 0)
6812 return 0;
6813
6814 res = tpacpi_brightness_get_raw(&status);
6815
6816 mutex_unlock(&brightness_mutex);
6817
6818 if (res < 0)
6819 return 0;
6820
6821 return status & TP_EC_BACKLIGHT_LVLMSK;
6822 }
6823
6824 static void tpacpi_brightness_notify_change(void)
6825 {
6826 backlight_force_update(ibm_backlight_device,
6827 BACKLIGHT_UPDATE_HOTKEY);
6828 }
6829
6830 static const struct backlight_ops ibm_backlight_data = {
6831 .get_brightness = brightness_get,
6832 .update_status = brightness_update_status,
6833 };
6834
6835
6836
6837 static int __init tpacpi_evaluate_bcl(struct acpi_device *adev, void *not_used)
6838 {
6839 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
6840 union acpi_object *obj;
6841 acpi_status status;
6842 int rc;
6843
6844 status = acpi_evaluate_object(adev->handle, "_BCL", NULL, &buffer);
6845 if (ACPI_FAILURE(status))
6846 return 0;
6847
6848 obj = buffer.pointer;
6849 if (!obj || obj->type != ACPI_TYPE_PACKAGE) {
6850 acpi_handle_info(adev->handle,
6851 "Unknown _BCL data, please report this to %s\n",
6852 TPACPI_MAIL);
6853 rc = 0;
6854 } else {
6855 rc = obj->package.count;
6856 }
6857 kfree(obj);
6858
6859 return rc;
6860 }
6861
6862
6863
6864
6865
6866
6867 static int __init tpacpi_query_bcl_levels(acpi_handle handle)
6868 {
6869 struct acpi_device *device;
6870
6871 device = acpi_fetch_acpi_dev(handle);
6872 if (!device)
6873 return 0;
6874
6875 return acpi_dev_for_each_child(device, tpacpi_evaluate_bcl, NULL);
6876 }
6877
6878
6879
6880
6881
6882 static unsigned int __init tpacpi_check_std_acpi_brightness_support(void)
6883 {
6884 acpi_handle video_device;
6885 int bcl_levels = 0;
6886
6887 tpacpi_acpi_handle_locate("video", NULL, &video_device);
6888 if (video_device)
6889 bcl_levels = tpacpi_query_bcl_levels(video_device);
6890
6891 tp_features.bright_acpimode = (bcl_levels > 0);
6892
6893 return (bcl_levels > 2) ? (bcl_levels - 2) : 0;
6894 }
6895
6896
6897
6898
6899
6900
6901 #define TPACPI_BRGHT_Q_NOEC 0x0001
6902 #define TPACPI_BRGHT_Q_EC 0x0002
6903 #define TPACPI_BRGHT_Q_ASK 0x8000
6904
6905 static const struct tpacpi_quirk brightness_quirk_table[] __initconst = {
6906
6907 TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC),
6908
6909
6910 TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC),
6911 TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
6912 TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_EC),
6913 TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
6914
6915
6916 TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_NOEC),
6917 TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
6918 TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
6919
6920
6921 TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC),
6922 TPACPI_Q_IBM('7', '4', TPACPI_BRGHT_Q_NOEC),
6923 TPACPI_Q_IBM('7', '5', TPACPI_BRGHT_Q_NOEC),
6924 };
6925
6926
6927
6928
6929
6930 static void __init tpacpi_detect_brightness_capabilities(void)
6931 {
6932 unsigned int b;
6933
6934 vdbg_printk(TPACPI_DBG_INIT,
6935 "detecting firmware brightness interface capabilities\n");
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945 b = tpacpi_check_std_acpi_brightness_support();
6946 switch (b) {
6947 case 16:
6948 bright_maxlvl = 15;
6949 break;
6950 case 8:
6951 case 0:
6952 bright_maxlvl = 7;
6953 break;
6954 default:
6955 tp_features.bright_unkfw = 1;
6956 bright_maxlvl = b - 1;
6957 }
6958 pr_debug("detected %u brightness levels\n", bright_maxlvl + 1);
6959 }
6960
6961 static int __init brightness_init(struct ibm_init_struct *iibm)
6962 {
6963 struct backlight_properties props;
6964 int b;
6965 unsigned long quirks;
6966
6967 vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n");
6968
6969 mutex_init(&brightness_mutex);
6970
6971 quirks = tpacpi_check_quirks(brightness_quirk_table,
6972 ARRAY_SIZE(brightness_quirk_table));
6973
6974
6975
6976
6977 if (tp_features.bright_unkfw)
6978 return -ENODEV;
6979
6980 if (!brightness_enable) {
6981 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT,
6982 "brightness support disabled by module parameter\n");
6983 return -ENODEV;
6984 }
6985
6986 if (acpi_video_get_backlight_type() != acpi_backlight_vendor) {
6987 if (brightness_enable > 1) {
6988 pr_info("Standard ACPI backlight interface available, not loading native one\n");
6989 return -ENODEV;
6990 } else if (brightness_enable == 1) {
6991 pr_warn("Cannot enable backlight brightness support, ACPI is already handling it. Refer to the acpi_backlight kernel parameter.\n");
6992 return -ENODEV;
6993 }
6994 } else if (!tp_features.bright_acpimode) {
6995 pr_notice("ACPI backlight interface not available\n");
6996 return -ENODEV;
6997 }
6998
6999 pr_notice("ACPI native brightness control enabled\n");
7000
7001
7002
7003
7004
7005
7006 if (brightness_mode > TPACPI_BRGHT_MODE_MAX)
7007 return -EINVAL;
7008
7009
7010 if (brightness_mode == TPACPI_BRGHT_MODE_AUTO ||
7011 brightness_mode == TPACPI_BRGHT_MODE_MAX) {
7012 if (quirks & TPACPI_BRGHT_Q_EC)
7013 brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM;
7014 else
7015 brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP;
7016
7017 dbg_printk(TPACPI_DBG_BRGHT,
7018 "driver auto-selected brightness_mode=%d\n",
7019 brightness_mode);
7020 }
7021
7022
7023 if (!tpacpi_is_ibm() &&
7024 (brightness_mode == TPACPI_BRGHT_MODE_ECNVRAM ||
7025 brightness_mode == TPACPI_BRGHT_MODE_EC))
7026 return -EINVAL;
7027
7028 if (tpacpi_brightness_get_raw(&b) < 0)
7029 return -ENODEV;
7030
7031 memset(&props, 0, sizeof(struct backlight_properties));
7032 props.type = BACKLIGHT_PLATFORM;
7033 props.max_brightness = bright_maxlvl;
7034 props.brightness = b & TP_EC_BACKLIGHT_LVLMSK;
7035 ibm_backlight_device = backlight_device_register(TPACPI_BACKLIGHT_DEV_NAME,
7036 NULL, NULL,
7037 &ibm_backlight_data,
7038 &props);
7039 if (IS_ERR(ibm_backlight_device)) {
7040 int rc = PTR_ERR(ibm_backlight_device);
7041 ibm_backlight_device = NULL;
7042 pr_err("Could not register backlight device\n");
7043 return rc;
7044 }
7045 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT,
7046 "brightness is supported\n");
7047
7048 if (quirks & TPACPI_BRGHT_Q_ASK) {
7049 pr_notice("brightness: will use unverified default: brightness_mode=%d\n",
7050 brightness_mode);
7051 pr_notice("brightness: please report to %s whether it works well or not on your ThinkPad\n",
7052 TPACPI_MAIL);
7053 }
7054
7055
7056
7057
7058
7059 backlight_update_status(ibm_backlight_device);
7060
7061 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT,
7062 "brightness: registering brightness hotkeys as change notification\n");
7063 tpacpi_hotkey_driver_mask_set(hotkey_driver_mask
7064 | TP_ACPI_HKEY_BRGHTUP_MASK
7065 | TP_ACPI_HKEY_BRGHTDWN_MASK);
7066 return 0;
7067 }
7068
7069 static void brightness_suspend(void)
7070 {
7071 tpacpi_brightness_checkpoint_nvram();
7072 }
7073
7074 static void brightness_shutdown(void)
7075 {
7076 tpacpi_brightness_checkpoint_nvram();
7077 }
7078
7079 static void brightness_exit(void)
7080 {
7081 if (ibm_backlight_device) {
7082 vdbg_printk(TPACPI_DBG_EXIT | TPACPI_DBG_BRGHT,
7083 "calling backlight_device_unregister()\n");
7084 backlight_device_unregister(ibm_backlight_device);
7085 }
7086
7087 tpacpi_brightness_checkpoint_nvram();
7088 }
7089
7090 static int brightness_read(struct seq_file *m)
7091 {
7092 int level;
7093
7094 level = brightness_get(NULL);
7095 if (level < 0) {
7096 seq_printf(m, "level:\t\tunreadable\n");
7097 } else {
7098 seq_printf(m, "level:\t\t%d\n", level);
7099 seq_printf(m, "commands:\tup, down\n");
7100 seq_printf(m, "commands:\tlevel <level> (<level> is 0-%d)\n",
7101 bright_maxlvl);
7102 }
7103
7104 return 0;
7105 }
7106
7107 static int brightness_write(char *buf)
7108 {
7109 int level;
7110 int rc;
7111 char *cmd;
7112
7113 level = brightness_get(NULL);
7114 if (level < 0)
7115 return level;
7116
7117 while ((cmd = strsep(&buf, ","))) {
7118 if (strlencmp(cmd, "up") == 0) {
7119 if (level < bright_maxlvl)
7120 level++;
7121 } else if (strlencmp(cmd, "down") == 0) {
7122 if (level > 0)
7123 level--;
7124 } else if (sscanf(cmd, "level %d", &level) == 1 &&
7125 level >= 0 && level <= bright_maxlvl) {
7126
7127 } else
7128 return -EINVAL;
7129 }
7130
7131 tpacpi_disclose_usertask("procfs brightness",
7132 "set level to %d\n", level);
7133
7134
7135
7136
7137
7138 rc = brightness_set(level);
7139 if (!rc && ibm_backlight_device)
7140 backlight_force_update(ibm_backlight_device,
7141 BACKLIGHT_UPDATE_SYSFS);
7142 return (rc == -EINTR) ? -ERESTARTSYS : rc;
7143 }
7144
7145 static struct ibm_struct brightness_driver_data = {
7146 .name = "brightness",
7147 .read = brightness_read,
7148 .write = brightness_write,
7149 .exit = brightness_exit,
7150 .suspend = brightness_suspend,
7151 .shutdown = brightness_shutdown,
7152 };
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187 #ifdef CONFIG_THINKPAD_ACPI_ALSA_SUPPORT
7188
7189 #define TPACPI_ALSA_DRVNAME "ThinkPad EC"
7190 #define TPACPI_ALSA_SHRTNAME "ThinkPad Console Audio Control"
7191 #define TPACPI_ALSA_MIXERNAME TPACPI_ALSA_SHRTNAME
7192
7193 #if SNDRV_CARDS <= 32
7194 #define DEFAULT_ALSA_IDX ~((1 << (SNDRV_CARDS - 3)) - 1)
7195 #else
7196 #define DEFAULT_ALSA_IDX ~((1 << (32 - 3)) - 1)
7197 #endif
7198 static int alsa_index = DEFAULT_ALSA_IDX;
7199 static char *alsa_id = "ThinkPadEC";
7200 static bool alsa_enable = SNDRV_DEFAULT_ENABLE1;
7201
7202 struct tpacpi_alsa_data {
7203 struct snd_card *card;
7204 struct snd_ctl_elem_id *ctl_mute_id;
7205 struct snd_ctl_elem_id *ctl_vol_id;
7206 };
7207
7208 static struct snd_card *alsa_card;
7209
7210 enum {
7211 TP_EC_AUDIO = 0x30,
7212
7213
7214 TP_EC_AUDIO_MUTESW = 6,
7215
7216
7217 TP_EC_AUDIO_LVL_MSK = 0x0F,
7218 TP_EC_AUDIO_MUTESW_MSK = (1 << TP_EC_AUDIO_MUTESW),
7219
7220
7221 TP_EC_VOLUME_MAX = 14,
7222 };
7223
7224 enum tpacpi_volume_access_mode {
7225 TPACPI_VOL_MODE_AUTO = 0,
7226 TPACPI_VOL_MODE_EC,
7227 TPACPI_VOL_MODE_UCMS_STEP,
7228 TPACPI_VOL_MODE_ECNVRAM,
7229 TPACPI_VOL_MODE_MAX
7230 };
7231
7232 enum tpacpi_volume_capabilities {
7233 TPACPI_VOL_CAP_AUTO = 0,
7234 TPACPI_VOL_CAP_VOLMUTE,
7235 TPACPI_VOL_CAP_MUTEONLY,
7236 TPACPI_VOL_CAP_MAX
7237 };
7238
7239 enum tpacpi_mute_btn_mode {
7240 TP_EC_MUTE_BTN_LATCH = 0,
7241
7242 TP_EC_MUTE_BTN_NONE = 2,
7243 TP_EC_MUTE_BTN_TOGGLE = 3,
7244 };
7245
7246 static enum tpacpi_volume_access_mode volume_mode =
7247 TPACPI_VOL_MODE_MAX;
7248
7249 static enum tpacpi_volume_capabilities volume_capabilities;
7250 static bool volume_control_allowed;
7251 static bool software_mute_requested = true;
7252 static bool software_mute_active;
7253 static int software_mute_orig_mode;
7254
7255
7256
7257
7258
7259 static struct mutex volume_mutex;
7260
7261 static void tpacpi_volume_checkpoint_nvram(void)
7262 {
7263 u8 lec = 0;
7264 u8 b_nvram;
7265 u8 ec_mask;
7266
7267 if (volume_mode != TPACPI_VOL_MODE_ECNVRAM)
7268 return;
7269 if (!volume_control_allowed)
7270 return;
7271 if (software_mute_active)
7272 return;
7273
7274 vdbg_printk(TPACPI_DBG_MIXER,
7275 "trying to checkpoint mixer state to NVRAM...\n");
7276
7277 if (tp_features.mixer_no_level_control)
7278 ec_mask = TP_EC_AUDIO_MUTESW_MSK;
7279 else
7280 ec_mask = TP_EC_AUDIO_MUTESW_MSK | TP_EC_AUDIO_LVL_MSK;
7281
7282 if (mutex_lock_killable(&volume_mutex) < 0)
7283 return;
7284
7285 if (unlikely(!acpi_ec_read(TP_EC_AUDIO, &lec)))
7286 goto unlock;
7287 lec &= ec_mask;
7288 b_nvram = nvram_read_byte(TP_NVRAM_ADDR_MIXER);
7289
7290 if (lec != (b_nvram & ec_mask)) {
7291
7292 b_nvram &= ~ec_mask;
7293 b_nvram |= lec;
7294 nvram_write_byte(b_nvram, TP_NVRAM_ADDR_MIXER);
7295 dbg_printk(TPACPI_DBG_MIXER,
7296 "updated NVRAM mixer status to 0x%02x (0x%02x)\n",
7297 (unsigned int) lec, (unsigned int) b_nvram);
7298 } else {
7299 vdbg_printk(TPACPI_DBG_MIXER,
7300 "NVRAM mixer status already is 0x%02x (0x%02x)\n",
7301 (unsigned int) lec, (unsigned int) b_nvram);
7302 }
7303
7304 unlock:
7305 mutex_unlock(&volume_mutex);
7306 }
7307
7308 static int volume_get_status_ec(u8 *status)
7309 {
7310 u8 s;
7311
7312 if (!acpi_ec_read(TP_EC_AUDIO, &s))
7313 return -EIO;
7314
7315 *status = s;
7316
7317 dbg_printk(TPACPI_DBG_MIXER, "status 0x%02x\n", s);
7318
7319 return 0;
7320 }
7321
7322 static int volume_get_status(u8 *status)
7323 {
7324 return volume_get_status_ec(status);
7325 }
7326
7327 static int volume_set_status_ec(const u8 status)
7328 {
7329 if (!acpi_ec_write(TP_EC_AUDIO, status))
7330 return -EIO;
7331
7332 dbg_printk(TPACPI_DBG_MIXER, "set EC mixer to 0x%02x\n", status);
7333
7334
7335
7336
7337
7338 msleep(1);
7339
7340 return 0;
7341 }
7342
7343 static int volume_set_status(const u8 status)
7344 {
7345 return volume_set_status_ec(status);
7346 }
7347
7348
7349 static int __volume_set_mute_ec(const bool mute)
7350 {
7351 int rc;
7352 u8 s, n;
7353
7354 if (mutex_lock_killable(&volume_mutex) < 0)
7355 return -EINTR;
7356
7357 rc = volume_get_status_ec(&s);
7358 if (rc)
7359 goto unlock;
7360
7361 n = (mute) ? s | TP_EC_AUDIO_MUTESW_MSK :
7362 s & ~TP_EC_AUDIO_MUTESW_MSK;
7363
7364 if (n != s) {
7365 rc = volume_set_status_ec(n);
7366 if (!rc)
7367 rc = 1;
7368 }
7369
7370 unlock:
7371 mutex_unlock(&volume_mutex);
7372 return rc;
7373 }
7374
7375 static int volume_alsa_set_mute(const bool mute)
7376 {
7377 dbg_printk(TPACPI_DBG_MIXER, "ALSA: trying to %smute\n",
7378 (mute) ? "" : "un");
7379 return __volume_set_mute_ec(mute);
7380 }
7381
7382 static int volume_set_mute(const bool mute)
7383 {
7384 int rc;
7385
7386 dbg_printk(TPACPI_DBG_MIXER, "trying to %smute\n",
7387 (mute) ? "" : "un");
7388
7389 rc = __volume_set_mute_ec(mute);
7390 return (rc < 0) ? rc : 0;
7391 }
7392
7393
7394 static int __volume_set_volume_ec(const u8 vol)
7395 {
7396 int rc;
7397 u8 s, n;
7398
7399 if (vol > TP_EC_VOLUME_MAX)
7400 return -EINVAL;
7401
7402 if (mutex_lock_killable(&volume_mutex) < 0)
7403 return -EINTR;
7404
7405 rc = volume_get_status_ec(&s);
7406 if (rc)
7407 goto unlock;
7408
7409 n = (s & ~TP_EC_AUDIO_LVL_MSK) | vol;
7410
7411 if (n != s) {
7412 rc = volume_set_status_ec(n);
7413 if (!rc)
7414 rc = 1;
7415 }
7416
7417 unlock:
7418 mutex_unlock(&volume_mutex);
7419 return rc;
7420 }
7421
7422 static int volume_set_software_mute(bool startup)
7423 {
7424 int result;
7425
7426 if (!tpacpi_is_lenovo())
7427 return -ENODEV;
7428
7429 if (startup) {
7430 if (!acpi_evalf(ec_handle, &software_mute_orig_mode,
7431 "HAUM", "qd"))
7432 return -EIO;
7433
7434 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7435 "Initial HAUM setting was %d\n",
7436 software_mute_orig_mode);
7437 }
7438
7439 if (!acpi_evalf(ec_handle, &result, "SAUM", "qdd",
7440 (int)TP_EC_MUTE_BTN_NONE))
7441 return -EIO;
7442
7443 if (result != TP_EC_MUTE_BTN_NONE)
7444 pr_warn("Unexpected SAUM result %d\n",
7445 result);
7446
7447
7448
7449
7450
7451
7452
7453 if (tp_features.mixer_no_level_control)
7454 result = volume_set_mute(false);
7455 else
7456 result = volume_set_status(TP_EC_VOLUME_MAX);
7457
7458 if (result != 0)
7459 pr_warn("Failed to unmute the HW mute switch\n");
7460
7461 return 0;
7462 }
7463
7464 static void volume_exit_software_mute(void)
7465 {
7466 int r;
7467
7468 if (!acpi_evalf(ec_handle, &r, "SAUM", "qdd", software_mute_orig_mode)
7469 || r != software_mute_orig_mode)
7470 pr_warn("Failed to restore mute mode\n");
7471 }
7472
7473 static int volume_alsa_set_volume(const u8 vol)
7474 {
7475 dbg_printk(TPACPI_DBG_MIXER,
7476 "ALSA: trying to set volume level to %hu\n", vol);
7477 return __volume_set_volume_ec(vol);
7478 }
7479
7480 static void volume_alsa_notify_change(void)
7481 {
7482 struct tpacpi_alsa_data *d;
7483
7484 if (alsa_card && alsa_card->private_data) {
7485 d = alsa_card->private_data;
7486 if (d->ctl_mute_id)
7487 snd_ctl_notify(alsa_card,
7488 SNDRV_CTL_EVENT_MASK_VALUE,
7489 d->ctl_mute_id);
7490 if (d->ctl_vol_id)
7491 snd_ctl_notify(alsa_card,
7492 SNDRV_CTL_EVENT_MASK_VALUE,
7493 d->ctl_vol_id);
7494 }
7495 }
7496
7497 static int volume_alsa_vol_info(struct snd_kcontrol *kcontrol,
7498 struct snd_ctl_elem_info *uinfo)
7499 {
7500 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7501 uinfo->count = 1;
7502 uinfo->value.integer.min = 0;
7503 uinfo->value.integer.max = TP_EC_VOLUME_MAX;
7504 return 0;
7505 }
7506
7507 static int volume_alsa_vol_get(struct snd_kcontrol *kcontrol,
7508 struct snd_ctl_elem_value *ucontrol)
7509 {
7510 u8 s;
7511 int rc;
7512
7513 rc = volume_get_status(&s);
7514 if (rc < 0)
7515 return rc;
7516
7517 ucontrol->value.integer.value[0] = s & TP_EC_AUDIO_LVL_MSK;
7518 return 0;
7519 }
7520
7521 static int volume_alsa_vol_put(struct snd_kcontrol *kcontrol,
7522 struct snd_ctl_elem_value *ucontrol)
7523 {
7524 tpacpi_disclose_usertask("ALSA", "set volume to %ld\n",
7525 ucontrol->value.integer.value[0]);
7526 return volume_alsa_set_volume(ucontrol->value.integer.value[0]);
7527 }
7528
7529 #define volume_alsa_mute_info snd_ctl_boolean_mono_info
7530
7531 static int volume_alsa_mute_get(struct snd_kcontrol *kcontrol,
7532 struct snd_ctl_elem_value *ucontrol)
7533 {
7534 u8 s;
7535 int rc;
7536
7537 rc = volume_get_status(&s);
7538 if (rc < 0)
7539 return rc;
7540
7541 ucontrol->value.integer.value[0] =
7542 (s & TP_EC_AUDIO_MUTESW_MSK) ? 0 : 1;
7543 return 0;
7544 }
7545
7546 static int volume_alsa_mute_put(struct snd_kcontrol *kcontrol,
7547 struct snd_ctl_elem_value *ucontrol)
7548 {
7549 tpacpi_disclose_usertask("ALSA", "%smute\n",
7550 ucontrol->value.integer.value[0] ?
7551 "un" : "");
7552 return volume_alsa_set_mute(!ucontrol->value.integer.value[0]);
7553 }
7554
7555 static struct snd_kcontrol_new volume_alsa_control_vol __initdata = {
7556 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7557 .name = "Console Playback Volume",
7558 .index = 0,
7559 .access = SNDRV_CTL_ELEM_ACCESS_READ,
7560 .info = volume_alsa_vol_info,
7561 .get = volume_alsa_vol_get,
7562 };
7563
7564 static struct snd_kcontrol_new volume_alsa_control_mute __initdata = {
7565 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7566 .name = "Console Playback Switch",
7567 .index = 0,
7568 .access = SNDRV_CTL_ELEM_ACCESS_READ,
7569 .info = volume_alsa_mute_info,
7570 .get = volume_alsa_mute_get,
7571 };
7572
7573 static void volume_suspend(void)
7574 {
7575 tpacpi_volume_checkpoint_nvram();
7576 }
7577
7578 static void volume_resume(void)
7579 {
7580 if (software_mute_active) {
7581 if (volume_set_software_mute(false) < 0)
7582 pr_warn("Failed to restore software mute\n");
7583 } else {
7584 volume_alsa_notify_change();
7585 }
7586 }
7587
7588 static void volume_shutdown(void)
7589 {
7590 tpacpi_volume_checkpoint_nvram();
7591 }
7592
7593 static void volume_exit(void)
7594 {
7595 if (alsa_card) {
7596 snd_card_free(alsa_card);
7597 alsa_card = NULL;
7598 }
7599
7600 tpacpi_volume_checkpoint_nvram();
7601
7602 if (software_mute_active)
7603 volume_exit_software_mute();
7604 }
7605
7606 static int __init volume_create_alsa_mixer(void)
7607 {
7608 struct snd_card *card;
7609 struct tpacpi_alsa_data *data;
7610 struct snd_kcontrol *ctl_vol;
7611 struct snd_kcontrol *ctl_mute;
7612 int rc;
7613
7614 rc = snd_card_new(&tpacpi_pdev->dev,
7615 alsa_index, alsa_id, THIS_MODULE,
7616 sizeof(struct tpacpi_alsa_data), &card);
7617 if (rc < 0 || !card) {
7618 pr_err("Failed to create ALSA card structures: %d\n", rc);
7619 return -ENODEV;
7620 }
7621
7622 BUG_ON(!card->private_data);
7623 data = card->private_data;
7624 data->card = card;
7625
7626 strlcpy(card->driver, TPACPI_ALSA_DRVNAME,
7627 sizeof(card->driver));
7628 strlcpy(card->shortname, TPACPI_ALSA_SHRTNAME,
7629 sizeof(card->shortname));
7630 snprintf(card->mixername, sizeof(card->mixername), "ThinkPad EC %s",
7631 (thinkpad_id.ec_version_str) ?
7632 thinkpad_id.ec_version_str : "(unknown)");
7633 snprintf(card->longname, sizeof(card->longname),
7634 "%s at EC reg 0x%02x, fw %s", card->shortname, TP_EC_AUDIO,
7635 (thinkpad_id.ec_version_str) ?
7636 thinkpad_id.ec_version_str : "unknown");
7637
7638 if (volume_control_allowed) {
7639 volume_alsa_control_vol.put = volume_alsa_vol_put;
7640 volume_alsa_control_vol.access =
7641 SNDRV_CTL_ELEM_ACCESS_READWRITE;
7642
7643 volume_alsa_control_mute.put = volume_alsa_mute_put;
7644 volume_alsa_control_mute.access =
7645 SNDRV_CTL_ELEM_ACCESS_READWRITE;
7646 }
7647
7648 if (!tp_features.mixer_no_level_control) {
7649 ctl_vol = snd_ctl_new1(&volume_alsa_control_vol, NULL);
7650 rc = snd_ctl_add(card, ctl_vol);
7651 if (rc < 0) {
7652 pr_err("Failed to create ALSA volume control: %d\n",
7653 rc);
7654 goto err_exit;
7655 }
7656 data->ctl_vol_id = &ctl_vol->id;
7657 }
7658
7659 ctl_mute = snd_ctl_new1(&volume_alsa_control_mute, NULL);
7660 rc = snd_ctl_add(card, ctl_mute);
7661 if (rc < 0) {
7662 pr_err("Failed to create ALSA mute control: %d\n", rc);
7663 goto err_exit;
7664 }
7665 data->ctl_mute_id = &ctl_mute->id;
7666
7667 rc = snd_card_register(card);
7668 if (rc < 0) {
7669 pr_err("Failed to register ALSA card: %d\n", rc);
7670 goto err_exit;
7671 }
7672
7673 alsa_card = card;
7674 return 0;
7675
7676 err_exit:
7677 snd_card_free(card);
7678 return -ENODEV;
7679 }
7680
7681 #define TPACPI_VOL_Q_MUTEONLY 0x0001
7682 #define TPACPI_VOL_Q_LEVEL 0x0002
7683
7684 static const struct tpacpi_quirk volume_quirk_table[] __initconst = {
7685
7686 { .vendor = PCI_VENDOR_ID_IBM,
7687 .bios = TPACPI_MATCH_ANY,
7688 .ec = TPACPI_MATCH_ANY,
7689 .quirks = TPACPI_VOL_Q_LEVEL },
7690
7691
7692 TPACPI_QEC_LNV('7', 'C', TPACPI_VOL_Q_LEVEL),
7693 TPACPI_QEC_LNV('7', 'E', TPACPI_VOL_Q_LEVEL),
7694 TPACPI_QEC_LNV('7', '9', TPACPI_VOL_Q_LEVEL),
7695 TPACPI_QEC_LNV('7', 'B', TPACPI_VOL_Q_LEVEL),
7696 TPACPI_QEC_LNV('7', 'J', TPACPI_VOL_Q_LEVEL),
7697 TPACPI_QEC_LNV('7', '7', TPACPI_VOL_Q_LEVEL),
7698 TPACPI_QEC_LNV('7', 'F', TPACPI_VOL_Q_LEVEL),
7699
7700
7701 { .vendor = PCI_VENDOR_ID_LENOVO,
7702 .bios = TPACPI_MATCH_ANY,
7703 .ec = TPACPI_MATCH_ANY,
7704 .quirks = TPACPI_VOL_Q_MUTEONLY }
7705 };
7706
7707 static int __init volume_init(struct ibm_init_struct *iibm)
7708 {
7709 unsigned long quirks;
7710 int rc;
7711
7712 vdbg_printk(TPACPI_DBG_INIT, "initializing volume subdriver\n");
7713
7714 mutex_init(&volume_mutex);
7715
7716
7717
7718
7719
7720
7721 if (volume_mode > TPACPI_VOL_MODE_MAX)
7722 return -EINVAL;
7723
7724 if (volume_mode == TPACPI_VOL_MODE_UCMS_STEP) {
7725 pr_err("UCMS step volume mode not implemented, please contact %s\n",
7726 TPACPI_MAIL);
7727 return -ENODEV;
7728 }
7729
7730 if (volume_capabilities >= TPACPI_VOL_CAP_MAX)
7731 return -EINVAL;
7732
7733
7734
7735
7736
7737 if (!alsa_enable) {
7738 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7739 "ALSA mixer disabled by parameter, not loading volume subdriver...\n");
7740 return -ENODEV;
7741 }
7742
7743 quirks = tpacpi_check_quirks(volume_quirk_table,
7744 ARRAY_SIZE(volume_quirk_table));
7745
7746 switch (volume_capabilities) {
7747 case TPACPI_VOL_CAP_AUTO:
7748 if (quirks & TPACPI_VOL_Q_MUTEONLY)
7749 tp_features.mixer_no_level_control = 1;
7750 else if (quirks & TPACPI_VOL_Q_LEVEL)
7751 tp_features.mixer_no_level_control = 0;
7752 else
7753 return -ENODEV;
7754 break;
7755 case TPACPI_VOL_CAP_VOLMUTE:
7756 tp_features.mixer_no_level_control = 0;
7757 break;
7758 case TPACPI_VOL_CAP_MUTEONLY:
7759 tp_features.mixer_no_level_control = 1;
7760 break;
7761 default:
7762 return -ENODEV;
7763 }
7764
7765 if (volume_capabilities != TPACPI_VOL_CAP_AUTO)
7766 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7767 "using user-supplied volume_capabilities=%d\n",
7768 volume_capabilities);
7769
7770 if (volume_mode == TPACPI_VOL_MODE_AUTO ||
7771 volume_mode == TPACPI_VOL_MODE_MAX) {
7772 volume_mode = TPACPI_VOL_MODE_ECNVRAM;
7773
7774 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7775 "driver auto-selected volume_mode=%d\n",
7776 volume_mode);
7777 } else {
7778 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7779 "using user-supplied volume_mode=%d\n",
7780 volume_mode);
7781 }
7782
7783 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7784 "mute is supported, volume control is %s\n",
7785 str_supported(!tp_features.mixer_no_level_control));
7786
7787 if (software_mute_requested && volume_set_software_mute(true) == 0) {
7788 software_mute_active = true;
7789 } else {
7790 rc = volume_create_alsa_mixer();
7791 if (rc) {
7792 pr_err("Could not create the ALSA mixer interface\n");
7793 return rc;
7794 }
7795
7796 pr_info("Console audio control enabled, mode: %s\n",
7797 (volume_control_allowed) ?
7798 "override (read/write)" :
7799 "monitor (read only)");
7800 }
7801
7802 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_MIXER,
7803 "registering volume hotkeys as change notification\n");
7804 tpacpi_hotkey_driver_mask_set(hotkey_driver_mask
7805 | TP_ACPI_HKEY_VOLUP_MASK
7806 | TP_ACPI_HKEY_VOLDWN_MASK
7807 | TP_ACPI_HKEY_MUTE_MASK);
7808
7809 return 0;
7810 }
7811
7812 static int volume_read(struct seq_file *m)
7813 {
7814 u8 status;
7815
7816 if (volume_get_status(&status) < 0) {
7817 seq_printf(m, "level:\t\tunreadable\n");
7818 } else {
7819 if (tp_features.mixer_no_level_control)
7820 seq_printf(m, "level:\t\tunsupported\n");
7821 else
7822 seq_printf(m, "level:\t\t%d\n",
7823 status & TP_EC_AUDIO_LVL_MSK);
7824
7825 seq_printf(m, "mute:\t\t%s\n", str_on_off(status & BIT(TP_EC_AUDIO_MUTESW)));
7826
7827 if (volume_control_allowed) {
7828 seq_printf(m, "commands:\tunmute, mute\n");
7829 if (!tp_features.mixer_no_level_control) {
7830 seq_printf(m, "commands:\tup, down\n");
7831 seq_printf(m, "commands:\tlevel <level> (<level> is 0-%d)\n",
7832 TP_EC_VOLUME_MAX);
7833 }
7834 }
7835 }
7836
7837 return 0;
7838 }
7839
7840 static int volume_write(char *buf)
7841 {
7842 u8 s;
7843 u8 new_level, new_mute;
7844 int l;
7845 char *cmd;
7846 int rc;
7847
7848
7849
7850
7851
7852 if (!volume_control_allowed && tpacpi_lifecycle != TPACPI_LIFE_INIT) {
7853 if (unlikely(!tp_warned.volume_ctrl_forbidden)) {
7854 tp_warned.volume_ctrl_forbidden = 1;
7855 pr_notice("Console audio control in monitor mode, changes are not allowed\n");
7856 pr_notice("Use the volume_control=1 module parameter to enable volume control\n");
7857 }
7858 return -EPERM;
7859 }
7860
7861 rc = volume_get_status(&s);
7862 if (rc < 0)
7863 return rc;
7864
7865 new_level = s & TP_EC_AUDIO_LVL_MSK;
7866 new_mute = s & TP_EC_AUDIO_MUTESW_MSK;
7867
7868 while ((cmd = strsep(&buf, ","))) {
7869 if (!tp_features.mixer_no_level_control) {
7870 if (strlencmp(cmd, "up") == 0) {
7871 if (new_mute)
7872 new_mute = 0;
7873 else if (new_level < TP_EC_VOLUME_MAX)
7874 new_level++;
7875 continue;
7876 } else if (strlencmp(cmd, "down") == 0) {
7877 if (new_mute)
7878 new_mute = 0;
7879 else if (new_level > 0)
7880 new_level--;
7881 continue;
7882 } else if (sscanf(cmd, "level %u", &l) == 1 &&
7883 l >= 0 && l <= TP_EC_VOLUME_MAX) {
7884 new_level = l;
7885 continue;
7886 }
7887 }
7888 if (strlencmp(cmd, "mute") == 0)
7889 new_mute = TP_EC_AUDIO_MUTESW_MSK;
7890 else if (strlencmp(cmd, "unmute") == 0)
7891 new_mute = 0;
7892 else
7893 return -EINVAL;
7894 }
7895
7896 if (tp_features.mixer_no_level_control) {
7897 tpacpi_disclose_usertask("procfs volume", "%smute\n",
7898 new_mute ? "" : "un");
7899 rc = volume_set_mute(!!new_mute);
7900 } else {
7901 tpacpi_disclose_usertask("procfs volume",
7902 "%smute and set level to %d\n",
7903 new_mute ? "" : "un", new_level);
7904 rc = volume_set_status(new_mute | new_level);
7905 }
7906 volume_alsa_notify_change();
7907
7908 return (rc == -EINTR) ? -ERESTARTSYS : rc;
7909 }
7910
7911 static struct ibm_struct volume_driver_data = {
7912 .name = "volume",
7913 .read = volume_read,
7914 .write = volume_write,
7915 .exit = volume_exit,
7916 .suspend = volume_suspend,
7917 .resume = volume_resume,
7918 .shutdown = volume_shutdown,
7919 };
7920
7921 #else
7922
7923 #define alsa_card NULL
7924
7925 static inline void volume_alsa_notify_change(void)
7926 {
7927 }
7928
7929 static int __init volume_init(struct ibm_init_struct *iibm)
7930 {
7931 pr_info("volume: disabled as there is no ALSA support in this kernel\n");
7932
7933 return -ENODEV;
7934 }
7935
7936 static struct ibm_struct volume_driver_data = {
7937 .name = "volume",
7938 };
7939
7940 #endif
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062 enum {
8063 fan_status_offset = 0x2f,
8064 fan_rpm_offset = 0x84,
8065
8066 fan_select_offset = 0x31,
8067
8068
8069 TP_EC_FAN_FULLSPEED = 0x40,
8070 TP_EC_FAN_AUTO = 0x80,
8071
8072 TPACPI_FAN_LAST_LEVEL = 0x100,
8073 };
8074
8075 enum fan_status_access_mode {
8076 TPACPI_FAN_NONE = 0,
8077 TPACPI_FAN_RD_ACPI_GFAN,
8078 TPACPI_FAN_RD_TPEC,
8079 };
8080
8081 enum fan_control_access_mode {
8082 TPACPI_FAN_WR_NONE = 0,
8083 TPACPI_FAN_WR_ACPI_SFAN,
8084 TPACPI_FAN_WR_TPEC,
8085 TPACPI_FAN_WR_ACPI_FANS,
8086 };
8087
8088 enum fan_control_commands {
8089 TPACPI_FAN_CMD_SPEED = 0x0001,
8090 TPACPI_FAN_CMD_LEVEL = 0x0002,
8091 TPACPI_FAN_CMD_ENABLE = 0x0004,
8092
8093 };
8094
8095 static bool fan_control_allowed;
8096
8097 static enum fan_status_access_mode fan_status_access_mode;
8098 static enum fan_control_access_mode fan_control_access_mode;
8099 static enum fan_control_commands fan_control_commands;
8100
8101 static u8 fan_control_initial_status;
8102 static u8 fan_control_desired_level;
8103 static u8 fan_control_resume_level;
8104 static int fan_watchdog_maxinterval;
8105
8106 static struct mutex fan_mutex;
8107
8108 static void fan_watchdog_fire(struct work_struct *ignored);
8109 static DECLARE_DELAYED_WORK(fan_watchdog_task, fan_watchdog_fire);
8110
8111 TPACPI_HANDLE(fans, ec, "FANS");
8112 TPACPI_HANDLE(gfan, ec, "GFAN",
8113 "\\FSPD",
8114 );
8115 TPACPI_HANDLE(sfan, ec, "SFAN",
8116 "JFNS",
8117 );
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135 static void fan_quirk1_setup(void)
8136 {
8137 if (fan_control_initial_status == 0x07) {
8138 pr_notice("fan_init: initial fan status is unknown, assuming it is in auto mode\n");
8139 tp_features.fan_ctrl_status_undef = 1;
8140 }
8141 }
8142
8143 static void fan_quirk1_handle(u8 *fan_status)
8144 {
8145 if (unlikely(tp_features.fan_ctrl_status_undef)) {
8146 if (*fan_status != fan_control_initial_status) {
8147
8148
8149
8150 tp_features.fan_ctrl_status_undef = 0;
8151 } else {
8152
8153
8154 *fan_status = TP_EC_FAN_AUTO;
8155 }
8156 }
8157 }
8158
8159
8160 static bool fan_select_fan1(void)
8161 {
8162 if (tp_features.second_fan) {
8163 u8 val;
8164
8165 if (ec_read(fan_select_offset, &val) < 0)
8166 return false;
8167 val &= 0xFEU;
8168 if (ec_write(fan_select_offset, val) < 0)
8169 return false;
8170 }
8171 return true;
8172 }
8173
8174
8175 static bool fan_select_fan2(void)
8176 {
8177 u8 val;
8178
8179 if (!tp_features.second_fan)
8180 return false;
8181
8182 if (ec_read(fan_select_offset, &val) < 0)
8183 return false;
8184 val |= 0x01U;
8185 if (ec_write(fan_select_offset, val) < 0)
8186 return false;
8187
8188 return true;
8189 }
8190
8191
8192
8193
8194 static void fan_update_desired_level(u8 status)
8195 {
8196 if ((status &
8197 (TP_EC_FAN_AUTO | TP_EC_FAN_FULLSPEED)) == 0) {
8198 if (status > 7)
8199 fan_control_desired_level = 7;
8200 else
8201 fan_control_desired_level = status;
8202 }
8203 }
8204
8205 static int fan_get_status(u8 *status)
8206 {
8207 u8 s;
8208
8209
8210
8211
8212 switch (fan_status_access_mode) {
8213 case TPACPI_FAN_RD_ACPI_GFAN: {
8214
8215 int res;
8216
8217 if (unlikely(!acpi_evalf(gfan_handle, &res, NULL, "d")))
8218 return -EIO;
8219
8220 if (likely(status))
8221 *status = res & 0x07;
8222
8223 break;
8224 }
8225 case TPACPI_FAN_RD_TPEC:
8226
8227 if (unlikely(!acpi_ec_read(fan_status_offset, &s)))
8228 return -EIO;
8229
8230 if (likely(status)) {
8231 *status = s;
8232 fan_quirk1_handle(status);
8233 }
8234
8235 break;
8236
8237 default:
8238 return -ENXIO;
8239 }
8240
8241 return 0;
8242 }
8243
8244 static int fan_get_status_safe(u8 *status)
8245 {
8246 int rc;
8247 u8 s;
8248
8249 if (mutex_lock_killable(&fan_mutex))
8250 return -ERESTARTSYS;
8251 rc = fan_get_status(&s);
8252 if (!rc)
8253 fan_update_desired_level(s);
8254 mutex_unlock(&fan_mutex);
8255
8256 if (rc)
8257 return rc;
8258 if (status)
8259 *status = s;
8260
8261 return 0;
8262 }
8263
8264 static int fan_get_speed(unsigned int *speed)
8265 {
8266 u8 hi, lo;
8267
8268 switch (fan_status_access_mode) {
8269 case TPACPI_FAN_RD_TPEC:
8270
8271 if (unlikely(!fan_select_fan1()))
8272 return -EIO;
8273 if (unlikely(!acpi_ec_read(fan_rpm_offset, &lo) ||
8274 !acpi_ec_read(fan_rpm_offset + 1, &hi)))
8275 return -EIO;
8276
8277 if (likely(speed))
8278 *speed = (hi << 8) | lo;
8279
8280 break;
8281
8282 default:
8283 return -ENXIO;
8284 }
8285
8286 return 0;
8287 }
8288
8289 static int fan2_get_speed(unsigned int *speed)
8290 {
8291 u8 hi, lo;
8292 bool rc;
8293
8294 switch (fan_status_access_mode) {
8295 case TPACPI_FAN_RD_TPEC:
8296
8297 if (unlikely(!fan_select_fan2()))
8298 return -EIO;
8299 rc = !acpi_ec_read(fan_rpm_offset, &lo) ||
8300 !acpi_ec_read(fan_rpm_offset + 1, &hi);
8301 fan_select_fan1();
8302 if (rc)
8303 return -EIO;
8304
8305 if (likely(speed))
8306 *speed = (hi << 8) | lo;
8307
8308 break;
8309
8310 default:
8311 return -ENXIO;
8312 }
8313
8314 return 0;
8315 }
8316
8317 static int fan_set_level(int level)
8318 {
8319 if (!fan_control_allowed)
8320 return -EPERM;
8321
8322 switch (fan_control_access_mode) {
8323 case TPACPI_FAN_WR_ACPI_SFAN:
8324 if ((level < 0) || (level > 7))
8325 return -EINVAL;
8326
8327 if (tp_features.second_fan_ctl) {
8328 if (!fan_select_fan2() ||
8329 !acpi_evalf(sfan_handle, NULL, NULL, "vd", level)) {
8330 pr_warn("Couldn't set 2nd fan level, disabling support\n");
8331 tp_features.second_fan_ctl = 0;
8332 }
8333 fan_select_fan1();
8334 }
8335 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", level))
8336 return -EIO;
8337 break;
8338
8339 case TPACPI_FAN_WR_ACPI_FANS:
8340 case TPACPI_FAN_WR_TPEC:
8341 if (!(level & TP_EC_FAN_AUTO) &&
8342 !(level & TP_EC_FAN_FULLSPEED) &&
8343 ((level < 0) || (level > 7)))
8344 return -EINVAL;
8345
8346
8347
8348 if (level & TP_EC_FAN_FULLSPEED)
8349 level |= 7;
8350 else if (level & TP_EC_FAN_AUTO)
8351 level |= 4;
8352
8353 if (tp_features.second_fan_ctl) {
8354 if (!fan_select_fan2() ||
8355 !acpi_ec_write(fan_status_offset, level)) {
8356 pr_warn("Couldn't set 2nd fan level, disabling support\n");
8357 tp_features.second_fan_ctl = 0;
8358 }
8359 fan_select_fan1();
8360
8361 }
8362 if (!acpi_ec_write(fan_status_offset, level))
8363 return -EIO;
8364 else
8365 tp_features.fan_ctrl_status_undef = 0;
8366 break;
8367
8368 default:
8369 return -ENXIO;
8370 }
8371
8372 vdbg_printk(TPACPI_DBG_FAN,
8373 "fan control: set fan control register to 0x%02x\n", level);
8374 return 0;
8375 }
8376
8377 static int fan_set_level_safe(int level)
8378 {
8379 int rc;
8380
8381 if (!fan_control_allowed)
8382 return -EPERM;
8383
8384 if (mutex_lock_killable(&fan_mutex))
8385 return -ERESTARTSYS;
8386
8387 if (level == TPACPI_FAN_LAST_LEVEL)
8388 level = fan_control_desired_level;
8389
8390 rc = fan_set_level(level);
8391 if (!rc)
8392 fan_update_desired_level(level);
8393
8394 mutex_unlock(&fan_mutex);
8395 return rc;
8396 }
8397
8398 static int fan_set_enable(void)
8399 {
8400 u8 s;
8401 int rc;
8402
8403 if (!fan_control_allowed)
8404 return -EPERM;
8405
8406 if (mutex_lock_killable(&fan_mutex))
8407 return -ERESTARTSYS;
8408
8409 switch (fan_control_access_mode) {
8410 case TPACPI_FAN_WR_ACPI_FANS:
8411 case TPACPI_FAN_WR_TPEC:
8412 rc = fan_get_status(&s);
8413 if (rc)
8414 break;
8415
8416
8417 if (s != 7) {
8418 s &= 0x07;
8419 s |= TP_EC_FAN_AUTO | 4;
8420 }
8421
8422 if (!acpi_ec_write(fan_status_offset, s))
8423 rc = -EIO;
8424 else {
8425 tp_features.fan_ctrl_status_undef = 0;
8426 rc = 0;
8427 }
8428 break;
8429
8430 case TPACPI_FAN_WR_ACPI_SFAN:
8431 rc = fan_get_status(&s);
8432 if (rc)
8433 break;
8434
8435 s &= 0x07;
8436
8437
8438 s |= 4;
8439
8440 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s))
8441 rc = -EIO;
8442 else
8443 rc = 0;
8444 break;
8445
8446 default:
8447 rc = -ENXIO;
8448 }
8449
8450 mutex_unlock(&fan_mutex);
8451
8452 if (!rc)
8453 vdbg_printk(TPACPI_DBG_FAN,
8454 "fan control: set fan control register to 0x%02x\n",
8455 s);
8456 return rc;
8457 }
8458
8459 static int fan_set_disable(void)
8460 {
8461 int rc;
8462
8463 if (!fan_control_allowed)
8464 return -EPERM;
8465
8466 if (mutex_lock_killable(&fan_mutex))
8467 return -ERESTARTSYS;
8468
8469 rc = 0;
8470 switch (fan_control_access_mode) {
8471 case TPACPI_FAN_WR_ACPI_FANS:
8472 case TPACPI_FAN_WR_TPEC:
8473 if (!acpi_ec_write(fan_status_offset, 0x00))
8474 rc = -EIO;
8475 else {
8476 fan_control_desired_level = 0;
8477 tp_features.fan_ctrl_status_undef = 0;
8478 }
8479 break;
8480
8481 case TPACPI_FAN_WR_ACPI_SFAN:
8482 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", 0x00))
8483 rc = -EIO;
8484 else
8485 fan_control_desired_level = 0;
8486 break;
8487
8488 default:
8489 rc = -ENXIO;
8490 }
8491
8492 if (!rc)
8493 vdbg_printk(TPACPI_DBG_FAN,
8494 "fan control: set fan control register to 0\n");
8495
8496 mutex_unlock(&fan_mutex);
8497 return rc;
8498 }
8499
8500 static int fan_set_speed(int speed)
8501 {
8502 int rc;
8503
8504 if (!fan_control_allowed)
8505 return -EPERM;
8506
8507 if (mutex_lock_killable(&fan_mutex))
8508 return -ERESTARTSYS;
8509
8510 rc = 0;
8511 switch (fan_control_access_mode) {
8512 case TPACPI_FAN_WR_ACPI_FANS:
8513 if (speed >= 0 && speed <= 65535) {
8514 if (!acpi_evalf(fans_handle, NULL, NULL, "vddd",
8515 speed, speed, speed))
8516 rc = -EIO;
8517 } else
8518 rc = -EINVAL;
8519 break;
8520
8521 default:
8522 rc = -ENXIO;
8523 }
8524
8525 mutex_unlock(&fan_mutex);
8526 return rc;
8527 }
8528
8529 static void fan_watchdog_reset(void)
8530 {
8531 if (fan_control_access_mode == TPACPI_FAN_WR_NONE)
8532 return;
8533
8534 if (fan_watchdog_maxinterval > 0 &&
8535 tpacpi_lifecycle != TPACPI_LIFE_EXITING)
8536 mod_delayed_work(tpacpi_wq, &fan_watchdog_task,
8537 msecs_to_jiffies(fan_watchdog_maxinterval * 1000));
8538 else
8539 cancel_delayed_work(&fan_watchdog_task);
8540 }
8541
8542 static void fan_watchdog_fire(struct work_struct *ignored)
8543 {
8544 int rc;
8545
8546 if (tpacpi_lifecycle != TPACPI_LIFE_RUNNING)
8547 return;
8548
8549 pr_notice("fan watchdog: enabling fan\n");
8550 rc = fan_set_enable();
8551 if (rc < 0) {
8552 pr_err("fan watchdog: error %d while enabling fan, will try again later...\n",
8553 rc);
8554
8555 fan_watchdog_reset();
8556 }
8557 }
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581 static ssize_t fan_pwm1_enable_show(struct device *dev,
8582 struct device_attribute *attr,
8583 char *buf)
8584 {
8585 int res, mode;
8586 u8 status;
8587
8588 res = fan_get_status_safe(&status);
8589 if (res)
8590 return res;
8591
8592 if (status & TP_EC_FAN_FULLSPEED) {
8593 mode = 0;
8594 } else if (status & TP_EC_FAN_AUTO) {
8595 mode = 2;
8596 } else
8597 mode = 1;
8598
8599 return sysfs_emit(buf, "%d\n", mode);
8600 }
8601
8602 static ssize_t fan_pwm1_enable_store(struct device *dev,
8603 struct device_attribute *attr,
8604 const char *buf, size_t count)
8605 {
8606 unsigned long t;
8607 int res, level;
8608
8609 if (parse_strtoul(buf, 2, &t))
8610 return -EINVAL;
8611
8612 tpacpi_disclose_usertask("hwmon pwm1_enable",
8613 "set fan mode to %lu\n", t);
8614
8615 switch (t) {
8616 case 0:
8617 level = TP_EC_FAN_FULLSPEED;
8618 break;
8619 case 1:
8620 level = TPACPI_FAN_LAST_LEVEL;
8621 break;
8622 case 2:
8623 level = TP_EC_FAN_AUTO;
8624 break;
8625 case 3:
8626
8627 return -ENOSYS;
8628 default:
8629 return -EINVAL;
8630 }
8631
8632 res = fan_set_level_safe(level);
8633 if (res == -ENXIO)
8634 return -EINVAL;
8635 else if (res < 0)
8636 return res;
8637
8638 fan_watchdog_reset();
8639
8640 return count;
8641 }
8642
8643 static DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
8644 fan_pwm1_enable_show, fan_pwm1_enable_store);
8645
8646
8647 static ssize_t fan_pwm1_show(struct device *dev,
8648 struct device_attribute *attr,
8649 char *buf)
8650 {
8651 int res;
8652 u8 status;
8653
8654 res = fan_get_status_safe(&status);
8655 if (res)
8656 return res;
8657
8658 if ((status &
8659 (TP_EC_FAN_AUTO | TP_EC_FAN_FULLSPEED)) != 0)
8660 status = fan_control_desired_level;
8661
8662 if (status > 7)
8663 status = 7;
8664
8665 return sysfs_emit(buf, "%u\n", (status * 255) / 7);
8666 }
8667
8668 static ssize_t fan_pwm1_store(struct device *dev,
8669 struct device_attribute *attr,
8670 const char *buf, size_t count)
8671 {
8672 unsigned long s;
8673 int rc;
8674 u8 status, newlevel;
8675
8676 if (parse_strtoul(buf, 255, &s))
8677 return -EINVAL;
8678
8679 tpacpi_disclose_usertask("hwmon pwm1",
8680 "set fan speed to %lu\n", s);
8681
8682
8683 newlevel = (s >> 5) & 0x07;
8684
8685 if (mutex_lock_killable(&fan_mutex))
8686 return -ERESTARTSYS;
8687
8688 rc = fan_get_status(&status);
8689 if (!rc && (status &
8690 (TP_EC_FAN_AUTO | TP_EC_FAN_FULLSPEED)) == 0) {
8691 rc = fan_set_level(newlevel);
8692 if (rc == -ENXIO)
8693 rc = -EINVAL;
8694 else if (!rc) {
8695 fan_update_desired_level(newlevel);
8696 fan_watchdog_reset();
8697 }
8698 }
8699
8700 mutex_unlock(&fan_mutex);
8701 return (rc) ? rc : count;
8702 }
8703
8704 static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, fan_pwm1_show, fan_pwm1_store);
8705
8706
8707 static ssize_t fan_fan1_input_show(struct device *dev,
8708 struct device_attribute *attr,
8709 char *buf)
8710 {
8711 int res;
8712 unsigned int speed;
8713
8714 res = fan_get_speed(&speed);
8715 if (res < 0)
8716 return res;
8717
8718 return sysfs_emit(buf, "%u\n", speed);
8719 }
8720
8721 static DEVICE_ATTR(fan1_input, S_IRUGO, fan_fan1_input_show, NULL);
8722
8723
8724 static ssize_t fan_fan2_input_show(struct device *dev,
8725 struct device_attribute *attr,
8726 char *buf)
8727 {
8728 int res;
8729 unsigned int speed;
8730
8731 res = fan2_get_speed(&speed);
8732 if (res < 0)
8733 return res;
8734
8735 return sysfs_emit(buf, "%u\n", speed);
8736 }
8737
8738 static DEVICE_ATTR(fan2_input, S_IRUGO, fan_fan2_input_show, NULL);
8739
8740
8741 static ssize_t fan_watchdog_show(struct device_driver *drv, char *buf)
8742 {
8743 return sysfs_emit(buf, "%u\n", fan_watchdog_maxinterval);
8744 }
8745
8746 static ssize_t fan_watchdog_store(struct device_driver *drv, const char *buf,
8747 size_t count)
8748 {
8749 unsigned long t;
8750
8751 if (parse_strtoul(buf, 120, &t))
8752 return -EINVAL;
8753
8754 if (!fan_control_allowed)
8755 return -EPERM;
8756
8757 fan_watchdog_maxinterval = t;
8758 fan_watchdog_reset();
8759
8760 tpacpi_disclose_usertask("fan_watchdog", "set to %lu\n", t);
8761
8762 return count;
8763 }
8764 static DRIVER_ATTR_RW(fan_watchdog);
8765
8766
8767
8768 static struct attribute *fan_attributes[] = {
8769 &dev_attr_pwm1_enable.attr,
8770 &dev_attr_pwm1.attr,
8771 &dev_attr_fan1_input.attr,
8772 &dev_attr_fan2_input.attr,
8773 NULL
8774 };
8775
8776 static umode_t fan_attr_is_visible(struct kobject *kobj, struct attribute *attr,
8777 int n)
8778 {
8779 if (fan_status_access_mode == TPACPI_FAN_NONE &&
8780 fan_control_access_mode == TPACPI_FAN_WR_NONE)
8781 return 0;
8782
8783 if (attr == &dev_attr_fan2_input.attr) {
8784 if (!tp_features.second_fan)
8785 return 0;
8786 }
8787
8788 return attr->mode;
8789 }
8790
8791 static const struct attribute_group fan_attr_group = {
8792 .is_visible = fan_attr_is_visible,
8793 .attrs = fan_attributes,
8794 };
8795
8796 static struct attribute *fan_driver_attributes[] = {
8797 &driver_attr_fan_watchdog.attr,
8798 NULL
8799 };
8800
8801 static const struct attribute_group fan_driver_attr_group = {
8802 .is_visible = fan_attr_is_visible,
8803 .attrs = fan_driver_attributes,
8804 };
8805
8806 #define TPACPI_FAN_Q1 0x0001
8807 #define TPACPI_FAN_2FAN 0x0002
8808 #define TPACPI_FAN_2CTL 0x0004
8809 #define TPACPI_FAN_NOFAN 0x0008
8810
8811 static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
8812 TPACPI_QEC_IBM('1', 'Y', TPACPI_FAN_Q1),
8813 TPACPI_QEC_IBM('7', '8', TPACPI_FAN_Q1),
8814 TPACPI_QEC_IBM('7', '6', TPACPI_FAN_Q1),
8815 TPACPI_QEC_IBM('7', '0', TPACPI_FAN_Q1),
8816 TPACPI_QEC_LNV('7', 'M', TPACPI_FAN_2FAN),
8817 TPACPI_Q_LNV('N', '1', TPACPI_FAN_2FAN),
8818 TPACPI_Q_LNV3('N', '1', 'D', TPACPI_FAN_2CTL),
8819 TPACPI_Q_LNV3('N', '1', 'E', TPACPI_FAN_2CTL),
8820 TPACPI_Q_LNV3('N', '1', 'T', TPACPI_FAN_2CTL),
8821 TPACPI_Q_LNV3('N', '1', 'U', TPACPI_FAN_2CTL),
8822 TPACPI_Q_LNV3('N', '2', 'C', TPACPI_FAN_2CTL),
8823 TPACPI_Q_LNV3('N', '2', 'N', TPACPI_FAN_2CTL),
8824 TPACPI_Q_LNV3('N', '2', 'E', TPACPI_FAN_2CTL),
8825 TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL),
8826 TPACPI_Q_LNV3('N', '3', '0', TPACPI_FAN_2CTL),
8827 TPACPI_Q_LNV3('N', '3', '7', TPACPI_FAN_2CTL),
8828 TPACPI_Q_LNV3('N', '1', 'O', TPACPI_FAN_NOFAN),
8829 };
8830
8831 static int __init fan_init(struct ibm_init_struct *iibm)
8832 {
8833 unsigned long quirks;
8834
8835 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN,
8836 "initializing fan subdriver\n");
8837
8838 mutex_init(&fan_mutex);
8839 fan_status_access_mode = TPACPI_FAN_NONE;
8840 fan_control_access_mode = TPACPI_FAN_WR_NONE;
8841 fan_control_commands = 0;
8842 fan_watchdog_maxinterval = 0;
8843 tp_features.fan_ctrl_status_undef = 0;
8844 tp_features.second_fan = 0;
8845 tp_features.second_fan_ctl = 0;
8846 fan_control_desired_level = 7;
8847
8848 if (tpacpi_is_ibm()) {
8849 TPACPI_ACPIHANDLE_INIT(fans);
8850 TPACPI_ACPIHANDLE_INIT(gfan);
8851 TPACPI_ACPIHANDLE_INIT(sfan);
8852 }
8853
8854 quirks = tpacpi_check_quirks(fan_quirk_table,
8855 ARRAY_SIZE(fan_quirk_table));
8856
8857 if (quirks & TPACPI_FAN_NOFAN) {
8858 pr_info("No integrated ThinkPad fan available\n");
8859 return -ENODEV;
8860 }
8861
8862 if (gfan_handle) {
8863
8864 fan_status_access_mode = TPACPI_FAN_RD_ACPI_GFAN;
8865 } else {
8866
8867
8868 if (likely(acpi_ec_read(fan_status_offset,
8869 &fan_control_initial_status))) {
8870 int res;
8871 unsigned int speed;
8872
8873 fan_status_access_mode = TPACPI_FAN_RD_TPEC;
8874 if (quirks & TPACPI_FAN_Q1)
8875 fan_quirk1_setup();
8876
8877 tp_features.second_fan = 1;
8878 res = fan2_get_speed(&speed);
8879 if (res >= 0) {
8880
8881 tp_features.second_fan = 1;
8882 tp_features.second_fan_ctl = 1;
8883 pr_info("secondary fan control detected & enabled\n");
8884 } else {
8885
8886 tp_features.second_fan = 0;
8887 if (quirks & TPACPI_FAN_2FAN) {
8888 tp_features.second_fan = 1;
8889 pr_info("secondary fan support enabled\n");
8890 }
8891 if (quirks & TPACPI_FAN_2CTL) {
8892 tp_features.second_fan = 1;
8893 tp_features.second_fan_ctl = 1;
8894 pr_info("secondary fan control enabled\n");
8895 }
8896 }
8897 } else {
8898 pr_err("ThinkPad ACPI EC access misbehaving, fan status and control unavailable\n");
8899 return -ENODEV;
8900 }
8901 }
8902
8903 if (sfan_handle) {
8904
8905 fan_control_access_mode = TPACPI_FAN_WR_ACPI_SFAN;
8906 fan_control_commands |=
8907 TPACPI_FAN_CMD_LEVEL | TPACPI_FAN_CMD_ENABLE;
8908 } else {
8909 if (!gfan_handle) {
8910
8911
8912
8913 if (fans_handle) {
8914
8915 fan_control_access_mode =
8916 TPACPI_FAN_WR_ACPI_FANS;
8917 fan_control_commands |=
8918 TPACPI_FAN_CMD_SPEED |
8919 TPACPI_FAN_CMD_LEVEL |
8920 TPACPI_FAN_CMD_ENABLE;
8921 } else {
8922 fan_control_access_mode = TPACPI_FAN_WR_TPEC;
8923 fan_control_commands |=
8924 TPACPI_FAN_CMD_LEVEL |
8925 TPACPI_FAN_CMD_ENABLE;
8926 }
8927 }
8928 }
8929
8930 vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN,
8931 "fan is %s, modes %d, %d\n",
8932 str_supported(fan_status_access_mode != TPACPI_FAN_NONE ||
8933 fan_control_access_mode != TPACPI_FAN_WR_NONE),
8934 fan_status_access_mode, fan_control_access_mode);
8935
8936
8937 if (!fan_control_allowed) {
8938 fan_control_access_mode = TPACPI_FAN_WR_NONE;
8939 fan_control_commands = 0;
8940 dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN,
8941 "fan control features disabled by parameter\n");
8942 }
8943
8944
8945 if (fan_status_access_mode != TPACPI_FAN_NONE)
8946 fan_get_status_safe(NULL);
8947
8948 if (fan_status_access_mode == TPACPI_FAN_NONE &&
8949 fan_control_access_mode == TPACPI_FAN_WR_NONE)
8950 return -ENODEV;
8951
8952 return 0;
8953 }
8954
8955 static void fan_exit(void)
8956 {
8957 vdbg_printk(TPACPI_DBG_EXIT | TPACPI_DBG_FAN,
8958 "cancelling any pending fan watchdog tasks\n");
8959
8960 cancel_delayed_work(&fan_watchdog_task);
8961 flush_workqueue(tpacpi_wq);
8962 }
8963
8964 static void fan_suspend(void)
8965 {
8966 int rc;
8967
8968 if (!fan_control_allowed)
8969 return;
8970
8971
8972 fan_control_resume_level = 0;
8973 rc = fan_get_status_safe(&fan_control_resume_level);
8974 if (rc)
8975 pr_notice("failed to read fan level for later restore during resume: %d\n",
8976 rc);
8977
8978
8979
8980 if (tp_features.fan_ctrl_status_undef)
8981 fan_control_resume_level = 0;
8982 }
8983
8984 static void fan_resume(void)
8985 {
8986 u8 current_level = 7;
8987 bool do_set = false;
8988 int rc;
8989
8990
8991 tp_features.fan_ctrl_status_undef = 0;
8992
8993 if (!fan_control_allowed ||
8994 !fan_control_resume_level ||
8995 fan_get_status_safe(¤t_level))
8996 return;
8997
8998 switch (fan_control_access_mode) {
8999 case TPACPI_FAN_WR_ACPI_SFAN:
9000
9001 do_set = (fan_control_resume_level > current_level);
9002 break;
9003 case TPACPI_FAN_WR_ACPI_FANS:
9004 case TPACPI_FAN_WR_TPEC:
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020 if (fan_control_resume_level != 7 &&
9021 !(fan_control_resume_level & TP_EC_FAN_FULLSPEED))
9022 return;
9023 else
9024 do_set = !(current_level & TP_EC_FAN_FULLSPEED) &&
9025 (current_level != fan_control_resume_level);
9026 break;
9027 default:
9028 return;
9029 }
9030 if (do_set) {
9031 pr_notice("restoring fan level to 0x%02x\n",
9032 fan_control_resume_level);
9033 rc = fan_set_level_safe(fan_control_resume_level);
9034 if (rc < 0)
9035 pr_notice("failed to restore fan level: %d\n", rc);
9036 }
9037 }
9038
9039 static int fan_read(struct seq_file *m)
9040 {
9041 int rc;
9042 u8 status;
9043 unsigned int speed = 0;
9044
9045 switch (fan_status_access_mode) {
9046 case TPACPI_FAN_RD_ACPI_GFAN:
9047
9048 rc = fan_get_status_safe(&status);
9049 if (rc)
9050 return rc;
9051
9052 seq_printf(m, "status:\t\t%s\n"
9053 "level:\t\t%d\n",
9054 str_enabled_disabled(status), status);
9055 break;
9056
9057 case TPACPI_FAN_RD_TPEC:
9058
9059 rc = fan_get_status_safe(&status);
9060 if (rc)
9061 return rc;
9062
9063 seq_printf(m, "status:\t\t%s\n", str_enabled_disabled(status));
9064
9065 rc = fan_get_speed(&speed);
9066 if (rc < 0)
9067 return rc;
9068
9069 seq_printf(m, "speed:\t\t%d\n", speed);
9070
9071 if (status & TP_EC_FAN_FULLSPEED)
9072
9073 seq_printf(m, "level:\t\tdisengaged\n");
9074 else if (status & TP_EC_FAN_AUTO)
9075 seq_printf(m, "level:\t\tauto\n");
9076 else
9077 seq_printf(m, "level:\t\t%d\n", status);
9078 break;
9079
9080 case TPACPI_FAN_NONE:
9081 default:
9082 seq_printf(m, "status:\t\tnot supported\n");
9083 }
9084
9085 if (fan_control_commands & TPACPI_FAN_CMD_LEVEL) {
9086 seq_printf(m, "commands:\tlevel <level>");
9087
9088 switch (fan_control_access_mode) {
9089 case TPACPI_FAN_WR_ACPI_SFAN:
9090 seq_printf(m, " (<level> is 0-7)\n");
9091 break;
9092
9093 default:
9094 seq_printf(m, " (<level> is 0-7, auto, disengaged, full-speed)\n");
9095 break;
9096 }
9097 }
9098
9099 if (fan_control_commands & TPACPI_FAN_CMD_ENABLE)
9100 seq_printf(m, "commands:\tenable, disable\n"
9101 "commands:\twatchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))\n");
9102
9103 if (fan_control_commands & TPACPI_FAN_CMD_SPEED)
9104 seq_printf(m, "commands:\tspeed <speed> (<speed> is 0-65535)\n");
9105
9106 return 0;
9107 }
9108
9109 static int fan_write_cmd_level(const char *cmd, int *rc)
9110 {
9111 int level;
9112
9113 if (strlencmp(cmd, "level auto") == 0)
9114 level = TP_EC_FAN_AUTO;
9115 else if ((strlencmp(cmd, "level disengaged") == 0) ||
9116 (strlencmp(cmd, "level full-speed") == 0))
9117 level = TP_EC_FAN_FULLSPEED;
9118 else if (sscanf(cmd, "level %d", &level) != 1)
9119 return 0;
9120
9121 *rc = fan_set_level_safe(level);
9122 if (*rc == -ENXIO)
9123 pr_err("level command accepted for unsupported access mode %d\n",
9124 fan_control_access_mode);
9125 else if (!*rc)
9126 tpacpi_disclose_usertask("procfs fan",
9127 "set level to %d\n", level);
9128
9129 return 1;
9130 }
9131
9132 static int fan_write_cmd_enable(const char *cmd, int *rc)
9133 {
9134 if (strlencmp(cmd, "enable") != 0)
9135 return 0;
9136
9137 *rc = fan_set_enable();
9138 if (*rc == -ENXIO)
9139 pr_err("enable command accepted for unsupported access mode %d\n",
9140 fan_control_access_mode);
9141 else if (!*rc)
9142 tpacpi_disclose_usertask("procfs fan", "enable\n");
9143
9144 return 1;
9145 }
9146
9147 static int fan_write_cmd_disable(const char *cmd, int *rc)
9148 {
9149 if (strlencmp(cmd, "disable") != 0)
9150 return 0;
9151
9152 *rc = fan_set_disable();
9153 if (*rc == -ENXIO)
9154 pr_err("disable command accepted for unsupported access mode %d\n",
9155 fan_control_access_mode);
9156 else if (!*rc)
9157 tpacpi_disclose_usertask("procfs fan", "disable\n");
9158
9159 return 1;
9160 }
9161
9162 static int fan_write_cmd_speed(const char *cmd, int *rc)
9163 {
9164 int speed;
9165
9166
9167
9168
9169 if (sscanf(cmd, "speed %d", &speed) != 1)
9170 return 0;
9171
9172 *rc = fan_set_speed(speed);
9173 if (*rc == -ENXIO)
9174 pr_err("speed command accepted for unsupported access mode %d\n",
9175 fan_control_access_mode);
9176 else if (!*rc)
9177 tpacpi_disclose_usertask("procfs fan",
9178 "set speed to %d\n", speed);
9179
9180 return 1;
9181 }
9182
9183 static int fan_write_cmd_watchdog(const char *cmd, int *rc)
9184 {
9185 int interval;
9186
9187 if (sscanf(cmd, "watchdog %d", &interval) != 1)
9188 return 0;
9189
9190 if (interval < 0 || interval > 120)
9191 *rc = -EINVAL;
9192 else {
9193 fan_watchdog_maxinterval = interval;
9194 tpacpi_disclose_usertask("procfs fan",
9195 "set watchdog timer to %d\n",
9196 interval);
9197 }
9198
9199 return 1;
9200 }
9201
9202 static int fan_write(char *buf)
9203 {
9204 char *cmd;
9205 int rc = 0;
9206
9207 while (!rc && (cmd = strsep(&buf, ","))) {
9208 if (!((fan_control_commands & TPACPI_FAN_CMD_LEVEL) &&
9209 fan_write_cmd_level(cmd, &rc)) &&
9210 !((fan_control_commands & TPACPI_FAN_CMD_ENABLE) &&
9211 (fan_write_cmd_enable(cmd, &rc) ||
9212 fan_write_cmd_disable(cmd, &rc) ||
9213 fan_write_cmd_watchdog(cmd, &rc))) &&
9214 !((fan_control_commands & TPACPI_FAN_CMD_SPEED) &&
9215 fan_write_cmd_speed(cmd, &rc))
9216 )
9217 rc = -EINVAL;
9218 else if (!rc)
9219 fan_watchdog_reset();
9220 }
9221
9222 return rc;
9223 }
9224
9225 static struct ibm_struct fan_driver_data = {
9226 .name = "fan",
9227 .read = fan_read,
9228 .write = fan_write,
9229 .exit = fan_exit,
9230 .suspend = fan_suspend,
9231 .resume = fan_resume,
9232 };
9233
9234
9235
9236
9237
9238 #define TPACPI_LED_MAX 2
9239
9240 struct tp_led_table {
9241 acpi_string name;
9242 int on_value;
9243 int off_value;
9244 int state;
9245 };
9246
9247 static struct tp_led_table led_tables[TPACPI_LED_MAX] = {
9248 [LED_AUDIO_MUTE] = {
9249 .name = "SSMS",
9250 .on_value = 1,
9251 .off_value = 0,
9252 },
9253 [LED_AUDIO_MICMUTE] = {
9254 .name = "MMTS",
9255 .on_value = 2,
9256 .off_value = 0,
9257 },
9258 };
9259
9260 static int mute_led_on_off(struct tp_led_table *t, bool state)
9261 {
9262 acpi_handle temp;
9263 int output;
9264
9265 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, t->name, &temp))) {
9266 pr_warn("Thinkpad ACPI has no %s interface.\n", t->name);
9267 return -EIO;
9268 }
9269
9270 if (!acpi_evalf(hkey_handle, &output, t->name, "dd",
9271 state ? t->on_value : t->off_value))
9272 return -EIO;
9273
9274 t->state = state;
9275 return state;
9276 }
9277
9278 static int tpacpi_led_set(int whichled, bool on)
9279 {
9280 struct tp_led_table *t;
9281
9282 t = &led_tables[whichled];
9283 if (t->state < 0 || t->state == on)
9284 return t->state;
9285 return mute_led_on_off(t, on);
9286 }
9287
9288 static int tpacpi_led_mute_set(struct led_classdev *led_cdev,
9289 enum led_brightness brightness)
9290 {
9291 return tpacpi_led_set(LED_AUDIO_MUTE, brightness != LED_OFF);
9292 }
9293
9294 static int tpacpi_led_micmute_set(struct led_classdev *led_cdev,
9295 enum led_brightness brightness)
9296 {
9297 return tpacpi_led_set(LED_AUDIO_MICMUTE, brightness != LED_OFF);
9298 }
9299
9300 static struct led_classdev mute_led_cdev[TPACPI_LED_MAX] = {
9301 [LED_AUDIO_MUTE] = {
9302 .name = "platform::mute",
9303 .max_brightness = 1,
9304 .brightness_set_blocking = tpacpi_led_mute_set,
9305 .default_trigger = "audio-mute",
9306 },
9307 [LED_AUDIO_MICMUTE] = {
9308 .name = "platform::micmute",
9309 .max_brightness = 1,
9310 .brightness_set_blocking = tpacpi_led_micmute_set,
9311 .default_trigger = "audio-micmute",
9312 },
9313 };
9314
9315 static int mute_led_init(struct ibm_init_struct *iibm)
9316 {
9317 acpi_handle temp;
9318 int i, err;
9319
9320 for (i = 0; i < TPACPI_LED_MAX; i++) {
9321 struct tp_led_table *t = &led_tables[i];
9322 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, t->name, &temp))) {
9323 t->state = -ENODEV;
9324 continue;
9325 }
9326
9327 mute_led_cdev[i].brightness = ledtrig_audio_get(i);
9328 err = led_classdev_register(&tpacpi_pdev->dev, &mute_led_cdev[i]);
9329 if (err < 0) {
9330 while (i--)
9331 led_classdev_unregister(&mute_led_cdev[i]);
9332 return err;
9333 }
9334 }
9335 return 0;
9336 }
9337
9338 static void mute_led_exit(void)
9339 {
9340 int i;
9341
9342 for (i = 0; i < TPACPI_LED_MAX; i++) {
9343 led_classdev_unregister(&mute_led_cdev[i]);
9344 tpacpi_led_set(i, false);
9345 }
9346 }
9347
9348 static void mute_led_resume(void)
9349 {
9350 int i;
9351
9352 for (i = 0; i < TPACPI_LED_MAX; i++) {
9353 struct tp_led_table *t = &led_tables[i];
9354 if (t->state >= 0)
9355 mute_led_on_off(t, t->state);
9356 }
9357 }
9358
9359 static struct ibm_struct mute_led_driver_data = {
9360 .name = "mute_led",
9361 .exit = mute_led_exit,
9362 .resume = mute_led_resume,
9363 };
9364
9365
9366
9367
9368
9369
9370
9371
9372 #define GET_START "BCTG"
9373 #define SET_START "BCCS"
9374 #define GET_STOP "BCSG"
9375 #define SET_STOP "BCSS"
9376 #define GET_DISCHARGE "BDSG"
9377 #define SET_DISCHARGE "BDSS"
9378 #define GET_INHIBIT "BICG"
9379 #define SET_INHIBIT "BICS"
9380
9381 enum {
9382 BAT_ANY = 0,
9383 BAT_PRIMARY = 1,
9384 BAT_SECONDARY = 2
9385 };
9386
9387 enum {
9388
9389 METHOD_ERR = BIT(31),
9390 };
9391
9392 enum {
9393
9394 THRESHOLD_START,
9395 THRESHOLD_STOP,
9396 FORCE_DISCHARGE,
9397 INHIBIT_CHARGE,
9398 };
9399
9400 struct tpacpi_battery_data {
9401 int charge_start;
9402 int start_support;
9403 int charge_stop;
9404 int stop_support;
9405 unsigned int charge_behaviours;
9406 };
9407
9408 struct tpacpi_battery_driver_data {
9409 struct tpacpi_battery_data batteries[3];
9410 int individual_addressing;
9411 };
9412
9413 static struct tpacpi_battery_driver_data battery_info;
9414
9415
9416
9417
9418
9419
9420
9421
9422 static acpi_status tpacpi_battery_acpi_eval(char *method, int *ret, int param)
9423 {
9424 int response;
9425
9426 if (!acpi_evalf(hkey_handle, &response, method, "dd", param)) {
9427 acpi_handle_err(hkey_handle, "%s: evaluate failed", method);
9428 return AE_ERROR;
9429 }
9430 if (response & METHOD_ERR) {
9431 acpi_handle_err(hkey_handle,
9432 "%s evaluated but flagged as error", method);
9433 return AE_ERROR;
9434 }
9435 *ret = response;
9436 return AE_OK;
9437 }
9438
9439 static int tpacpi_battery_get(int what, int battery, int *ret)
9440 {
9441 switch (what) {
9442 case THRESHOLD_START:
9443 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_START, ret, battery))
9444 return -ENODEV;
9445
9446
9447 *ret = *ret & 0xFF;
9448 return 0;
9449 case THRESHOLD_STOP:
9450 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_STOP, ret, battery))
9451 return -ENODEV;
9452
9453 *ret = *ret & 0xFF;
9454
9455
9456
9457
9458
9459
9460 if (*ret == 0)
9461 *ret = 100;
9462 return 0;
9463 case FORCE_DISCHARGE:
9464 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_DISCHARGE, ret, battery))
9465 return -ENODEV;
9466
9467 *ret = *ret & 0x01;
9468 return 0;
9469 case INHIBIT_CHARGE:
9470 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_INHIBIT, ret, battery))
9471 return -ENODEV;
9472
9473 *ret = *ret & 0x01;
9474 return 0;
9475 default:
9476 pr_crit("wrong parameter: %d", what);
9477 return -EINVAL;
9478 }
9479 }
9480
9481 static int tpacpi_battery_set(int what, int battery, int value)
9482 {
9483 int param, ret;
9484
9485 param = value;
9486
9487 param |= battery << 8;
9488
9489 switch (what) {
9490 case THRESHOLD_START:
9491 if ACPI_FAILURE(tpacpi_battery_acpi_eval(SET_START, &ret, param)) {
9492 pr_err("failed to set charge threshold on battery %d",
9493 battery);
9494 return -ENODEV;
9495 }
9496 return 0;
9497 case THRESHOLD_STOP:
9498 if ACPI_FAILURE(tpacpi_battery_acpi_eval(SET_STOP, &ret, param)) {
9499 pr_err("failed to set stop threshold: %d", battery);
9500 return -ENODEV;
9501 }
9502 return 0;
9503 case FORCE_DISCHARGE:
9504
9505
9506
9507
9508 if (ACPI_FAILURE(tpacpi_battery_acpi_eval(SET_DISCHARGE, &ret, param))) {
9509 pr_err("failed to set force discharge on %d", battery);
9510 return -ENODEV;
9511 }
9512 return 0;
9513 case INHIBIT_CHARGE:
9514
9515
9516
9517
9518
9519
9520
9521 param = value;
9522 param |= battery << 4;
9523 param |= 0xFFFF << 8;
9524 if (ACPI_FAILURE(tpacpi_battery_acpi_eval(SET_INHIBIT, &ret, param))) {
9525 pr_err("failed to set inhibit charge on %d", battery);
9526 return -ENODEV;
9527 }
9528 return 0;
9529 default:
9530 pr_crit("wrong parameter: %d", what);
9531 return -EINVAL;
9532 }
9533 }
9534
9535 static int tpacpi_battery_set_validate(int what, int battery, int value)
9536 {
9537 int ret, v;
9538
9539 ret = tpacpi_battery_set(what, battery, value);
9540 if (ret < 0)
9541 return ret;
9542
9543 ret = tpacpi_battery_get(what, battery, &v);
9544 if (ret < 0)
9545 return ret;
9546
9547 if (v == value)
9548 return 0;
9549
9550 msleep(500);
9551
9552 ret = tpacpi_battery_get(what, battery, &v);
9553 if (ret < 0)
9554 return ret;
9555
9556 if (v == value)
9557 return 0;
9558
9559 return -EIO;
9560 }
9561
9562 static int tpacpi_battery_probe(int battery)
9563 {
9564 int ret = 0;
9565
9566 memset(&battery_info.batteries[battery], 0,
9567 sizeof(battery_info.batteries[battery]));
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579 if (acpi_has_method(hkey_handle, GET_START)) {
9580 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_START, &ret, battery)) {
9581 pr_err("Error probing battery %d\n", battery);
9582 return -ENODEV;
9583 }
9584
9585 if (ret & BIT(9))
9586 battery_info.individual_addressing = true;
9587
9588 if (ret & BIT(8))
9589 battery_info.batteries[battery].start_support = 1;
9590 else
9591 return -ENODEV;
9592 if (tpacpi_battery_get(THRESHOLD_START, battery,
9593 &battery_info.batteries[battery].charge_start)) {
9594 pr_err("Error probing battery %d\n", battery);
9595 return -ENODEV;
9596 }
9597 }
9598 if (acpi_has_method(hkey_handle, GET_STOP)) {
9599 if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_STOP, &ret, battery)) {
9600 pr_err("Error probing battery stop; %d\n", battery);
9601 return -ENODEV;
9602 }
9603
9604 if (ret & BIT(8))
9605 battery_info.batteries[battery].stop_support = 1;
9606 else
9607 return -ENODEV;
9608 if (tpacpi_battery_get(THRESHOLD_STOP, battery,
9609 &battery_info.batteries[battery].charge_stop)) {
9610 pr_err("Error probing battery stop: %d\n", battery);
9611 return -ENODEV;
9612 }
9613 }
9614 if (acpi_has_method(hkey_handle, GET_DISCHARGE)) {
9615 if (ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_DISCHARGE, &ret, battery))) {
9616 pr_err("Error probing battery discharge; %d\n", battery);
9617 return -ENODEV;
9618 }
9619
9620 if (ret & BIT(8))
9621 battery_info.batteries[battery].charge_behaviours |=
9622 BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE);
9623 }
9624 if (acpi_has_method(hkey_handle, GET_INHIBIT)) {
9625 if (ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_INHIBIT, &ret, battery))) {
9626 pr_err("Error probing battery inhibit charge; %d\n", battery);
9627 return -ENODEV;
9628 }
9629
9630 if (ret & BIT(5))
9631 battery_info.batteries[battery].charge_behaviours |=
9632 BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE);
9633 }
9634
9635 battery_info.batteries[battery].charge_behaviours |=
9636 BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO);
9637
9638 pr_info("battery %d registered (start %d, stop %d, behaviours: 0x%x)\n",
9639 battery,
9640 battery_info.batteries[battery].charge_start,
9641 battery_info.batteries[battery].charge_stop,
9642 battery_info.batteries[battery].charge_behaviours);
9643
9644 return 0;
9645 }
9646
9647
9648
9649 static int tpacpi_battery_get_id(const char *battery_name)
9650 {
9651
9652 if (strcmp(battery_name, "BAT0") == 0 ||
9653 tp_features.battery_force_primary)
9654 return BAT_PRIMARY;
9655 if (strcmp(battery_name, "BAT1") == 0)
9656 return BAT_SECONDARY;
9657
9658
9659
9660
9661
9662 pr_warn("unknown battery %s, assuming primary", battery_name);
9663 return BAT_PRIMARY;
9664 }
9665
9666
9667
9668 static ssize_t tpacpi_battery_store(int what,
9669 struct device *dev,
9670 const char *buf, size_t count)
9671 {
9672 struct power_supply *supply = to_power_supply(dev);
9673 unsigned long value;
9674 int battery, rval;
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686 if (battery_info.individual_addressing)
9687
9688 battery = tpacpi_battery_get_id(supply->desc->name);
9689 else
9690 battery = BAT_PRIMARY;
9691
9692 rval = kstrtoul(buf, 10, &value);
9693 if (rval)
9694 return rval;
9695
9696 switch (what) {
9697 case THRESHOLD_START:
9698 if (!battery_info.batteries[battery].start_support)
9699 return -ENODEV;
9700
9701 if (value > 99)
9702 return -EINVAL;
9703 if (value > battery_info.batteries[battery].charge_stop)
9704 return -EINVAL;
9705 if (tpacpi_battery_set(THRESHOLD_START, battery, value))
9706 return -ENODEV;
9707 battery_info.batteries[battery].charge_start = value;
9708 return count;
9709
9710 case THRESHOLD_STOP:
9711 if (!battery_info.batteries[battery].stop_support)
9712 return -ENODEV;
9713
9714 if (value < 1 || value > 100)
9715 return -EINVAL;
9716 if (value < battery_info.batteries[battery].charge_start)
9717 return -EINVAL;
9718 battery_info.batteries[battery].charge_stop = value;
9719
9720
9721
9722
9723
9724 if (value == 100)
9725 value = 0;
9726 if (tpacpi_battery_set(THRESHOLD_STOP, battery, value))
9727 return -EINVAL;
9728 return count;
9729 default:
9730 pr_crit("Wrong parameter: %d", what);
9731 return -EINVAL;
9732 }
9733 return count;
9734 }
9735
9736 static ssize_t tpacpi_battery_show(int what,
9737 struct device *dev,
9738 char *buf)
9739 {
9740 struct power_supply *supply = to_power_supply(dev);
9741 int ret, battery;
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753 if (battery_info.individual_addressing)
9754
9755 battery = tpacpi_battery_get_id(supply->desc->name);
9756 else
9757 battery = BAT_PRIMARY;
9758 if (tpacpi_battery_get(what, battery, &ret))
9759 return -ENODEV;
9760 return sprintf(buf, "%d\n", ret);
9761 }
9762
9763 static ssize_t charge_control_start_threshold_show(struct device *device,
9764 struct device_attribute *attr,
9765 char *buf)
9766 {
9767 return tpacpi_battery_show(THRESHOLD_START, device, buf);
9768 }
9769
9770 static ssize_t charge_control_end_threshold_show(struct device *device,
9771 struct device_attribute *attr,
9772 char *buf)
9773 {
9774 return tpacpi_battery_show(THRESHOLD_STOP, device, buf);
9775 }
9776
9777 static ssize_t charge_behaviour_show(struct device *dev,
9778 struct device_attribute *attr,
9779 char *buf)
9780 {
9781 enum power_supply_charge_behaviour active = POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO;
9782 struct power_supply *supply = to_power_supply(dev);
9783 unsigned int available;
9784 int ret, battery;
9785
9786 battery = tpacpi_battery_get_id(supply->desc->name);
9787 available = battery_info.batteries[battery].charge_behaviours;
9788
9789 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE)) {
9790 if (tpacpi_battery_get(FORCE_DISCHARGE, battery, &ret))
9791 return -ENODEV;
9792 if (ret) {
9793 active = POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE;
9794 goto out;
9795 }
9796 }
9797
9798 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE)) {
9799 if (tpacpi_battery_get(INHIBIT_CHARGE, battery, &ret))
9800 return -ENODEV;
9801 if (ret) {
9802 active = POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE;
9803 goto out;
9804 }
9805 }
9806
9807 out:
9808 return power_supply_charge_behaviour_show(dev, available, active, buf);
9809 }
9810
9811 static ssize_t charge_control_start_threshold_store(struct device *dev,
9812 struct device_attribute *attr,
9813 const char *buf, size_t count)
9814 {
9815 return tpacpi_battery_store(THRESHOLD_START, dev, buf, count);
9816 }
9817
9818 static ssize_t charge_control_end_threshold_store(struct device *dev,
9819 struct device_attribute *attr,
9820 const char *buf, size_t count)
9821 {
9822 return tpacpi_battery_store(THRESHOLD_STOP, dev, buf, count);
9823 }
9824
9825 static ssize_t charge_behaviour_store(struct device *dev,
9826 struct device_attribute *attr,
9827 const char *buf, size_t count)
9828 {
9829 struct power_supply *supply = to_power_supply(dev);
9830 int selected, battery, ret = 0;
9831 unsigned int available;
9832
9833 battery = tpacpi_battery_get_id(supply->desc->name);
9834 available = battery_info.batteries[battery].charge_behaviours;
9835 selected = power_supply_charge_behaviour_parse(available, buf);
9836
9837 if (selected < 0)
9838 return selected;
9839
9840 switch (selected) {
9841 case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO:
9842 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE))
9843 ret = tpacpi_battery_set_validate(FORCE_DISCHARGE, battery, 0);
9844 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE))
9845 ret = min(ret, tpacpi_battery_set_validate(INHIBIT_CHARGE, battery, 0));
9846 if (ret < 0)
9847 return ret;
9848 break;
9849 case POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE:
9850 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE))
9851 ret = tpacpi_battery_set_validate(INHIBIT_CHARGE, battery, 0);
9852 ret = min(ret, tpacpi_battery_set_validate(FORCE_DISCHARGE, battery, 1));
9853 if (ret < 0)
9854 return ret;
9855 break;
9856 case POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE:
9857 if (available & BIT(POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE))
9858 ret = tpacpi_battery_set_validate(FORCE_DISCHARGE, battery, 0);
9859 ret = min(ret, tpacpi_battery_set_validate(INHIBIT_CHARGE, battery, 1));
9860 if (ret < 0)
9861 return ret;
9862 break;
9863 default:
9864 dev_err(dev, "Unexpected charge behaviour: %d\n", selected);
9865 return -EINVAL;
9866 }
9867
9868 return count;
9869 }
9870
9871 static DEVICE_ATTR_RW(charge_control_start_threshold);
9872 static DEVICE_ATTR_RW(charge_control_end_threshold);
9873 static DEVICE_ATTR_RW(charge_behaviour);
9874 static struct device_attribute dev_attr_charge_start_threshold = __ATTR(
9875 charge_start_threshold,
9876 0644,
9877 charge_control_start_threshold_show,
9878 charge_control_start_threshold_store
9879 );
9880 static struct device_attribute dev_attr_charge_stop_threshold = __ATTR(
9881 charge_stop_threshold,
9882 0644,
9883 charge_control_end_threshold_show,
9884 charge_control_end_threshold_store
9885 );
9886
9887 static struct attribute *tpacpi_battery_attrs[] = {
9888 &dev_attr_charge_control_start_threshold.attr,
9889 &dev_attr_charge_control_end_threshold.attr,
9890 &dev_attr_charge_start_threshold.attr,
9891 &dev_attr_charge_stop_threshold.attr,
9892 &dev_attr_charge_behaviour.attr,
9893 NULL,
9894 };
9895
9896 ATTRIBUTE_GROUPS(tpacpi_battery);
9897
9898
9899
9900 static int tpacpi_battery_add(struct power_supply *battery)
9901 {
9902 int batteryid = tpacpi_battery_get_id(battery->desc->name);
9903
9904 if (tpacpi_battery_probe(batteryid))
9905 return -ENODEV;
9906 if (device_add_groups(&battery->dev, tpacpi_battery_groups))
9907 return -ENODEV;
9908 return 0;
9909 }
9910
9911 static int tpacpi_battery_remove(struct power_supply *battery)
9912 {
9913 device_remove_groups(&battery->dev, tpacpi_battery_groups);
9914 return 0;
9915 }
9916
9917 static struct acpi_battery_hook battery_hook = {
9918 .add_battery = tpacpi_battery_add,
9919 .remove_battery = tpacpi_battery_remove,
9920 .name = "ThinkPad Battery Extension",
9921 };
9922
9923
9924
9925 static const struct tpacpi_quirk battery_quirk_table[] __initconst = {
9926
9927
9928
9929
9930 TPACPI_Q_LNV('J', '7', true),
9931 TPACPI_Q_LNV('J', 'I', true),
9932 TPACPI_Q_LNV3('R', '0', 'B', true),
9933 TPACPI_Q_LNV3('R', '0', 'C', true),
9934 TPACPI_Q_LNV3('R', '0', 'J', true),
9935 TPACPI_Q_LNV3('R', '0', 'K', true),
9936 };
9937
9938 static int __init tpacpi_battery_init(struct ibm_init_struct *ibm)
9939 {
9940 memset(&battery_info, 0, sizeof(battery_info));
9941
9942 tp_features.battery_force_primary = tpacpi_check_quirks(
9943 battery_quirk_table,
9944 ARRAY_SIZE(battery_quirk_table));
9945
9946 battery_hook_register(&battery_hook);
9947 return 0;
9948 }
9949
9950 static void tpacpi_battery_exit(void)
9951 {
9952 battery_hook_unregister(&battery_hook);
9953 }
9954
9955 static struct ibm_struct battery_driver_data = {
9956 .name = "battery",
9957 .exit = tpacpi_battery_exit,
9958 };
9959
9960
9961
9962
9963
9964 static struct drm_privacy_screen *lcdshadow_dev;
9965 static acpi_handle lcdshadow_get_handle;
9966 static acpi_handle lcdshadow_set_handle;
9967
9968 static int lcdshadow_set_sw_state(struct drm_privacy_screen *priv,
9969 enum drm_privacy_screen_status state)
9970 {
9971 int output;
9972
9973 if (WARN_ON(!mutex_is_locked(&priv->lock)))
9974 return -EIO;
9975
9976 if (!acpi_evalf(lcdshadow_set_handle, &output, NULL, "dd", (int)state))
9977 return -EIO;
9978
9979 priv->hw_state = priv->sw_state = state;
9980 return 0;
9981 }
9982
9983 static void lcdshadow_get_hw_state(struct drm_privacy_screen *priv)
9984 {
9985 int output;
9986
9987 if (!acpi_evalf(lcdshadow_get_handle, &output, NULL, "dd", 0))
9988 return;
9989
9990 priv->hw_state = priv->sw_state = output & 0x1;
9991 }
9992
9993 static const struct drm_privacy_screen_ops lcdshadow_ops = {
9994 .set_sw_state = lcdshadow_set_sw_state,
9995 .get_hw_state = lcdshadow_get_hw_state,
9996 };
9997
9998 static int tpacpi_lcdshadow_init(struct ibm_init_struct *iibm)
9999 {
10000 acpi_status status1, status2;
10001 int output;
10002
10003 status1 = acpi_get_handle(hkey_handle, "GSSS", &lcdshadow_get_handle);
10004 status2 = acpi_get_handle(hkey_handle, "SSSS", &lcdshadow_set_handle);
10005 if (ACPI_FAILURE(status1) || ACPI_FAILURE(status2))
10006 return 0;
10007
10008 if (!acpi_evalf(lcdshadow_get_handle, &output, NULL, "dd", 0))
10009 return -EIO;
10010
10011 if (!(output & 0x10000))
10012 return 0;
10013
10014 lcdshadow_dev = drm_privacy_screen_register(&tpacpi_pdev->dev,
10015 &lcdshadow_ops, NULL);
10016 if (IS_ERR(lcdshadow_dev))
10017 return PTR_ERR(lcdshadow_dev);
10018
10019 return 0;
10020 }
10021
10022 static void lcdshadow_exit(void)
10023 {
10024 drm_privacy_screen_unregister(lcdshadow_dev);
10025 }
10026
10027 static void lcdshadow_resume(void)
10028 {
10029 if (!lcdshadow_dev)
10030 return;
10031
10032 mutex_lock(&lcdshadow_dev->lock);
10033 lcdshadow_set_sw_state(lcdshadow_dev, lcdshadow_dev->sw_state);
10034 mutex_unlock(&lcdshadow_dev->lock);
10035 }
10036
10037 static int lcdshadow_read(struct seq_file *m)
10038 {
10039 if (!lcdshadow_dev) {
10040 seq_puts(m, "status:\t\tnot supported\n");
10041 } else {
10042 seq_printf(m, "status:\t\t%d\n", lcdshadow_dev->hw_state);
10043 seq_puts(m, "commands:\t0, 1\n");
10044 }
10045
10046 return 0;
10047 }
10048
10049 static int lcdshadow_write(char *buf)
10050 {
10051 char *cmd;
10052 int res, state = -EINVAL;
10053
10054 if (!lcdshadow_dev)
10055 return -ENODEV;
10056
10057 while ((cmd = strsep(&buf, ","))) {
10058 res = kstrtoint(cmd, 10, &state);
10059 if (res < 0)
10060 return res;
10061 }
10062
10063 if (state >= 2 || state < 0)
10064 return -EINVAL;
10065
10066 mutex_lock(&lcdshadow_dev->lock);
10067 res = lcdshadow_set_sw_state(lcdshadow_dev, state);
10068 mutex_unlock(&lcdshadow_dev->lock);
10069
10070 drm_privacy_screen_call_notifier_chain(lcdshadow_dev);
10071
10072 return res;
10073 }
10074
10075 static struct ibm_struct lcdshadow_driver_data = {
10076 .name = "lcdshadow",
10077 .exit = lcdshadow_exit,
10078 .resume = lcdshadow_resume,
10079 .read = lcdshadow_read,
10080 .write = lcdshadow_write,
10081 };
10082
10083
10084
10085
10086
10087 #define DYTC_CMD_QUERY 0
10088 #define DYTC_QUERY_ENABLE_BIT 8
10089 #define DYTC_QUERY_SUBREV_BIT 16
10090 #define DYTC_QUERY_REV_BIT 28
10091
10092 #define DYTC_CMD_GET 2
10093 #define DYTC_GET_LAPMODE_BIT 17
10094
10095 #define PALMSENSOR_PRESENT_BIT 0
10096 #define PALMSENSOR_ON_BIT 1
10097
10098 static bool has_palmsensor;
10099 static bool has_lapsensor;
10100 static bool palm_state;
10101 static bool lap_state;
10102 static int dytc_version;
10103
10104 static int dytc_command(int command, int *output)
10105 {
10106 acpi_handle dytc_handle;
10107
10108 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "DYTC", &dytc_handle))) {
10109
10110 return -ENODEV;
10111 }
10112 if (!acpi_evalf(dytc_handle, output, NULL, "dd", command))
10113 return -EIO;
10114 return 0;
10115 }
10116
10117 static int lapsensor_get(bool *present, bool *state)
10118 {
10119 int output, err;
10120
10121 *present = false;
10122 err = dytc_command(DYTC_CMD_GET, &output);
10123 if (err)
10124 return err;
10125
10126 *present = true;
10127 *state = output & BIT(DYTC_GET_LAPMODE_BIT) ? true : false;
10128 return 0;
10129 }
10130
10131 static int palmsensor_get(bool *present, bool *state)
10132 {
10133 acpi_handle psensor_handle;
10134 int output;
10135
10136 *present = false;
10137 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "GPSS", &psensor_handle)))
10138 return -ENODEV;
10139 if (!acpi_evalf(psensor_handle, &output, NULL, "d"))
10140 return -EIO;
10141
10142 *present = output & BIT(PALMSENSOR_PRESENT_BIT) ? true : false;
10143 *state = output & BIT(PALMSENSOR_ON_BIT) ? true : false;
10144 return 0;
10145 }
10146
10147 static void lapsensor_refresh(void)
10148 {
10149 bool state;
10150 int err;
10151
10152 if (has_lapsensor) {
10153 err = lapsensor_get(&has_lapsensor, &state);
10154 if (err)
10155 return;
10156 if (lap_state != state) {
10157 lap_state = state;
10158 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "dytc_lapmode");
10159 }
10160 }
10161 }
10162
10163 static void palmsensor_refresh(void)
10164 {
10165 bool state;
10166 int err;
10167
10168 if (has_palmsensor) {
10169 err = palmsensor_get(&has_palmsensor, &state);
10170 if (err)
10171 return;
10172 if (palm_state != state) {
10173 palm_state = state;
10174 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "palmsensor");
10175 }
10176 }
10177 }
10178
10179 static ssize_t dytc_lapmode_show(struct device *dev,
10180 struct device_attribute *attr,
10181 char *buf)
10182 {
10183 if (has_lapsensor)
10184 return sysfs_emit(buf, "%d\n", lap_state);
10185 return sysfs_emit(buf, "\n");
10186 }
10187 static DEVICE_ATTR_RO(dytc_lapmode);
10188
10189 static ssize_t palmsensor_show(struct device *dev,
10190 struct device_attribute *attr,
10191 char *buf)
10192 {
10193 if (has_palmsensor)
10194 return sysfs_emit(buf, "%d\n", palm_state);
10195 return sysfs_emit(buf, "\n");
10196 }
10197 static DEVICE_ATTR_RO(palmsensor);
10198
10199 static struct attribute *proxsensor_attributes[] = {
10200 &dev_attr_dytc_lapmode.attr,
10201 &dev_attr_palmsensor.attr,
10202 NULL
10203 };
10204
10205 static umode_t proxsensor_attr_is_visible(struct kobject *kobj,
10206 struct attribute *attr, int n)
10207 {
10208 if (attr == &dev_attr_dytc_lapmode.attr) {
10209
10210
10211
10212
10213 if (!has_lapsensor || dytc_version < 5)
10214 return 0;
10215 } else if (attr == &dev_attr_palmsensor.attr) {
10216 if (!has_palmsensor)
10217 return 0;
10218 }
10219
10220 return attr->mode;
10221 }
10222
10223 static const struct attribute_group proxsensor_attr_group = {
10224 .is_visible = proxsensor_attr_is_visible,
10225 .attrs = proxsensor_attributes,
10226 };
10227
10228 static int tpacpi_proxsensor_init(struct ibm_init_struct *iibm)
10229 {
10230 int palm_err, lap_err;
10231
10232 palm_err = palmsensor_get(&has_palmsensor, &palm_state);
10233 lap_err = lapsensor_get(&has_lapsensor, &lap_state);
10234
10235 if ((palm_err == -ENODEV) && (lap_err == -ENODEV))
10236 return -ENODEV;
10237
10238 if (palm_err && (palm_err != -ENODEV))
10239 return palm_err;
10240 if (lap_err && (lap_err != -ENODEV))
10241 return lap_err;
10242
10243 return 0;
10244 }
10245
10246 static struct ibm_struct proxsensor_driver_data = {
10247 .name = "proximity-sensor",
10248 };
10249
10250
10251
10252
10253
10254 #define DYTC_CMD_SET 1
10255 #define DYTC_CMD_MMC_GET 8
10256 #define DYTC_CMD_RESET 0x1ff
10257
10258 #define DYTC_CMD_FUNC_CAP 3
10259 #define DYTC_FC_MMC 27
10260 #define DYTC_FC_PSC 29
10261 #define DYTC_FC_AMT 31
10262
10263 #define DYTC_GET_FUNCTION_BIT 8
10264 #define DYTC_GET_MODE_BIT 12
10265
10266 #define DYTC_SET_FUNCTION_BIT 12
10267 #define DYTC_SET_MODE_BIT 16
10268 #define DYTC_SET_VALID_BIT 20
10269
10270 #define DYTC_FUNCTION_STD 0
10271 #define DYTC_FUNCTION_CQL 1
10272 #define DYTC_FUNCTION_MMC 11
10273 #define DYTC_FUNCTION_PSC 13
10274 #define DYTC_FUNCTION_AMT 15
10275
10276 #define DYTC_MODE_AMT_ENABLE 0x1
10277 #define DYTC_MODE_AMT_DISABLE 0xF
10278
10279 #define DYTC_MODE_MMC_PERFORM 2
10280 #define DYTC_MODE_MMC_LOWPOWER 3
10281 #define DYTC_MODE_MMC_BALANCE 0xF
10282 #define DYTC_MODE_MMC_DEFAULT 0
10283
10284 #define DYTC_MODE_PSC_LOWPOWER 3
10285 #define DYTC_MODE_PSC_BALANCE 5
10286 #define DYTC_MODE_PSC_PERFORM 7
10287
10288 #define DYTC_ERR_MASK 0xF
10289 #define DYTC_ERR_SUCCESS 1
10290
10291 #define DYTC_SET_COMMAND(function, mode, on) \
10292 (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \
10293 (mode) << DYTC_SET_MODE_BIT | \
10294 (on) << DYTC_SET_VALID_BIT)
10295
10296 #define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 0)
10297 #define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 1)
10298 static int dytc_control_amt(bool enable);
10299 static bool dytc_amt_active;
10300
10301 static enum platform_profile_option dytc_current_profile;
10302 static atomic_t dytc_ignore_event = ATOMIC_INIT(0);
10303 static DEFINE_MUTEX(dytc_mutex);
10304 static int dytc_capabilities;
10305 static bool dytc_mmc_get_available;
10306
10307 static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile)
10308 {
10309 if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
10310 switch (dytcmode) {
10311 case DYTC_MODE_MMC_LOWPOWER:
10312 *profile = PLATFORM_PROFILE_LOW_POWER;
10313 break;
10314 case DYTC_MODE_MMC_DEFAULT:
10315 case DYTC_MODE_MMC_BALANCE:
10316 *profile = PLATFORM_PROFILE_BALANCED;
10317 break;
10318 case DYTC_MODE_MMC_PERFORM:
10319 *profile = PLATFORM_PROFILE_PERFORMANCE;
10320 break;
10321 default:
10322 return -EINVAL;
10323 }
10324 return 0;
10325 }
10326 if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
10327 switch (dytcmode) {
10328 case DYTC_MODE_PSC_LOWPOWER:
10329 *profile = PLATFORM_PROFILE_LOW_POWER;
10330 break;
10331 case DYTC_MODE_PSC_BALANCE:
10332 *profile = PLATFORM_PROFILE_BALANCED;
10333 break;
10334 case DYTC_MODE_PSC_PERFORM:
10335 *profile = PLATFORM_PROFILE_PERFORMANCE;
10336 break;
10337 default:
10338 return -EINVAL;
10339 }
10340 }
10341 return 0;
10342 }
10343
10344 static int convert_profile_to_dytc(enum platform_profile_option profile, int *perfmode)
10345 {
10346 switch (profile) {
10347 case PLATFORM_PROFILE_LOW_POWER:
10348 if (dytc_capabilities & BIT(DYTC_FC_MMC))
10349 *perfmode = DYTC_MODE_MMC_LOWPOWER;
10350 else if (dytc_capabilities & BIT(DYTC_FC_PSC))
10351 *perfmode = DYTC_MODE_PSC_LOWPOWER;
10352 break;
10353 case PLATFORM_PROFILE_BALANCED:
10354 if (dytc_capabilities & BIT(DYTC_FC_MMC))
10355 *perfmode = DYTC_MODE_MMC_BALANCE;
10356 else if (dytc_capabilities & BIT(DYTC_FC_PSC))
10357 *perfmode = DYTC_MODE_PSC_BALANCE;
10358 break;
10359 case PLATFORM_PROFILE_PERFORMANCE:
10360 if (dytc_capabilities & BIT(DYTC_FC_MMC))
10361 *perfmode = DYTC_MODE_MMC_PERFORM;
10362 else if (dytc_capabilities & BIT(DYTC_FC_PSC))
10363 *perfmode = DYTC_MODE_PSC_PERFORM;
10364 break;
10365 default:
10366 return -EOPNOTSUPP;
10367 }
10368 return 0;
10369 }
10370
10371
10372
10373
10374
10375 static int dytc_profile_get(struct platform_profile_handler *pprof,
10376 enum platform_profile_option *profile)
10377 {
10378 *profile = dytc_current_profile;
10379 return 0;
10380 }
10381
10382 static int dytc_control_amt(bool enable)
10383 {
10384 int dummy;
10385 int err;
10386 int cmd;
10387
10388 if (!(dytc_capabilities & BIT(DYTC_FC_AMT))) {
10389 pr_warn("Attempting to toggle AMT on a system that doesn't advertise support\n");
10390 return -ENODEV;
10391 }
10392
10393 if (enable)
10394 cmd = DYTC_SET_COMMAND(DYTC_FUNCTION_AMT, DYTC_MODE_AMT_ENABLE, enable);
10395 else
10396 cmd = DYTC_SET_COMMAND(DYTC_FUNCTION_AMT, DYTC_MODE_AMT_DISABLE, enable);
10397
10398 pr_debug("%sabling AMT (cmd 0x%x)", enable ? "en":"dis", cmd);
10399 err = dytc_command(cmd, &dummy);
10400 if (err)
10401 return err;
10402 dytc_amt_active = enable;
10403 return 0;
10404 }
10405
10406
10407
10408
10409
10410
10411
10412
10413 static int dytc_cql_command(int command, int *output)
10414 {
10415 int err, cmd_err, dummy;
10416 int cur_funcmode;
10417
10418
10419 err = dytc_command(DYTC_CMD_GET, output);
10420 if (err)
10421 return err;
10422
10423 cur_funcmode = (*output >> DYTC_GET_FUNCTION_BIT) & 0xF;
10424
10425 if ((command == DYTC_CMD_GET) && (cur_funcmode != DYTC_FUNCTION_CQL))
10426 return 0;
10427
10428 if (cur_funcmode == DYTC_FUNCTION_CQL) {
10429 atomic_inc(&dytc_ignore_event);
10430 err = dytc_command(DYTC_DISABLE_CQL, &dummy);
10431 if (err)
10432 return err;
10433 }
10434
10435 cmd_err = dytc_command(command, output);
10436
10437
10438 if (cur_funcmode == DYTC_FUNCTION_CQL) {
10439 err = dytc_command(DYTC_ENABLE_CQL, &dummy);
10440 if (err)
10441 return err;
10442 }
10443 return cmd_err;
10444 }
10445
10446
10447
10448
10449
10450 static int dytc_profile_set(struct platform_profile_handler *pprof,
10451 enum platform_profile_option profile)
10452 {
10453 int perfmode;
10454 int output;
10455 int err;
10456
10457 err = mutex_lock_interruptible(&dytc_mutex);
10458 if (err)
10459 return err;
10460
10461 err = convert_profile_to_dytc(profile, &perfmode);
10462 if (err)
10463 goto unlock;
10464
10465 if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
10466 if (profile == PLATFORM_PROFILE_BALANCED) {
10467
10468
10469
10470
10471
10472
10473 err = dytc_cql_command(DYTC_CMD_RESET, &output);
10474 if (err)
10475 goto unlock;
10476 } else {
10477
10478 err = dytc_cql_command(DYTC_SET_COMMAND(DYTC_FUNCTION_MMC, perfmode, 1),
10479 &output);
10480 if (err)
10481 goto unlock;
10482 }
10483 }
10484 if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
10485 err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output);
10486 if (err)
10487 goto unlock;
10488
10489 if (dytc_capabilities & BIT(DYTC_FC_AMT))
10490 dytc_control_amt(profile == PLATFORM_PROFILE_BALANCED);
10491 }
10492
10493 dytc_current_profile = profile;
10494 unlock:
10495 mutex_unlock(&dytc_mutex);
10496 return err;
10497 }
10498
10499 static void dytc_profile_refresh(void)
10500 {
10501 enum platform_profile_option profile;
10502 int output, err = 0;
10503 int perfmode;
10504
10505 mutex_lock(&dytc_mutex);
10506 if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
10507 if (dytc_mmc_get_available)
10508 err = dytc_command(DYTC_CMD_MMC_GET, &output);
10509 else
10510 err = dytc_cql_command(DYTC_CMD_GET, &output);
10511 } else if (dytc_capabilities & BIT(DYTC_FC_PSC))
10512 err = dytc_command(DYTC_CMD_GET, &output);
10513
10514 mutex_unlock(&dytc_mutex);
10515 if (err)
10516 return;
10517
10518 perfmode = (output >> DYTC_GET_MODE_BIT) & 0xF;
10519 convert_dytc_to_profile(perfmode, &profile);
10520 if (profile != dytc_current_profile) {
10521 dytc_current_profile = profile;
10522 platform_profile_notify();
10523 }
10524 }
10525
10526 static struct platform_profile_handler dytc_profile = {
10527 .profile_get = dytc_profile_get,
10528 .profile_set = dytc_profile_set,
10529 };
10530
10531 static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
10532 {
10533 int err, output;
10534
10535
10536 set_bit(PLATFORM_PROFILE_LOW_POWER, dytc_profile.choices);
10537 set_bit(PLATFORM_PROFILE_BALANCED, dytc_profile.choices);
10538 set_bit(PLATFORM_PROFILE_PERFORMANCE, dytc_profile.choices);
10539
10540 err = dytc_command(DYTC_CMD_QUERY, &output);
10541 if (err)
10542 return err;
10543
10544 if (output & BIT(DYTC_QUERY_ENABLE_BIT))
10545 dytc_version = (output >> DYTC_QUERY_REV_BIT) & 0xF;
10546
10547
10548 if (dytc_version < 5)
10549 return -ENODEV;
10550
10551
10552 err = dytc_command(DYTC_CMD_FUNC_CAP, &dytc_capabilities);
10553 if (err)
10554 return err;
10555
10556 if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
10557 pr_debug("MMC is supported\n");
10558
10559
10560
10561
10562 dytc_mmc_get_available = false;
10563 if (dytc_version >= 6) {
10564 err = dytc_command(DYTC_CMD_MMC_GET, &output);
10565 if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS))
10566 dytc_mmc_get_available = true;
10567 }
10568 } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
10569
10570 if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) {
10571 dbg_printk(TPACPI_DBG_INIT, "PSC not support on Intel platforms\n");
10572 return -ENODEV;
10573 }
10574 pr_debug("PSC is supported\n");
10575 } else {
10576 dbg_printk(TPACPI_DBG_INIT, "No DYTC support available\n");
10577 return -ENODEV;
10578 }
10579
10580 dbg_printk(TPACPI_DBG_INIT,
10581 "DYTC version %d: thermal mode available\n", dytc_version);
10582
10583
10584 err = platform_profile_register(&dytc_profile);
10585
10586
10587
10588
10589 if (err)
10590 return -ENODEV;
10591
10592
10593 dytc_profile_refresh();
10594
10595
10596 if (dytc_capabilities & BIT(DYTC_FC_PSC))
10597 dytc_profile_set(NULL, PLATFORM_PROFILE_BALANCED);
10598
10599 return 0;
10600 }
10601
10602 static void dytc_profile_exit(void)
10603 {
10604 platform_profile_remove();
10605 }
10606
10607 static struct ibm_struct dytc_profile_driver_data = {
10608 .name = "dytc-profile",
10609 .exit = dytc_profile_exit,
10610 };
10611
10612
10613
10614
10615
10616 struct keyboard_lang_data {
10617 const char *lang_str;
10618 int lang_code;
10619 };
10620
10621 static const struct keyboard_lang_data keyboard_lang_data[] = {
10622 {"be", 0x080c},
10623 {"cz", 0x0405},
10624 {"da", 0x0406},
10625 {"de", 0x0c07},
10626 {"en", 0x0000},
10627 {"es", 0x2c0a},
10628 {"et", 0x0425},
10629 {"fr", 0x040c},
10630 {"fr-ch", 0x100c},
10631 {"hu", 0x040e},
10632 {"it", 0x0410},
10633 {"jp", 0x0411},
10634 {"nl", 0x0413},
10635 {"nn", 0x0414},
10636 {"pl", 0x0415},
10637 {"pt", 0x0816},
10638 {"sl", 0x041b},
10639 {"sv", 0x081d},
10640 {"tr", 0x041f},
10641 };
10642
10643 static int set_keyboard_lang_command(int command)
10644 {
10645 acpi_handle sskl_handle;
10646 int output;
10647
10648 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "SSKL", &sskl_handle))) {
10649
10650 return -ENODEV;
10651 }
10652
10653 if (!acpi_evalf(sskl_handle, &output, NULL, "dd", command))
10654 return -EIO;
10655
10656 return 0;
10657 }
10658
10659 static int get_keyboard_lang(int *output)
10660 {
10661 acpi_handle gskl_handle;
10662 int kbd_lang;
10663
10664 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "GSKL", &gskl_handle))) {
10665
10666 return -ENODEV;
10667 }
10668
10669 if (!acpi_evalf(gskl_handle, &kbd_lang, NULL, "dd", 0x02000000))
10670 return -EIO;
10671
10672
10673
10674
10675
10676 if (kbd_lang & METHOD_ERR)
10677 return -ENODEV;
10678
10679 *output = kbd_lang;
10680
10681 return 0;
10682 }
10683
10684
10685 static ssize_t keyboard_lang_show(struct device *dev,
10686 struct device_attribute *attr,
10687 char *buf)
10688 {
10689 int output, err, i, len = 0;
10690
10691 err = get_keyboard_lang(&output);
10692 if (err)
10693 return err;
10694
10695 for (i = 0; i < ARRAY_SIZE(keyboard_lang_data); i++) {
10696 if (i)
10697 len += sysfs_emit_at(buf, len, "%s", " ");
10698
10699 if (output == keyboard_lang_data[i].lang_code) {
10700 len += sysfs_emit_at(buf, len, "[%s]", keyboard_lang_data[i].lang_str);
10701 } else {
10702 len += sysfs_emit_at(buf, len, "%s", keyboard_lang_data[i].lang_str);
10703 }
10704 }
10705 len += sysfs_emit_at(buf, len, "\n");
10706
10707 return len;
10708 }
10709
10710 static ssize_t keyboard_lang_store(struct device *dev,
10711 struct device_attribute *attr,
10712 const char *buf, size_t count)
10713 {
10714 int err, i;
10715 bool lang_found = false;
10716 int lang_code = 0;
10717
10718 for (i = 0; i < ARRAY_SIZE(keyboard_lang_data); i++) {
10719 if (sysfs_streq(buf, keyboard_lang_data[i].lang_str)) {
10720 lang_code = keyboard_lang_data[i].lang_code;
10721 lang_found = true;
10722 break;
10723 }
10724 }
10725
10726 if (lang_found) {
10727 lang_code = lang_code | 1 << 24;
10728
10729
10730 err = set_keyboard_lang_command(lang_code);
10731 if (err)
10732 return err;
10733 } else {
10734 dev_err(&tpacpi_pdev->dev, "Unknown Keyboard language. Ignoring\n");
10735 return -EINVAL;
10736 }
10737
10738 tpacpi_disclose_usertask(attr->attr.name,
10739 "keyboard language is set to %s\n", buf);
10740
10741 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "keyboard_lang");
10742
10743 return count;
10744 }
10745 static DEVICE_ATTR_RW(keyboard_lang);
10746
10747 static struct attribute *kbdlang_attributes[] = {
10748 &dev_attr_keyboard_lang.attr,
10749 NULL
10750 };
10751
10752 static umode_t kbdlang_attr_is_visible(struct kobject *kobj,
10753 struct attribute *attr, int n)
10754 {
10755 return tp_features.kbd_lang ? attr->mode : 0;
10756 }
10757
10758 static const struct attribute_group kbdlang_attr_group = {
10759 .is_visible = kbdlang_attr_is_visible,
10760 .attrs = kbdlang_attributes,
10761 };
10762
10763 static int tpacpi_kbdlang_init(struct ibm_init_struct *iibm)
10764 {
10765 int err, output;
10766
10767 err = get_keyboard_lang(&output);
10768 tp_features.kbd_lang = !err;
10769 return err;
10770 }
10771
10772 static struct ibm_struct kbdlang_driver_data = {
10773 .name = "kbdlang",
10774 };
10775
10776
10777
10778
10779
10780 #define DPRC_GET_WWAN_ANTENNA_TYPE 0x40000
10781 #define DPRC_WWAN_ANTENNA_TYPE_A_BIT BIT(4)
10782 #define DPRC_WWAN_ANTENNA_TYPE_B_BIT BIT(8)
10783 static bool has_antennatype;
10784 static int wwan_antennatype;
10785
10786 static int dprc_command(int command, int *output)
10787 {
10788 acpi_handle dprc_handle;
10789
10790 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "DPRC", &dprc_handle))) {
10791
10792 return -ENODEV;
10793 }
10794
10795 if (!acpi_evalf(dprc_handle, output, NULL, "dd", command))
10796 return -EIO;
10797
10798
10799
10800
10801
10802
10803 if (*output & METHOD_ERR)
10804 return -ENODEV;
10805
10806 return 0;
10807 }
10808
10809 static int get_wwan_antenna(int *wwan_antennatype)
10810 {
10811 int output, err;
10812
10813
10814 err = dprc_command(DPRC_GET_WWAN_ANTENNA_TYPE, &output);
10815 if (err)
10816 return err;
10817
10818 if (output & DPRC_WWAN_ANTENNA_TYPE_A_BIT)
10819 *wwan_antennatype = 1;
10820 else if (output & DPRC_WWAN_ANTENNA_TYPE_B_BIT)
10821 *wwan_antennatype = 2;
10822 else
10823 return -ENODEV;
10824
10825 return 0;
10826 }
10827
10828
10829 static ssize_t wwan_antenna_type_show(struct device *dev,
10830 struct device_attribute *attr,
10831 char *buf)
10832 {
10833 switch (wwan_antennatype) {
10834 case 1:
10835 return sysfs_emit(buf, "type a\n");
10836 case 2:
10837 return sysfs_emit(buf, "type b\n");
10838 default:
10839 return -ENODATA;
10840 }
10841 }
10842 static DEVICE_ATTR_RO(wwan_antenna_type);
10843
10844 static struct attribute *dprc_attributes[] = {
10845 &dev_attr_wwan_antenna_type.attr,
10846 NULL
10847 };
10848
10849 static umode_t dprc_attr_is_visible(struct kobject *kobj,
10850 struct attribute *attr, int n)
10851 {
10852 return has_antennatype ? attr->mode : 0;
10853 }
10854
10855 static const struct attribute_group dprc_attr_group = {
10856 .is_visible = dprc_attr_is_visible,
10857 .attrs = dprc_attributes,
10858 };
10859
10860 static int tpacpi_dprc_init(struct ibm_init_struct *iibm)
10861 {
10862 int err;
10863
10864 err = get_wwan_antenna(&wwan_antennatype);
10865 if (err)
10866 return err;
10867
10868 has_antennatype = true;
10869 return 0;
10870 }
10871
10872 static struct ibm_struct dprc_driver_data = {
10873 .name = "dprc",
10874 };
10875
10876
10877
10878 static struct attribute *tpacpi_driver_attributes[] = {
10879 &driver_attr_debug_level.attr,
10880 &driver_attr_version.attr,
10881 &driver_attr_interface_version.attr,
10882 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
10883 &driver_attr_wlsw_emulstate.attr,
10884 &driver_attr_bluetooth_emulstate.attr,
10885 &driver_attr_wwan_emulstate.attr,
10886 &driver_attr_uwb_emulstate.attr,
10887 #endif
10888 NULL
10889 };
10890
10891 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
10892 static umode_t tpacpi_attr_is_visible(struct kobject *kobj,
10893 struct attribute *attr, int n)
10894 {
10895 if (attr == &driver_attr_wlsw_emulstate.attr) {
10896 if (!dbg_wlswemul)
10897 return 0;
10898 } else if (attr == &driver_attr_bluetooth_emulstate.attr) {
10899 if (!dbg_bluetoothemul)
10900 return 0;
10901 } else if (attr == &driver_attr_wwan_emulstate.attr) {
10902 if (!dbg_wwanemul)
10903 return 0;
10904 } else if (attr == &driver_attr_uwb_emulstate.attr) {
10905 if (!dbg_uwbemul)
10906 return 0;
10907 }
10908
10909 return attr->mode;
10910 }
10911 #endif
10912
10913 static const struct attribute_group tpacpi_driver_attr_group = {
10914 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
10915 .is_visible = tpacpi_attr_is_visible,
10916 #endif
10917 .attrs = tpacpi_driver_attributes,
10918 };
10919
10920 static const struct attribute_group *tpacpi_driver_groups[] = {
10921 &tpacpi_driver_attr_group,
10922 NULL,
10923 };
10924
10925 static const struct attribute_group *tpacpi_groups[] = {
10926 &adaptive_kbd_attr_group,
10927 &hotkey_attr_group,
10928 &bluetooth_attr_group,
10929 &wan_attr_group,
10930 &cmos_attr_group,
10931 &proxsensor_attr_group,
10932 &kbdlang_attr_group,
10933 &dprc_attr_group,
10934 NULL,
10935 };
10936
10937 static const struct attribute_group *tpacpi_hwmon_groups[] = {
10938 &thermal_attr_group,
10939 &temp_label_attr_group,
10940 &fan_attr_group,
10941 NULL,
10942 };
10943
10944 static const struct attribute_group *tpacpi_hwmon_driver_groups[] = {
10945 &fan_driver_attr_group,
10946 NULL,
10947 };
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957 static struct platform_driver tpacpi_pdriver = {
10958 .driver = {
10959 .name = TPACPI_DRVR_NAME,
10960 .pm = &tpacpi_pm,
10961 .groups = tpacpi_driver_groups,
10962 .dev_groups = tpacpi_groups,
10963 },
10964 .shutdown = tpacpi_shutdown_handler,
10965 };
10966
10967 static struct platform_driver tpacpi_hwmon_pdriver = {
10968 .driver = {
10969 .name = TPACPI_HWMON_DRVR_NAME,
10970 .groups = tpacpi_hwmon_driver_groups,
10971 },
10972 };
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986 static void tpacpi_driver_event(const unsigned int hkey_event)
10987 {
10988 if (ibm_backlight_device) {
10989 switch (hkey_event) {
10990 case TP_HKEY_EV_BRGHT_UP:
10991 case TP_HKEY_EV_BRGHT_DOWN:
10992 tpacpi_brightness_notify_change();
10993 }
10994 }
10995 if (alsa_card) {
10996 switch (hkey_event) {
10997 case TP_HKEY_EV_VOL_UP:
10998 case TP_HKEY_EV_VOL_DOWN:
10999 case TP_HKEY_EV_VOL_MUTE:
11000 volume_alsa_notify_change();
11001 }
11002 }
11003 if (tp_features.kbdlight && hkey_event == TP_HKEY_EV_KBD_LIGHT) {
11004 enum led_brightness brightness;
11005
11006 mutex_lock(&kbdlight_mutex);
11007
11008
11009
11010
11011
11012 brightness = kbdlight_sysfs_get(NULL);
11013 if (kbdlight_brightness != brightness) {
11014 kbdlight_brightness = brightness;
11015 led_classdev_notify_brightness_hw_changed(
11016 &tpacpi_led_kbdlight.led_classdev, brightness);
11017 }
11018
11019 mutex_unlock(&kbdlight_mutex);
11020 }
11021
11022 if (hkey_event == TP_HKEY_EV_THM_CSM_COMPLETED) {
11023 lapsensor_refresh();
11024
11025 if (!atomic_add_unless(&dytc_ignore_event, -1, 0))
11026 dytc_profile_refresh();
11027 }
11028
11029 if (lcdshadow_dev && hkey_event == TP_HKEY_EV_PRIVACYGUARD_TOGGLE) {
11030 enum drm_privacy_screen_status old_hw_state;
11031 bool changed;
11032
11033 mutex_lock(&lcdshadow_dev->lock);
11034 old_hw_state = lcdshadow_dev->hw_state;
11035 lcdshadow_get_hw_state(lcdshadow_dev);
11036 changed = lcdshadow_dev->hw_state != old_hw_state;
11037 mutex_unlock(&lcdshadow_dev->lock);
11038
11039 if (changed)
11040 drm_privacy_screen_call_notifier_chain(lcdshadow_dev);
11041 }
11042 if (hkey_event == TP_HKEY_EV_AMT_TOGGLE) {
11043
11044 if (!dytc_amt_active)
11045
11046 dytc_profile_set(NULL, PLATFORM_PROFILE_BALANCED);
11047 else
11048 dytc_control_amt(!dytc_amt_active);
11049 }
11050
11051 }
11052
11053 static void hotkey_driver_event(const unsigned int scancode)
11054 {
11055 tpacpi_driver_event(TP_HKEY_EV_HOTKEY_BASE + scancode);
11056 }
11057
11058
11059
11060
11061 static struct proc_dir_entry *proc_dir;
11062
11063
11064
11065
11066
11067 static bool force_load;
11068
11069 #ifdef CONFIG_THINKPAD_ACPI_DEBUG
11070 static const char * __init str_supported(int is_supported)
11071 {
11072 static char text_unsupported[] __initdata = "not supported";
11073
11074 return (is_supported) ? &text_unsupported[4] : &text_unsupported[0];
11075 }
11076 #endif
11077
11078 static void ibm_exit(struct ibm_struct *ibm)
11079 {
11080 dbg_printk(TPACPI_DBG_EXIT, "removing %s\n", ibm->name);
11081
11082 list_del_init(&ibm->all_drivers);
11083
11084 if (ibm->flags.acpi_notify_installed) {
11085 dbg_printk(TPACPI_DBG_EXIT,
11086 "%s: acpi_remove_notify_handler\n", ibm->name);
11087 BUG_ON(!ibm->acpi);
11088 acpi_remove_notify_handler(*ibm->acpi->handle,
11089 ibm->acpi->type,
11090 dispatch_acpi_notify);
11091 ibm->flags.acpi_notify_installed = 0;
11092 }
11093
11094 if (ibm->flags.proc_created) {
11095 dbg_printk(TPACPI_DBG_EXIT,
11096 "%s: remove_proc_entry\n", ibm->name);
11097 remove_proc_entry(ibm->name, proc_dir);
11098 ibm->flags.proc_created = 0;
11099 }
11100
11101 if (ibm->flags.acpi_driver_registered) {
11102 dbg_printk(TPACPI_DBG_EXIT,
11103 "%s: acpi_bus_unregister_driver\n", ibm->name);
11104 BUG_ON(!ibm->acpi);
11105 acpi_bus_unregister_driver(ibm->acpi->driver);
11106 kfree(ibm->acpi->driver);
11107 ibm->acpi->driver = NULL;
11108 ibm->flags.acpi_driver_registered = 0;
11109 }
11110
11111 if (ibm->flags.init_called && ibm->exit) {
11112 ibm->exit();
11113 ibm->flags.init_called = 0;
11114 }
11115
11116 dbg_printk(TPACPI_DBG_INIT, "finished removing %s\n", ibm->name);
11117 }
11118
11119 static int __init ibm_init(struct ibm_init_struct *iibm)
11120 {
11121 int ret;
11122 struct ibm_struct *ibm = iibm->data;
11123 struct proc_dir_entry *entry;
11124
11125 BUG_ON(ibm == NULL);
11126
11127 INIT_LIST_HEAD(&ibm->all_drivers);
11128
11129 if (ibm->flags.experimental && !experimental)
11130 return 0;
11131
11132 dbg_printk(TPACPI_DBG_INIT,
11133 "probing for %s\n", ibm->name);
11134
11135 if (iibm->init) {
11136 ret = iibm->init(iibm);
11137 if (ret > 0 || ret == -ENODEV)
11138 return 0;
11139 if (ret)
11140 return ret;
11141
11142 ibm->flags.init_called = 1;
11143 }
11144
11145 if (ibm->acpi) {
11146 if (ibm->acpi->hid) {
11147 ret = register_tpacpi_subdriver(ibm);
11148 if (ret)
11149 goto err_out;
11150 }
11151
11152 if (ibm->acpi->notify) {
11153 ret = setup_acpi_notify(ibm);
11154 if (ret == -ENODEV) {
11155 pr_notice("disabling subdriver %s\n",
11156 ibm->name);
11157 ret = 0;
11158 goto err_out;
11159 }
11160 if (ret < 0)
11161 goto err_out;
11162 }
11163 }
11164
11165 dbg_printk(TPACPI_DBG_INIT,
11166 "%s installed\n", ibm->name);
11167
11168 if (ibm->read) {
11169 umode_t mode = iibm->base_procfs_mode;
11170
11171 if (!mode)
11172 mode = S_IRUGO;
11173 if (ibm->write)
11174 mode |= S_IWUSR;
11175 entry = proc_create_data(ibm->name, mode, proc_dir,
11176 &dispatch_proc_ops, ibm);
11177 if (!entry) {
11178 pr_err("unable to create proc entry %s\n", ibm->name);
11179 ret = -ENODEV;
11180 goto err_out;
11181 }
11182 ibm->flags.proc_created = 1;
11183 }
11184
11185 list_add_tail(&ibm->all_drivers, &tpacpi_all_drivers);
11186
11187 return 0;
11188
11189 err_out:
11190 dbg_printk(TPACPI_DBG_INIT,
11191 "%s: at error exit path with result %d\n",
11192 ibm->name, ret);
11193
11194 ibm_exit(ibm);
11195 return (ret < 0) ? ret : 0;
11196 }
11197
11198
11199
11200 static char __init tpacpi_parse_fw_id(const char * const s,
11201 u32 *model, u16 *release)
11202 {
11203 int i;
11204
11205 if (!s || strlen(s) < 8)
11206 goto invalid;
11207
11208 for (i = 0; i < 8; i++)
11209 if (!((s[i] >= '0' && s[i] <= '9') ||
11210 (s[i] >= 'A' && s[i] <= 'Z')))
11211 goto invalid;
11212
11213
11214
11215
11216
11217 if (s[3] == 'T' || s[3] == 'N') {
11218 *model = TPID(s[0], s[1]);
11219 *release = TPVER(s[4], s[5]);
11220 return s[2];
11221
11222
11223 } else if (s[4] == 'T' || s[4] == 'N') {
11224 *model = TPID3(s[0], s[1], s[2]);
11225 *release = TPVER(s[5], s[6]);
11226 return s[3];
11227 }
11228
11229 invalid:
11230 return '\0';
11231 }
11232
11233 static void find_new_ec_fwstr(const struct dmi_header *dm, void *private)
11234 {
11235 char *ec_fw_string = (char *) private;
11236 const char *dmi_data = (const char *)dm;
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254 if (dm->type != 140 || dm->length < 0x0F ||
11255 memcmp(dmi_data + 4, "LENOVO", 6) != 0 ||
11256 dmi_data[0x0A] != 0x0B || dmi_data[0x0B] != 0x07 ||
11257 dmi_data[0x0C] != 0x01)
11258 return;
11259
11260
11261 strncpy(ec_fw_string, dmi_data + 0x0F, 8);
11262 }
11263
11264
11265
11266
11267 static int __must_check __init get_thinkpad_model_data(
11268 struct thinkpad_id_data *tp)
11269 {
11270 const struct dmi_device *dev = NULL;
11271 char ec_fw_string[18] = {0};
11272 char const *s;
11273 char t;
11274
11275 if (!tp)
11276 return -EINVAL;
11277
11278 memset(tp, 0, sizeof(*tp));
11279
11280 if (dmi_name_in_vendors("IBM"))
11281 tp->vendor = PCI_VENDOR_ID_IBM;
11282 else if (dmi_name_in_vendors("LENOVO"))
11283 tp->vendor = PCI_VENDOR_ID_LENOVO;
11284 else
11285 return 0;
11286
11287 s = dmi_get_system_info(DMI_BIOS_VERSION);
11288 tp->bios_version_str = kstrdup(s, GFP_KERNEL);
11289 if (s && !tp->bios_version_str)
11290 return -ENOMEM;
11291
11292
11293 t = tpacpi_parse_fw_id(tp->bios_version_str,
11294 &tp->bios_model, &tp->bios_release);
11295 if (t != 'E' && t != 'C')
11296 return 0;
11297
11298
11299
11300
11301
11302
11303
11304
11305 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
11306 if (sscanf(dev->name,
11307 "IBM ThinkPad Embedded Controller -[%17c",
11308 ec_fw_string) == 1) {
11309 ec_fw_string[sizeof(ec_fw_string) - 1] = 0;
11310 ec_fw_string[strcspn(ec_fw_string, " ]")] = 0;
11311 break;
11312 }
11313 }
11314
11315
11316 if (!ec_fw_string[0])
11317 dmi_walk(find_new_ec_fwstr, &ec_fw_string);
11318
11319 if (ec_fw_string[0]) {
11320 tp->ec_version_str = kstrdup(ec_fw_string, GFP_KERNEL);
11321 if (!tp->ec_version_str)
11322 return -ENOMEM;
11323
11324 t = tpacpi_parse_fw_id(ec_fw_string,
11325 &tp->ec_model, &tp->ec_release);
11326 if (t != 'H') {
11327 pr_notice("ThinkPad firmware release %s doesn't match the known patterns\n",
11328 ec_fw_string);
11329 pr_notice("please report this to %s\n", TPACPI_MAIL);
11330 }
11331 }
11332
11333 s = dmi_get_system_info(DMI_PRODUCT_VERSION);
11334 if (s && !(strncasecmp(s, "ThinkPad", 8) && strncasecmp(s, "Lenovo", 6))) {
11335 tp->model_str = kstrdup(s, GFP_KERNEL);
11336 if (!tp->model_str)
11337 return -ENOMEM;
11338 } else {
11339 s = dmi_get_system_info(DMI_BIOS_VENDOR);
11340 if (s && !(strncasecmp(s, "Lenovo", 6))) {
11341 tp->model_str = kstrdup(s, GFP_KERNEL);
11342 if (!tp->model_str)
11343 return -ENOMEM;
11344 }
11345 }
11346
11347 s = dmi_get_system_info(DMI_PRODUCT_NAME);
11348 tp->nummodel_str = kstrdup(s, GFP_KERNEL);
11349 if (s && !tp->nummodel_str)
11350 return -ENOMEM;
11351
11352 return 0;
11353 }
11354
11355 static int __init probe_for_thinkpad(void)
11356 {
11357 int is_thinkpad;
11358
11359 if (acpi_disabled)
11360 return -ENODEV;
11361
11362
11363 if (!tpacpi_is_ibm() && !tpacpi_is_lenovo())
11364 return -ENODEV;
11365
11366
11367
11368
11369
11370 is_thinkpad = (thinkpad_id.model_str != NULL) ||
11371 (thinkpad_id.ec_model != 0) ||
11372 tpacpi_is_fw_known();
11373
11374
11375 tpacpi_acpi_handle_locate("ec", TPACPI_ACPI_EC_HID, &ec_handle);
11376 if (!ec_handle) {
11377 if (is_thinkpad)
11378 pr_err("Not yet supported ThinkPad detected!\n");
11379 return -ENODEV;
11380 }
11381
11382 if (!is_thinkpad && !force_load)
11383 return -ENODEV;
11384
11385 return 0;
11386 }
11387
11388 static void __init thinkpad_acpi_init_banner(void)
11389 {
11390 pr_info("%s v%s\n", TPACPI_DESC, TPACPI_VERSION);
11391 pr_info("%s\n", TPACPI_URL);
11392
11393 pr_info("ThinkPad BIOS %s, EC %s\n",
11394 (thinkpad_id.bios_version_str) ?
11395 thinkpad_id.bios_version_str : "unknown",
11396 (thinkpad_id.ec_version_str) ?
11397 thinkpad_id.ec_version_str : "unknown");
11398
11399 BUG_ON(!thinkpad_id.vendor);
11400
11401 if (thinkpad_id.model_str)
11402 pr_info("%s %s, model %s\n",
11403 (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) ?
11404 "IBM" : ((thinkpad_id.vendor ==
11405 PCI_VENDOR_ID_LENOVO) ?
11406 "Lenovo" : "Unknown vendor"),
11407 thinkpad_id.model_str,
11408 (thinkpad_id.nummodel_str) ?
11409 thinkpad_id.nummodel_str : "unknown");
11410 }
11411
11412
11413
11414 static struct ibm_init_struct ibms_init[] __initdata = {
11415 {
11416 .data = &thinkpad_acpi_driver_data,
11417 },
11418 {
11419 .init = hotkey_init,
11420 .data = &hotkey_driver_data,
11421 },
11422 {
11423 .init = bluetooth_init,
11424 .data = &bluetooth_driver_data,
11425 },
11426 {
11427 .init = wan_init,
11428 .data = &wan_driver_data,
11429 },
11430 {
11431 .init = uwb_init,
11432 .data = &uwb_driver_data,
11433 },
11434 #ifdef CONFIG_THINKPAD_ACPI_VIDEO
11435 {
11436 .init = video_init,
11437 .base_procfs_mode = S_IRUSR,
11438 .data = &video_driver_data,
11439 },
11440 #endif
11441 {
11442 .init = kbdlight_init,
11443 .data = &kbdlight_driver_data,
11444 },
11445 {
11446 .init = light_init,
11447 .data = &light_driver_data,
11448 },
11449 {
11450 .init = cmos_init,
11451 .data = &cmos_driver_data,
11452 },
11453 {
11454 .init = led_init,
11455 .data = &led_driver_data,
11456 },
11457 {
11458 .init = beep_init,
11459 .data = &beep_driver_data,
11460 },
11461 {
11462 .init = thermal_init,
11463 .data = &thermal_driver_data,
11464 },
11465 {
11466 .init = brightness_init,
11467 .data = &brightness_driver_data,
11468 },
11469 {
11470 .init = volume_init,
11471 .data = &volume_driver_data,
11472 },
11473 {
11474 .init = fan_init,
11475 .data = &fan_driver_data,
11476 },
11477 {
11478 .init = mute_led_init,
11479 .data = &mute_led_driver_data,
11480 },
11481 {
11482 .init = tpacpi_battery_init,
11483 .data = &battery_driver_data,
11484 },
11485 {
11486 .init = tpacpi_lcdshadow_init,
11487 .data = &lcdshadow_driver_data,
11488 },
11489 {
11490 .init = tpacpi_proxsensor_init,
11491 .data = &proxsensor_driver_data,
11492 },
11493 {
11494 .init = tpacpi_dytc_profile_init,
11495 .data = &dytc_profile_driver_data,
11496 },
11497 {
11498 .init = tpacpi_kbdlang_init,
11499 .data = &kbdlang_driver_data,
11500 },
11501 {
11502 .init = tpacpi_dprc_init,
11503 .data = &dprc_driver_data,
11504 },
11505 };
11506
11507 static int __init set_ibm_param(const char *val, const struct kernel_param *kp)
11508 {
11509 unsigned int i;
11510 struct ibm_struct *ibm;
11511
11512 if (!kp || !kp->name || !val)
11513 return -EINVAL;
11514
11515 for (i = 0; i < ARRAY_SIZE(ibms_init); i++) {
11516 ibm = ibms_init[i].data;
11517 if (!ibm || !ibm->name)
11518 continue;
11519
11520 if (strcmp(ibm->name, kp->name) == 0 && ibm->write) {
11521 if (strlen(val) > sizeof(ibms_init[i].param) - 1)
11522 return -ENOSPC;
11523 strcpy(ibms_init[i].param, val);
11524 return 0;
11525 }
11526 }
11527
11528 return -EINVAL;
11529 }
11530
11531 module_param(experimental, int, 0444);
11532 MODULE_PARM_DESC(experimental,
11533 "Enables experimental features when non-zero");
11534
11535 module_param_named(debug, dbg_level, uint, 0);
11536 MODULE_PARM_DESC(debug, "Sets debug level bit-mask");
11537
11538 module_param(force_load, bool, 0444);
11539 MODULE_PARM_DESC(force_load,
11540 "Attempts to load the driver even on a mis-identified ThinkPad when true");
11541
11542 module_param_named(fan_control, fan_control_allowed, bool, 0444);
11543 MODULE_PARM_DESC(fan_control,
11544 "Enables setting fan parameters features when true");
11545
11546 module_param_named(brightness_mode, brightness_mode, uint, 0444);
11547 MODULE_PARM_DESC(brightness_mode,
11548 "Selects brightness control strategy: 0=auto, 1=EC, 2=UCMS, 3=EC+NVRAM");
11549
11550 module_param(brightness_enable, uint, 0444);
11551 MODULE_PARM_DESC(brightness_enable,
11552 "Enables backlight control when 1, disables when 0");
11553
11554 #ifdef CONFIG_THINKPAD_ACPI_ALSA_SUPPORT
11555 module_param_named(volume_mode, volume_mode, uint, 0444);
11556 MODULE_PARM_DESC(volume_mode,
11557 "Selects volume control strategy: 0=auto, 1=EC, 2=N/A, 3=EC+NVRAM");
11558
11559 module_param_named(volume_capabilities, volume_capabilities, uint, 0444);
11560 MODULE_PARM_DESC(volume_capabilities,
11561 "Selects the mixer capabilities: 0=auto, 1=volume and mute, 2=mute only");
11562
11563 module_param_named(volume_control, volume_control_allowed, bool, 0444);
11564 MODULE_PARM_DESC(volume_control,
11565 "Enables software override for the console audio control when true");
11566
11567 module_param_named(software_mute, software_mute_requested, bool, 0444);
11568 MODULE_PARM_DESC(software_mute,
11569 "Request full software mute control");
11570
11571
11572 module_param_named(index, alsa_index, int, 0444);
11573 MODULE_PARM_DESC(index, "ALSA index for the ACPI EC Mixer");
11574 module_param_named(id, alsa_id, charp, 0444);
11575 MODULE_PARM_DESC(id, "ALSA id for the ACPI EC Mixer");
11576 module_param_named(enable, alsa_enable, bool, 0444);
11577 MODULE_PARM_DESC(enable, "Enable the ALSA interface for the ACPI EC Mixer");
11578 #endif
11579
11580
11581 #define TPACPI_PARAM(feature) \
11582 module_param_call(feature, set_ibm_param, NULL, NULL, 0); \
11583 MODULE_PARM_DESC(feature, "Simulates thinkpad-acpi procfs command at module load, see documentation")
11584
11585 TPACPI_PARAM(hotkey);
11586 TPACPI_PARAM(bluetooth);
11587 TPACPI_PARAM(video);
11588 TPACPI_PARAM(light);
11589 TPACPI_PARAM(cmos);
11590 TPACPI_PARAM(led);
11591 TPACPI_PARAM(beep);
11592 TPACPI_PARAM(brightness);
11593 TPACPI_PARAM(volume);
11594 TPACPI_PARAM(fan);
11595
11596 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
11597 module_param(dbg_wlswemul, uint, 0444);
11598 MODULE_PARM_DESC(dbg_wlswemul, "Enables WLSW emulation");
11599 module_param_named(wlsw_state, tpacpi_wlsw_emulstate, bool, 0);
11600 MODULE_PARM_DESC(wlsw_state,
11601 "Initial state of the emulated WLSW switch");
11602
11603 module_param(dbg_bluetoothemul, uint, 0444);
11604 MODULE_PARM_DESC(dbg_bluetoothemul, "Enables bluetooth switch emulation");
11605 module_param_named(bluetooth_state, tpacpi_bluetooth_emulstate, bool, 0);
11606 MODULE_PARM_DESC(bluetooth_state,
11607 "Initial state of the emulated bluetooth switch");
11608
11609 module_param(dbg_wwanemul, uint, 0444);
11610 MODULE_PARM_DESC(dbg_wwanemul, "Enables WWAN switch emulation");
11611 module_param_named(wwan_state, tpacpi_wwan_emulstate, bool, 0);
11612 MODULE_PARM_DESC(wwan_state,
11613 "Initial state of the emulated WWAN switch");
11614
11615 module_param(dbg_uwbemul, uint, 0444);
11616 MODULE_PARM_DESC(dbg_uwbemul, "Enables UWB switch emulation");
11617 module_param_named(uwb_state, tpacpi_uwb_emulstate, bool, 0);
11618 MODULE_PARM_DESC(uwb_state,
11619 "Initial state of the emulated UWB switch");
11620 #endif
11621
11622 static void thinkpad_acpi_module_exit(void)
11623 {
11624 struct ibm_struct *ibm, *itmp;
11625
11626 tpacpi_lifecycle = TPACPI_LIFE_EXITING;
11627
11628 #ifdef CONFIG_SUSPEND
11629 if (tp_features.quirks && tp_features.quirks->s2idle_bug_mmio)
11630 acpi_unregister_lps0_dev(&thinkpad_acpi_s2idle_dev_ops);
11631 #endif
11632 if (tpacpi_hwmon)
11633 hwmon_device_unregister(tpacpi_hwmon);
11634 if (tp_features.sensors_pdrv_registered)
11635 platform_driver_unregister(&tpacpi_hwmon_pdriver);
11636 if (tp_features.platform_drv_registered)
11637 platform_driver_unregister(&tpacpi_pdriver);
11638
11639 list_for_each_entry_safe_reverse(ibm, itmp,
11640 &tpacpi_all_drivers,
11641 all_drivers) {
11642 ibm_exit(ibm);
11643 }
11644
11645 dbg_printk(TPACPI_DBG_INIT, "finished subdriver exit path...\n");
11646
11647 if (tpacpi_inputdev) {
11648 if (tp_features.input_device_registered)
11649 input_unregister_device(tpacpi_inputdev);
11650 else
11651 input_free_device(tpacpi_inputdev);
11652 kfree(hotkey_keycode_map);
11653 }
11654
11655 if (tpacpi_sensors_pdev)
11656 platform_device_unregister(tpacpi_sensors_pdev);
11657 if (tpacpi_pdev)
11658 platform_device_unregister(tpacpi_pdev);
11659 if (proc_dir)
11660 remove_proc_entry(TPACPI_PROC_DIR, acpi_root_dir);
11661 if (tpacpi_wq)
11662 destroy_workqueue(tpacpi_wq);
11663
11664 kfree(thinkpad_id.bios_version_str);
11665 kfree(thinkpad_id.ec_version_str);
11666 kfree(thinkpad_id.model_str);
11667 kfree(thinkpad_id.nummodel_str);
11668 }
11669
11670
11671 static int __init thinkpad_acpi_module_init(void)
11672 {
11673 const struct dmi_system_id *dmi_id;
11674 int ret, i;
11675
11676 tpacpi_lifecycle = TPACPI_LIFE_INIT;
11677
11678
11679
11680 ret = get_thinkpad_model_data(&thinkpad_id);
11681 if (ret) {
11682 pr_err("unable to get DMI data: %d\n", ret);
11683 thinkpad_acpi_module_exit();
11684 return ret;
11685 }
11686 ret = probe_for_thinkpad();
11687 if (ret) {
11688 thinkpad_acpi_module_exit();
11689 return ret;
11690 }
11691
11692
11693
11694 thinkpad_acpi_init_banner();
11695 tpacpi_check_outdated_fw();
11696
11697 TPACPI_ACPIHANDLE_INIT(ecrd);
11698 TPACPI_ACPIHANDLE_INIT(ecwr);
11699
11700 tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
11701 if (!tpacpi_wq) {
11702 thinkpad_acpi_module_exit();
11703 return -ENOMEM;
11704 }
11705
11706 proc_dir = proc_mkdir(TPACPI_PROC_DIR, acpi_root_dir);
11707 if (!proc_dir) {
11708 pr_err("unable to create proc dir " TPACPI_PROC_DIR "\n");
11709 thinkpad_acpi_module_exit();
11710 return -ENODEV;
11711 }
11712
11713 dmi_id = dmi_first_match(fwbug_list);
11714 if (dmi_id)
11715 tp_features.quirks = dmi_id->driver_data;
11716
11717
11718 tpacpi_pdev = platform_device_register_simple(TPACPI_DRVR_NAME, -1,
11719 NULL, 0);
11720 if (IS_ERR(tpacpi_pdev)) {
11721 ret = PTR_ERR(tpacpi_pdev);
11722 tpacpi_pdev = NULL;
11723 pr_err("unable to register platform device\n");
11724 thinkpad_acpi_module_exit();
11725 return ret;
11726 }
11727 tpacpi_sensors_pdev = platform_device_register_simple(
11728 TPACPI_HWMON_DRVR_NAME,
11729 -1, NULL, 0);
11730 if (IS_ERR(tpacpi_sensors_pdev)) {
11731 ret = PTR_ERR(tpacpi_sensors_pdev);
11732 tpacpi_sensors_pdev = NULL;
11733 pr_err("unable to register hwmon platform device\n");
11734 thinkpad_acpi_module_exit();
11735 return ret;
11736 }
11737
11738 mutex_init(&tpacpi_inputdev_send_mutex);
11739 tpacpi_inputdev = input_allocate_device();
11740 if (!tpacpi_inputdev) {
11741 thinkpad_acpi_module_exit();
11742 return -ENOMEM;
11743 } else {
11744
11745 tpacpi_inputdev->name = "ThinkPad Extra Buttons";
11746 tpacpi_inputdev->phys = TPACPI_DRVR_NAME "/input0";
11747 tpacpi_inputdev->id.bustype = BUS_HOST;
11748 tpacpi_inputdev->id.vendor = thinkpad_id.vendor;
11749 tpacpi_inputdev->id.product = TPACPI_HKEY_INPUT_PRODUCT;
11750 tpacpi_inputdev->id.version = TPACPI_HKEY_INPUT_VERSION;
11751 tpacpi_inputdev->dev.parent = &tpacpi_pdev->dev;
11752 }
11753
11754
11755 tpacpi_detect_brightness_capabilities();
11756
11757
11758 for (i = 0; i < ARRAY_SIZE(ibms_init); i++) {
11759 ret = ibm_init(&ibms_init[i]);
11760 if (ret >= 0 && *ibms_init[i].param)
11761 ret = ibms_init[i].data->write(ibms_init[i].param);
11762 if (ret < 0) {
11763 thinkpad_acpi_module_exit();
11764 return ret;
11765 }
11766 }
11767
11768 tpacpi_lifecycle = TPACPI_LIFE_RUNNING;
11769
11770 ret = platform_driver_register(&tpacpi_pdriver);
11771 if (ret) {
11772 pr_err("unable to register main platform driver\n");
11773 thinkpad_acpi_module_exit();
11774 return ret;
11775 }
11776 tp_features.platform_drv_registered = 1;
11777
11778 ret = platform_driver_register(&tpacpi_hwmon_pdriver);
11779 if (ret) {
11780 pr_err("unable to register hwmon platform driver\n");
11781 thinkpad_acpi_module_exit();
11782 return ret;
11783 }
11784 tp_features.sensors_pdrv_registered = 1;
11785
11786 tpacpi_hwmon = hwmon_device_register_with_groups(
11787 &tpacpi_sensors_pdev->dev, TPACPI_NAME, NULL, tpacpi_hwmon_groups);
11788 if (IS_ERR(tpacpi_hwmon)) {
11789 ret = PTR_ERR(tpacpi_hwmon);
11790 tpacpi_hwmon = NULL;
11791 pr_err("unable to register hwmon device\n");
11792 thinkpad_acpi_module_exit();
11793 return ret;
11794 }
11795
11796 ret = input_register_device(tpacpi_inputdev);
11797 if (ret < 0) {
11798 pr_err("unable to register input device\n");
11799 thinkpad_acpi_module_exit();
11800 return ret;
11801 } else {
11802 tp_features.input_device_registered = 1;
11803 }
11804
11805 #ifdef CONFIG_SUSPEND
11806 if (tp_features.quirks && tp_features.quirks->s2idle_bug_mmio) {
11807 if (!acpi_register_lps0_dev(&thinkpad_acpi_s2idle_dev_ops))
11808 pr_info("Using s2idle quirk to avoid %s platform firmware bug\n",
11809 (dmi_id && dmi_id->ident) ? dmi_id->ident : "");
11810 }
11811 #endif
11812 return 0;
11813 }
11814
11815 MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);
11816
11817
11818
11819
11820
11821
11822
11823
11824 MODULE_DEVICE_TABLE(acpi, ibm_htk_device_ids);
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835 #define IBM_BIOS_MODULE_ALIAS(__type) \
11836 MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
11837
11838
11839
11840
11841 IBM_BIOS_MODULE_ALIAS("I[MU]");
11842
11843 MODULE_AUTHOR("Borislav Deianov <borislav@users.sf.net>");
11844 MODULE_AUTHOR("Henrique de Moraes Holschuh <hmh@hmh.eng.br>");
11845 MODULE_DESCRIPTION(TPACPI_DESC);
11846 MODULE_VERSION(TPACPI_VERSION);
11847 MODULE_LICENSE("GPL");
11848
11849 module_init(thinkpad_acpi_module_init);
11850 module_exit(thinkpad_acpi_module_exit);