Lines Matching +full:v +full:- +full:pos +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * thinkpad_acpi.c - ThinkPad ACPI Extras
5 * Copyright (C) 2004-2005 Borislav Deianov <borislav@users.sf.net>
6 * Copyright (C) 2006-2009 Henrique de Moraes Holschuh <hmh@hmh.eng.br>
16 * 2007-10-20 changelog trimmed down
18 * 2007-03-27 0.14 renamed to thinkpad_acpi and moved to
21 * 2006-11-22 0.13 new maintainer
23 * not be updated further in-file.
25 * 2005-03-17 0.11 support for 600e, 770x
28 * 2005-01-16 0.9 use MODULE_VERSION
33 * 2004-11-08 0.8 fix init error case, don't return from a macro
44 #include <linux/hwmon-sysfs.h>
47 #include <linux/input/sparse-keymap.h>
121 /* Misc NVRAM-related */
180 * hkey -> scancode translation for
182 * directly in the sparse-keymap.
198 /* Auto-sleep after eject request */
215 /* User-interface events */
227 /* Key-related user-interface events */
245 /* AC-related events */
248 /* Further user-interface events */
266 #define TPACPI_URL "http://ibm-acpi.sf.net/"
267 #define TPACPI_MAIL "ibm-acpi-devel@lists.sourceforge.net"
294 * Driver-wide structs and misc. variables
390 char *ec_version_str; /* Something like 1ZHT51WW-1.04a */
398 char *nummodel_str; /* 9384A9C for a 9384-A9C model */
479 * two or three characters from the set [0-9A-Z], i.e. base 36.
531 * tpacpi_check_quirks() - search BIOS/EC version on a list
548 if ((qlist->vendor == thinkpad_id.vendor ||
549 qlist->vendor == TPACPI_MATCH_ANY) &&
550 (qlist->bios == thinkpad_id.bios_model ||
551 qlist->bios == TPACPI_MATCH_ANY) &&
552 (qlist->ec == thinkpad_id.ec_model ||
553 qlist->ec == TPACPI_MATCH_ANY))
554 return qlist->quirks;
556 qlist_size--;
598 "\\CMOS", /* A3x, G4x, R32, T23, T30, X22-24, X30 */
659 if (res_type != 'v') {
675 case 'v': /* void */
694 int v;
697 if (!acpi_evalf(ecrd_handle, &v, NULL, "dd", i))
699 *p = v;
708 static int acpi_ec_write(int i, u8 v)
711 if (!acpi_evalf(ecwr_handle, NULL, NULL, "vdd", i, v))
714 if (ec_write(i, v) < 0)
724 return -ENXIO;
727 return -EIO;
816 if (!ibm || !ibm->acpi || !ibm->acpi->notify)
819 ibm->acpi->notify(ibm, event);
826 BUG_ON(!ibm->acpi);
828 if (!*ibm->acpi->handle)
832 "setting up ACPI notify for %s\n", ibm->name);
834 ibm->acpi->device = acpi_fetch_acpi_dev(*ibm->acpi->handle);
835 if (!ibm->acpi->device) {
836 pr_err("acpi_fetch_acpi_dev(%s) failed\n", ibm->name);
837 return -ENODEV;
840 ibm->acpi->device->driver_data = ibm;
841 scnprintf(acpi_device_class(ibm->acpi->device),
842 sizeof(acpi_device_class(ibm->acpi->device)),
843 "%s/%s", TPACPI_ACPI_EVENT_PREFIX, ibm->name);
845 status = acpi_install_notify_handler(*ibm->acpi->handle,
846 ibm->acpi->type, dispatch_acpi_notify, ibm);
850 ibm->name);
853 ibm->name, acpi_format_exception(status));
855 return -ENODEV;
857 ibm->flags.acpi_notify_installed = 1;
871 "registering %s as an ACPI driver\n", ibm->name);
873 BUG_ON(!ibm->acpi);
875 ibm->acpi->driver = kzalloc(sizeof(struct acpi_driver), GFP_KERNEL);
876 if (!ibm->acpi->driver) {
877 pr_err("failed to allocate memory for ibm->acpi->driver\n");
878 return -ENOMEM;
881 sprintf(ibm->acpi->driver->name, "%s_%s", TPACPI_NAME, ibm->name);
882 ibm->acpi->driver->ids = ibm->acpi->hid;
884 ibm->acpi->driver->ops.add = &tpacpi_device_add;
886 rc = acpi_bus_register_driver(ibm->acpi->driver);
889 ibm->name, rc);
890 kfree(ibm->acpi->driver);
891 ibm->acpi->driver = NULL;
893 ibm->flags.acpi_driver_registered = 1;
907 static int dispatch_proc_show(struct seq_file *m, void *v)
909 struct ibm_struct *ibm = m->private;
911 if (!ibm || !ibm->read)
912 return -EINVAL;
913 return ibm->read(m);
923 size_t count, loff_t *pos)
929 if (!ibm || !ibm->write)
930 return -EINVAL;
931 if (count > PAGE_SIZE - 1)
932 return -EINVAL;
937 ret = ibm->write(kernbuf);
978 if (ibm->suspend)
979 (ibm->suspend)();
992 if (ibm->resume)
993 (ibm->resume)();
1010 if (ibm->shutdown)
1011 (ibm->shutdown)();
1027 return -EINVAL;
1051 * ThinkPad-ACPI firmware handling model:
1053 * WLSW (master wireless switch) is event-driven, and is common to all
1054 * firmware-controlled radios. It cannot be controlled, just monitored,
1057 * The kernel, a masked-off hotkey, and WLSW can change the radio state
1061 * masked-off hotkeys are used.
1090 /* ThinkPad-ACPI rfkill subdriver */
1111 return -ENODEV;
1113 status = (tp_rfk->ops->get_status)();
1117 rfkill_set_sw_state(tp_rfk->rfkill,
1124 * Sync the HW-blocking state of all rfkill switches,
1135 if (rfkill_set_hw_state(tp_rfk->rfkill,
1137 /* ignore -- we track sw block */
1172 res = (tp_rfk->ops->set_status)(blocked ?
1201 atp_rfk->rfkill = rfkill_alloc(name,
1202 &tpacpi_pdev->dev,
1206 if (!atp_rfk || !atp_rfk->rfkill) {
1209 return -ENOMEM;
1212 atp_rfk->id = id;
1213 atp_rfk->ops = tp_rfkops;
1215 sw_status = (tp_rfkops->get_status)();
1224 rfkill_init_sw_state(atp_rfk->rfkill, sw_state);
1228 rfkill_set_hw_state(atp_rfk->rfkill, hw_state);
1230 res = rfkill_register(atp_rfk->rfkill);
1233 rfkill_destroy(atp_rfk->rfkill);
1253 rfkill_unregister(tp_rfk->rfkill);
1254 rfkill_destroy(tp_rfk->rfkill);
1266 /* sysfs <radio> enable ------------------------------------------------ */
1273 printk_deprecated_rfkill_attribute(attr->attr.name);
1295 printk_deprecated_rfkill_attribute(attr->attr.name);
1298 return -EINVAL;
1300 tpacpi_disclose_usertask(attr->attr.name, "set to %ld\n", t);
1304 return -EPERM;
1306 res = tpacpi_rfkill_switches[id]->ops->set_status((!!t) ?
1313 /* procfs -------------------------------------------------------------- */
1341 int status = -1;
1345 return -ENODEV;
1353 return -EINVAL;
1356 if (status != -1) {
1360 res = (tpacpi_rfkill_switches[id]->ops->set_status)(status);
1368 * thinkpad-acpi driver attributes
1371 /* interface_version --------------------------------------------------- */
1378 /* debug_level --------------------------------------------------------- */
1390 return -EINVAL;
1398 /* version ------------------------------------------------------------- */
1401 return sysfs_emit(buf, "%s v%s\n",
1406 /* --------------------------------------------------------------------- */
1410 /* wlsw_emulstate ------------------------------------------------------ */
1422 return -EINVAL;
1433 /* bluetooth_emulstate ------------------------------------------------- */
1445 return -EINVAL;
1453 /* wwan_emulstate ------------------------------------------------- */
1465 return -EINVAL;
1473 /* uwb_emulstate ------------------------------------------------- */
1485 return -EINVAL;
1571 /* Numeric models ------------------ */
1583 /* A-series ------------------------- */
1586 TPV_QI0('I', 'V', '6', '9'), /* A20p */
1597 /* G-series ------------------------- */
1602 /* R-series, T-series --------------- */
1612 TPV_QI1('1', 'V', '7', '1', '2', '8'), /* R50e, R51 (1) */
1629 TPV_QI2('1', 'W', '9', '0', '1', 'V', '2', '8'), /* R50e (1) */
1632 /* X-series ------------------------- */
1645 /* (0) - older versions lack DMI EC fw string and functionality */
1646 /* (1) - older versions known to lack functionality */
1702 * thinkpad-acpi metadata subdriver
1737 * Unlike other classes, hotkey-class events have mask/unmask control on
1738 * non-ancient firmware. However, how it behaves changes a lot with the
1956 return -ENODEV;
1965 return -EIO;
2059 return -EIO;
2065 return -EIO;
2090 return -EIO;
2098 /* sync userspace-visible mask */
2136 rc = -EIO;
2177 pr_notice("please consider using the driver defaults, and refer to up-to-date thinkpad-acpi documentation\n");
2226 return -EIO;
2234 return -EIO;
2263 return -ENODEV;
2266 return -EIO;
2269 return -ENODEV;
2283 * Before the conversion to using the sparse-keymap helpers the driver used to
2284 * map the hkey event codes to 0x00 - 0x4d scancodes so that a straight scancode
2287 * 0x1001 - 0x1020 -> 0x00 - 0x1f (Original ThinkPad events)
2288 * 0x1103 - 0x1116 -> 0x20 - 0x33 (Adaptive keyboard, 2014 X1 Carbon)
2289 * 0x1300 - 0x1319 -> 0x34 - 0x4d (Additional keys send in 2017+ models)
2291 * The sparse-keymap tables still use these scancodes for these ranges to
2296 scancode = hkey - TP_HKEY_EV_ORIG_KEY_START;
2301 scancode = hkey - TP_HKEY_EV_ADAPTIVE_KEY_START +
2305 scancode = hkey - TP_HKEY_EV_EXTENDED_KEY_START +
2341 n->thinkpad_toggle = !!(d & TP_NVRAM_MASK_HKT_THINKPAD);
2342 n->zoom_toggle = !!(d & TP_NVRAM_MASK_HKT_ZOOM);
2343 n->display_toggle = !!(d & TP_NVRAM_MASK_HKT_DISPLAY);
2344 n->hibernate_toggle = !!(d & TP_NVRAM_MASK_HKT_HIBERNATE);
2348 n->thinklight_toggle = !!(d & TP_NVRAM_MASK_THINKLIGHT);
2352 n->displayexp_toggle =
2357 n->brightness_level = (d & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
2359 n->brightness_toggle =
2364 n->volume_level = (d & TP_NVRAM_MASK_LEVEL_VOLUME)
2366 n->mute = !!(d & TP_NVRAM_MASK_MUTE);
2367 n->volume_toggle = !!(d & TP_NVRAM_MASK_HKT_VOLUME);
2374 oldn->__member != newn->__member) \
2392 i--;
2408 i--;
2434 * - Pressing MUTE issues mute hotkey message, even when already mute
2435 * - Pressing Volume up/down issues volume up/down hotkey messages,
2437 * - The act of unmuting issues volume up/down notification,
2447 if (newn->mute) {
2449 if (!oldn->mute ||
2450 oldn->volume_toggle != newn->volume_toggle ||
2451 oldn->volume_level != newn->volume_level) {
2454 issue_volchange(oldn->volume_level, newn->volume_level,
2460 if (oldn->mute) {
2464 if (oldn->volume_level != newn->volume_level) {
2465 issue_volchange(oldn->volume_level, newn->volume_level,
2467 } else if (oldn->volume_toggle != newn->volume_toggle) {
2469 if (newn->volume_level == 0)
2471 else if (newn->volume_level >= TP_NVRAM_LEVEL_VOLUME_MAX)
2477 if (oldn->brightness_level != newn->brightness_level) {
2478 issue_brightnesschange(oldn->brightness_level,
2479 newn->brightness_level, event_mask);
2480 } else if (oldn->brightness_toggle != newn->brightness_toggle) {
2482 if (newn->brightness_level == 0)
2484 else if (newn->brightness_level >= bright_maxlvl
2497 * most of them are edge-based. We only issue those requested by
2591 (poll_user_mask && tpacpi_inputdev->users > 0))) {
2650 return -EBUSY;
2655 return -EBUSY;
2666 /* sysfs hotkey enable ------------------------------------------------- */
2693 return -EINVAL;
2696 return -EPERM;
2703 /* sysfs hotkey mask --------------------------------------------------- */
2719 return -EINVAL;
2722 return -ERESTARTSYS;
2739 /* sysfs hotkey bios_enabled ------------------------------------------- */
2749 /* sysfs hotkey bios_mask ---------------------------------------------- */
2761 /* sysfs hotkey all_mask ----------------------------------------------- */
2772 /* sysfs hotkey all_mask ----------------------------------------------- */
2783 /* sysfs hotkey recommended_mask --------------------------------------- */
2797 /* sysfs hotkey hotkey_source_mask ------------------------------------- */
2815 return -EINVAL;
2818 return -ERESTARTSYS;
2848 /* sysfs hotkey hotkey_poll_freq --------------------------------------- */
2863 return -EINVAL;
2866 return -ERESTARTSYS;
2882 /* sysfs hotkey radio_sw (pollable) ------------------------------------ */
2904 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2908 /* sysfs hotkey tablet mode (pollable) --------------------------------- */
2926 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2930 /* sysfs wakeup reason (pollable) -------------------------------------- */
2942 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2946 /* sysfs wakeup hotunplug_complete (pollable) -------------------------- */
2959 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL,
2963 /* sysfs adaptive kbd mode --------------------------------------------- */
2997 return -EINVAL;
3013 return tp_features.has_adaptive_kbd ? attr->mode : 0;
3021 /* --------------------------------------------------------------------- */
3053 return attr->mode;
3081 /* Sync hw blocking state first if it is hw-blocked */
3085 /* Sync hw blocking state last if it is hw-unblocked */
3135 TPACPI_Q_IBM('I', 'V', TPACPI_HK_Q_INIMASK), /* A20p */
3189 /* Original hotkey mappings translated scancodes 0x00 - 0x1f */
3209 * Volume: firmware always reacts and reprograms the built-in *extra* mixer.
3220 /* Original hotkey mappings translated scancodes 0x00 - 0x1f */
3234 * These should be enabled --only-- when ACPI video is disabled and
3244 * reprograms the built-in *extra* mixer.
3259 /* Adaptive keyboard mappings for Carbon X1 2014 translated scancodes 0x20 - 0x33 */
3280 /* Extended hotkeys mappings translated scancodes 0x34 - 0x4d */
3334 BUG_ON(tpacpi_inputdev->open != NULL ||
3335 tpacpi_inputdev->close != NULL);
3352 return -ENODEV;
3360 A30, R30, R31, T20-22, X20-21, X22-24. Detected by checking
3379 /* Fallback: pre-init for FN+F3,F4,F12 */
3396 /* Fallback: pre-init for FN+F3,F4,F12 */
3514 pr_notice("Disabling thinkpad-acpi brightness events by default...\n");
3545 if (res < 0 && res != -ENXIO) {
3555 tpacpi_inputdev->open = &hotkey_inputdev_open;
3556 tpacpi_inputdev->close = &hotkey_inputdev_close;
3567 * mode, Web conference mode, Function mode and Lay-flat mode.
3592 return -EIO;
3602 return -EINVAL;
3606 return -EIO;
3615 size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1;
3661 /* 0x1000-0x1FFF: key presses */
3664 /* Never send ACPI netlink events for original hotkeys (hkey: 0x1001 - 0x1020) */
3669 unsigned int scancode = hkey - TP_HKEY_EV_ORIG_KEY_START;
3677 /* 0x2000-0x2FFF: Wakeup reason */
3696 /* how to auto-heal: */
3706 pr_info("woke up due to a hot-unplug request...\n");
3712 /* 0x4000-0x4FFF: dock-related events */
3732 * duplicates from intel-vbtn, which already emits SW_TABLET_MODE events
3739 * https://lore.kernel.org/platform-driver-x86/38cb8265-1e30-d547-9e12-b4ae290be737@a-kobel.de/
3751 /* 0x5000-0x5FFF: human interface helpers */
3759 case TP_HKEY_EV_TABLET_TABLET: /* X41t-X61t: tablet mode */
3760 case TP_HKEY_EV_TABLET_NOTEBOOK: /* X41t-X61t: normal mode */
3781 /* 0x6000-0x6FFF: thermal alarms/notices and keyboard events */
3792 /* Thermal event - pass on to event handler */
3837 acpi_evalf(hkey_handle, NULL, "GMKS", "v");
3849 /* palm detected - pass on to event handler */
3885 ibm->acpi->device->pnp.device_class,
3886 dev_name(&ibm->acpi->device->dev),
3907 /* 0x1000-0x1FFF: key presses */
3911 /* 0x2000-0x2FFF: Wakeup reason */
3915 /* 0x3000-0x3FFF: bay-related wakeups */
3930 /* 0x4000-0x4FFF: dock-related events */
3934 /* 0x5000-0x5FFF: human interface helpers */
3938 /* 0x6000-0x6FFF: thermal alarms/notices and
3943 /* 0x7000-0x7FFF: misc */
3952 /* 0x8000-0x8FFF: misc2 */
3965 ibm->acpi->device->pnp.device_class,
3966 dev_name(&ibm->acpi->device->dev),
4013 /* procfs -------------------------------------------------------------- */
4024 return -ERESTARTSYS;
4059 return -ENODEV;
4062 return -ERESTARTSYS;
4072 res = -EPERM;
4081 res = -EINVAL;
4136 TP_ACPI_BLTH_GET_PWR_ON_RESUME = 0x01, /* Get power-on-resume state */
4155 return -EIO;
4182 return -EIO;
4187 /* sysfs bluetooth enable ---------------------------------------------- */
4206 /* --------------------------------------------------------------------- */
4216 return tp_features.bluetooth ? attr->mode : 0;
4264 .ident = "ThinkPad A285 - 20MW",
4272 .ident = "ThinkPad A285 - 20MX",
4280 .ident = "ThinkPad A485 - 20MU",
4288 .ident = "ThinkPad A485 - 20MV",
4312 if (tp_features.quirks && tp_features.quirks->btusb_bug &&
4332 G4x, R30, R31, R40e, R50e, T20-22, X20-21 */
4356 return -ENODEV;
4366 /* procfs -------------------------------------------------------------- */
4410 return -EIO;
4437 return -EIO;
4442 /* sysfs wan enable ---------------------------------------------------- */
4462 /* --------------------------------------------------------------------- */
4472 return tp_features.wan ? attr->mode : 0;
4535 return -ENODEV;
4545 /* procfs -------------------------------------------------------------- */
4587 return -EIO;
4613 return -EIO;
4618 /* --------------------------------------------------------------------- */
4663 return -ENODEV;
4756 return (video_supported != TPACPI_VIDEO_NONE) ? 0 : -ENODEV;
4776 return -EIO;
4781 return -EIO;
4785 return -EIO;
4792 return -EIO;
4798 return -EIO;
4802 return -EIO;
4807 return -ENOSYS;
4836 pr_err("video auto-switch left enabled due to error\n");
4837 return -EIO;
4845 return -ENOSYS;
4848 return (res) ? 0 : -EIO;
4858 return -EIO;
4863 return -EIO;
4866 return -ENOSYS;
4875 return -EIO;
4892 res = acpi_evalf(ec_handle, NULL, "_Q16", "v");
4899 res = acpi_evalf(vid_handle, NULL, "VSWT", "v");
4902 return -ENOSYS;
4905 pr_err("video auto-switch left enabled due to error\n");
4906 return -EIO;
4909 return (res) ? 0 : -EIO;
4916 return acpi_evalf(ec_handle, NULL, "_Q17", "v") ?
4917 0 : -EIO;
4919 return acpi_evalf(vid_handle, NULL, "VEXP", "v") ?
4920 0 : -EIO;
4922 return acpi_evalf(NULL, NULL, "\\VEXP", "v") ?
4923 0 : -EIO;
4925 return -ENOSYS;
4941 return -EPERM;
4974 return -ENODEV;
4978 return -EPERM;
5015 return -EINVAL;
5051 return -ENXIO;
5056 ret = -EIO;
5070 return -ENXIO;
5073 return -EIO;
5108 * b010100000010000000XX - ThinkPad X1 Carbon 3rd
5109 * b110100010010000000XX - ThinkPad x230
5110 * b010100000010000000XX - ThinkPad x240
5111 * b010100000010000000XX - ThinkPad W541
5115 * b10100001000000000000 - ThinkPad x230
5116 * b10110001000000000000 - ThinkPad E430
5117 * b00000000000000000000 - ThinkPad E450
5164 return -ENODEV;
5170 rc = led_classdev_register(&tpacpi_pdev->dev,
5195 if (ret == 0 && !(led_cdev->flags & LED_SUSPENDED))
5196 led_cdev->brightness = level;
5222 int res, level = -EINVAL;
5225 return -ENODEV;
5234 return -EINVAL;
5272 TPACPI_HANDLE(lght, root, "\\LGHT"); /* A21e, A2xm/p, T20-22, X20-21 */
5281 return -EIO;
5285 return -ENXIO;
5302 return (rc) ? 0 : -EIO;
5305 return -ENXIO;
5355 return -ENODEV;
5357 rc = led_classdev_register(&tpacpi_pdev->dev,
5401 return -ENODEV;
5409 return -EINVAL;
5426 /* sysfs cmos_command -------------------------------------------------- */
5435 return -EINVAL;
5451 return cmos_handle ? attr->mode : 0;
5459 /* --------------------------------------------------------------------- */
5471 return cmos_handle ? 0 : -ENODEV;
5477 R30, R31, T20-22, X20-21 */
5482 seq_printf(m, "commands:\t<cmd> (<cmd> is 0-21)\n");
5498 return -EINVAL;
5521 TPACPI_LED_OLD, /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */
5574 return -EIO;
5583 return -ENXIO;
5602 return -EINVAL;
5604 return -EPERM;
5607 return -EIO;
5610 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */
5612 return -EINVAL;
5614 return -EPERM;
5626 return -EINVAL;
5628 return -EPERM;
5631 return -EIO;
5634 return -ENXIO;
5652 else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK)
5657 return led_set_status(data->led, new_state);
5672 return -EINVAL;
5674 return led_set_status(data->led, TPACPI_LED_BLINK);
5684 rc = led_get_status(data->led);
5719 return led_classdev_register(&tpacpi_pdev->dev, &tpacpi_leds[led].led_classdev);
5732 TPACPI_Q_IBM('1', 'V', 0x0097), /* R51 */
5747 /* (1) - may have excess leds enabled on MSB */
5777 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */
5817 return -ENODEV;
5823 return -ENOMEM;
5827 tpacpi_leds[i].led = -1;
5860 return -EIO;
5865 seq_printf(m, "commands:\t<led> on, <led> off, <led> blink (<led> is 0-15)\n");
5877 return -ENODEV;
5881 return -EINVAL;
5883 if (led < 0 || led > (TPACPI_LED_NUMLEDS - 1))
5884 return -ENODEV;
5887 return -ENODEV;
5896 return -EINVAL;
5924 TPACPI_Q_IBM('I', 'U', TPACPI_BEEP_Q1), /* 570E - unverified */
5943 return (beep_handle) ? 0 : -ENODEV;
5952 seq_printf(m, "commands:\t<cmd> (<cmd> is 0-17)\n");
5964 return -ENODEV;
5971 return -EINVAL;
5975 return -EIO;
5979 return -EIO;
5998 TPACPI_THERMAL_ACPI_TMP07, /* Use ACPI TMP0-7 */
5999 TPACPI_THERMAL_ACPI_UPDT, /* Use ACPI TMP0-7 with UPDT */
6008 TP_EC_THERMAL_TMP0_NS = 0xA8, /* ACPI EC Non-Standard regs TMP 0..7 */
6009 TP_EC_THERMAL_TMP8_NS = 0xB8, /* ACPI EC Non-standard regs TMP 8..11 */
6011 TP_EC_THERMAL_TMP_NA = -128, /* ACPI EC sensor not available */
6013 TPACPI_THERMAL_SENSOR_NA = -128000, /* Sensor not available */
6023 /* Non-standard address for thermal registers on some ThinkPads */
6031 TPACPI_Q_LNV3('R', '1', 'D', true), /* 11e Gen5 GL-R*/
6032 TPACPI_Q_LNV3('R', '0', 'V', true), /* 11e Gen5 KL-Y*/
6037 static bool thermal_with_ns_address; /* Non-standard thermal reg address */
6050 * Direct EC access mode: sensors at registers 0x78-0x7F,
6051 * 0xC0-0xC7. Registers return 0x00 for non-implemented,
6054 * In some special cases (when Power Supply ID is 0xC2)
6056 * determines EC version. 0xC0-0xC7 are not thermal registers
6062 /* Quirks to check non-standard EC */
6066 /* Support for Thinkpads with non-standard address */
6068 pr_info("ECFW with non-standard thermal registers found\n");
6121 /* idx is zero-based */
6135 idx -= 8;
6142 return -EIO;
6148 /* The Non-standard EC uses 12 Thermal areas */
6151 return -EINVAL;
6154 TP_EC_THERMAL_TMP8_NS + (idx - 8);
6157 return -EIO;
6165 if (!acpi_evalf(ec_handle, NULL, "UPDT", "v"))
6166 return -EIO;
6168 return -EIO;
6169 *value = (t - 2732) * 100;
6178 return -EIO;
6179 if (t > 127 || t < -127)
6188 return -ENOSYS;
6191 return -EINVAL;
6199 return -EINVAL;
6209 res = thermal_get_sensor(i, &s->temp[i]);
6238 /* sysfs temp##_input -------------------------------------------------- */
6246 int idx = sensor_attr->index;
6254 return -ENXIO;
6314 int idx = sensor_attr->index;
6337 return attr->mode;
6369 return thermal_use_labels ? attr->mode : 0;
6377 /* --------------------------------------------------------------------- */
6389 return thermal_read_mode != TPACPI_THERMAL_NONE ? 0 : -ENODEV;
6404 for (i = 0; i < (n - 1); i++)
6426 * CMOS NVRAM byte 0x5E, bits 0-3.
6433 * Bit 3-0: backlight brightness level
6454 TPACPI_BRGHT_MODE_UCMS_STEP, /* UCMS step-based control */
6535 return -EIO;
6539 return -ENXIO;
6551 return -EIO;
6556 return -EIO;
6576 inc = (value > current_value) ? 1 : -1;
6580 return -EIO;
6591 return -EINVAL;
6609 res = -ENXIO;
6616 /* sysfs backlight class ----------------------------------------------- */
6660 /* --------------------------------------------------------------------- */
6669 status = acpi_evaluate_object(adev->handle, "_BCL", NULL, &buffer);
6674 if (!obj || obj->type != ACPI_TYPE_PACKAGE) {
6675 acpi_handle_info(adev->handle,
6680 rc = obj->package.count;
6718 return (bcl_levels > 2) ? (bcl_levels - 2) : 0;
6735 TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_EC), /* R50,51 T40-42 */
6742 TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
6781 bright_maxlvl = b - 1;
6803 return -ENODEV;
6808 return -ENODEV;
6814 return -ENODEV;
6817 return -ENODEV;
6821 return -ENODEV;
6832 return -EINVAL;
6843 "driver auto-selected brightness_mode=%d\n",
6851 return -EINVAL;
6854 return -ENODEV;
6925 seq_printf(m, "commands:\tlevel <level> (<level> is 0-%d)\n",
6948 level--;
6953 return -EINVAL;
6967 return (rc == -EINTR) ? -ERESTARTSYS : rc;
6992 * Bit 3-0: Volume
6996 * bits 3-0 (volume). Other bits in NVRAM may have other functions,
7008 * To avoid confusing userspace, we simply disable all EC-based mute
7019 #define DEFAULT_ALSA_IDX ~((1 << (SNDRV_CARDS - 3)) - 1)
7021 #define DEFAULT_ALSA_IDX ~((1 << (32 - 3)) - 1)
7052 TPACPI_VOL_MODE_UCMS_STEP, /* UCMS step-based control: N/A */
7082 * TP_NVRAM_ADDR_MIXER, as we need to do read-modify-write
7138 return -EIO;
7155 return -EIO;
7180 return -EINTR;
7225 return -EINVAL;
7228 return -EINTR;
7252 return -ENODEV;
7257 return -EIO;
7266 return -EIO;
7275 * startup. Just on case there are SAUM-capable ThinkPads
7309 if (alsa_card && alsa_card->private_data) {
7310 d = alsa_card->private_data;
7311 if (d->ctl_mute_id)
7314 d->ctl_mute_id);
7315 if (d->ctl_vol_id)
7318 d->ctl_vol_id);
7325 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7326 uinfo->count = 1;
7327 uinfo->value.integer.min = 0;
7328 uinfo->value.integer.max = TP_EC_VOLUME_MAX;
7342 ucontrol->value.integer.value[0] = s & TP_EC_AUDIO_LVL_MSK;
7350 ucontrol->value.integer.value[0]);
7351 return volume_alsa_set_volume(ucontrol->value.integer.value[0]);
7366 ucontrol->value.integer.value[0] =
7375 ucontrol->value.integer.value[0] ?
7377 return volume_alsa_set_mute(!ucontrol->value.integer.value[0]);
7439 rc = snd_card_new(&tpacpi_pdev->dev,
7444 return -ENODEV;
7447 BUG_ON(!card->private_data);
7448 data = card->private_data;
7449 data->card = card;
7451 strscpy(card->driver, TPACPI_ALSA_DRVNAME);
7452 strscpy(card->shortname, TPACPI_ALSA_SHRTNAME);
7453 snprintf(card->mixername, sizeof(card->mixername), "ThinkPad EC %s",
7456 snprintf(card->longname, sizeof(card->longname),
7457 "%s at EC reg 0x%02x, fw %s", card->shortname, TP_EC_AUDIO,
7479 data->ctl_vol_id = &ctl_vol->id;
7488 data->ctl_mute_id = &ctl_mute->id;
7501 return -ENODEV;
7504 #define TPACPI_VOL_Q_MUTEONLY 0x0001 /* Mute-only control available */
7523 /* Whitelist mute-only on all Lenovo by default */
7545 return -EINVAL;
7550 return -ENODEV;
7554 return -EINVAL;
7563 return -ENODEV;
7576 return -ENODEV; /* no mixer */
7585 return -ENODEV;
7590 "using user-supplied volume_capabilities=%d\n",
7598 "driver auto-selected volume_mode=%d\n",
7602 "using user-supplied volume_mode=%d\n",
7654 seq_printf(m, "commands:\tlevel <level> (<level> is 0-%d)\n",
7681 return -EPERM;
7703 new_level--;
7716 return -EINVAL;
7731 return (rc == -EINTR) ? -ERESTARTSYS : rc;
7756 return -ENODEV;
7793 * Contains the current fan speed from 0-100%
7826 * Speeds up fan to 100% duty-cycle, which is far above
7829 * 5-3 unused in some models. Extra bits for fan level
7832 * 2-0 fan level (0..7 usually)
7845 * ----
7850 * This register is present on all ThinkPads with a new-style EC, and
7856 * Unfortunately a lot of ThinkPads with new-style ECs but whose firmware
7870 * ----
7882 * So far, only the firmware for the X60/X61 non-tablet versions
7883 * seem to support this (firmware TP-7M).
7908 * that are using non-standard EC locations for reporting fan speeds.
7913 #define FAN_RPM_CAL_CONST 491520 /* FAN RPM calculation offset for some non-standard ECFW */
7926 fan_status_offset_ns = 0x93, /* Special status/control offset for non-standard EC Fan1 */
7927 fan2_status_offset_ns = 0x96, /* Special status/control offset for non-standard EC Fan2 */
7928 fan_rpm_status_ns = 0x95, /* Special offset for Fan1 RPM status for non-standard EC */
7929 fan2_rpm_status_ns = 0x98, /* Special offset for Fan2 RPM status for non-standard EC */
7934 TPACPI_FAN_LAST_LEVEL = 0x100, /* Use cached last-seen fan level */
7941 TPACPI_FAN_RD_TPEC, /* Use ACPI EC regs 0x2f, 0x84-0x85 */
7942 TPACPI_FAN_RD_TPEC_NS, /* Use non-standard ACPI EC regs (eg: L13 Yoga gen2 etc.) */
7987 "JFNS", /* 770x-JL */
8004 * Enable for TP-1Y (T43), TP-78 (R51e), TP-76 (R52),
8005 * TP-70 (T43, R52), which are known to be buggy.
8090 return -EIO;
8102 return -EIO;
8104 return -EIO;
8117 return -EIO;
8128 return -EIO;
8136 return -ENXIO;
8148 return -ERESTARTSYS;
8171 return -EIO;
8174 return -EIO;
8184 return -EIO;
8191 return -ENXIO;
8206 return -EIO;
8211 return -EIO;
8223 return -EIO;
8226 return -EIO;
8230 return -EIO;
8239 return -EIO;
8247 return -ENXIO;
8256 return -EPERM;
8261 return -EINVAL;
8272 return -EIO;
8280 return -EINVAL;
8299 return -EIO;
8306 return -EINVAL;
8308 return -EINVAL;
8312 return -EIO;
8315 return -EIO;
8319 return -EIO;
8322 return -EIO;
8325 return -EIO;
8331 return -ENXIO;
8344 return -EPERM;
8347 return -ERESTARTSYS;
8366 return -EPERM;
8369 return -ERESTARTSYS;
8385 rc = -EIO;
8403 rc = -EIO;
8410 rc = -EIO;
8414 rc = -EIO;
8422 rc = -ENXIO;
8439 return -EPERM;
8442 return -ERESTARTSYS;
8449 rc = -EIO;
8458 rc = -EIO;
8465 rc = -EIO;
8469 rc = -EIO;
8473 rc = -EIO;
8480 rc = -ENXIO;
8496 return -EPERM;
8499 return -ERESTARTSYS;
8507 rc = -EIO;
8509 rc = -EINVAL;
8515 rc = -EIO;
8519 rc = -EIO;
8524 rc = -EIO;
8526 rc = -EINVAL;
8530 rc = -ENXIO;
8588 /* sysfs fan pwm1_enable ----------------------------------------------- */
8618 return -EINVAL;
8634 /* reserved for software-controlled auto mode */
8635 return -ENOSYS;
8637 return -EINVAL;
8641 if (res == -ENXIO)
8642 return -EINVAL;
8654 /* sysfs fan pwm1 ------------------------------------------------------ */
8685 return -EINVAL;
8690 /* scale down from 0-255 to 0-7 */
8694 return -ERESTARTSYS;
8700 if (rc == -ENXIO)
8701 rc = -EINVAL;
8714 /* sysfs fan fan1_input ------------------------------------------------ */
8735 /* sysfs fan fan2_input ------------------------------------------------ */
8756 /* sysfs fan fan_watchdog (hwmon driver) ------------------------------- */
8768 return -EINVAL;
8771 return -EPERM;
8782 /* --------------------------------------------------------------------- */
8804 return attr->mode;
8826 #define TPACPI_FAN_NS 0x0010 /* For EC with non-Standard register addresses */
8855 TPACPI_Q_LNV3('R', '1', 'D', TPACPI_FAN_NS), /* 11e Gen5 GL-R */
8856 TPACPI_Q_LNV3('R', '0', 'V', TPACPI_FAN_NS), /* 11e Gen5 KL-Y */
8897 return -ENODEV;
8901 pr_info("ECFW with non-standard fan reg control found\n");
8928 /* all other ThinkPads: note that even old-style
8946 /* It responded - so let's assume it's there */
8952 /* Fan not auto-detected */
8966 return -ENODEV;
8971 /* 570, 770x-JL */
9022 return -ENODEV;
9177 seq_printf(m, " (<level> is 0-7)\n");
9181 seq_printf(m, " (<level> is 0-7, auto, disengaged, full-speed)\n");
9188 "commands:\twatchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))\n");
9191 seq_printf(m, "commands:\tspeed <speed> (<speed> is 0-65535)\n");
9202 else if (strstarts(cmd, "level disengaged") || strstarts(cmd, "level full-speed"))
9208 if (*rc == -ENXIO)
9224 if (*rc == -ENXIO)
9239 if (*rc == -ENXIO)
9259 if (*rc == -ENXIO)
9277 *rc = -EINVAL;
9303 rc = -EINVAL;
9351 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, t->name, &temp))) {
9352 pr_warn("Thinkpad ACPI has no %s interface.\n", t->name);
9353 return -EIO;
9356 if (!acpi_evalf(hkey_handle, &output, t->name, "dd",
9357 state ? t->on_value : t->off_value))
9358 return -EIO;
9360 t->state = state;
9369 if (t->state < 0 || t->state == on)
9370 return t->state;
9391 .default_trigger = "audio-mute",
9397 .default_trigger = "audio-micmute",
9408 if (ACPI_FAILURE(acpi_get_handle(hkey_handle, t->name, &temp))) {
9409 t->state = -ENODEV;
9413 err = led_classdev_register(&tpacpi_pdev->dev, &mute_led_cdev[i]);
9415 while (i--)
9439 if (t->state >= 0)
9440 mute_led_on_off(t, t->state);
9529 return -ENODEV;
9536 return -ENODEV;
9550 return -ENODEV;
9556 return -ENODEV;
9562 return -EINVAL;
9571 /* The battery ID is in bits 8-9, 2 bits */
9579 return -ENODEV;
9585 return -ENODEV;
9591 * battery ID is in bits 8-9, 2 bits.
9595 return -ENODEV;
9602 * The battery ID is in bits 4-5, 2 bits,
9603 * the effective time is in bits 8-23, 2 bytes.
9611 return -ENODEV;
9616 return -EINVAL;
9622 int ret, v;
9628 ret = tpacpi_battery_get(what, battery, &v);
9632 if (v == value)
9637 ret = tpacpi_battery_get(what, battery, &v);
9641 if (v == value)
9644 return -EIO;
9667 return -ENODEV;
9676 return -ENODEV;
9680 return -ENODEV;
9686 return -ENODEV;
9692 return -ENODEV;
9696 return -ENODEV;
9702 return -ENODEV;
9712 return -ENODEV;
9757 struct power_supply *supply = to_power_supply(dev);
9773 battery = tpacpi_battery_get_id(supply->desc->name);
9784 return -ENODEV;
9787 return -EINVAL;
9789 return -EINVAL;
9791 return -ENODEV;
9797 return -ENODEV;
9800 return -EINVAL;
9802 return -EINVAL;
9812 return -EINVAL;
9816 return -EINVAL;
9825 struct power_supply *supply = to_power_supply(dev);
9840 battery = tpacpi_battery_get_id(supply->desc->name);
9844 return -ENODEV;
9867 struct power_supply *supply = to_power_supply(dev);
9871 battery = tpacpi_battery_get_id(supply->desc->name);
9876 return -ENODEV;
9885 return -ENODEV;
9914 struct power_supply *supply = to_power_supply(dev);
9918 battery = tpacpi_battery_get_id(supply->desc->name);
9950 return -EINVAL;
9987 int batteryid = tpacpi_battery_get_id(battery->desc->name);
9990 return -ENODEV;
9991 if (device_add_groups(&battery->dev, tpacpi_battery_groups))
9992 return -ENODEV;
9998 device_remove_groups(&battery->dev, tpacpi_battery_groups);
10060 if (WARN_ON(!mutex_is_locked(&priv->lock)))
10061 return -EIO;
10064 return -EIO;
10066 priv->hw_state = priv->sw_state = state;
10077 priv->hw_state = priv->sw_state = output & 0x1;
10096 return -EIO;
10101 lcdshadow_dev = drm_privacy_screen_register(&tpacpi_pdev->dev,
10119 mutex_lock(&lcdshadow_dev->lock);
10120 lcdshadow_set_sw_state(lcdshadow_dev, lcdshadow_dev->sw_state);
10121 mutex_unlock(&lcdshadow_dev->lock);
10129 seq_printf(m, "status:\t\t%d\n", lcdshadow_dev->hw_state);
10139 int res, state = -EINVAL;
10142 return -ENODEV;
10151 return -EINVAL;
10153 mutex_lock(&lcdshadow_dev->lock);
10155 mutex_unlock(&lcdshadow_dev->lock);
10174 #define DYTC_CMD_QUERY 0 /* To get DYTC status - enable/revision */
10175 #define DYTC_QUERY_ENABLE_BIT 8 /* Bit 8 - 0 = disabled, 1 = enabled */
10176 #define DYTC_QUERY_SUBREV_BIT 16 /* Bits 16 - 27 - sub revision */
10177 #define DYTC_QUERY_REV_BIT 28 /* Bits 28 - 31 - revision */
10197 return -ENODEV;
10200 return -EIO;
10225 return -ENODEV;
10227 return -EIO;
10245 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "dytc_lapmode");
10261 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "palmsensor");
10307 return attr->mode;
10321 /* If support isn't available for both devices return -ENODEV */
10322 if ((palm_err == -ENODEV) && (lap_err == -ENODEV))
10323 return -ENODEV;
10325 if (palm_err && (palm_err != -ENODEV))
10327 if (lap_err && (lap_err != -ENODEV))
10334 .name = "proximity-sensor",
10350 #define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */
10351 #define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */
10353 #define DYTC_SET_FUNCTION_BIT 12 /* Bits 12-15 - function setting */
10354 #define DYTC_SET_MODE_BIT 16 /* Bits 16-19 - mode setting */
10355 #define DYTC_SET_VALID_BIT 20 /* Bit 20 - 1 = on, 0 = off */
10379 #define DYTC_ERR_MASK 0xF /* Bits 0-3 in cmd result are the error result */
10420 return -EINVAL;
10431 return -EINVAL;
10441 return -EOPNOTSUPP;
10468 return -EOPNOTSUPP;
10492 return -ENODEV;
10509 * Helper function - check if we are in CQL mode and if we are
10510 * - disable CQL,
10511 * - run the command
10512 * - enable CQL
10571 * Note we still need to disable CQL mode before hand and re-enable
10594 /* Success - update current profile */
10634 err = -ENODEV;
10662 return -ENODEV;
10672 case -1:
10705 return -ENODEV;
10712 tpacpi_pprof = platform_profile_register(&tpacpi_pdev->dev, "thinkpad-acpi-profile",
10719 return -ENODEV;
10738 .name = "dytc-profile",
10760 {"fr-ch", 0x100c},
10780 return -ENODEV;
10784 return -EIO;
10796 return -ENODEV;
10800 return -EIO;
10804 * '(' and ')') keys which use layout dependent key-press emulation.
10807 return -ENODEV;
10864 dev_err(&tpacpi_pdev->dev, "Unknown Keyboard language. Ignoring\n");
10865 return -EINVAL;
10868 tpacpi_disclose_usertask(attr->attr.name,
10871 sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "keyboard_lang");
10885 return tp_features.kbd_lang ? attr->mode : 0;
10922 return -ENODEV;
10926 return -EIO;
10934 return -ENODEV;
10953 return -ENODEV;
10969 return -ENODATA;
10982 return has_antennatype ? attr->mode : 0;
11010 * MAC Address Pass-through feature. In most cases, there are three
11032 return -ENODEV;
11036 if (obj->type != ACPI_TYPE_STRING || obj->string.length != AUXMAC_STRLEN) {
11037 pr_info("Invalid buffer for MAC address pass-through.\n");
11041 if (obj->string.pointer[AUXMAC_BEGIN_MARKER] != '#' ||
11042 obj->string.pointer[AUXMAC_END_MARKER] != '#') {
11043 pr_info("Invalid header for MAC address pass-through.\n");
11047 if (strncmp(obj->string.pointer + AUXMAC_START, "XXXXXXXXXXXX", AUXMAC_LEN) != 0)
11048 strscpy(auxmac, obj->string.pointer + AUXMAC_START, sizeof(auxmac));
11070 return auxmac[0] == 0 ? 0 : attr->mode;
11083 /* --------------------------------------------------------------------- */
11116 return attr->mode;
11246 if (!atomic_add_unless(&dytc_ignore_event, -1, 0))
11255 mutex_lock(&lcdshadow_dev->lock);
11256 old_hw_state = lcdshadow_dev->hw_state;
11258 changed = lcdshadow_dev->hw_state != old_hw_state;
11259 mutex_unlock(&lcdshadow_dev->lock);
11299 /* --------------------------------------------------------------------- */
11321 dbg_printk(TPACPI_DBG_EXIT, "removing %s\n", ibm->name);
11323 list_del_init(&ibm->all_drivers);
11325 if (ibm->flags.acpi_notify_installed) {
11327 "%s: acpi_remove_notify_handler\n", ibm->name);
11328 BUG_ON(!ibm->acpi);
11329 acpi_remove_notify_handler(*ibm->acpi->handle,
11330 ibm->acpi->type,
11332 ibm->flags.acpi_notify_installed = 0;
11335 if (ibm->flags.proc_created) {
11337 "%s: remove_proc_entry\n", ibm->name);
11338 remove_proc_entry(ibm->name, proc_dir);
11339 ibm->flags.proc_created = 0;
11342 if (ibm->flags.acpi_driver_registered) {
11344 "%s: acpi_bus_unregister_driver\n", ibm->name);
11345 BUG_ON(!ibm->acpi);
11346 acpi_bus_unregister_driver(ibm->acpi->driver);
11347 kfree(ibm->acpi->driver);
11348 ibm->acpi->driver = NULL;
11349 ibm->flags.acpi_driver_registered = 0;
11352 if (ibm->flags.init_called && ibm->exit) {
11353 ibm->exit();
11354 ibm->flags.init_called = 0;
11357 dbg_printk(TPACPI_DBG_INIT, "finished removing %s\n", ibm->name);
11363 struct ibm_struct *ibm = iibm->data;
11368 INIT_LIST_HEAD(&ibm->all_drivers);
11370 if (ibm->flags.experimental && !experimental)
11374 "probing for %s\n", ibm->name);
11376 if (iibm->init) {
11377 ret = iibm->init(iibm);
11378 if (ret > 0 || ret == -ENODEV)
11383 ibm->flags.init_called = 1;
11386 if (ibm->acpi) {
11387 if (ibm->acpi->hid) {
11393 if (ibm->acpi->notify) {
11395 if (ret == -ENODEV) {
11397 ibm->name);
11407 "%s installed\n", ibm->name);
11409 if (ibm->read) {
11410 umode_t mode = iibm->base_procfs_mode;
11414 if (ibm->write)
11416 entry = proc_create_data(ibm->name, mode, proc_dir,
11419 pr_err("unable to create proc entry %s\n", ibm->name);
11420 ret = -ENODEV;
11423 ibm->flags.proc_created = 1;
11426 list_add_tail(&ibm->all_drivers, &tpacpi_all_drivers);
11433 ibm->name, ret);
11456 * Ancient 570/600 and -SL lacks (#.##c)
11484 * ----------------------------------------------------
11497 if (dm->type != 140 || dm->length < 0x0F ||
11508 /* returns 0 - probe ok, or < 0 - probe error.
11510 * On error, kfree() cleanup on tp->* is not performed, caller must do it */
11520 return -EINVAL;
11525 tp->vendor = PCI_VENDOR_ID_IBM;
11527 tp->vendor = PCI_VENDOR_ID_LENOVO;
11529 tp->vendor = PCI_VENDOR_ID_LENOVO;
11534 tp->bios_version_str = kstrdup(s, GFP_KERNEL);
11535 if (s && !tp->bios_version_str)
11536 return -ENOMEM;
11539 t = tpacpi_parse_fw_id(tp->bios_version_str,
11540 &tp->bios_model, &tp->bios_release);
11547 * up-to-date BIOS or they will not be detected.
11552 if (sscanf(dev->name,
11553 "IBM ThinkPad Embedded Controller -[%17c",
11555 ec_fw_string[sizeof(ec_fw_string) - 1] = 0;
11566 tp->ec_version_str = kstrdup(ec_fw_string, GFP_KERNEL);
11567 if (!tp->ec_version_str)
11568 return -ENOMEM;
11571 &tp->ec_model, &tp->ec_release);
11581 tp->model_str = kstrdup(s, GFP_KERNEL);
11582 if (!tp->model_str)
11583 return -ENOMEM;
11587 tp->model_str = kstrdup(s, GFP_KERNEL);
11588 if (!tp->model_str)
11589 return -ENOMEM;
11594 tp->nummodel_str = kstrdup(s, GFP_KERNEL);
11595 if (s && !tp->nummodel_str)
11596 return -ENOMEM;
11606 return -ENODEV;
11610 return -ENODEV;
11613 * Non-ancient models have better DMI tagging, but very old models
11625 return -ENODEV;
11629 return -ENODEV;
11636 pr_info("%s v%s\n", TPACPI_DESC, TPACPI_VERSION);
11762 if (!kp || !kp->name || !val)
11763 return -EINVAL;
11767 if (!ibm || !ibm->name)
11770 if (strcmp(ibm->name, kp->name) == 0 && ibm->write) {
11771 if (strlen(val) > sizeof(ibms_init[i].param) - 1)
11772 return -ENOSPC;
11778 return -EINVAL;
11783 "Enables experimental features when non-zero");
11786 MODULE_PARM_DESC(debug, "Sets debug level bit-mask");
11790 "Attempts to load the driver even on a mis-identified ThinkPad when true");
11833 MODULE_PARM_DESC(feature, "Simulates thinkpad-acpi procfs command at module load, see documentation")
11873 MODULE_PARM_DESC(profile_force, "Force profile mode. -1=off, 1=MMC, 2=PSC");
11914 ret = devm_mutex_init(&pdev->dev, &tpacpi_inputdev_send_mutex);
11918 tpacpi_inputdev = devm_input_allocate_device(&pdev->dev);
11920 return -ENOMEM;
11922 tpacpi_inputdev->name = "ThinkPad Extra Buttons";
11923 tpacpi_inputdev->phys = TPACPI_DRVR_NAME "/input0";
11924 tpacpi_inputdev->id.bustype = BUS_HOST;
11925 tpacpi_inputdev->id.vendor = thinkpad_id.vendor;
11926 tpacpi_inputdev->id.product = TPACPI_HKEY_INPUT_PRODUCT;
11927 tpacpi_inputdev->id.version = TPACPI_HKEY_INPUT_VERSION;
11928 tpacpi_inputdev->dev.parent = &tpacpi_pdev->dev;
11937 ret = ibms_init[i].data->write(ibms_init[i].param);
11944 ret = devm_add_action_or_reset(&pdev->dev, tpacpi_subdrivers_release, NULL);
11957 tpacpi_hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, TPACPI_NAME,
11973 /* Driver-level probe */
12013 return -ENOMEM;
12020 return -ENODEV;
12025 tp_features.quirks = dmi_id->driver_data;