linux/drivers/platform/x86/toshiba_acpi.c
<<
>>
Prefs
   1/*
   2 *  toshiba_acpi.c - Toshiba Laptop ACPI Extras
   3 *
   4 *  Copyright (C) 2002-2004 John Belmonte
   5 *  Copyright (C) 2008 Philip Langdale
   6 *  Copyright (C) 2010 Pierre Ducroquet
   7 *  Copyright (C) 2014-2015 Azael Avalos
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation; either version 2 of the License, or
  12 *  (at your option) any later version.
  13 *
  14 *  This program is distributed in the hope that it will be useful,
  15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *  GNU General Public License for more details.
  18 *
  19 *  The full GNU General Public License is included in this distribution in
  20 *  the file called "COPYING".
  21 *
  22 *  The devolpment page for this driver is located at
  23 *  http://memebeam.org/toys/ToshibaAcpiDriver.
  24 *
  25 *  Credits:
  26 *      Jonathan A. Buzzard - Toshiba HCI info, and critical tips on reverse
  27 *              engineering the Windows drivers
  28 *      Yasushi Nagato - changes for linux kernel 2.4 -> 2.5
  29 *      Rob Miller - TV out and hotkeys help
  30 */
  31
  32#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  33
  34#define TOSHIBA_ACPI_VERSION    "0.23"
  35#define PROC_INTERFACE_VERSION  1
  36
  37#include <linux/kernel.h>
  38#include <linux/module.h>
  39#include <linux/moduleparam.h>
  40#include <linux/init.h>
  41#include <linux/types.h>
  42#include <linux/proc_fs.h>
  43#include <linux/seq_file.h>
  44#include <linux/backlight.h>
  45#include <linux/input.h>
  46#include <linux/input/sparse-keymap.h>
  47#include <linux/leds.h>
  48#include <linux/slab.h>
  49#include <linux/workqueue.h>
  50#include <linux/i8042.h>
  51#include <linux/acpi.h>
  52#include <linux/dmi.h>
  53#include <linux/uaccess.h>
  54#include <linux/miscdevice.h>
  55#include <linux/rfkill.h>
  56#include <linux/toshiba.h>
  57#include <acpi/video.h>
  58
  59MODULE_AUTHOR("John Belmonte");
  60MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver");
  61MODULE_LICENSE("GPL");
  62
  63#define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100"
  64
  65/* Scan code for Fn key on TOS1900 models */
  66#define TOS1900_FN_SCAN         0x6e
  67
  68/* Toshiba ACPI method paths */
  69#define METHOD_VIDEO_OUT        "\\_SB_.VALX.DSSX"
  70
  71/*
  72 * The Toshiba configuration interface is composed of the HCI and the SCI,
  73 * which are defined as follows:
  74 *
  75 * HCI is Toshiba's "Hardware Control Interface" which is supposed to
  76 * be uniform across all their models.  Ideally we would just call
  77 * dedicated ACPI methods instead of using this primitive interface.
  78 * However the ACPI methods seem to be incomplete in some areas (for
  79 * example they allow setting, but not reading, the LCD brightness value),
  80 * so this is still useful.
  81 *
  82 * SCI stands for "System Configuration Interface" which aim is to
  83 * conceal differences in hardware between different models.
  84 */
  85
  86#define TCI_WORDS                       6
  87
  88/* Operations */
  89#define HCI_SET                         0xff00
  90#define HCI_GET                         0xfe00
  91#define SCI_OPEN                        0xf100
  92#define SCI_CLOSE                       0xf200
  93#define SCI_GET                         0xf300
  94#define SCI_SET                         0xf400
  95
  96/* Return codes */
  97#define TOS_SUCCESS                     0x0000
  98#define TOS_SUCCESS2                    0x0001
  99#define TOS_OPEN_CLOSE_OK               0x0044
 100#define TOS_FAILURE                     0x1000
 101#define TOS_NOT_SUPPORTED               0x8000
 102#define TOS_ALREADY_OPEN                0x8100
 103#define TOS_NOT_OPENED                  0x8200
 104#define TOS_INPUT_DATA_ERROR            0x8300
 105#define TOS_WRITE_PROTECTED             0x8400
 106#define TOS_NOT_PRESENT                 0x8600
 107#define TOS_FIFO_EMPTY                  0x8c00
 108#define TOS_DATA_NOT_AVAILABLE          0x8d20
 109#define TOS_NOT_INITIALIZED             0x8d50
 110#define TOS_NOT_INSTALLED               0x8e00
 111
 112/* Registers */
 113#define HCI_FAN                         0x0004
 114#define HCI_TR_BACKLIGHT                0x0005
 115#define HCI_SYSTEM_EVENT                0x0016
 116#define HCI_VIDEO_OUT                   0x001c
 117#define HCI_HOTKEY_EVENT                0x001e
 118#define HCI_LCD_BRIGHTNESS              0x002a
 119#define HCI_WIRELESS                    0x0056
 120#define HCI_ACCELEROMETER               0x006d
 121#define HCI_COOLING_METHOD              0x007f
 122#define HCI_KBD_ILLUMINATION            0x0095
 123#define HCI_ECO_MODE                    0x0097
 124#define HCI_ACCELEROMETER2              0x00a6
 125#define HCI_SYSTEM_INFO                 0xc000
 126#define SCI_PANEL_POWER_ON              0x010d
 127#define SCI_ILLUMINATION                0x014e
 128#define SCI_USB_SLEEP_CHARGE            0x0150
 129#define SCI_KBD_ILLUM_STATUS            0x015c
 130#define SCI_USB_SLEEP_MUSIC             0x015e
 131#define SCI_USB_THREE                   0x0169
 132#define SCI_TOUCHPAD                    0x050e
 133#define SCI_KBD_FUNCTION_KEYS           0x0522
 134
 135/* Field definitions */
 136#define HCI_ACCEL_MASK                  0x7fff
 137#define HCI_HOTKEY_DISABLE              0x0b
 138#define HCI_HOTKEY_ENABLE               0x09
 139#define HCI_HOTKEY_SPECIAL_FUNCTIONS    0x10
 140#define HCI_LCD_BRIGHTNESS_BITS         3
 141#define HCI_LCD_BRIGHTNESS_SHIFT        (16-HCI_LCD_BRIGHTNESS_BITS)
 142#define HCI_LCD_BRIGHTNESS_LEVELS       (1 << HCI_LCD_BRIGHTNESS_BITS)
 143#define HCI_MISC_SHIFT                  0x10
 144#define HCI_SYSTEM_TYPE1                0x10
 145#define HCI_SYSTEM_TYPE2                0x11
 146#define HCI_VIDEO_OUT_LCD               0x1
 147#define HCI_VIDEO_OUT_CRT               0x2
 148#define HCI_VIDEO_OUT_TV                0x4
 149#define SCI_KBD_MODE_MASK               0x1f
 150#define SCI_KBD_MODE_FNZ                0x1
 151#define SCI_KBD_MODE_AUTO               0x2
 152#define SCI_KBD_MODE_ON                 0x8
 153#define SCI_KBD_MODE_OFF                0x10
 154#define SCI_KBD_TIME_MAX                0x3c001a
 155#define HCI_WIRELESS_STATUS             0x1
 156#define HCI_WIRELESS_WWAN               0x3
 157#define HCI_WIRELESS_WWAN_STATUS        0x2000
 158#define HCI_WIRELESS_WWAN_POWER         0x4000
 159#define SCI_USB_CHARGE_MODE_MASK        0xff
 160#define SCI_USB_CHARGE_DISABLED         0x00
 161#define SCI_USB_CHARGE_ALTERNATE        0x09
 162#define SCI_USB_CHARGE_TYPICAL          0x11
 163#define SCI_USB_CHARGE_AUTO             0x21
 164#define SCI_USB_CHARGE_BAT_MASK         0x7
 165#define SCI_USB_CHARGE_BAT_LVL_OFF      0x1
 166#define SCI_USB_CHARGE_BAT_LVL_ON       0x4
 167#define SCI_USB_CHARGE_BAT_LVL          0x0200
 168#define SCI_USB_CHARGE_RAPID_DSP        0x0300
 169
 170struct toshiba_acpi_dev {
 171        struct acpi_device *acpi_dev;
 172        const char *method_hci;
 173        struct input_dev *hotkey_dev;
 174        struct work_struct hotkey_work;
 175        struct backlight_device *backlight_dev;
 176        struct led_classdev led_dev;
 177        struct led_classdev kbd_led;
 178        struct led_classdev eco_led;
 179        struct miscdevice miscdev;
 180        struct rfkill *wwan_rfk;
 181
 182        int force_fan;
 183        int last_key_event;
 184        int key_event_valid;
 185        int kbd_type;
 186        int kbd_mode;
 187        int kbd_time;
 188        int usbsc_bat_level;
 189        int usbsc_mode_base;
 190        int hotkey_event_type;
 191        int max_cooling_method;
 192
 193        unsigned int illumination_supported:1;
 194        unsigned int video_supported:1;
 195        unsigned int fan_supported:1;
 196        unsigned int system_event_supported:1;
 197        unsigned int ntfy_supported:1;
 198        unsigned int info_supported:1;
 199        unsigned int tr_backlight_supported:1;
 200        unsigned int kbd_illum_supported:1;
 201        unsigned int touchpad_supported:1;
 202        unsigned int eco_supported:1;
 203        unsigned int accelerometer_supported:1;
 204        unsigned int usb_sleep_charge_supported:1;
 205        unsigned int usb_rapid_charge_supported:1;
 206        unsigned int usb_sleep_music_supported:1;
 207        unsigned int kbd_function_keys_supported:1;
 208        unsigned int panel_power_on_supported:1;
 209        unsigned int usb_three_supported:1;
 210        unsigned int wwan_supported:1;
 211        unsigned int cooling_method_supported:1;
 212        unsigned int sysfs_created:1;
 213        unsigned int special_functions;
 214
 215        bool kbd_event_generated;
 216        bool kbd_led_registered;
 217        bool illumination_led_registered;
 218        bool eco_led_registered;
 219        bool killswitch;
 220};
 221
 222static struct toshiba_acpi_dev *toshiba_acpi;
 223
 224static bool disable_hotkeys;
 225module_param(disable_hotkeys, bool, 0444);
 226MODULE_PARM_DESC(disable_hotkeys, "Disables the hotkeys activation");
 227
 228static const struct acpi_device_id toshiba_device_ids[] = {
 229        {"TOS6200", 0},
 230        {"TOS6207", 0},
 231        {"TOS6208", 0},
 232        {"TOS1900", 0},
 233        {"", 0},
 234};
 235MODULE_DEVICE_TABLE(acpi, toshiba_device_ids);
 236
 237static const struct key_entry toshiba_acpi_keymap[] = {
 238        { KE_KEY, 0x9e, { KEY_RFKILL } },
 239        { KE_KEY, 0x101, { KEY_MUTE } },
 240        { KE_KEY, 0x102, { KEY_ZOOMOUT } },
 241        { KE_KEY, 0x103, { KEY_ZOOMIN } },
 242        { KE_KEY, 0x10f, { KEY_TAB } },
 243        { KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } },
 244        { KE_KEY, 0x139, { KEY_ZOOMRESET } },
 245        { KE_KEY, 0x13b, { KEY_COFFEE } },
 246        { KE_KEY, 0x13c, { KEY_BATTERY } },
 247        { KE_KEY, 0x13d, { KEY_SLEEP } },
 248        { KE_KEY, 0x13e, { KEY_SUSPEND } },
 249        { KE_KEY, 0x13f, { KEY_SWITCHVIDEOMODE } },
 250        { KE_KEY, 0x140, { KEY_BRIGHTNESSDOWN } },
 251        { KE_KEY, 0x141, { KEY_BRIGHTNESSUP } },
 252        { KE_KEY, 0x142, { KEY_WLAN } },
 253        { KE_KEY, 0x143, { KEY_TOUCHPAD_TOGGLE } },
 254        { KE_KEY, 0x17f, { KEY_FN } },
 255        { KE_KEY, 0xb05, { KEY_PROG2 } },
 256        { KE_KEY, 0xb06, { KEY_WWW } },
 257        { KE_KEY, 0xb07, { KEY_MAIL } },
 258        { KE_KEY, 0xb30, { KEY_STOP } },
 259        { KE_KEY, 0xb31, { KEY_PREVIOUSSONG } },
 260        { KE_KEY, 0xb32, { KEY_NEXTSONG } },
 261        { KE_KEY, 0xb33, { KEY_PLAYPAUSE } },
 262        { KE_KEY, 0xb5a, { KEY_MEDIA } },
 263        { KE_IGNORE, 0x1430, { KEY_RESERVED } }, /* Wake from sleep */
 264        { KE_IGNORE, 0x1501, { KEY_RESERVED } }, /* Output changed */
 265        { KE_IGNORE, 0x1502, { KEY_RESERVED } }, /* HDMI plugged/unplugged */
 266        { KE_IGNORE, 0x1ABE, { KEY_RESERVED } }, /* Protection level set */
 267        { KE_IGNORE, 0x1ABF, { KEY_RESERVED } }, /* Protection level off */
 268        { KE_END, 0 },
 269};
 270
 271static const struct key_entry toshiba_acpi_alt_keymap[] = {
 272        { KE_KEY, 0x102, { KEY_ZOOMOUT } },
 273        { KE_KEY, 0x103, { KEY_ZOOMIN } },
 274        { KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } },
 275        { KE_KEY, 0x139, { KEY_ZOOMRESET } },
 276        { KE_KEY, 0x13c, { KEY_BRIGHTNESSDOWN } },
 277        { KE_KEY, 0x13d, { KEY_BRIGHTNESSUP } },
 278        { KE_KEY, 0x13e, { KEY_SWITCHVIDEOMODE } },
 279        { KE_KEY, 0x13f, { KEY_TOUCHPAD_TOGGLE } },
 280        { KE_KEY, 0x157, { KEY_MUTE } },
 281        { KE_KEY, 0x158, { KEY_WLAN } },
 282        { KE_END, 0 },
 283};
 284
 285/*
 286 * List of models which have a broken acpi-video backlight interface and thus
 287 * need to use the toshiba (vendor) interface instead.
 288 */
 289static const struct dmi_system_id toshiba_vendor_backlight_dmi[] = {
 290        {}
 291};
 292
 293/*
 294 * Utility
 295 */
 296
 297static inline void _set_bit(u32 *word, u32 mask, int value)
 298{
 299        *word = (*word & ~mask) | (mask * value);
 300}
 301
 302/*
 303 * ACPI interface wrappers
 304 */
 305
 306static int write_acpi_int(const char *methodName, int val)
 307{
 308        acpi_status status;
 309
 310        status = acpi_execute_simple_method(NULL, (char *)methodName, val);
 311        return (status == AE_OK) ? 0 : -EIO;
 312}
 313
 314/*
 315 * Perform a raw configuration call.  Here we don't care about input or output
 316 * buffer format.
 317 */
 318static acpi_status tci_raw(struct toshiba_acpi_dev *dev,
 319                           const u32 in[TCI_WORDS], u32 out[TCI_WORDS])
 320{
 321        struct acpi_object_list params;
 322        union acpi_object in_objs[TCI_WORDS];
 323        struct acpi_buffer results;
 324        union acpi_object out_objs[TCI_WORDS + 1];
 325        acpi_status status;
 326        int i;
 327
 328        params.count = TCI_WORDS;
 329        params.pointer = in_objs;
 330        for (i = 0; i < TCI_WORDS; ++i) {
 331                in_objs[i].type = ACPI_TYPE_INTEGER;
 332                in_objs[i].integer.value = in[i];
 333        }
 334
 335        results.length = sizeof(out_objs);
 336        results.pointer = out_objs;
 337
 338        status = acpi_evaluate_object(dev->acpi_dev->handle,
 339                                      (char *)dev->method_hci, &params,
 340                                      &results);
 341        if ((status == AE_OK) && (out_objs->package.count <= TCI_WORDS)) {
 342                for (i = 0; i < out_objs->package.count; ++i)
 343                        out[i] = out_objs->package.elements[i].integer.value;
 344        }
 345
 346        return status;
 347}
 348
 349/*
 350 * Common hci tasks
 351 *
 352 * In addition to the ACPI status, the HCI system returns a result which
 353 * may be useful (such as "not supported").
 354 */
 355
 356static u32 hci_write(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
 357{
 358        u32 in[TCI_WORDS] = { HCI_SET, reg, in1, 0, 0, 0 };
 359        u32 out[TCI_WORDS];
 360        acpi_status status = tci_raw(dev, in, out);
 361
 362        return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
 363}
 364
 365static u32 hci_read(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
 366{
 367        u32 in[TCI_WORDS] = { HCI_GET, reg, 0, 0, 0, 0 };
 368        u32 out[TCI_WORDS];
 369        acpi_status status = tci_raw(dev, in, out);
 370
 371        if (ACPI_FAILURE(status))
 372                return TOS_FAILURE;
 373
 374        *out1 = out[2];
 375
 376        return out[0];
 377}
 378
 379/*
 380 * Common sci tasks
 381 */
 382
 383static int sci_open(struct toshiba_acpi_dev *dev)
 384{
 385        u32 in[TCI_WORDS] = { SCI_OPEN, 0, 0, 0, 0, 0 };
 386        u32 out[TCI_WORDS];
 387        acpi_status status;
 388
 389        status = tci_raw(dev, in, out);
 390        if  (ACPI_FAILURE(status)) {
 391                pr_err("ACPI call to open SCI failed\n");
 392                return 0;
 393        }
 394
 395        if (out[0] == TOS_OPEN_CLOSE_OK) {
 396                return 1;
 397        } else if (out[0] == TOS_ALREADY_OPEN) {
 398                pr_info("Toshiba SCI already opened\n");
 399                return 1;
 400        } else if (out[0] == TOS_NOT_SUPPORTED) {
 401                /*
 402                 * Some BIOSes do not have the SCI open/close functions
 403                 * implemented and return 0x8000 (Not Supported), failing to
 404                 * register some supported features.
 405                 *
 406                 * Simply return 1 if we hit those affected laptops to make the
 407                 * supported features work.
 408                 *
 409                 * In the case that some laptops really do not support the SCI,
 410                 * all the SCI dependent functions check for TOS_NOT_SUPPORTED,
 411                 * and thus, not registering support for the queried feature.
 412                 */
 413                return 1;
 414        } else if (out[0] == TOS_NOT_PRESENT) {
 415                pr_info("Toshiba SCI is not present\n");
 416        }
 417
 418        return 0;
 419}
 420
 421static void sci_close(struct toshiba_acpi_dev *dev)
 422{
 423        u32 in[TCI_WORDS] = { SCI_CLOSE, 0, 0, 0, 0, 0 };
 424        u32 out[TCI_WORDS];
 425        acpi_status status;
 426
 427        status = tci_raw(dev, in, out);
 428        if (ACPI_FAILURE(status)) {
 429                pr_err("ACPI call to close SCI failed\n");
 430                return;
 431        }
 432
 433        if (out[0] == TOS_OPEN_CLOSE_OK)
 434                return;
 435        else if (out[0] == TOS_NOT_OPENED)
 436                pr_info("Toshiba SCI not opened\n");
 437        else if (out[0] == TOS_NOT_PRESENT)
 438                pr_info("Toshiba SCI is not present\n");
 439}
 440
 441static u32 sci_read(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
 442{
 443        u32 in[TCI_WORDS] = { SCI_GET, reg, 0, 0, 0, 0 };
 444        u32 out[TCI_WORDS];
 445        acpi_status status = tci_raw(dev, in, out);
 446
 447        if (ACPI_FAILURE(status))
 448                return TOS_FAILURE;
 449
 450        *out1 = out[2];
 451
 452        return out[0];
 453}
 454
 455static u32 sci_write(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
 456{
 457        u32 in[TCI_WORDS] = { SCI_SET, reg, in1, 0, 0, 0 };
 458        u32 out[TCI_WORDS];
 459        acpi_status status = tci_raw(dev, in, out);
 460
 461        return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
 462}
 463
 464/* Illumination support */
 465static void toshiba_illumination_available(struct toshiba_acpi_dev *dev)
 466{
 467        u32 in[TCI_WORDS] = { SCI_GET, SCI_ILLUMINATION, 0, 0, 0, 0 };
 468        u32 out[TCI_WORDS];
 469        acpi_status status;
 470
 471        dev->illumination_supported = 0;
 472        dev->illumination_led_registered = false;
 473
 474        if (!sci_open(dev))
 475                return;
 476
 477        status = tci_raw(dev, in, out);
 478        sci_close(dev);
 479        if (ACPI_FAILURE(status))
 480                pr_err("ACPI call to query Illumination support failed\n");
 481        else if (out[0] == TOS_SUCCESS)
 482                dev->illumination_supported = 1;
 483}
 484
 485static void toshiba_illumination_set(struct led_classdev *cdev,
 486                                     enum led_brightness brightness)
 487{
 488        struct toshiba_acpi_dev *dev = container_of(cdev,
 489                        struct toshiba_acpi_dev, led_dev);
 490        u32 result;
 491        u32 state;
 492
 493        /* First request : initialize communication. */
 494        if (!sci_open(dev))
 495                return;
 496
 497        /* Switch the illumination on/off */
 498        state = brightness ? 1 : 0;
 499        result = sci_write(dev, SCI_ILLUMINATION, state);
 500        sci_close(dev);
 501        if (result == TOS_FAILURE)
 502                pr_err("ACPI call for illumination failed\n");
 503}
 504
 505static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev)
 506{
 507        struct toshiba_acpi_dev *dev = container_of(cdev,
 508                        struct toshiba_acpi_dev, led_dev);
 509        u32 state, result;
 510
 511        /* First request : initialize communication. */
 512        if (!sci_open(dev))
 513                return LED_OFF;
 514
 515        /* Check the illumination */
 516        result = sci_read(dev, SCI_ILLUMINATION, &state);
 517        sci_close(dev);
 518        if (result == TOS_FAILURE) {
 519                pr_err("ACPI call for illumination failed\n");
 520                return LED_OFF;
 521        } else if (result != TOS_SUCCESS) {
 522                return LED_OFF;
 523        }
 524
 525        return state ? LED_FULL : LED_OFF;
 526}
 527
 528/* KBD Illumination */
 529static void toshiba_kbd_illum_available(struct toshiba_acpi_dev *dev)
 530{
 531        u32 in[TCI_WORDS] = { SCI_GET, SCI_KBD_ILLUM_STATUS, 0, 0, 0, 0 };
 532        u32 out[TCI_WORDS];
 533        acpi_status status;
 534
 535        dev->kbd_illum_supported = 0;
 536        dev->kbd_led_registered = false;
 537        dev->kbd_event_generated = false;
 538
 539        if (!sci_open(dev))
 540                return;
 541
 542        status = tci_raw(dev, in, out);
 543        sci_close(dev);
 544        if (ACPI_FAILURE(status)) {
 545                pr_err("ACPI call to query kbd illumination support failed\n");
 546        } else if (out[0] == TOS_SUCCESS) {
 547                /*
 548                 * Check for keyboard backlight timeout max value,
 549                 * previous kbd backlight implementation set this to
 550                 * 0x3c0003, and now the new implementation set this
 551                 * to 0x3c001a, use this to distinguish between them.
 552                 */
 553                if (out[3] == SCI_KBD_TIME_MAX)
 554                        dev->kbd_type = 2;
 555                else
 556                        dev->kbd_type = 1;
 557                /* Get the current keyboard backlight mode */
 558                dev->kbd_mode = out[2] & SCI_KBD_MODE_MASK;
 559                /* Get the current time (1-60 seconds) */
 560                dev->kbd_time = out[2] >> HCI_MISC_SHIFT;
 561                /* Flag as supported */
 562                dev->kbd_illum_supported = 1;
 563        }
 564}
 565
 566static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time)
 567{
 568        u32 result;
 569
 570        if (!sci_open(dev))
 571                return -EIO;
 572
 573        result = sci_write(dev, SCI_KBD_ILLUM_STATUS, time);
 574        sci_close(dev);
 575        if (result == TOS_FAILURE)
 576                pr_err("ACPI call to set KBD backlight status failed\n");
 577        else if (result == TOS_NOT_SUPPORTED)
 578                return -ENODEV;
 579
 580        return result == TOS_SUCCESS ? 0 : -EIO;
 581}
 582
 583static int toshiba_kbd_illum_status_get(struct toshiba_acpi_dev *dev, u32 *time)
 584{
 585        u32 result;
 586
 587        if (!sci_open(dev))
 588                return -EIO;
 589
 590        result = sci_read(dev, SCI_KBD_ILLUM_STATUS, time);
 591        sci_close(dev);
 592        if (result == TOS_FAILURE)
 593                pr_err("ACPI call to get KBD backlight status failed\n");
 594        else if (result == TOS_NOT_SUPPORTED)
 595                return -ENODEV;
 596
 597        return result == TOS_SUCCESS ? 0 : -EIO;
 598}
 599
 600static enum led_brightness toshiba_kbd_backlight_get(struct led_classdev *cdev)
 601{
 602        struct toshiba_acpi_dev *dev = container_of(cdev,
 603                        struct toshiba_acpi_dev, kbd_led);
 604        u32 result;
 605        u32 state;
 606
 607        /* Check the keyboard backlight state */
 608        result = hci_read(dev, HCI_KBD_ILLUMINATION, &state);
 609        if (result == TOS_FAILURE) {
 610                pr_err("ACPI call to get the keyboard backlight failed\n");
 611                return LED_OFF;
 612        } else if (result != TOS_SUCCESS) {
 613                return LED_OFF;
 614        }
 615
 616        return state ? LED_FULL : LED_OFF;
 617}
 618
 619static void toshiba_kbd_backlight_set(struct led_classdev *cdev,
 620                                     enum led_brightness brightness)
 621{
 622        struct toshiba_acpi_dev *dev = container_of(cdev,
 623                        struct toshiba_acpi_dev, kbd_led);
 624        u32 result;
 625        u32 state;
 626
 627        /* Set the keyboard backlight state */
 628        state = brightness ? 1 : 0;
 629        result = hci_write(dev, HCI_KBD_ILLUMINATION, state);
 630        if (result == TOS_FAILURE)
 631                pr_err("ACPI call to set KBD Illumination mode failed\n");
 632}
 633
 634/* TouchPad support */
 635static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state)
 636{
 637        u32 result;
 638
 639        if (!sci_open(dev))
 640                return -EIO;
 641
 642        result = sci_write(dev, SCI_TOUCHPAD, state);
 643        sci_close(dev);
 644        if (result == TOS_FAILURE)
 645                pr_err("ACPI call to set the touchpad failed\n");
 646        else if (result == TOS_NOT_SUPPORTED)
 647                return -ENODEV;
 648
 649        return result == TOS_SUCCESS ? 0 : -EIO;
 650}
 651
 652static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state)
 653{
 654        u32 result;
 655
 656        if (!sci_open(dev))
 657                return -EIO;
 658
 659        result = sci_read(dev, SCI_TOUCHPAD, state);
 660        sci_close(dev);
 661        if (result == TOS_FAILURE)
 662                pr_err("ACPI call to query the touchpad failed\n");
 663        else if (result == TOS_NOT_SUPPORTED)
 664                return -ENODEV;
 665
 666        return result == TOS_SUCCESS ? 0 : -EIO;
 667}
 668
 669/* Eco Mode support */
 670static void toshiba_eco_mode_available(struct toshiba_acpi_dev *dev)
 671{
 672        acpi_status status;
 673        u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 0, 0, 0 };
 674        u32 out[TCI_WORDS];
 675
 676        dev->eco_supported = 0;
 677        dev->eco_led_registered = false;
 678
 679        status = tci_raw(dev, in, out);
 680        if (ACPI_FAILURE(status)) {
 681                pr_err("ACPI call to get ECO led failed\n");
 682        } else if (out[0] == TOS_INPUT_DATA_ERROR) {
 683                /*
 684                 * If we receive 0x8300 (Input Data Error), it means that the
 685                 * LED device is present, but that we just screwed the input
 686                 * parameters.
 687                 *
 688                 * Let's query the status of the LED to see if we really have a
 689                 * success response, indicating the actual presense of the LED,
 690                 * bail out otherwise.
 691                 */
 692                in[3] = 1;
 693                status = tci_raw(dev, in, out);
 694                if (ACPI_FAILURE(status))
 695                        pr_err("ACPI call to get ECO led failed\n");
 696                else if (out[0] == TOS_SUCCESS)
 697                        dev->eco_supported = 1;
 698        }
 699}
 700
 701static enum led_brightness
 702toshiba_eco_mode_get_status(struct led_classdev *cdev)
 703{
 704        struct toshiba_acpi_dev *dev = container_of(cdev,
 705                        struct toshiba_acpi_dev, eco_led);
 706        u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 };
 707        u32 out[TCI_WORDS];
 708        acpi_status status;
 709
 710        status = tci_raw(dev, in, out);
 711        if (ACPI_FAILURE(status)) {
 712                pr_err("ACPI call to get ECO led failed\n");
 713                return LED_OFF;
 714        } else if (out[0] != TOS_SUCCESS) {
 715                return LED_OFF;
 716        }
 717
 718        return out[2] ? LED_FULL : LED_OFF;
 719}
 720
 721static void toshiba_eco_mode_set_status(struct led_classdev *cdev,
 722                                     enum led_brightness brightness)
 723{
 724        struct toshiba_acpi_dev *dev = container_of(cdev,
 725                        struct toshiba_acpi_dev, eco_led);
 726        u32 in[TCI_WORDS] = { HCI_SET, HCI_ECO_MODE, 0, 1, 0, 0 };
 727        u32 out[TCI_WORDS];
 728        acpi_status status;
 729
 730        /* Switch the Eco Mode led on/off */
 731        in[2] = (brightness) ? 1 : 0;
 732        status = tci_raw(dev, in, out);
 733        if (ACPI_FAILURE(status))
 734                pr_err("ACPI call to set ECO led failed\n");
 735}
 736
 737/* Accelerometer support */
 738static void toshiba_accelerometer_available(struct toshiba_acpi_dev *dev)
 739{
 740        u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER2, 0, 0, 0, 0 };
 741        u32 out[TCI_WORDS];
 742        acpi_status status;
 743
 744        dev->accelerometer_supported = 0;
 745
 746        /*
 747         * Check if the accelerometer call exists,
 748         * this call also serves as initialization
 749         */
 750        status = tci_raw(dev, in, out);
 751        if (ACPI_FAILURE(status))
 752                pr_err("ACPI call to query the accelerometer failed\n");
 753        else if (out[0] == TOS_SUCCESS)
 754                dev->accelerometer_supported = 1;
 755}
 756
 757static int toshiba_accelerometer_get(struct toshiba_acpi_dev *dev,
 758                                     u32 *xy, u32 *z)
 759{
 760        u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER, 0, 1, 0, 0 };
 761        u32 out[TCI_WORDS];
 762        acpi_status status;
 763
 764        /* Check the Accelerometer status */
 765        status = tci_raw(dev, in, out);
 766        if (ACPI_FAILURE(status)) {
 767                pr_err("ACPI call to query the accelerometer failed\n");
 768                return -EIO;
 769        } else if (out[0] == TOS_NOT_SUPPORTED) {
 770                return -ENODEV;
 771        } else if (out[0] == TOS_SUCCESS) {
 772                *xy = out[2];
 773                *z = out[4];
 774                return 0;
 775        }
 776
 777        return -EIO;
 778}
 779
 780/* Sleep (Charge and Music) utilities support */
 781static void toshiba_usb_sleep_charge_available(struct toshiba_acpi_dev *dev)
 782{
 783        u32 in[TCI_WORDS] = { SCI_GET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 };
 784        u32 out[TCI_WORDS];
 785        acpi_status status;
 786
 787        dev->usb_sleep_charge_supported = 0;
 788
 789        if (!sci_open(dev))
 790                return;
 791
 792        status = tci_raw(dev, in, out);
 793        if (ACPI_FAILURE(status)) {
 794                pr_err("ACPI call to get USB Sleep and Charge mode failed\n");
 795                sci_close(dev);
 796                return;
 797        } else if (out[0] == TOS_NOT_SUPPORTED) {
 798                sci_close(dev);
 799                return;
 800        } else if (out[0] == TOS_SUCCESS) {
 801                dev->usbsc_mode_base = out[4];
 802        }
 803
 804        in[5] = SCI_USB_CHARGE_BAT_LVL;
 805        status = tci_raw(dev, in, out);
 806        sci_close(dev);
 807        if (ACPI_FAILURE(status)) {
 808                pr_err("ACPI call to get USB Sleep and Charge mode failed\n");
 809        } else if (out[0] == TOS_SUCCESS) {
 810                dev->usbsc_bat_level = out[2];
 811                /* Flag as supported */
 812                dev->usb_sleep_charge_supported = 1;
 813        }
 814
 815}
 816
 817static int toshiba_usb_sleep_charge_get(struct toshiba_acpi_dev *dev,
 818                                        u32 *mode)
 819{
 820        u32 result;
 821
 822        if (!sci_open(dev))
 823                return -EIO;
 824
 825        result = sci_read(dev, SCI_USB_SLEEP_CHARGE, mode);
 826        sci_close(dev);
 827        if (result == TOS_FAILURE)
 828                pr_err("ACPI call to set USB S&C mode failed\n");
 829        else if (result == TOS_NOT_SUPPORTED)
 830                return -ENODEV;
 831
 832        return result == TOS_SUCCESS ? 0 : -EIO;
 833}
 834
 835static int toshiba_usb_sleep_charge_set(struct toshiba_acpi_dev *dev,
 836                                        u32 mode)
 837{
 838        u32 result;
 839
 840        if (!sci_open(dev))
 841                return -EIO;
 842
 843        result = sci_write(dev, SCI_USB_SLEEP_CHARGE, mode);
 844        sci_close(dev);
 845        if (result == TOS_FAILURE)
 846                pr_err("ACPI call to set USB S&C mode failed\n");
 847        else if (result == TOS_NOT_SUPPORTED)
 848                return -ENODEV;
 849
 850        return result == TOS_SUCCESS ? 0 : -EIO;
 851}
 852
 853static int toshiba_sleep_functions_status_get(struct toshiba_acpi_dev *dev,
 854                                              u32 *mode)
 855{
 856        u32 in[TCI_WORDS] = { SCI_GET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 };
 857        u32 out[TCI_WORDS];
 858        acpi_status status;
 859
 860        if (!sci_open(dev))
 861                return -EIO;
 862
 863        in[5] = SCI_USB_CHARGE_BAT_LVL;
 864        status = tci_raw(dev, in, out);
 865        sci_close(dev);
 866        if (ACPI_FAILURE(status)) {
 867                pr_err("ACPI call to get USB S&C battery level failed\n");
 868        } else if (out[0] == TOS_NOT_SUPPORTED) {
 869                return -ENODEV;
 870        } else if (out[0] == TOS_SUCCESS) {
 871                *mode = out[2];
 872                return 0;
 873        }
 874
 875        return -EIO;
 876}
 877
 878static int toshiba_sleep_functions_status_set(struct toshiba_acpi_dev *dev,
 879                                              u32 mode)
 880{
 881        u32 in[TCI_WORDS] = { SCI_SET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 };
 882        u32 out[TCI_WORDS];
 883        acpi_status status;
 884
 885        if (!sci_open(dev))
 886                return -EIO;
 887
 888        in[2] = mode;
 889        in[5] = SCI_USB_CHARGE_BAT_LVL;
 890        status = tci_raw(dev, in, out);
 891        sci_close(dev);
 892        if (ACPI_FAILURE(status))
 893                pr_err("ACPI call to set USB S&C battery level failed\n");
 894        else if (out[0] == TOS_NOT_SUPPORTED)
 895                return -ENODEV;
 896
 897        return out[0] == TOS_SUCCESS ? 0 : -EIO;
 898}
 899
 900static int toshiba_usb_rapid_charge_get(struct toshiba_acpi_dev *dev,
 901                                        u32 *state)
 902{
 903        u32 in[TCI_WORDS] = { SCI_GET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 };
 904        u32 out[TCI_WORDS];
 905        acpi_status status;
 906
 907        if (!sci_open(dev))
 908                return -EIO;
 909
 910        in[5] = SCI_USB_CHARGE_RAPID_DSP;
 911        status = tci_raw(dev, in, out);
 912        sci_close(dev);
 913        if (ACPI_FAILURE(status)) {
 914                pr_err("ACPI call to get USB Rapid Charge failed\n");
 915        } else if (out[0] == TOS_NOT_SUPPORTED) {
 916                return -ENODEV;
 917        } else if (out[0] == TOS_SUCCESS || out[0] == TOS_SUCCESS2) {
 918                *state = out[2];
 919                return 0;
 920        }
 921
 922        return -EIO;
 923}
 924
 925static int toshiba_usb_rapid_charge_set(struct toshiba_acpi_dev *dev,
 926                                        u32 state)
 927{
 928        u32 in[TCI_WORDS] = { SCI_SET, SCI_USB_SLEEP_CHARGE, 0, 0, 0, 0 };
 929        u32 out[TCI_WORDS];
 930        acpi_status status;
 931
 932        if (!sci_open(dev))
 933                return -EIO;
 934
 935        in[2] = state;
 936        in[5] = SCI_USB_CHARGE_RAPID_DSP;
 937        status = tci_raw(dev, in, out);
 938        sci_close(dev);
 939        if (ACPI_FAILURE(status))
 940                pr_err("ACPI call to set USB Rapid Charge failed\n");
 941        else if (out[0] == TOS_NOT_SUPPORTED)
 942                return -ENODEV;
 943
 944        return (out[0] == TOS_SUCCESS || out[0] == TOS_SUCCESS2) ? 0 : -EIO;
 945}
 946
 947static int toshiba_usb_sleep_music_get(struct toshiba_acpi_dev *dev, u32 *state)
 948{
 949        u32 result;
 950
 951        if (!sci_open(dev))
 952                return -EIO;
 953
 954        result = sci_read(dev, SCI_USB_SLEEP_MUSIC, state);
 955        sci_close(dev);
 956        if (result == TOS_FAILURE)
 957                pr_err("ACPI call to get Sleep and Music failed\n");
 958        else if (result == TOS_NOT_SUPPORTED)
 959                return -ENODEV;
 960
 961        return result == TOS_SUCCESS ? 0 : -EIO;
 962}
 963
 964static int toshiba_usb_sleep_music_set(struct toshiba_acpi_dev *dev, u32 state)
 965{
 966        u32 result;
 967
 968        if (!sci_open(dev))
 969                return -EIO;
 970
 971        result = sci_write(dev, SCI_USB_SLEEP_MUSIC, state);
 972        sci_close(dev);
 973        if (result == TOS_FAILURE)
 974                pr_err("ACPI call to set Sleep and Music failed\n");
 975        else if (result == TOS_NOT_SUPPORTED)
 976                return -ENODEV;
 977
 978        return result == TOS_SUCCESS ? 0 : -EIO;
 979}
 980
 981/* Keyboard function keys */
 982static int toshiba_function_keys_get(struct toshiba_acpi_dev *dev, u32 *mode)
 983{
 984        u32 result;
 985
 986        if (!sci_open(dev))
 987                return -EIO;
 988
 989        result = sci_read(dev, SCI_KBD_FUNCTION_KEYS, mode);
 990        sci_close(dev);
 991        if (result == TOS_FAILURE)
 992                pr_err("ACPI call to get KBD function keys failed\n");
 993        else if (result == TOS_NOT_SUPPORTED)
 994                return -ENODEV;
 995
 996        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
 997}
 998
 999static int toshiba_function_keys_set(struct toshiba_acpi_dev *dev, u32 mode)
1000{
1001        u32 result;
1002
1003        if (!sci_open(dev))
1004                return -EIO;
1005
1006        result = sci_write(dev, SCI_KBD_FUNCTION_KEYS, mode);
1007        sci_close(dev);
1008        if (result == TOS_FAILURE)
1009                pr_err("ACPI call to set KBD function keys failed\n");
1010        else if (result == TOS_NOT_SUPPORTED)
1011                return -ENODEV;
1012
1013        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
1014}
1015
1016/* Panel Power ON */
1017static int toshiba_panel_power_on_get(struct toshiba_acpi_dev *dev, u32 *state)
1018{
1019        u32 result;
1020
1021        if (!sci_open(dev))
1022                return -EIO;
1023
1024        result = sci_read(dev, SCI_PANEL_POWER_ON, state);
1025        sci_close(dev);
1026        if (result == TOS_FAILURE)
1027                pr_err("ACPI call to get Panel Power ON failed\n");
1028        else if (result == TOS_NOT_SUPPORTED)
1029                return -ENODEV;
1030
1031        return result == TOS_SUCCESS ? 0 : -EIO;
1032}
1033
1034static int toshiba_panel_power_on_set(struct toshiba_acpi_dev *dev, u32 state)
1035{
1036        u32 result;
1037
1038        if (!sci_open(dev))
1039                return -EIO;
1040
1041        result = sci_write(dev, SCI_PANEL_POWER_ON, state);
1042        sci_close(dev);
1043        if (result == TOS_FAILURE)
1044                pr_err("ACPI call to set Panel Power ON failed\n");
1045        else if (result == TOS_NOT_SUPPORTED)
1046                return -ENODEV;
1047
1048        return result == TOS_SUCCESS ? 0 : -EIO;
1049}
1050
1051/* USB Three */
1052static int toshiba_usb_three_get(struct toshiba_acpi_dev *dev, u32 *state)
1053{
1054        u32 result;
1055
1056        if (!sci_open(dev))
1057                return -EIO;
1058
1059        result = sci_read(dev, SCI_USB_THREE, state);
1060        sci_close(dev);
1061        if (result == TOS_FAILURE)
1062                pr_err("ACPI call to get USB 3 failed\n");
1063        else if (result == TOS_NOT_SUPPORTED)
1064                return -ENODEV;
1065
1066        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
1067}
1068
1069static int toshiba_usb_three_set(struct toshiba_acpi_dev *dev, u32 state)
1070{
1071        u32 result;
1072
1073        if (!sci_open(dev))
1074                return -EIO;
1075
1076        result = sci_write(dev, SCI_USB_THREE, state);
1077        sci_close(dev);
1078        if (result == TOS_FAILURE)
1079                pr_err("ACPI call to set USB 3 failed\n");
1080        else if (result == TOS_NOT_SUPPORTED)
1081                return -ENODEV;
1082
1083        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
1084}
1085
1086/* Hotkey Event type */
1087static int toshiba_hotkey_event_type_get(struct toshiba_acpi_dev *dev,
1088                                         u32 *type)
1089{
1090        u32 in[TCI_WORDS] = { HCI_GET, HCI_SYSTEM_INFO, 0x03, 0, 0, 0 };
1091        u32 out[TCI_WORDS];
1092        acpi_status status;
1093
1094        status = tci_raw(dev, in, out);
1095        if (ACPI_FAILURE(status)) {
1096                pr_err("ACPI call to get System type failed\n");
1097        } else if (out[0] == TOS_NOT_SUPPORTED) {
1098                return -ENODEV;
1099        } else if (out[0] == TOS_SUCCESS) {
1100                *type = out[3];
1101                return 0;
1102        }
1103
1104        return -EIO;
1105}
1106
1107/* Wireless status (RFKill, WLAN, BT, WWAN) */
1108static int toshiba_wireless_status(struct toshiba_acpi_dev *dev)
1109{
1110        u32 in[TCI_WORDS] = { HCI_GET, HCI_WIRELESS, 0, 0, 0, 0 };
1111        u32 out[TCI_WORDS];
1112        acpi_status status;
1113
1114        in[3] = HCI_WIRELESS_STATUS;
1115        status = tci_raw(dev, in, out);
1116
1117        if (ACPI_FAILURE(status)) {
1118                pr_err("ACPI call to get Wireless status failed\n");
1119                return -EIO;
1120        }
1121
1122        if (out[0] == TOS_NOT_SUPPORTED)
1123                return -ENODEV;
1124
1125        if (out[0] != TOS_SUCCESS)
1126                return -EIO;
1127
1128        dev->killswitch = !!(out[2] & HCI_WIRELESS_STATUS);
1129
1130        return 0;
1131}
1132
1133/* WWAN */
1134static void toshiba_wwan_available(struct toshiba_acpi_dev *dev)
1135{
1136        u32 in[TCI_WORDS] = { HCI_GET, HCI_WIRELESS, 0, 0, 0, 0 };
1137        u32 out[TCI_WORDS];
1138        acpi_status status;
1139
1140        dev->wwan_supported = 0;
1141
1142        /*
1143         * WWAN support can be queried by setting the in[3] value to
1144         * HCI_WIRELESS_WWAN (0x03).
1145         *
1146         * If supported, out[0] contains TOS_SUCCESS and out[2] contains
1147         * HCI_WIRELESS_WWAN_STATUS (0x2000).
1148         *
1149         * If not supported, out[0] contains TOS_INPUT_DATA_ERROR (0x8300)
1150         * or TOS_NOT_SUPPORTED (0x8000).
1151         */
1152        in[3] = HCI_WIRELESS_WWAN;
1153        status = tci_raw(dev, in, out);
1154
1155        if (ACPI_FAILURE(status)) {
1156                pr_err("ACPI call to get WWAN status failed\n");
1157                return;
1158        }
1159
1160        if (out[0] != TOS_SUCCESS)
1161                return;
1162
1163        dev->wwan_supported = (out[2] == HCI_WIRELESS_WWAN_STATUS);
1164}
1165
1166static int toshiba_wwan_set(struct toshiba_acpi_dev *dev, u32 state)
1167{
1168        u32 in[TCI_WORDS] = { HCI_SET, HCI_WIRELESS, state, 0, 0, 0 };
1169        u32 out[TCI_WORDS];
1170        acpi_status status;
1171
1172        in[3] = HCI_WIRELESS_WWAN_STATUS;
1173        status = tci_raw(dev, in, out);
1174
1175        if (ACPI_FAILURE(status)) {
1176                pr_err("ACPI call to set WWAN status failed\n");
1177                return -EIO;
1178        }
1179
1180        if (out[0] == TOS_NOT_SUPPORTED)
1181                return -ENODEV;
1182
1183        if (out[0] != TOS_SUCCESS)
1184                return -EIO;
1185
1186        /*
1187         * Some devices only need to call HCI_WIRELESS_WWAN_STATUS to
1188         * (de)activate the device, but some others need the
1189         * HCI_WIRELESS_WWAN_POWER call as well.
1190         */
1191        in[3] = HCI_WIRELESS_WWAN_POWER;
1192        status = tci_raw(dev, in, out);
1193
1194        if (ACPI_FAILURE(status)) {
1195                pr_err("ACPI call to set WWAN power failed\n");
1196                return -EIO;
1197        }
1198
1199        if (out[0] == TOS_NOT_SUPPORTED)
1200                return -ENODEV;
1201
1202        return out[0] == TOS_SUCCESS ? 0 : -EIO;
1203}
1204
1205/* Cooling Method */
1206static void toshiba_cooling_method_available(struct toshiba_acpi_dev *dev)
1207{
1208        u32 in[TCI_WORDS] = { HCI_GET, HCI_COOLING_METHOD, 0, 0, 0, 0 };
1209        u32 out[TCI_WORDS];
1210        acpi_status status;
1211
1212        dev->cooling_method_supported = 0;
1213        dev->max_cooling_method = 0;
1214
1215        status = tci_raw(dev, in, out);
1216        if (ACPI_FAILURE(status))
1217                pr_err("ACPI call to get Cooling Method failed\n");
1218
1219        if (out[0] != TOS_SUCCESS && out[0] != TOS_SUCCESS2)
1220                return;
1221
1222        dev->cooling_method_supported = 1;
1223        dev->max_cooling_method = out[3];
1224}
1225
1226static int toshiba_cooling_method_get(struct toshiba_acpi_dev *dev, u32 *state)
1227{
1228        u32 result = hci_read(dev, HCI_COOLING_METHOD, state);
1229
1230        if (result == TOS_FAILURE)
1231                pr_err("ACPI call to get Cooling Method failed\n");
1232
1233        if (result == TOS_NOT_SUPPORTED)
1234                return -ENODEV;
1235
1236        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
1237}
1238
1239static int toshiba_cooling_method_set(struct toshiba_acpi_dev *dev, u32 state)
1240{
1241        u32 result = hci_write(dev, HCI_COOLING_METHOD, state);
1242
1243        if (result == TOS_FAILURE)
1244                pr_err("ACPI call to get Cooling Method failed\n");
1245
1246        if (result == TOS_NOT_SUPPORTED)
1247                return -ENODEV;
1248
1249        return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO;
1250}
1251
1252/* Transflective Backlight */
1253static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status)
1254{
1255        u32 result = hci_read(dev, HCI_TR_BACKLIGHT, status);
1256
1257        if (result == TOS_FAILURE)
1258                pr_err("ACPI call to get Transflective Backlight failed\n");
1259        else if (result == TOS_NOT_SUPPORTED)
1260                return -ENODEV;
1261
1262        return result == TOS_SUCCESS ? 0 : -EIO;
1263}
1264
1265static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 status)
1266{
1267        u32 result = hci_write(dev, HCI_TR_BACKLIGHT, !status);
1268
1269        if (result == TOS_FAILURE)
1270                pr_err("ACPI call to set Transflective Backlight failed\n");
1271        else if (result == TOS_NOT_SUPPORTED)
1272                return -ENODEV;
1273
1274        return result == TOS_SUCCESS ? 0 : -EIO;
1275}
1276
1277static struct proc_dir_entry *toshiba_proc_dir;
1278
1279/* LCD Brightness */
1280static int __get_lcd_brightness(struct toshiba_acpi_dev *dev)
1281{
1282        u32 result;
1283        u32 value;
1284        int brightness = 0;
1285
1286        if (dev->tr_backlight_supported) {
1287                int ret = get_tr_backlight_status(dev, &value);
1288
1289                if (ret)
1290                        return ret;
1291                if (value)
1292                        return 0;
1293                brightness++;
1294        }
1295
1296        result = hci_read(dev, HCI_LCD_BRIGHTNESS, &value);
1297        if (result == TOS_FAILURE)
1298                pr_err("ACPI call to get LCD Brightness failed\n");
1299        else if (result == TOS_NOT_SUPPORTED)
1300                return -ENODEV;
1301        if (result == TOS_SUCCESS)
1302                return brightness + (value >> HCI_LCD_BRIGHTNESS_SHIFT);
1303
1304        return -EIO;
1305}
1306
1307static int get_lcd_brightness(struct backlight_device *bd)
1308{
1309        struct toshiba_acpi_dev *dev = bl_get_data(bd);
1310
1311        return __get_lcd_brightness(dev);
1312}
1313
1314static int lcd_proc_show(struct seq_file *m, void *v)
1315{
1316        struct toshiba_acpi_dev *dev = m->private;
1317        int levels;
1318        int value;
1319
1320        if (!dev->backlight_dev)
1321                return -ENODEV;
1322
1323        levels = dev->backlight_dev->props.max_brightness + 1;
1324        value = get_lcd_brightness(dev->backlight_dev);
1325        if (value >= 0) {
1326                seq_printf(m, "brightness:              %d\n", value);
1327                seq_printf(m, "brightness_levels:       %d\n", levels);
1328                return 0;
1329        }
1330
1331        pr_err("Error reading LCD brightness\n");
1332
1333        return -EIO;
1334}
1335
1336static int lcd_proc_open(struct inode *inode, struct file *file)
1337{
1338        return single_open(file, lcd_proc_show, PDE_DATA(inode));
1339}
1340
1341static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
1342{
1343        u32 result;
1344
1345        if (dev->tr_backlight_supported) {
1346                int ret = set_tr_backlight_status(dev, !value);
1347
1348                if (ret)
1349                        return ret;
1350                if (value)
1351                        value--;
1352        }
1353
1354        value = value << HCI_LCD_BRIGHTNESS_SHIFT;
1355        result = hci_write(dev, HCI_LCD_BRIGHTNESS, value);
1356        if (result == TOS_FAILURE)
1357                pr_err("ACPI call to set LCD Brightness failed\n");
1358        else if (result == TOS_NOT_SUPPORTED)
1359                return -ENODEV;
1360
1361        return result == TOS_SUCCESS ? 0 : -EIO;
1362}
1363
1364static int set_lcd_status(struct backlight_device *bd)
1365{
1366        struct toshiba_acpi_dev *dev = bl_get_data(bd);
1367
1368        return set_lcd_brightness(dev, bd->props.brightness);
1369}
1370
1371static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
1372                              size_t count, loff_t *pos)
1373{
1374        struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
1375        char cmd[42];
1376        size_t len;
1377        int levels = dev->backlight_dev->props.max_brightness + 1;
1378        int value;
1379
1380        len = min(count, sizeof(cmd) - 1);
1381        if (copy_from_user(cmd, buf, len))
1382                return -EFAULT;
1383        cmd[len] = '\0';
1384
1385        if (sscanf(cmd, " brightness : %i", &value) != 1 &&
1386            value < 0 && value > levels)
1387                return -EINVAL;
1388
1389        if (set_lcd_brightness(dev, value))
1390                return -EIO;
1391
1392        return count;
1393}
1394
1395static const struct file_operations lcd_proc_fops = {
1396        .owner          = THIS_MODULE,
1397        .open           = lcd_proc_open,
1398        .read           = seq_read,
1399        .llseek         = seq_lseek,
1400        .release        = single_release,
1401        .write          = lcd_proc_write,
1402};
1403
1404/* Video-Out */
1405static int get_video_status(struct toshiba_acpi_dev *dev, u32 *status)
1406{
1407        u32 result = hci_read(dev, HCI_VIDEO_OUT, status);
1408
1409        if (result == TOS_FAILURE)
1410                pr_err("ACPI call to get Video-Out failed\n");
1411        else if (result == TOS_NOT_SUPPORTED)
1412                return -ENODEV;
1413
1414        return result == TOS_SUCCESS ? 0 : -EIO;
1415}
1416
1417static int video_proc_show(struct seq_file *m, void *v)
1418{
1419        struct toshiba_acpi_dev *dev = m->private;
1420        u32 value;
1421
1422        if (!get_video_status(dev, &value)) {
1423                int is_lcd = (value & HCI_VIDEO_OUT_LCD) ? 1 : 0;
1424                int is_crt = (value & HCI_VIDEO_OUT_CRT) ? 1 : 0;
1425                int is_tv = (value & HCI_VIDEO_OUT_TV) ? 1 : 0;
1426
1427                seq_printf(m, "lcd_out:                 %d\n", is_lcd);
1428                seq_printf(m, "crt_out:                 %d\n", is_crt);
1429                seq_printf(m, "tv_out:                  %d\n", is_tv);
1430                return 0;
1431        }
1432
1433        return -EIO;
1434}
1435
1436static int video_proc_open(struct inode *inode, struct file *file)
1437{
1438        return single_open(file, video_proc_show, PDE_DATA(inode));
1439}
1440
1441static ssize_t video_proc_write(struct file *file, const char __user *buf,
1442                                size_t count, loff_t *pos)
1443{
1444        struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
1445        char *buffer;
1446        char *cmd;
1447        int remain = count;
1448        int lcd_out = -1;
1449        int crt_out = -1;
1450        int tv_out = -1;
1451        int value;
1452        int ret;
1453        u32 video_out;
1454
1455        cmd = kmalloc(count + 1, GFP_KERNEL);
1456        if (!cmd)
1457                return -ENOMEM;
1458        if (copy_from_user(cmd, buf, count)) {
1459                kfree(cmd);
1460                return -EFAULT;
1461        }
1462        cmd[count] = '\0';
1463
1464        buffer = cmd;
1465
1466        /*
1467         * Scan expression.  Multiple expressions may be delimited with ;
1468         * NOTE: To keep scanning simple, invalid fields are ignored.
1469         */
1470        while (remain) {
1471                if (sscanf(buffer, " lcd_out : %i", &value) == 1)
1472                        lcd_out = value & 1;
1473                else if (sscanf(buffer, " crt_out : %i", &value) == 1)
1474                        crt_out = value & 1;
1475                else if (sscanf(buffer, " tv_out : %i", &value) == 1)
1476                        tv_out = value & 1;
1477                /* Advance to one character past the next ; */
1478                do {
1479                        ++buffer;
1480                        --remain;
1481                } while (remain && *(buffer - 1) != ';');
1482        }
1483
1484        kfree(cmd);
1485
1486        ret = get_video_status(dev, &video_out);
1487        if (!ret) {
1488                unsigned int new_video_out = video_out;
1489
1490                if (lcd_out != -1)
1491                        _set_bit(&new_video_out, HCI_VIDEO_OUT_LCD, lcd_out);
1492                if (crt_out != -1)
1493                        _set_bit(&new_video_out, HCI_VIDEO_OUT_CRT, crt_out);
1494                if (tv_out != -1)
1495                        _set_bit(&new_video_out, HCI_VIDEO_OUT_TV, tv_out);
1496                /*
1497                 * To avoid unnecessary video disruption, only write the new
1498                 * video setting if something changed.
1499                 */
1500                if (new_video_out != video_out)
1501                        ret = write_acpi_int(METHOD_VIDEO_OUT, new_video_out);
1502        }
1503
1504        return ret ? -EIO : count;
1505}
1506
1507static const struct file_operations video_proc_fops = {
1508        .owner          = THIS_MODULE,
1509        .open           = video_proc_open,
1510        .read           = seq_read,
1511        .llseek         = seq_lseek,
1512        .release        = single_release,
1513        .write          = video_proc_write,
1514};
1515
1516/* Fan status */
1517static int get_fan_status(struct toshiba_acpi_dev *dev, u32 *status)
1518{
1519        u32 result = hci_read(dev, HCI_FAN, status);
1520
1521        if (result == TOS_FAILURE)
1522                pr_err("ACPI call to get Fan status failed\n");
1523        else if (result == TOS_NOT_SUPPORTED)
1524                return -ENODEV;
1525
1526        return result == TOS_SUCCESS ? 0 : -EIO;
1527}
1528
1529static int set_fan_status(struct toshiba_acpi_dev *dev, u32 status)
1530{
1531        u32 result = hci_write(dev, HCI_FAN, status);
1532
1533        if (result == TOS_FAILURE)
1534                pr_err("ACPI call to set Fan status failed\n");
1535        else if (result == TOS_NOT_SUPPORTED)
1536                return -ENODEV;
1537
1538        return result == TOS_SUCCESS ? 0 : -EIO;
1539}
1540
1541static int fan_proc_show(struct seq_file *m, void *v)
1542{
1543        struct toshiba_acpi_dev *dev = m->private;
1544        u32 value;
1545
1546        if (get_fan_status(dev, &value))
1547                return -EIO;
1548
1549        seq_printf(m, "running:                 %d\n", (value > 0));
1550        seq_printf(m, "force_on:                %d\n", dev->force_fan);
1551
1552        return 0;
1553}
1554
1555static int fan_proc_open(struct inode *inode, struct file *file)
1556{
1557        return single_open(file, fan_proc_show, PDE_DATA(inode));
1558}
1559
1560static ssize_t fan_proc_write(struct file *file, const char __user *buf,
1561                              size_t count, loff_t *pos)
1562{
1563        struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
1564        char cmd[42];
1565        size_t len;
1566        int value;
1567
1568        len = min(count, sizeof(cmd) - 1);
1569        if (copy_from_user(cmd, buf, len))
1570                return -EFAULT;
1571        cmd[len] = '\0';
1572
1573        if (sscanf(cmd, " force_on : %i", &value) != 1 &&
1574            value != 0 && value != 1)
1575                return -EINVAL;
1576
1577        if (set_fan_status(dev, value))
1578                return -EIO;
1579
1580        dev->force_fan = value;
1581
1582        return count;
1583}
1584
1585static const struct file_operations fan_proc_fops = {
1586        .owner          = THIS_MODULE,
1587        .open           = fan_proc_open,
1588        .read           = seq_read,
1589        .llseek         = seq_lseek,
1590        .release        = single_release,
1591        .write          = fan_proc_write,
1592};
1593
1594static int keys_proc_show(struct seq_file *m, void *v)
1595{
1596        struct toshiba_acpi_dev *dev = m->private;
1597
1598        seq_printf(m, "hotkey_ready:            %d\n", dev->key_event_valid);
1599        seq_printf(m, "hotkey:                  0x%04x\n", dev->last_key_event);
1600
1601        return 0;
1602}
1603
1604static int keys_proc_open(struct inode *inode, struct file *file)
1605{
1606        return single_open(file, keys_proc_show, PDE_DATA(inode));
1607}
1608
1609static ssize_t keys_proc_write(struct file *file, const char __user *buf,
1610                               size_t count, loff_t *pos)
1611{
1612        struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
1613        char cmd[42];
1614        size_t len;
1615        int value;
1616
1617        len = min(count, sizeof(cmd) - 1);
1618        if (copy_from_user(cmd, buf, len))
1619                return -EFAULT;
1620        cmd[len] = '\0';
1621
1622        if (sscanf(cmd, " hotkey_ready : %i", &value) == 1 && value == 0)
1623                dev->key_event_valid = 0;
1624        else
1625                return -EINVAL;
1626
1627        return count;
1628}
1629
1630static const struct file_operations keys_proc_fops = {
1631        .owner          = THIS_MODULE,
1632        .open           = keys_proc_open,
1633        .read           = seq_read,
1634        .llseek         = seq_lseek,
1635        .release        = single_release,
1636        .write          = keys_proc_write,
1637};
1638
1639static int version_proc_show(struct seq_file *m, void *v)
1640{
1641        seq_printf(m, "driver:                  %s\n", TOSHIBA_ACPI_VERSION);
1642        seq_printf(m, "proc_interface:          %d\n", PROC_INTERFACE_VERSION);
1643        return 0;
1644}
1645
1646static int version_proc_open(struct inode *inode, struct file *file)
1647{
1648        return single_open(file, version_proc_show, PDE_DATA(inode));
1649}
1650
1651static const struct file_operations version_proc_fops = {
1652        .owner          = THIS_MODULE,
1653        .open           = version_proc_open,
1654        .read           = seq_read,
1655        .llseek         = seq_lseek,
1656        .release        = single_release,
1657};
1658
1659/*
1660 * Proc and module init
1661 */
1662
1663#define PROC_TOSHIBA            "toshiba"
1664
1665static void create_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
1666{
1667        if (dev->backlight_dev)
1668                proc_create_data("lcd", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1669                                 &lcd_proc_fops, dev);
1670        if (dev->video_supported)
1671                proc_create_data("video", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1672                                 &video_proc_fops, dev);
1673        if (dev->fan_supported)
1674                proc_create_data("fan", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1675                                 &fan_proc_fops, dev);
1676        if (dev->hotkey_dev)
1677                proc_create_data("keys", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1678                                 &keys_proc_fops, dev);
1679        proc_create_data("version", S_IRUGO, toshiba_proc_dir,
1680                         &version_proc_fops, dev);
1681}
1682
1683static void remove_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
1684{
1685        if (dev->backlight_dev)
1686                remove_proc_entry("lcd", toshiba_proc_dir);
1687        if (dev->video_supported)
1688                remove_proc_entry("video", toshiba_proc_dir);
1689        if (dev->fan_supported)
1690                remove_proc_entry("fan", toshiba_proc_dir);
1691        if (dev->hotkey_dev)
1692                remove_proc_entry("keys", toshiba_proc_dir);
1693        remove_proc_entry("version", toshiba_proc_dir);
1694}
1695
1696static const struct backlight_ops toshiba_backlight_data = {
1697        .options = BL_CORE_SUSPENDRESUME,
1698        .get_brightness = get_lcd_brightness,
1699        .update_status  = set_lcd_status,
1700};
1701
1702/* Keyboard backlight work */
1703static void toshiba_acpi_kbd_bl_work(struct work_struct *work);
1704
1705static DECLARE_WORK(kbd_bl_work, toshiba_acpi_kbd_bl_work);
1706
1707/*
1708 * Sysfs files
1709 */
1710static ssize_t version_show(struct device *dev,
1711                            struct device_attribute *attr, char *buf)
1712{
1713        return sprintf(buf, "%s\n", TOSHIBA_ACPI_VERSION);
1714}
1715static DEVICE_ATTR_RO(version);
1716
1717static ssize_t fan_store(struct device *dev,
1718                         struct device_attribute *attr,
1719                         const char *buf, size_t count)
1720{
1721        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1722        int state;
1723        int ret;
1724
1725        ret = kstrtoint(buf, 0, &state);
1726        if (ret)
1727                return ret;
1728
1729        if (state != 0 && state != 1)
1730                return -EINVAL;
1731
1732        ret = set_fan_status(toshiba, state);
1733        if (ret)
1734                return ret;
1735
1736        return count;
1737}
1738
1739static ssize_t fan_show(struct device *dev,
1740                        struct device_attribute *attr, char *buf)
1741{
1742        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1743        u32 value;
1744        int ret;
1745
1746        ret = get_fan_status(toshiba, &value);
1747        if (ret)
1748                return ret;
1749
1750        return sprintf(buf, "%d\n", value);
1751}
1752static DEVICE_ATTR_RW(fan);
1753
1754static ssize_t kbd_backlight_mode_store(struct device *dev,
1755                                        struct device_attribute *attr,
1756                                        const char *buf, size_t count)
1757{
1758        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1759        int mode;
1760        int ret;
1761
1762
1763        ret = kstrtoint(buf, 0, &mode);
1764        if (ret)
1765                return ret;
1766
1767        /* Check for supported modes depending on keyboard backlight type */
1768        if (toshiba->kbd_type == 1) {
1769                /* Type 1 supports SCI_KBD_MODE_FNZ and SCI_KBD_MODE_AUTO */
1770                if (mode != SCI_KBD_MODE_FNZ && mode != SCI_KBD_MODE_AUTO)
1771                        return -EINVAL;
1772        } else if (toshiba->kbd_type == 2) {
1773                /* Type 2 doesn't support SCI_KBD_MODE_FNZ */
1774                if (mode != SCI_KBD_MODE_AUTO && mode != SCI_KBD_MODE_ON &&
1775                    mode != SCI_KBD_MODE_OFF)
1776                        return -EINVAL;
1777        }
1778
1779        /*
1780         * Set the Keyboard Backlight Mode where:
1781         *      Auto - KBD backlight turns off automatically in given time
1782         *      FN-Z - KBD backlight "toggles" when hotkey pressed
1783         *      ON   - KBD backlight is always on
1784         *      OFF  - KBD backlight is always off
1785         */
1786
1787        /* Only make a change if the actual mode has changed */
1788        if (toshiba->kbd_mode != mode) {
1789                /* Shift the time to "base time" (0x3c0000 == 60 seconds) */
1790                int time = toshiba->kbd_time << HCI_MISC_SHIFT;
1791
1792                /* OR the "base time" to the actual method format */
1793                if (toshiba->kbd_type == 1) {
1794                        /* Type 1 requires the current mode */
1795                        time |= toshiba->kbd_mode;
1796                } else if (toshiba->kbd_type == 2) {
1797                        /* Type 2 requires the desired mode */
1798                        time |= mode;
1799                }
1800
1801                ret = toshiba_kbd_illum_status_set(toshiba, time);
1802                if (ret)
1803                        return ret;
1804
1805                toshiba->kbd_mode = mode;
1806
1807                /*
1808                 * Some laptop models with the second generation backlit
1809                 * keyboard (type 2) do not generate the keyboard backlight
1810                 * changed event (0x92), and thus, the driver will never update
1811                 * the sysfs entries.
1812                 *
1813                 * The event is generated right when changing the keyboard
1814                 * backlight mode and the *notify function will set the
1815                 * kbd_event_generated to true.
1816                 *
1817                 * In case the event is not generated, schedule the keyboard
1818                 * backlight work to update the sysfs entries and emulate the
1819                 * event via genetlink.
1820                 */
1821                if (toshiba->kbd_type == 2 &&
1822                    !toshiba_acpi->kbd_event_generated)
1823                        schedule_work(&kbd_bl_work);
1824        }
1825
1826        return count;
1827}
1828
1829static ssize_t kbd_backlight_mode_show(struct device *dev,
1830                                       struct device_attribute *attr,
1831                                       char *buf)
1832{
1833        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1834        u32 time;
1835
1836        if (toshiba_kbd_illum_status_get(toshiba, &time) < 0)
1837                return -EIO;
1838
1839        return sprintf(buf, "%i\n", time & SCI_KBD_MODE_MASK);
1840}
1841static DEVICE_ATTR_RW(kbd_backlight_mode);
1842
1843static ssize_t kbd_type_show(struct device *dev,
1844                             struct device_attribute *attr, char *buf)
1845{
1846        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1847
1848        return sprintf(buf, "%d\n", toshiba->kbd_type);
1849}
1850static DEVICE_ATTR_RO(kbd_type);
1851
1852static ssize_t available_kbd_modes_show(struct device *dev,
1853                                        struct device_attribute *attr,
1854                                        char *buf)
1855{
1856        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1857
1858        if (toshiba->kbd_type == 1)
1859                return sprintf(buf, "0x%x 0x%x\n",
1860                               SCI_KBD_MODE_FNZ, SCI_KBD_MODE_AUTO);
1861
1862        return sprintf(buf, "0x%x 0x%x 0x%x\n",
1863                       SCI_KBD_MODE_AUTO, SCI_KBD_MODE_ON, SCI_KBD_MODE_OFF);
1864}
1865static DEVICE_ATTR_RO(available_kbd_modes);
1866
1867static ssize_t kbd_backlight_timeout_store(struct device *dev,
1868                                           struct device_attribute *attr,
1869                                           const char *buf, size_t count)
1870{
1871        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1872        int time;
1873        int ret;
1874
1875        ret = kstrtoint(buf, 0, &time);
1876        if (ret)
1877                return ret;
1878
1879        /* Check for supported values depending on kbd_type */
1880        if (toshiba->kbd_type == 1) {
1881                if (time < 0 || time > 60)
1882                        return -EINVAL;
1883        } else if (toshiba->kbd_type == 2) {
1884                if (time < 1 || time > 60)
1885                        return -EINVAL;
1886        }
1887
1888        /* Set the Keyboard Backlight Timeout */
1889
1890        /* Only make a change if the actual timeout has changed */
1891        if (toshiba->kbd_time != time) {
1892                /* Shift the time to "base time" (0x3c0000 == 60 seconds) */
1893                time = time << HCI_MISC_SHIFT;
1894                /* OR the "base time" to the actual method format */
1895                if (toshiba->kbd_type == 1)
1896                        time |= SCI_KBD_MODE_FNZ;
1897                else if (toshiba->kbd_type == 2)
1898                        time |= SCI_KBD_MODE_AUTO;
1899
1900                ret = toshiba_kbd_illum_status_set(toshiba, time);
1901                if (ret)
1902                        return ret;
1903
1904                toshiba->kbd_time = time >> HCI_MISC_SHIFT;
1905        }
1906
1907        return count;
1908}
1909
1910static ssize_t kbd_backlight_timeout_show(struct device *dev,
1911                                          struct device_attribute *attr,
1912                                          char *buf)
1913{
1914        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1915        u32 time;
1916
1917        if (toshiba_kbd_illum_status_get(toshiba, &time) < 0)
1918                return -EIO;
1919
1920        return sprintf(buf, "%i\n", time >> HCI_MISC_SHIFT);
1921}
1922static DEVICE_ATTR_RW(kbd_backlight_timeout);
1923
1924static ssize_t touchpad_store(struct device *dev,
1925                              struct device_attribute *attr,
1926                              const char *buf, size_t count)
1927{
1928        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1929        int state;
1930        int ret;
1931
1932        /* Set the TouchPad on/off, 0 - Disable | 1 - Enable */
1933        ret = kstrtoint(buf, 0, &state);
1934        if (ret)
1935                return ret;
1936        if (state != 0 && state != 1)
1937                return -EINVAL;
1938
1939        ret = toshiba_touchpad_set(toshiba, state);
1940        if (ret)
1941                return ret;
1942
1943        return count;
1944}
1945
1946static ssize_t touchpad_show(struct device *dev,
1947                             struct device_attribute *attr, char *buf)
1948{
1949        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1950        u32 state;
1951        int ret;
1952
1953        ret = toshiba_touchpad_get(toshiba, &state);
1954        if (ret < 0)
1955                return ret;
1956
1957        return sprintf(buf, "%i\n", state);
1958}
1959static DEVICE_ATTR_RW(touchpad);
1960
1961static ssize_t position_show(struct device *dev,
1962                             struct device_attribute *attr, char *buf)
1963{
1964        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1965        u32 xyval, zval, tmp;
1966        u16 x, y, z;
1967        int ret;
1968
1969        xyval = zval = 0;
1970        ret = toshiba_accelerometer_get(toshiba, &xyval, &zval);
1971        if (ret < 0)
1972                return ret;
1973
1974        x = xyval & HCI_ACCEL_MASK;
1975        tmp = xyval >> HCI_MISC_SHIFT;
1976        y = tmp & HCI_ACCEL_MASK;
1977        z = zval & HCI_ACCEL_MASK;
1978
1979        return sprintf(buf, "%d %d %d\n", x, y, z);
1980}
1981static DEVICE_ATTR_RO(position);
1982
1983static ssize_t usb_sleep_charge_show(struct device *dev,
1984                                     struct device_attribute *attr, char *buf)
1985{
1986        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1987        u32 mode;
1988        int ret;
1989
1990        ret = toshiba_usb_sleep_charge_get(toshiba, &mode);
1991        if (ret < 0)
1992                return ret;
1993
1994        return sprintf(buf, "%x\n", mode & SCI_USB_CHARGE_MODE_MASK);
1995}
1996
1997static ssize_t usb_sleep_charge_store(struct device *dev,
1998                                      struct device_attribute *attr,
1999                                      const char *buf, size_t count)
2000{
2001        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2002        u32 mode;
2003        int state;
2004        int ret;
2005
2006        ret = kstrtoint(buf, 0, &state);
2007        if (ret)
2008                return ret;
2009        /*
2010         * Check for supported values, where:
2011         * 0 - Disabled
2012         * 1 - Alternate (Non USB conformant devices that require more power)
2013         * 2 - Auto (USB conformant devices)
2014         * 3 - Typical
2015         */
2016        if (state != 0 && state != 1 && state != 2 && state != 3)
2017                return -EINVAL;
2018
2019        /* Set the USB charging mode to internal value */
2020        mode = toshiba->usbsc_mode_base;
2021        if (state == 0)
2022                mode |= SCI_USB_CHARGE_DISABLED;
2023        else if (state == 1)
2024                mode |= SCI_USB_CHARGE_ALTERNATE;
2025        else if (state == 2)
2026                mode |= SCI_USB_CHARGE_AUTO;
2027        else if (state == 3)
2028                mode |= SCI_USB_CHARGE_TYPICAL;
2029
2030        ret = toshiba_usb_sleep_charge_set(toshiba, mode);
2031        if (ret)
2032                return ret;
2033
2034        return count;
2035}
2036static DEVICE_ATTR_RW(usb_sleep_charge);
2037
2038static ssize_t sleep_functions_on_battery_show(struct device *dev,
2039                                               struct device_attribute *attr,
2040                                               char *buf)
2041{
2042        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2043        u32 state;
2044        int bat_lvl;
2045        int status;
2046        int ret;
2047        int tmp;
2048
2049        ret = toshiba_sleep_functions_status_get(toshiba, &state);
2050        if (ret < 0)
2051                return ret;
2052
2053        /* Determine the status: 0x4 - Enabled | 0x1 - Disabled */
2054        tmp = state & SCI_USB_CHARGE_BAT_MASK;
2055        status = (tmp == 0x4) ? 1 : 0;
2056        /* Determine the battery level set */
2057        bat_lvl = state >> HCI_MISC_SHIFT;
2058
2059        return sprintf(buf, "%d %d\n", status, bat_lvl);
2060}
2061
2062static ssize_t sleep_functions_on_battery_store(struct device *dev,
2063                                                struct device_attribute *attr,
2064                                                const char *buf, size_t count)
2065{
2066        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2067        u32 status;
2068        int value;
2069        int ret;
2070        int tmp;
2071
2072        ret = kstrtoint(buf, 0, &value);
2073        if (ret)
2074                return ret;
2075
2076        /*
2077         * Set the status of the function:
2078         * 0 - Disabled
2079         * 1-100 - Enabled
2080         */
2081        if (value < 0 || value > 100)
2082                return -EINVAL;
2083
2084        if (value == 0) {
2085                tmp = toshiba->usbsc_bat_level << HCI_MISC_SHIFT;
2086                status = tmp | SCI_USB_CHARGE_BAT_LVL_OFF;
2087        } else {
2088                tmp = value << HCI_MISC_SHIFT;
2089                status = tmp | SCI_USB_CHARGE_BAT_LVL_ON;
2090        }
2091        ret = toshiba_sleep_functions_status_set(toshiba, status);
2092        if (ret < 0)
2093                return ret;
2094
2095        toshiba->usbsc_bat_level = status >> HCI_MISC_SHIFT;
2096
2097        return count;
2098}
2099static DEVICE_ATTR_RW(sleep_functions_on_battery);
2100
2101static ssize_t usb_rapid_charge_show(struct device *dev,
2102                                     struct device_attribute *attr, char *buf)
2103{
2104        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2105        u32 state;
2106        int ret;
2107
2108        ret = toshiba_usb_rapid_charge_get(toshiba, &state);
2109        if (ret < 0)
2110                return ret;
2111
2112        return sprintf(buf, "%d\n", state);
2113}
2114
2115static ssize_t usb_rapid_charge_store(struct device *dev,
2116                                      struct device_attribute *attr,
2117                                      const char *buf, size_t count)
2118{
2119        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2120        int state;
2121        int ret;
2122
2123        ret = kstrtoint(buf, 0, &state);
2124        if (ret)
2125                return ret;
2126        if (state != 0 && state != 1)
2127                return -EINVAL;
2128
2129        ret = toshiba_usb_rapid_charge_set(toshiba, state);
2130        if (ret)
2131                return ret;
2132
2133        return count;
2134}
2135static DEVICE_ATTR_RW(usb_rapid_charge);
2136
2137static ssize_t usb_sleep_music_show(struct device *dev,
2138                                    struct device_attribute *attr, char *buf)
2139{
2140        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2141        u32 state;
2142        int ret;
2143
2144        ret = toshiba_usb_sleep_music_get(toshiba, &state);
2145        if (ret < 0)
2146                return ret;
2147
2148        return sprintf(buf, "%d\n", state);
2149}
2150
2151static ssize_t usb_sleep_music_store(struct device *dev,
2152                                     struct device_attribute *attr,
2153                                     const char *buf, size_t count)
2154{
2155        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2156        int state;
2157        int ret;
2158
2159        ret = kstrtoint(buf, 0, &state);
2160        if (ret)
2161                return ret;
2162        if (state != 0 && state != 1)
2163                return -EINVAL;
2164
2165        ret = toshiba_usb_sleep_music_set(toshiba, state);
2166        if (ret)
2167                return ret;
2168
2169        return count;
2170}
2171static DEVICE_ATTR_RW(usb_sleep_music);
2172
2173static ssize_t kbd_function_keys_show(struct device *dev,
2174                                      struct device_attribute *attr, char *buf)
2175{
2176        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2177        int mode;
2178        int ret;
2179
2180        ret = toshiba_function_keys_get(toshiba, &mode);
2181        if (ret < 0)
2182                return ret;
2183
2184        return sprintf(buf, "%d\n", mode);
2185}
2186
2187static ssize_t kbd_function_keys_store(struct device *dev,
2188                                       struct device_attribute *attr,
2189                                       const char *buf, size_t count)
2190{
2191        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2192        int mode;
2193        int ret;
2194
2195        ret = kstrtoint(buf, 0, &mode);
2196        if (ret)
2197                return ret;
2198        /*
2199         * Check for the function keys mode where:
2200         * 0 - Normal operation (F{1-12} as usual and hotkeys via FN-F{1-12})
2201         * 1 - Special functions (Opposite of the above setting)
2202         */
2203        if (mode != 0 && mode != 1)
2204                return -EINVAL;
2205
2206        ret = toshiba_function_keys_set(toshiba, mode);
2207        if (ret)
2208                return ret;
2209
2210        pr_info("Reboot for changes to KBD Function Keys to take effect");
2211
2212        return count;
2213}
2214static DEVICE_ATTR_RW(kbd_function_keys);
2215
2216static ssize_t panel_power_on_show(struct device *dev,
2217                                   struct device_attribute *attr, char *buf)
2218{
2219        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2220        u32 state;
2221        int ret;
2222
2223        ret = toshiba_panel_power_on_get(toshiba, &state);
2224        if (ret < 0)
2225                return ret;
2226
2227        return sprintf(buf, "%d\n", state);
2228}
2229
2230static ssize_t panel_power_on_store(struct device *dev,
2231                                    struct device_attribute *attr,
2232                                    const char *buf, size_t count)
2233{
2234        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2235        int state;
2236        int ret;
2237
2238        ret = kstrtoint(buf, 0, &state);
2239        if (ret)
2240                return ret;
2241        if (state != 0 && state != 1)
2242                return -EINVAL;
2243
2244        ret = toshiba_panel_power_on_set(toshiba, state);
2245        if (ret)
2246                return ret;
2247
2248        pr_info("Reboot for changes to Panel Power ON to take effect");
2249
2250        return count;
2251}
2252static DEVICE_ATTR_RW(panel_power_on);
2253
2254static ssize_t usb_three_show(struct device *dev,
2255                              struct device_attribute *attr, char *buf)
2256{
2257        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2258        u32 state;
2259        int ret;
2260
2261        ret = toshiba_usb_three_get(toshiba, &state);
2262        if (ret < 0)
2263                return ret;
2264
2265        return sprintf(buf, "%d\n", state);
2266}
2267
2268static ssize_t usb_three_store(struct device *dev,
2269                               struct device_attribute *attr,
2270                               const char *buf, size_t count)
2271{
2272        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2273        int state;
2274        int ret;
2275
2276        ret = kstrtoint(buf, 0, &state);
2277        if (ret)
2278                return ret;
2279        /*
2280         * Check for USB 3 mode where:
2281         * 0 - Disabled (Acts like a USB 2 port, saving power)
2282         * 1 - Enabled
2283         */
2284        if (state != 0 && state != 1)
2285                return -EINVAL;
2286
2287        ret = toshiba_usb_three_set(toshiba, state);
2288        if (ret)
2289                return ret;
2290
2291        pr_info("Reboot for changes to USB 3 to take effect");
2292
2293        return count;
2294}
2295static DEVICE_ATTR_RW(usb_three);
2296
2297static ssize_t cooling_method_show(struct device *dev,
2298                                   struct device_attribute *attr, char *buf)
2299{
2300        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2301        int state;
2302        int ret;
2303
2304        ret = toshiba_cooling_method_get(toshiba, &state);
2305        if (ret < 0)
2306                return ret;
2307
2308        return sprintf(buf, "%d %d\n", state, toshiba->max_cooling_method);
2309}
2310
2311static ssize_t cooling_method_store(struct device *dev,
2312                                    struct device_attribute *attr,
2313                                    const char *buf, size_t count)
2314{
2315        struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
2316        int state;
2317        int ret;
2318
2319        ret = kstrtoint(buf, 0, &state);
2320        if (ret)
2321                return ret;
2322
2323        /*
2324         * Check for supported values
2325         * Depending on the laptop model, some only support these two:
2326         * 0 - Maximum Performance
2327         * 1 - Battery Optimized
2328         *
2329         * While some others support all three methods:
2330         * 0 - Maximum Performance
2331         * 1 - Performance
2332         * 2 - Battery Optimized
2333         */
2334        if (state < 0 || state > toshiba->max_cooling_method)
2335                return -EINVAL;
2336
2337        ret = toshiba_cooling_method_set(toshiba, state);
2338        if (ret)
2339                return ret;
2340
2341        return count;
2342}
2343static DEVICE_ATTR_RW(cooling_method);
2344
2345static struct attribute *toshiba_attributes[] = {
2346        &dev_attr_version.attr,
2347        &dev_attr_fan.attr,
2348        &dev_attr_kbd_backlight_mode.attr,
2349        &dev_attr_kbd_type.attr,
2350        &dev_attr_available_kbd_modes.attr,
2351        &dev_attr_kbd_backlight_timeout.attr,
2352        &dev_attr_touchpad.attr,
2353        &dev_attr_position.attr,
2354        &dev_attr_usb_sleep_charge.attr,
2355        &dev_attr_sleep_functions_on_battery.attr,
2356        &dev_attr_usb_rapid_charge.attr,
2357        &dev_attr_usb_sleep_music.attr,
2358        &dev_attr_kbd_function_keys.attr,
2359        &dev_attr_panel_power_on.attr,
2360        &dev_attr_usb_three.attr,
2361        &dev_attr_cooling_method.attr,
2362        NULL,
2363};
2364
2365static umode_t toshiba_sysfs_is_visible(struct kobject *kobj,
2366                                        struct attribute *attr, int idx)
2367{
2368        struct device *dev = container_of(kobj, struct device, kobj);
2369        struct toshiba_acpi_dev *drv = dev_get_drvdata(dev);
2370        bool exists = true;
2371
2372        if (attr == &dev_attr_fan.attr)
2373                exists = (drv->fan_supported) ? true : false;
2374        else if (attr == &dev_attr_kbd_backlight_mode.attr)
2375                exists = (drv->kbd_illum_supported) ? true : false;
2376        else if (attr == &dev_attr_kbd_backlight_timeout.attr)
2377                exists = (drv->kbd_mode == SCI_KBD_MODE_AUTO) ? true : false;
2378        else if (attr == &dev_attr_touchpad.attr)
2379                exists = (drv->touchpad_supported) ? true : false;
2380        else if (attr == &dev_attr_position.attr)
2381                exists = (drv->accelerometer_supported) ? true : false;
2382        else if (attr == &dev_attr_usb_sleep_charge.attr)
2383                exists = (drv->usb_sleep_charge_supported) ? true : false;
2384        else if (attr == &dev_attr_sleep_functions_on_battery.attr)
2385                exists = (drv->usb_sleep_charge_supported) ? true : false;
2386        else if (attr == &dev_attr_usb_rapid_charge.attr)
2387                exists = (drv->usb_rapid_charge_supported) ? true : false;
2388        else if (attr == &dev_attr_usb_sleep_music.attr)
2389                exists = (drv->usb_sleep_music_supported) ? true : false;
2390        else if (attr == &dev_attr_kbd_function_keys.attr)
2391                exists = (drv->kbd_function_keys_supported) ? true : false;
2392        else if (attr == &dev_attr_panel_power_on.attr)
2393                exists = (drv->panel_power_on_supported) ? true : false;
2394        else if (attr == &dev_attr_usb_three.attr)
2395                exists = (drv->usb_three_supported) ? true : false;
2396        else if (attr == &dev_attr_cooling_method.attr)
2397                exists = (drv->cooling_method_supported) ? true : false;
2398
2399        return exists ? attr->mode : 0;
2400}
2401
2402static struct attribute_group toshiba_attr_group = {
2403        .is_visible = toshiba_sysfs_is_visible,
2404        .attrs = toshiba_attributes,
2405};
2406
2407static void toshiba_acpi_kbd_bl_work(struct work_struct *work)
2408{
2409        struct acpi_device *acpi_dev = toshiba_acpi->acpi_dev;
2410
2411        /* Update the sysfs entries */
2412        if (sysfs_update_group(&acpi_dev->dev.kobj,
2413                               &toshiba_attr_group))
2414                pr_err("Unable to update sysfs entries\n");
2415
2416        /* Emulate the keyboard backlight event */
2417        acpi_bus_generate_netlink_event(acpi_dev->pnp.device_class,
2418                                        dev_name(&acpi_dev->dev),
2419                                        0x92, 0);
2420}
2421
2422/*
2423 * Misc device
2424 */
2425static int toshiba_acpi_smm_bridge(SMMRegisters *regs)
2426{
2427        u32 in[TCI_WORDS] = { regs->eax, regs->ebx, regs->ecx,
2428                              regs->edx, regs->esi, regs->edi };
2429        u32 out[TCI_WORDS];
2430        acpi_status status;
2431
2432        status = tci_raw(toshiba_acpi, in, out);
2433        if (ACPI_FAILURE(status)) {
2434                pr_err("ACPI call to query SMM registers failed\n");
2435                return -EIO;
2436        }
2437
2438        /* Fillout the SMM struct with the TCI call results */
2439        regs->eax = out[0];
2440        regs->ebx = out[1];
2441        regs->ecx = out[2];
2442        regs->edx = out[3];
2443        regs->esi = out[4];
2444        regs->edi = out[5];
2445
2446        return 0;
2447}
2448
2449static long toshiba_acpi_ioctl(struct file *fp, unsigned int cmd,
2450                               unsigned long arg)
2451{
2452        SMMRegisters __user *argp = (SMMRegisters __user *)arg;
2453        SMMRegisters regs;
2454        int ret;
2455
2456        if (!argp)
2457                return -EINVAL;
2458
2459        switch (cmd) {
2460        case TOSH_SMM:
2461                if (copy_from_user(&regs, argp, sizeof(SMMRegisters)))
2462                        return -EFAULT;
2463                ret = toshiba_acpi_smm_bridge(&regs);
2464                if (ret)
2465                        return ret;
2466                if (copy_to_user(argp, &regs, sizeof(SMMRegisters)))
2467                        return -EFAULT;
2468                break;
2469        case TOSHIBA_ACPI_SCI:
2470                if (copy_from_user(&regs, argp, sizeof(SMMRegisters)))
2471                        return -EFAULT;
2472                /* Ensure we are being called with a SCI_{GET, SET} register */
2473                if (regs.eax != SCI_GET && regs.eax != SCI_SET)
2474                        return -EINVAL;
2475                if (!sci_open(toshiba_acpi))
2476                        return -EIO;
2477                ret = toshiba_acpi_smm_bridge(&regs);
2478                sci_close(toshiba_acpi);
2479                if (ret)
2480                        return ret;
2481                if (copy_to_user(argp, &regs, sizeof(SMMRegisters)))
2482                        return -EFAULT;
2483                break;
2484        default:
2485                return -EINVAL;
2486        }
2487
2488        return 0;
2489}
2490
2491static const struct file_operations toshiba_acpi_fops = {
2492        .owner          = THIS_MODULE,
2493        .unlocked_ioctl = toshiba_acpi_ioctl,
2494        .llseek         = noop_llseek,
2495};
2496
2497/*
2498 * WWAN RFKill handlers
2499 */
2500static int toshiba_acpi_wwan_set_block(void *data, bool blocked)
2501{
2502        struct toshiba_acpi_dev *dev = data;
2503        int ret;
2504
2505        ret = toshiba_wireless_status(dev);
2506        if (ret)
2507                return ret;
2508
2509        if (!dev->killswitch)
2510                return 0;
2511
2512        return toshiba_wwan_set(dev, !blocked);
2513}
2514
2515static void toshiba_acpi_wwan_poll(struct rfkill *rfkill, void *data)
2516{
2517        struct toshiba_acpi_dev *dev = data;
2518
2519        if (toshiba_wireless_status(dev))
2520                return;
2521
2522        rfkill_set_hw_state(dev->wwan_rfk, !dev->killswitch);
2523}
2524
2525static const struct rfkill_ops wwan_rfk_ops = {
2526        .set_block = toshiba_acpi_wwan_set_block,
2527        .poll = toshiba_acpi_wwan_poll,
2528};
2529
2530static int toshiba_acpi_setup_wwan_rfkill(struct toshiba_acpi_dev *dev)
2531{
2532        int ret = toshiba_wireless_status(dev);
2533
2534        if (ret)
2535                return ret;
2536
2537        dev->wwan_rfk = rfkill_alloc("Toshiba WWAN",
2538                                     &dev->acpi_dev->dev,
2539                                     RFKILL_TYPE_WWAN,
2540                                     &wwan_rfk_ops,
2541                                     dev);
2542        if (!dev->wwan_rfk) {
2543                pr_err("Unable to allocate WWAN rfkill device\n");
2544                return -ENOMEM;
2545        }
2546
2547        rfkill_set_hw_state(dev->wwan_rfk, !dev->killswitch);
2548
2549        ret = rfkill_register(dev->wwan_rfk);
2550        if (ret) {
2551                pr_err("Unable to register WWAN rfkill device\n");
2552                rfkill_destroy(dev->wwan_rfk);
2553        }
2554
2555        return ret;
2556}
2557
2558/*
2559 * Hotkeys
2560 */
2561static int toshiba_acpi_enable_hotkeys(struct toshiba_acpi_dev *dev)
2562{
2563        acpi_status status;
2564        u32 result;
2565
2566        status = acpi_evaluate_object(dev->acpi_dev->handle,
2567                                      "ENAB", NULL, NULL);
2568        if (ACPI_FAILURE(status))
2569                return -ENODEV;
2570
2571        /*
2572         * Enable the "Special Functions" mode only if they are
2573         * supported and if they are activated.
2574         */
2575        if (dev->kbd_function_keys_supported && dev->special_functions)
2576                result = hci_write(dev, HCI_HOTKEY_EVENT,
2577                                   HCI_HOTKEY_SPECIAL_FUNCTIONS);
2578        else
2579                result = hci_write(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE);
2580
2581        if (result == TOS_FAILURE)
2582                return -EIO;
2583        else if (result == TOS_NOT_SUPPORTED)
2584                return -ENODEV;
2585
2586        return 0;
2587}
2588
2589static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
2590                                      struct serio *port)
2591{
2592        if (str & I8042_STR_AUXDATA)
2593                return false;
2594
2595        if (unlikely(data == 0xe0))
2596                return false;
2597
2598        if ((data & 0x7f) == TOS1900_FN_SCAN) {
2599                schedule_work(&toshiba_acpi->hotkey_work);
2600                return true;
2601        }
2602
2603        return false;
2604}
2605
2606static void toshiba_acpi_hotkey_work(struct work_struct *work)
2607{
2608        acpi_handle ec_handle = ec_get_handle();
2609        acpi_status status;
2610
2611        if (!ec_handle)
2612                return;
2613
2614        status = acpi_evaluate_object(ec_handle, "NTFY", NULL, NULL);
2615        if (ACPI_FAILURE(status))
2616                pr_err("ACPI NTFY method execution failed\n");
2617}
2618
2619/*
2620 * Returns hotkey scancode, or < 0 on failure.
2621 */
2622static int toshiba_acpi_query_hotkey(struct toshiba_acpi_dev *dev)
2623{
2624        unsigned long long value;
2625        acpi_status status;
2626
2627        status = acpi_evaluate_integer(dev->acpi_dev->handle, "INFO",
2628                                      NULL, &value);
2629        if (ACPI_FAILURE(status)) {
2630                pr_err("ACPI INFO method execution failed\n");
2631                return -EIO;
2632        }
2633
2634        return value;
2635}
2636
2637static void toshiba_acpi_report_hotkey(struct toshiba_acpi_dev *dev,
2638                                       int scancode)
2639{
2640        if (scancode == 0x100)
2641                return;
2642
2643        /* Act on key press; ignore key release */
2644        if (scancode & 0x80)
2645                return;
2646
2647        if (!sparse_keymap_report_event(dev->hotkey_dev, scancode, 1, true))
2648                pr_info("Unknown key %x\n", scancode);
2649}
2650
2651static void toshiba_acpi_process_hotkeys(struct toshiba_acpi_dev *dev)
2652{
2653        if (dev->info_supported) {
2654                int scancode = toshiba_acpi_query_hotkey(dev);
2655
2656                if (scancode < 0) {
2657                        pr_err("Failed to query hotkey event\n");
2658                } else if (scancode != 0) {
2659                        toshiba_acpi_report_hotkey(dev, scancode);
2660                        dev->key_event_valid = 1;
2661                        dev->last_key_event = scancode;
2662                }
2663        } else if (dev->system_event_supported) {
2664                u32 result;
2665                u32 value;
2666                int retries = 3;
2667
2668                do {
2669                        result = hci_read(dev, HCI_SYSTEM_EVENT, &value);
2670                        switch (result) {
2671                        case TOS_SUCCESS:
2672                                toshiba_acpi_report_hotkey(dev, (int)value);
2673                                dev->key_event_valid = 1;
2674                                dev->last_key_event = value;
2675                                break;
2676                        case TOS_NOT_SUPPORTED:
2677                                /*
2678                                 * This is a workaround for an unresolved
2679                                 * issue on some machines where system events
2680                                 * sporadically become disabled.
2681                                 */
2682                                result = hci_write(dev, HCI_SYSTEM_EVENT, 1);
2683                                if (result == TOS_SUCCESS)
2684                                        pr_notice("Re-enabled hotkeys\n");
2685                                /* Fall through */
2686                        default:
2687                                retries--;
2688                                break;
2689                        }
2690                } while (retries && result != TOS_FIFO_EMPTY);
2691        }
2692}
2693
2694static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
2695{
2696        const struct key_entry *keymap = toshiba_acpi_keymap;
2697        acpi_handle ec_handle;
2698        int error;
2699
2700        if (disable_hotkeys) {
2701                pr_info("Hotkeys disabled by module parameter\n");
2702                return 0;
2703        }
2704
2705        if (wmi_has_guid(TOSHIBA_WMI_EVENT_GUID)) {
2706                pr_info("WMI event detected, hotkeys will not be monitored\n");
2707                return 0;
2708        }
2709
2710        error = toshiba_acpi_enable_hotkeys(dev);
2711        if (error)
2712                return error;
2713
2714        if (toshiba_hotkey_event_type_get(dev, &dev->hotkey_event_type))
2715                pr_notice("Unable to query Hotkey Event Type\n");
2716
2717        dev->hotkey_dev = input_allocate_device();
2718        if (!dev->hotkey_dev)
2719                return -ENOMEM;
2720
2721        dev->hotkey_dev->name = "Toshiba input device";
2722        dev->hotkey_dev->phys = "toshiba_acpi/input0";
2723        dev->hotkey_dev->id.bustype = BUS_HOST;
2724
2725        if (dev->hotkey_event_type == HCI_SYSTEM_TYPE1 ||
2726            !dev->kbd_function_keys_supported)
2727                keymap = toshiba_acpi_keymap;
2728        else if (dev->hotkey_event_type == HCI_SYSTEM_TYPE2 ||
2729                 dev->kbd_function_keys_supported)
2730                keymap = toshiba_acpi_alt_keymap;
2731        else
2732                pr_info("Unknown event type received %x\n",
2733                        dev->hotkey_event_type);
2734        error = sparse_keymap_setup(dev->hotkey_dev, keymap, NULL);
2735        if (error)
2736                goto err_free_dev;
2737
2738        /*
2739         * For some machines the SCI responsible for providing hotkey
2740         * notification doesn't fire. We can trigger the notification
2741         * whenever the Fn key is pressed using the NTFY method, if
2742         * supported, so if it's present set up an i8042 key filter
2743         * for this purpose.
2744         */
2745        ec_handle = ec_get_handle();
2746        if (ec_handle && acpi_has_method(ec_handle, "NTFY")) {
2747                INIT_WORK(&dev->hotkey_work, toshiba_acpi_hotkey_work);
2748
2749                error = i8042_install_filter(toshiba_acpi_i8042_filter);
2750                if (error) {
2751                        pr_err("Error installing key filter\n");
2752                        goto err_free_keymap;
2753                }
2754
2755                dev->ntfy_supported = 1;
2756        }
2757
2758        /*
2759         * Determine hotkey query interface. Prefer using the INFO
2760         * method when it is available.
2761         */
2762        if (acpi_has_method(dev->acpi_dev->handle, "INFO"))
2763                dev->info_supported = 1;
2764        else if (hci_write(dev, HCI_SYSTEM_EVENT, 1) == TOS_SUCCESS)
2765                dev->system_event_supported = 1;
2766
2767        if (!dev->info_supported && !dev->system_event_supported) {
2768                pr_warn("No hotkey query interface found\n");
2769                goto err_remove_filter;
2770        }
2771
2772        error = input_register_device(dev->hotkey_dev);
2773        if (error) {
2774                pr_info("Unable to register input device\n");
2775                goto err_remove_filter;
2776        }
2777
2778        return 0;
2779
2780 err_remove_filter:
2781        if (dev->ntfy_supported)
2782                i8042_remove_filter(toshiba_acpi_i8042_filter);
2783 err_free_keymap:
2784        sparse_keymap_free(dev->hotkey_dev);
2785 err_free_dev:
2786        input_free_device(dev->hotkey_dev);
2787        dev->hotkey_dev = NULL;
2788        return error;
2789}
2790
2791static int toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
2792{
2793        struct backlight_properties props;
2794        int brightness;
2795        int ret;
2796
2797        /*
2798         * Some machines don't support the backlight methods at all, and
2799         * others support it read-only. Either of these is pretty useless,
2800         * so only register the backlight device if the backlight method
2801         * supports both reads and writes.
2802         */
2803        brightness = __get_lcd_brightness(dev);
2804        if (brightness < 0)
2805                return 0;
2806        /*
2807         * If transflective backlight is supported and the brightness is zero
2808         * (lowest brightness level), the set_lcd_brightness function will
2809         * activate the transflective backlight, making the LCD appear to be
2810         * turned off, simply increment the brightness level to avoid that.
2811         */
2812        if (dev->tr_backlight_supported && brightness == 0)
2813                brightness++;
2814        ret = set_lcd_brightness(dev, brightness);
2815        if (ret) {
2816                pr_debug("Backlight method is read-only, disabling backlight support\n");
2817                return 0;
2818        }
2819
2820        /*
2821         * Tell acpi-video-detect code to prefer vendor backlight on all
2822         * systems with transflective backlight and on dmi matched systems.
2823         */
2824        if (dev->tr_backlight_supported ||
2825            dmi_check_system(toshiba_vendor_backlight_dmi))
2826                acpi_video_set_dmi_backlight_type(acpi_backlight_vendor);
2827
2828        if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
2829                return 0;
2830
2831        memset(&props, 0, sizeof(props));
2832        props.type = BACKLIGHT_PLATFORM;
2833        props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
2834
2835        /* Adding an extra level and having 0 change to transflective mode */
2836        if (dev->tr_backlight_supported)
2837                props.max_brightness++;
2838
2839        dev->backlight_dev = backlight_device_register("toshiba",
2840                                                       &dev->acpi_dev->dev,
2841                                                       dev,
2842                                                       &toshiba_backlight_data,
2843                                                       &props);
2844        if (IS_ERR(dev->backlight_dev)) {
2845                ret = PTR_ERR(dev->backlight_dev);
2846                pr_err("Could not register toshiba backlight device\n");
2847                dev->backlight_dev = NULL;
2848                return ret;
2849        }
2850
2851        dev->backlight_dev->props.brightness = brightness;
2852        return 0;
2853}
2854
2855static void print_supported_features(struct toshiba_acpi_dev *dev)
2856{
2857        pr_info("Supported laptop features:");
2858
2859        if (dev->hotkey_dev)
2860                pr_cont(" hotkeys");
2861        if (dev->backlight_dev)
2862                pr_cont(" backlight");
2863        if (dev->video_supported)
2864                pr_cont(" video-out");
2865        if (dev->fan_supported)
2866                pr_cont(" fan");
2867        if (dev->tr_backlight_supported)
2868                pr_cont(" transflective-backlight");
2869        if (dev->illumination_supported)
2870                pr_cont(" illumination");
2871        if (dev->kbd_illum_supported)
2872                pr_cont(" keyboard-backlight");
2873        if (dev->touchpad_supported)
2874                pr_cont(" touchpad");
2875        if (dev->eco_supported)
2876                pr_cont(" eco-led");
2877        if (dev->accelerometer_supported)
2878                pr_cont(" accelerometer-axes");
2879        if (dev->usb_sleep_charge_supported)
2880                pr_cont(" usb-sleep-charge");
2881        if (dev->usb_rapid_charge_supported)
2882                pr_cont(" usb-rapid-charge");
2883        if (dev->usb_sleep_music_supported)
2884                pr_cont(" usb-sleep-music");
2885        if (dev->kbd_function_keys_supported)
2886                pr_cont(" special-function-keys");
2887        if (dev->panel_power_on_supported)
2888                pr_cont(" panel-power-on");
2889        if (dev->usb_three_supported)
2890                pr_cont(" usb3");
2891        if (dev->wwan_supported)
2892                pr_cont(" wwan");
2893        if (dev->cooling_method_supported)
2894                pr_cont(" cooling-method");
2895
2896        pr_cont("\n");
2897}
2898
2899static int toshiba_acpi_remove(struct acpi_device *acpi_dev)
2900{
2901        struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
2902
2903        misc_deregister(&dev->miscdev);
2904
2905        remove_toshiba_proc_entries(dev);
2906
2907        if (dev->sysfs_created)
2908                sysfs_remove_group(&dev->acpi_dev->dev.kobj,
2909                                   &toshiba_attr_group);
2910
2911        if (dev->ntfy_supported) {
2912                i8042_remove_filter(toshiba_acpi_i8042_filter);
2913                cancel_work_sync(&dev->hotkey_work);
2914        }
2915
2916        if (dev->hotkey_dev) {
2917                input_unregister_device(dev->hotkey_dev);
2918                sparse_keymap_free(dev->hotkey_dev);
2919        }
2920
2921        backlight_device_unregister(dev->backlight_dev);
2922
2923        if (dev->illumination_led_registered)
2924                led_classdev_unregister(&dev->led_dev);
2925
2926        if (dev->kbd_led_registered)
2927                led_classdev_unregister(&dev->kbd_led);
2928
2929        if (dev->eco_led_registered)
2930                led_classdev_unregister(&dev->eco_led);
2931
2932        if (dev->wwan_rfk) {
2933                rfkill_unregister(dev->wwan_rfk);
2934                rfkill_destroy(dev->wwan_rfk);
2935        }
2936
2937        if (toshiba_acpi)
2938                toshiba_acpi = NULL;
2939
2940        kfree(dev);
2941
2942        return 0;
2943}
2944
2945static const char *find_hci_method(acpi_handle handle)
2946{
2947        if (acpi_has_method(handle, "GHCI"))
2948                return "GHCI";
2949
2950        if (acpi_has_method(handle, "SPFC"))
2951                return "SPFC";
2952
2953        return NULL;
2954}
2955
2956static int toshiba_acpi_add(struct acpi_device *acpi_dev)
2957{
2958        struct toshiba_acpi_dev *dev;
2959        const char *hci_method;
2960        u32 dummy;
2961        int ret = 0;
2962
2963        if (toshiba_acpi)
2964                return -EBUSY;
2965
2966        pr_info("Toshiba Laptop ACPI Extras version %s\n",
2967               TOSHIBA_ACPI_VERSION);
2968
2969        hci_method = find_hci_method(acpi_dev->handle);
2970        if (!hci_method) {
2971                pr_err("HCI interface not found\n");
2972                return -ENODEV;
2973        }
2974
2975        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2976        if (!dev)
2977                return -ENOMEM;
2978        dev->acpi_dev = acpi_dev;
2979        dev->method_hci = hci_method;
2980        dev->miscdev.minor = MISC_DYNAMIC_MINOR;
2981        dev->miscdev.name = "toshiba_acpi";
2982        dev->miscdev.fops = &toshiba_acpi_fops;
2983
2984        ret = misc_register(&dev->miscdev);
2985        if (ret) {
2986                pr_err("Failed to register miscdevice\n");
2987                kfree(dev);
2988                return ret;
2989        }
2990
2991        acpi_dev->driver_data = dev;
2992        dev_set_drvdata(&acpi_dev->dev, dev);
2993
2994        /* Query the BIOS for supported features */
2995
2996        /*
2997         * The "Special Functions" are always supported by the laptops
2998         * with the new keyboard layout, query for its presence to help
2999         * determine the keymap layout to use.
3000         */
3001        ret = toshiba_function_keys_get(dev, &dev->special_functions);
3002        dev->kbd_function_keys_supported = !ret;
3003
3004        dev->hotkey_event_type = 0;
3005        if (toshiba_acpi_setup_keyboard(dev))
3006                pr_info("Unable to activate hotkeys\n");
3007
3008        /* Determine whether or not BIOS supports transflective backlight */
3009        ret = get_tr_backlight_status(dev, &dummy);
3010        dev->tr_backlight_supported = !ret;
3011
3012        ret = toshiba_acpi_setup_backlight(dev);
3013        if (ret)
3014                goto error;
3015
3016        toshiba_illumination_available(dev);
3017        if (dev->illumination_supported) {
3018                dev->led_dev.name = "toshiba::illumination";
3019                dev->led_dev.max_brightness = 1;
3020                dev->led_dev.brightness_set = toshiba_illumination_set;
3021                dev->led_dev.brightness_get = toshiba_illumination_get;
3022                if (!led_classdev_register(&acpi_dev->dev, &dev->led_dev))
3023                        dev->illumination_led_registered = true;
3024        }
3025
3026        toshiba_eco_mode_available(dev);
3027        if (dev->eco_supported) {
3028                dev->eco_led.name = "toshiba::eco_mode";
3029                dev->eco_led.max_brightness = 1;
3030                dev->eco_led.brightness_set = toshiba_eco_mode_set_status;
3031                dev->eco_led.brightness_get = toshiba_eco_mode_get_status;
3032                if (!led_classdev_register(&dev->acpi_dev->dev, &dev->eco_led))
3033                        dev->eco_led_registered = true;
3034        }
3035
3036        toshiba_kbd_illum_available(dev);
3037        /*
3038         * Only register the LED if KBD illumination is supported
3039         * and the keyboard backlight operation mode is set to FN-Z
3040         */
3041        if (dev->kbd_illum_supported && dev->kbd_mode == SCI_KBD_MODE_FNZ) {
3042                dev->kbd_led.name = "toshiba::kbd_backlight";
3043                dev->kbd_led.max_brightness = 1;
3044                dev->kbd_led.brightness_set = toshiba_kbd_backlight_set;
3045                dev->kbd_led.brightness_get = toshiba_kbd_backlight_get;
3046                if (!led_classdev_register(&dev->acpi_dev->dev, &dev->kbd_led))
3047                        dev->kbd_led_registered = true;
3048        }
3049
3050        ret = toshiba_touchpad_get(dev, &dummy);
3051        dev->touchpad_supported = !ret;
3052
3053        toshiba_accelerometer_available(dev);
3054
3055        toshiba_usb_sleep_charge_available(dev);
3056
3057        ret = toshiba_usb_rapid_charge_get(dev, &dummy);
3058        dev->usb_rapid_charge_supported = !ret;
3059
3060        ret = toshiba_usb_sleep_music_get(dev, &dummy);
3061        dev->usb_sleep_music_supported = !ret;
3062
3063        ret = toshiba_panel_power_on_get(dev, &dummy);
3064        dev->panel_power_on_supported = !ret;
3065
3066        ret = toshiba_usb_three_get(dev, &dummy);
3067        dev->usb_three_supported = !ret;
3068
3069        ret = get_video_status(dev, &dummy);
3070        dev->video_supported = !ret;
3071
3072        ret = get_fan_status(dev, &dummy);
3073        dev->fan_supported = !ret;
3074
3075        toshiba_wwan_available(dev);
3076        if (dev->wwan_supported)
3077                toshiba_acpi_setup_wwan_rfkill(dev);
3078
3079        toshiba_cooling_method_available(dev);
3080
3081        print_supported_features(dev);
3082
3083        ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,
3084                                 &toshiba_attr_group);
3085        if (ret) {
3086                dev->sysfs_created = 0;
3087                goto error;
3088        }
3089        dev->sysfs_created = !ret;
3090
3091        create_toshiba_proc_entries(dev);
3092
3093        toshiba_acpi = dev;
3094
3095        return 0;
3096
3097error:
3098        toshiba_acpi_remove(acpi_dev);
3099        return ret;
3100}
3101
3102static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event)
3103{
3104        struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
3105
3106        switch (event) {
3107        case 0x80: /* Hotkeys and some system events */
3108                /*
3109                 * Machines with this WMI GUID aren't supported due to bugs in
3110                 * their AML.
3111                 *
3112                 * Return silently to avoid triggering a netlink event.
3113                 */
3114                if (wmi_has_guid(TOSHIBA_WMI_EVENT_GUID))
3115                        return;
3116                toshiba_acpi_process_hotkeys(dev);
3117                break;
3118        case 0x81: /* Dock events */
3119        case 0x82:
3120        case 0x83:
3121                pr_info("Dock event received %x\n", event);
3122                break;
3123        case 0x88: /* Thermal events */
3124                pr_info("Thermal event received\n");
3125                break;
3126        case 0x8f: /* LID closed */
3127        case 0x90: /* LID is closed and Dock has been ejected */
3128                break;
3129        case 0x8c: /* SATA power events */
3130        case 0x8b:
3131                pr_info("SATA power event received %x\n", event);
3132                break;
3133        case 0x92: /* Keyboard backlight mode changed */
3134                toshiba_acpi->kbd_event_generated = true;
3135                /* Update sysfs entries */
3136                if (sysfs_update_group(&acpi_dev->dev.kobj,
3137                                       &toshiba_attr_group))
3138                        pr_err("Unable to update sysfs entries\n");
3139                break;
3140        case 0x85: /* Unknown */
3141        case 0x8d: /* Unknown */
3142        case 0x8e: /* Unknown */
3143        case 0x94: /* Unknown */
3144        case 0x95: /* Unknown */
3145        default:
3146                pr_info("Unknown event received %x\n", event);
3147                break;
3148        }
3149
3150        acpi_bus_generate_netlink_event(acpi_dev->pnp.device_class,
3151                                        dev_name(&acpi_dev->dev),
3152                                        event, (event == 0x80) ?
3153                                        dev->last_key_event : 0);
3154}
3155
3156#ifdef CONFIG_PM_SLEEP
3157static int toshiba_acpi_suspend(struct device *device)
3158{
3159        struct toshiba_acpi_dev *dev = acpi_driver_data(to_acpi_device(device));
3160
3161        if (dev->hotkey_dev) {
3162                u32 result;
3163
3164                result = hci_write(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_DISABLE);
3165                if (result != TOS_SUCCESS)
3166                        pr_info("Unable to disable hotkeys\n");
3167        }
3168
3169        return 0;
3170}
3171
3172static int toshiba_acpi_resume(struct device *device)
3173{
3174        struct toshiba_acpi_dev *dev = acpi_driver_data(to_acpi_device(device));
3175
3176        if (dev->hotkey_dev) {
3177                if (toshiba_acpi_enable_hotkeys(dev))
3178                        pr_info("Unable to re-enable hotkeys\n");
3179        }
3180
3181        if (dev->wwan_rfk) {
3182                if (!toshiba_wireless_status(dev))
3183                        rfkill_set_hw_state(dev->wwan_rfk, !dev->killswitch);
3184        }
3185
3186        return 0;
3187}
3188#endif
3189
3190static SIMPLE_DEV_PM_OPS(toshiba_acpi_pm,
3191                         toshiba_acpi_suspend, toshiba_acpi_resume);
3192
3193static struct acpi_driver toshiba_acpi_driver = {
3194        .name   = "Toshiba ACPI driver",
3195        .owner  = THIS_MODULE,
3196        .ids    = toshiba_device_ids,
3197        .flags  = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
3198        .ops    = {
3199                .add            = toshiba_acpi_add,
3200                .remove         = toshiba_acpi_remove,
3201                .notify         = toshiba_acpi_notify,
3202        },
3203        .drv.pm = &toshiba_acpi_pm,
3204};
3205
3206static int __init toshiba_acpi_init(void)
3207{
3208        int ret;
3209
3210        toshiba_proc_dir = proc_mkdir(PROC_TOSHIBA, acpi_root_dir);
3211        if (!toshiba_proc_dir) {
3212                pr_err("Unable to create proc dir " PROC_TOSHIBA "\n");
3213                return -ENODEV;
3214        }
3215
3216        ret = acpi_bus_register_driver(&toshiba_acpi_driver);
3217        if (ret) {
3218                pr_err("Failed to register ACPI driver: %d\n", ret);
3219                remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
3220        }
3221
3222        return ret;
3223}
3224
3225static void __exit toshiba_acpi_exit(void)
3226{
3227        acpi_bus_unregister_driver(&toshiba_acpi_driver);
3228        if (toshiba_proc_dir)
3229                remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
3230}
3231
3232module_init(toshiba_acpi_init);
3233module_exit(toshiba_acpi_exit);
3234