]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/platform/x86/toshiba_acpi.c
dell-wmi: Don't report keypresses on keybord illumination change
[mirror_ubuntu-bionic-kernel.git] / drivers / platform / x86 / toshiba_acpi.c
CommitLineData
1da177e4
LT
1/*
2 * toshiba_acpi.c - Toshiba Laptop ACPI Extras
3 *
4 *
5 * Copyright (C) 2002-2004 John Belmonte
c41a40c5 6 * Copyright (C) 2008 Philip Langdale
6c3f6e6c 7 * Copyright (C) 2010 Pierre Ducroquet
548c4306 8 * Copyright (C) 2014 Azael Avalos
1da177e4
LT
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 *
25 * The devolpment page for this driver is located at
26 * http://memebeam.org/toys/ToshibaAcpiDriver.
27 *
28 * Credits:
29 * Jonathan A. Buzzard - Toshiba HCI info, and critical tips on reverse
30 * engineering the Windows drivers
31 * Yasushi Nagato - changes for linux kernel 2.4 -> 2.5
32 * Rob Miller - TV out and hotkeys help
33 *
34 *
35 * TODO
36 *
37 */
38
7e33460d
JP
39#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
40
548c4306 41#define TOSHIBA_ACPI_VERSION "0.20"
1da177e4
LT
42#define PROC_INTERFACE_VERSION 1
43
44#include <linux/kernel.h>
45#include <linux/module.h>
46#include <linux/init.h>
47#include <linux/types.h>
48#include <linux/proc_fs.h>
936c8bcd 49#include <linux/seq_file.h>
c9263557 50#include <linux/backlight.h>
c41a40c5 51#include <linux/rfkill.h>
6335e4d5 52#include <linux/input.h>
384a7cd9 53#include <linux/input/sparse-keymap.h>
6c3f6e6c 54#include <linux/leds.h>
5a0e3ad6 55#include <linux/slab.h>
29cd293f
SF
56#include <linux/workqueue.h>
57#include <linux/i8042.h>
8b48463f 58#include <linux/acpi.h>
fe808bfb 59#include <linux/dmi.h>
1da177e4
LT
60#include <asm/uaccess.h>
61
1da177e4
LT
62MODULE_AUTHOR("John Belmonte");
63MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver");
64MODULE_LICENSE("GPL");
65
f11f999e
SF
66#define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100"
67
29cd293f
SF
68/* Scan code for Fn key on TOS1900 models */
69#define TOS1900_FN_SCAN 0x6e
70
1da177e4 71/* Toshiba ACPI method paths */
1da177e4
LT
72#define METHOD_VIDEO_OUT "\\_SB_.VALX.DSSX"
73
258c5903
AA
74/* The Toshiba configuration interface is composed of the HCI and the SCI,
75 * which are defined as follows:
1da177e4
LT
76 *
77 * HCI is Toshiba's "Hardware Control Interface" which is supposed to
78 * be uniform across all their models. Ideally we would just call
79 * dedicated ACPI methods instead of using this primitive interface.
80 * However the ACPI methods seem to be incomplete in some areas (for
81 * example they allow setting, but not reading, the LCD brightness value),
82 * so this is still useful.
ea6b31f4 83 *
84a6273f
AA
84 * SCI stands for "System Configuration Interface" which aim is to
85 * conceal differences in hardware between different models.
1da177e4
LT
86 */
87
258c5903 88#define TCI_WORDS 6
1da177e4
LT
89
90/* operations */
91#define HCI_SET 0xff00
92#define HCI_GET 0xfe00
84a6273f
AA
93#define SCI_OPEN 0xf100
94#define SCI_CLOSE 0xf200
95#define SCI_GET 0xf300
96#define SCI_SET 0xf400
1da177e4
LT
97
98/* return codes */
1864bbc2
AA
99#define TOS_SUCCESS 0x0000
100#define TOS_OPEN_CLOSE_OK 0x0044
101#define TOS_FAILURE 0x1000
102#define TOS_NOT_SUPPORTED 0x8000
103#define TOS_ALREADY_OPEN 0x8100
104#define TOS_NOT_OPENED 0x8200
105#define TOS_INPUT_DATA_ERROR 0x8300
106#define TOS_WRITE_PROTECTED 0x8400
107#define TOS_NOT_PRESENT 0x8600
108#define TOS_FIFO_EMPTY 0x8c00
109#define TOS_DATA_NOT_AVAILABLE 0x8d20
110#define TOS_NOT_INITIALIZED 0x8d50
1da177e4
LT
111
112/* registers */
113#define HCI_FAN 0x0004
121b7b0d 114#define HCI_TR_BACKLIGHT 0x0005
1da177e4
LT
115#define HCI_SYSTEM_EVENT 0x0016
116#define HCI_VIDEO_OUT 0x001c
117#define HCI_HOTKEY_EVENT 0x001e
118#define HCI_LCD_BRIGHTNESS 0x002a
c41a40c5 119#define HCI_WIRELESS 0x0056
5a2813e9 120#define HCI_ACCELEROMETER 0x006d
360f0f39 121#define HCI_KBD_ILLUMINATION 0x0095
def6c4e2 122#define HCI_ECO_MODE 0x0097
5a2813e9 123#define HCI_ACCELEROMETER2 0x00a6
fdb79081 124#define SCI_ILLUMINATION 0x014e
360f0f39 125#define SCI_KBD_ILLUM_STATUS 0x015c
9d8658ac 126#define SCI_TOUCHPAD 0x050e
1da177e4
LT
127
128/* field definitions */
5a2813e9 129#define HCI_ACCEL_MASK 0x7fff
29cd293f
SF
130#define HCI_HOTKEY_DISABLE 0x0b
131#define HCI_HOTKEY_ENABLE 0x09
1da177e4
LT
132#define HCI_LCD_BRIGHTNESS_BITS 3
133#define HCI_LCD_BRIGHTNESS_SHIFT (16-HCI_LCD_BRIGHTNESS_BITS)
134#define HCI_LCD_BRIGHTNESS_LEVELS (1 << HCI_LCD_BRIGHTNESS_BITS)
360f0f39 135#define HCI_MISC_SHIFT 0x10
1da177e4
LT
136#define HCI_VIDEO_OUT_LCD 0x1
137#define HCI_VIDEO_OUT_CRT 0x2
138#define HCI_VIDEO_OUT_TV 0x4
c41a40c5 139#define HCI_WIRELESS_KILL_SWITCH 0x01
140#define HCI_WIRELESS_BT_PRESENT 0x0f
141#define HCI_WIRELESS_BT_ATTACH 0x40
142#define HCI_WIRELESS_BT_POWER 0x80
93f8c16d 143#define SCI_KBD_MODE_MASK 0x1f
360f0f39
AA
144#define SCI_KBD_MODE_FNZ 0x1
145#define SCI_KBD_MODE_AUTO 0x2
93f8c16d
AA
146#define SCI_KBD_MODE_ON 0x8
147#define SCI_KBD_MODE_OFF 0x10
148#define SCI_KBD_TIME_MAX 0x3c001a
1da177e4 149
135740de
SF
150struct toshiba_acpi_dev {
151 struct acpi_device *acpi_dev;
152 const char *method_hci;
153 struct rfkill *bt_rfk;
154 struct input_dev *hotkey_dev;
29cd293f 155 struct work_struct hotkey_work;
135740de
SF
156 struct backlight_device *backlight_dev;
157 struct led_classdev led_dev;
360f0f39 158 struct led_classdev kbd_led;
def6c4e2 159 struct led_classdev eco_led;
36d03f93 160
135740de
SF
161 int force_fan;
162 int last_key_event;
163 int key_event_valid;
93f8c16d 164 int kbd_type;
360f0f39
AA
165 int kbd_mode;
166 int kbd_time;
135740de 167
592b746c
DC
168 unsigned int illumination_supported:1;
169 unsigned int video_supported:1;
170 unsigned int fan_supported:1;
171 unsigned int system_event_supported:1;
29cd293f
SF
172 unsigned int ntfy_supported:1;
173 unsigned int info_supported:1;
121b7b0d 174 unsigned int tr_backlight_supported:1;
360f0f39
AA
175 unsigned int kbd_illum_supported:1;
176 unsigned int kbd_led_registered:1;
9d8658ac 177 unsigned int touchpad_supported:1;
def6c4e2 178 unsigned int eco_supported:1;
5a2813e9 179 unsigned int accelerometer_supported:1;
360f0f39 180 unsigned int sysfs_created:1;
36d03f93 181
135740de
SF
182 struct mutex mutex;
183};
184
29cd293f
SF
185static struct toshiba_acpi_dev *toshiba_acpi;
186
4db42c51 187static const struct acpi_device_id toshiba_device_ids[] = {
188 {"TOS6200", 0},
63a9e016 189 {"TOS6207", 0},
c41a40c5 190 {"TOS6208", 0},
4db42c51 191 {"TOS1900", 0},
192 {"", 0},
193};
194MODULE_DEVICE_TABLE(acpi, toshiba_device_ids);
195
b859f159 196static const struct key_entry toshiba_acpi_keymap[] = {
fec278a1 197 { KE_KEY, 0x9e, { KEY_RFKILL } },
384a7cd9
DT
198 { KE_KEY, 0x101, { KEY_MUTE } },
199 { KE_KEY, 0x102, { KEY_ZOOMOUT } },
200 { KE_KEY, 0x103, { KEY_ZOOMIN } },
408a5d13 201 { KE_KEY, 0x10f, { KEY_TAB } },
af502837
AA
202 { KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } },
203 { KE_KEY, 0x139, { KEY_ZOOMRESET } },
384a7cd9
DT
204 { KE_KEY, 0x13b, { KEY_COFFEE } },
205 { KE_KEY, 0x13c, { KEY_BATTERY } },
206 { KE_KEY, 0x13d, { KEY_SLEEP } },
207 { KE_KEY, 0x13e, { KEY_SUSPEND } },
208 { KE_KEY, 0x13f, { KEY_SWITCHVIDEOMODE } },
209 { KE_KEY, 0x140, { KEY_BRIGHTNESSDOWN } },
210 { KE_KEY, 0x141, { KEY_BRIGHTNESSUP } },
211 { KE_KEY, 0x142, { KEY_WLAN } },
af502837 212 { KE_KEY, 0x143, { KEY_TOUCHPAD_TOGGLE } },
a49010f5 213 { KE_KEY, 0x17f, { KEY_FN } },
384a7cd9
DT
214 { KE_KEY, 0xb05, { KEY_PROG2 } },
215 { KE_KEY, 0xb06, { KEY_WWW } },
216 { KE_KEY, 0xb07, { KEY_MAIL } },
217 { KE_KEY, 0xb30, { KEY_STOP } },
218 { KE_KEY, 0xb31, { KEY_PREVIOUSSONG } },
219 { KE_KEY, 0xb32, { KEY_NEXTSONG } },
220 { KE_KEY, 0xb33, { KEY_PLAYPAUSE } },
221 { KE_KEY, 0xb5a, { KEY_MEDIA } },
408a5d13
AA
222 { KE_IGNORE, 0x1430, { KEY_RESERVED } }, /* Wake from sleep */
223 { KE_IGNORE, 0x1501, { KEY_RESERVED } }, /* Output changed */
224 { KE_IGNORE, 0x1502, { KEY_RESERVED } }, /* HDMI plugged/unplugged */
225 { KE_IGNORE, 0x1ABE, { KEY_RESERVED } }, /* Protection level set */
226 { KE_IGNORE, 0x1ABF, { KEY_RESERVED } }, /* Protection level off */
384a7cd9 227 { KE_END, 0 },
6335e4d5
MG
228};
229
fe808bfb
TI
230/* alternative keymap */
231static const struct dmi_system_id toshiba_alt_keymap_dmi[] = {
232 {
233 .matches = {
234 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
235 DMI_MATCH(DMI_PRODUCT_NAME, "Satellite M840"),
236 },
237 },
e6efad7f
AA
238 {
239 .matches = {
240 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
241 DMI_MATCH(DMI_PRODUCT_NAME, "Qosmio X75-A"),
242 },
243 },
b1bde689
AL
244 {
245 .matches = {
246 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
247 DMI_MATCH(DMI_PRODUCT_NAME, "TECRA A50-A"),
248 },
249 },
fe808bfb
TI
250 {}
251};
252
253static const struct key_entry toshiba_acpi_alt_keymap[] = {
254 { KE_KEY, 0x157, { KEY_MUTE } },
255 { KE_KEY, 0x102, { KEY_ZOOMOUT } },
256 { KE_KEY, 0x103, { KEY_ZOOMIN } },
e6efad7f 257 { KE_KEY, 0x12c, { KEY_KBDILLUMTOGGLE } },
fe808bfb
TI
258 { KE_KEY, 0x139, { KEY_ZOOMRESET } },
259 { KE_KEY, 0x13e, { KEY_SWITCHVIDEOMODE } },
260 { KE_KEY, 0x13c, { KEY_BRIGHTNESSDOWN } },
261 { KE_KEY, 0x13d, { KEY_BRIGHTNESSUP } },
262 { KE_KEY, 0x158, { KEY_WLAN } },
263 { KE_KEY, 0x13f, { KEY_TOUCHPAD_TOGGLE } },
264 { KE_END, 0 },
265};
266
1da177e4
LT
267/* utility
268 */
269
4be44fcd 270static __inline__ void _set_bit(u32 * word, u32 mask, int value)
1da177e4
LT
271{
272 *word = (*word & ~mask) | (mask * value);
273}
274
275/* acpi interface wrappers
276 */
277
4be44fcd 278static int write_acpi_int(const char *methodName, int val)
1da177e4 279{
1da177e4
LT
280 acpi_status status;
281
619400da 282 status = acpi_execute_simple_method(NULL, (char *)methodName, val);
32bcd5cb 283 return (status == AE_OK) ? 0 : -EIO;
1da177e4
LT
284}
285
258c5903
AA
286/* Perform a raw configuration call. Here we don't care about input or output
287 * buffer format.
1da177e4 288 */
258c5903
AA
289static acpi_status tci_raw(struct toshiba_acpi_dev *dev,
290 const u32 in[TCI_WORDS], u32 out[TCI_WORDS])
1da177e4
LT
291{
292 struct acpi_object_list params;
258c5903 293 union acpi_object in_objs[TCI_WORDS];
1da177e4 294 struct acpi_buffer results;
258c5903 295 union acpi_object out_objs[TCI_WORDS + 1];
1da177e4
LT
296 acpi_status status;
297 int i;
298
258c5903 299 params.count = TCI_WORDS;
1da177e4 300 params.pointer = in_objs;
258c5903 301 for (i = 0; i < TCI_WORDS; ++i) {
1da177e4
LT
302 in_objs[i].type = ACPI_TYPE_INTEGER;
303 in_objs[i].integer.value = in[i];
304 }
305
306 results.length = sizeof(out_objs);
307 results.pointer = out_objs;
308
6e02cc7e
SF
309 status = acpi_evaluate_object(dev->acpi_dev->handle,
310 (char *)dev->method_hci, &params,
4be44fcd 311 &results);
258c5903 312 if ((status == AE_OK) && (out_objs->package.count <= TCI_WORDS)) {
1da177e4
LT
313 for (i = 0; i < out_objs->package.count; ++i) {
314 out[i] = out_objs->package.elements[i].integer.value;
315 }
316 }
317
318 return status;
319}
320
c41a40c5 321/* common hci tasks (get or set one or two value)
1da177e4
LT
322 *
323 * In addition to the ACPI status, the HCI system returns a result which
324 * may be useful (such as "not supported").
325 */
326
893f3f62 327static u32 hci_write1(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
1da177e4 328{
258c5903
AA
329 u32 in[TCI_WORDS] = { HCI_SET, reg, in1, 0, 0, 0 };
330 u32 out[TCI_WORDS];
331 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
332
333 return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
1da177e4
LT
334}
335
893f3f62 336static u32 hci_read1(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
1da177e4 337{
258c5903
AA
338 u32 in[TCI_WORDS] = { HCI_GET, reg, 0, 0, 0, 0 };
339 u32 out[TCI_WORDS];
340 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
341 if (ACPI_FAILURE(status))
342 return TOS_FAILURE;
343
1da177e4 344 *out1 = out[2];
893f3f62
AA
345
346 return out[0];
1da177e4
LT
347}
348
893f3f62 349static u32 hci_write2(struct toshiba_acpi_dev *dev, u32 reg, u32 in1, u32 in2)
c41a40c5 350{
258c5903
AA
351 u32 in[TCI_WORDS] = { HCI_SET, reg, in1, in2, 0, 0 };
352 u32 out[TCI_WORDS];
353 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
354
355 return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
c41a40c5 356}
357
893f3f62 358static u32 hci_read2(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1, u32 *out2)
c41a40c5 359{
258c5903
AA
360 u32 in[TCI_WORDS] = { HCI_GET, reg, *out1, *out2, 0, 0 };
361 u32 out[TCI_WORDS];
362 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
363 if (ACPI_FAILURE(status))
364 return TOS_FAILURE;
365
c41a40c5 366 *out1 = out[2];
367 *out2 = out[3];
893f3f62
AA
368
369 return out[0];
c41a40c5 370}
371
84a6273f
AA
372/* common sci tasks
373 */
374
375static int sci_open(struct toshiba_acpi_dev *dev)
376{
258c5903
AA
377 u32 in[TCI_WORDS] = { SCI_OPEN, 0, 0, 0, 0, 0 };
378 u32 out[TCI_WORDS];
84a6273f
AA
379 acpi_status status;
380
258c5903 381 status = tci_raw(dev, in, out);
1864bbc2 382 if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
84a6273f
AA
383 pr_err("ACPI call to open SCI failed\n");
384 return 0;
385 }
386
1864bbc2 387 if (out[0] == TOS_OPEN_CLOSE_OK) {
84a6273f 388 return 1;
1864bbc2 389 } else if (out[0] == TOS_ALREADY_OPEN) {
84a6273f
AA
390 pr_info("Toshiba SCI already opened\n");
391 return 1;
1864bbc2 392 } else if (out[0] == TOS_NOT_PRESENT) {
84a6273f
AA
393 pr_info("Toshiba SCI is not present\n");
394 }
395
396 return 0;
397}
398
399static void sci_close(struct toshiba_acpi_dev *dev)
400{
258c5903
AA
401 u32 in[TCI_WORDS] = { SCI_CLOSE, 0, 0, 0, 0, 0 };
402 u32 out[TCI_WORDS];
84a6273f
AA
403 acpi_status status;
404
258c5903 405 status = tci_raw(dev, in, out);
1864bbc2 406 if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
84a6273f
AA
407 pr_err("ACPI call to close SCI failed\n");
408 return;
409 }
410
1864bbc2 411 if (out[0] == TOS_OPEN_CLOSE_OK)
84a6273f 412 return;
1864bbc2 413 else if (out[0] == TOS_NOT_OPENED)
84a6273f 414 pr_info("Toshiba SCI not opened\n");
1864bbc2 415 else if (out[0] == TOS_NOT_PRESENT)
84a6273f
AA
416 pr_info("Toshiba SCI is not present\n");
417}
418
893f3f62 419static u32 sci_read(struct toshiba_acpi_dev *dev, u32 reg, u32 *out1)
84a6273f 420{
258c5903
AA
421 u32 in[TCI_WORDS] = { SCI_GET, reg, 0, 0, 0, 0 };
422 u32 out[TCI_WORDS];
423 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
424 if (ACPI_FAILURE(status))
425 return TOS_FAILURE;
426
84a6273f 427 *out1 = out[2];
893f3f62
AA
428
429 return out[0];
84a6273f
AA
430}
431
893f3f62 432static u32 sci_write(struct toshiba_acpi_dev *dev, u32 reg, u32 in1)
84a6273f 433{
258c5903
AA
434 u32 in[TCI_WORDS] = { SCI_SET, reg, in1, 0, 0, 0 };
435 u32 out[TCI_WORDS];
436 acpi_status status = tci_raw(dev, in, out);
893f3f62
AA
437
438 return ACPI_SUCCESS(status) ? out[0] : TOS_FAILURE;
84a6273f
AA
439}
440
6c3f6e6c 441/* Illumination support */
135740de 442static int toshiba_illumination_available(struct toshiba_acpi_dev *dev)
6c3f6e6c 443{
258c5903
AA
444 u32 in[TCI_WORDS] = { SCI_GET, SCI_ILLUMINATION, 0, 0, 0, 0 };
445 u32 out[TCI_WORDS];
6c3f6e6c
PD
446 acpi_status status;
447
fdb79081
AA
448 if (!sci_open(dev))
449 return 0;
450
258c5903 451 status = tci_raw(dev, in, out);
fdb79081 452 sci_close(dev);
1864bbc2 453 if (ACPI_FAILURE(status) || out[0] == TOS_FAILURE) {
fdb79081
AA
454 pr_err("ACPI call to query Illumination support failed\n");
455 return 0;
1864bbc2 456 } else if (out[0] == TOS_NOT_SUPPORTED) {
7e33460d 457 pr_info("Illumination device not available\n");
6c3f6e6c
PD
458 return 0;
459 }
fdb79081 460
6c3f6e6c
PD
461 return 1;
462}
463
464static void toshiba_illumination_set(struct led_classdev *cdev,
465 enum led_brightness brightness)
466{
135740de
SF
467 struct toshiba_acpi_dev *dev = container_of(cdev,
468 struct toshiba_acpi_dev, led_dev);
fdb79081 469 u32 state, result;
6c3f6e6c
PD
470
471 /* First request : initialize communication. */
fdb79081 472 if (!sci_open(dev))
6c3f6e6c 473 return;
6c3f6e6c 474
fdb79081
AA
475 /* Switch the illumination on/off */
476 state = brightness ? 1 : 0;
893f3f62 477 result = sci_write(dev, SCI_ILLUMINATION, state);
fdb79081 478 sci_close(dev);
893f3f62 479 if (result == TOS_FAILURE) {
fdb79081
AA
480 pr_err("ACPI call for illumination failed\n");
481 return;
1864bbc2 482 } else if (result == TOS_NOT_SUPPORTED) {
fdb79081
AA
483 pr_info("Illumination not supported\n");
484 return;
6c3f6e6c 485 }
6c3f6e6c
PD
486}
487
488static enum led_brightness toshiba_illumination_get(struct led_classdev *cdev)
489{
135740de
SF
490 struct toshiba_acpi_dev *dev = container_of(cdev,
491 struct toshiba_acpi_dev, led_dev);
fdb79081 492 u32 state, result;
6c3f6e6c
PD
493
494 /* First request : initialize communication. */
fdb79081 495 if (!sci_open(dev))
6c3f6e6c 496 return LED_OFF;
6c3f6e6c
PD
497
498 /* Check the illumination */
893f3f62 499 result = sci_read(dev, SCI_ILLUMINATION, &state);
fdb79081 500 sci_close(dev);
893f3f62 501 if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
fdb79081
AA
502 pr_err("ACPI call for illumination failed\n");
503 return LED_OFF;
1864bbc2 504 } else if (result == TOS_NOT_SUPPORTED) {
fdb79081 505 pr_info("Illumination not supported\n");
6c3f6e6c
PD
506 return LED_OFF;
507 }
508
fdb79081 509 return state ? LED_FULL : LED_OFF;
6c3f6e6c 510}
ea6b31f4 511
360f0f39 512/* KBD Illumination */
93f8c16d
AA
513static int toshiba_kbd_illum_available(struct toshiba_acpi_dev *dev)
514{
258c5903
AA
515 u32 in[TCI_WORDS] = { SCI_GET, SCI_KBD_ILLUM_STATUS, 0, 0, 0, 0 };
516 u32 out[TCI_WORDS];
93f8c16d
AA
517 acpi_status status;
518
519 if (!sci_open(dev))
520 return 0;
521
258c5903 522 status = tci_raw(dev, in, out);
93f8c16d 523 sci_close(dev);
1864bbc2 524 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
93f8c16d
AA
525 pr_err("ACPI call to query kbd illumination support failed\n");
526 return 0;
1864bbc2 527 } else if (out[0] == TOS_NOT_SUPPORTED) {
93f8c16d
AA
528 pr_info("Keyboard illumination not available\n");
529 return 0;
530 }
531
532 /* Check for keyboard backlight timeout max value,
533 * previous kbd backlight implementation set this to
534 * 0x3c0003, and now the new implementation set this
535 * to 0x3c001a, use this to distinguish between them
536 */
537 if (out[3] == SCI_KBD_TIME_MAX)
538 dev->kbd_type = 2;
539 else
540 dev->kbd_type = 1;
541 /* Get the current keyboard backlight mode */
542 dev->kbd_mode = out[2] & SCI_KBD_MODE_MASK;
543 /* Get the current time (1-60 seconds) */
544 dev->kbd_time = out[2] >> HCI_MISC_SHIFT;
545
546 return 1;
547}
548
360f0f39
AA
549static int toshiba_kbd_illum_status_set(struct toshiba_acpi_dev *dev, u32 time)
550{
551 u32 result;
360f0f39
AA
552
553 if (!sci_open(dev))
554 return -EIO;
555
893f3f62 556 result = sci_write(dev, SCI_KBD_ILLUM_STATUS, time);
360f0f39 557 sci_close(dev);
893f3f62 558 if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
360f0f39
AA
559 pr_err("ACPI call to set KBD backlight status failed\n");
560 return -EIO;
1864bbc2 561 } else if (result == TOS_NOT_SUPPORTED) {
360f0f39
AA
562 pr_info("Keyboard backlight status not supported\n");
563 return -ENODEV;
564 }
565
566 return 0;
567}
568
569static int toshiba_kbd_illum_status_get(struct toshiba_acpi_dev *dev, u32 *time)
570{
571 u32 result;
360f0f39
AA
572
573 if (!sci_open(dev))
574 return -EIO;
575
893f3f62 576 result = sci_read(dev, SCI_KBD_ILLUM_STATUS, time);
360f0f39 577 sci_close(dev);
893f3f62 578 if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
360f0f39
AA
579 pr_err("ACPI call to get KBD backlight status failed\n");
580 return -EIO;
1864bbc2 581 } else if (result == TOS_NOT_SUPPORTED) {
360f0f39
AA
582 pr_info("Keyboard backlight status not supported\n");
583 return -ENODEV;
584 }
585
586 return 0;
587}
588
589static enum led_brightness toshiba_kbd_backlight_get(struct led_classdev *cdev)
590{
591 struct toshiba_acpi_dev *dev = container_of(cdev,
592 struct toshiba_acpi_dev, kbd_led);
593 u32 state, result;
360f0f39
AA
594
595 /* Check the keyboard backlight state */
893f3f62
AA
596 result = hci_read1(dev, HCI_KBD_ILLUMINATION, &state);
597 if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
360f0f39
AA
598 pr_err("ACPI call to get the keyboard backlight failed\n");
599 return LED_OFF;
1864bbc2 600 } else if (result == TOS_NOT_SUPPORTED) {
360f0f39
AA
601 pr_info("Keyboard backlight not supported\n");
602 return LED_OFF;
603 }
604
605 return state ? LED_FULL : LED_OFF;
606}
607
608static void toshiba_kbd_backlight_set(struct led_classdev *cdev,
609 enum led_brightness brightness)
610{
611 struct toshiba_acpi_dev *dev = container_of(cdev,
612 struct toshiba_acpi_dev, kbd_led);
613 u32 state, result;
360f0f39
AA
614
615 /* Set the keyboard backlight state */
616 state = brightness ? 1 : 0;
893f3f62
AA
617 result = hci_write1(dev, HCI_KBD_ILLUMINATION, state);
618 if (result == TOS_FAILURE || result == TOS_INPUT_DATA_ERROR) {
360f0f39
AA
619 pr_err("ACPI call to set KBD Illumination mode failed\n");
620 return;
1864bbc2 621 } else if (result == TOS_NOT_SUPPORTED) {
360f0f39
AA
622 pr_info("Keyboard backlight not supported\n");
623 return;
624 }
625}
ea6b31f4 626
9d8658ac
AA
627/* TouchPad support */
628static int toshiba_touchpad_set(struct toshiba_acpi_dev *dev, u32 state)
629{
630 u32 result;
9d8658ac
AA
631
632 if (!sci_open(dev))
633 return -EIO;
634
893f3f62 635 result = sci_write(dev, SCI_TOUCHPAD, state);
9d8658ac 636 sci_close(dev);
893f3f62 637 if (result == TOS_FAILURE) {
9d8658ac
AA
638 pr_err("ACPI call to set the touchpad failed\n");
639 return -EIO;
1864bbc2 640 } else if (result == TOS_NOT_SUPPORTED) {
9d8658ac
AA
641 return -ENODEV;
642 }
643
644 return 0;
645}
646
647static int toshiba_touchpad_get(struct toshiba_acpi_dev *dev, u32 *state)
648{
649 u32 result;
9d8658ac
AA
650
651 if (!sci_open(dev))
652 return -EIO;
653
893f3f62 654 result = sci_read(dev, SCI_TOUCHPAD, state);
9d8658ac 655 sci_close(dev);
893f3f62 656 if (result == TOS_FAILURE) {
9d8658ac
AA
657 pr_err("ACPI call to query the touchpad failed\n");
658 return -EIO;
1864bbc2 659 } else if (result == TOS_NOT_SUPPORTED) {
9d8658ac
AA
660 return -ENODEV;
661 }
662
663 return 0;
664}
6c3f6e6c 665
def6c4e2
AA
666/* Eco Mode support */
667static int toshiba_eco_mode_available(struct toshiba_acpi_dev *dev)
668{
669 acpi_status status;
258c5903
AA
670 u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 };
671 u32 out[TCI_WORDS];
def6c4e2 672
258c5903 673 status = tci_raw(dev, in, out);
1864bbc2 674 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
def6c4e2
AA
675 pr_info("ACPI call to get ECO led failed\n");
676 return 0;
677 }
678
679 return 1;
680}
681
682static enum led_brightness toshiba_eco_mode_get_status(struct led_classdev *cdev)
683{
684 struct toshiba_acpi_dev *dev = container_of(cdev,
685 struct toshiba_acpi_dev, eco_led);
258c5903
AA
686 u32 in[TCI_WORDS] = { HCI_GET, HCI_ECO_MODE, 0, 1, 0, 0 };
687 u32 out[TCI_WORDS];
def6c4e2
AA
688 acpi_status status;
689
258c5903 690 status = tci_raw(dev, in, out);
1864bbc2 691 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
def6c4e2
AA
692 pr_err("ACPI call to get ECO led failed\n");
693 return LED_OFF;
694 }
695
696 return out[2] ? LED_FULL : LED_OFF;
697}
698
699static void toshiba_eco_mode_set_status(struct led_classdev *cdev,
700 enum led_brightness brightness)
701{
702 struct toshiba_acpi_dev *dev = container_of(cdev,
703 struct toshiba_acpi_dev, eco_led);
258c5903
AA
704 u32 in[TCI_WORDS] = { HCI_SET, HCI_ECO_MODE, 0, 1, 0, 0 };
705 u32 out[TCI_WORDS];
def6c4e2
AA
706 acpi_status status;
707
708 /* Switch the Eco Mode led on/off */
709 in[2] = (brightness) ? 1 : 0;
258c5903 710 status = tci_raw(dev, in, out);
1864bbc2 711 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
def6c4e2
AA
712 pr_err("ACPI call to set ECO led failed\n");
713 return;
714 }
715}
ea6b31f4 716
5a2813e9
AA
717/* Accelerometer support */
718static int toshiba_accelerometer_supported(struct toshiba_acpi_dev *dev)
719{
258c5903
AA
720 u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER2, 0, 0, 0, 0 };
721 u32 out[TCI_WORDS];
5a2813e9
AA
722 acpi_status status;
723
724 /* Check if the accelerometer call exists,
725 * this call also serves as initialization
726 */
258c5903 727 status = tci_raw(dev, in, out);
1864bbc2 728 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
5a2813e9
AA
729 pr_err("ACPI call to query the accelerometer failed\n");
730 return -EIO;
1864bbc2
AA
731 } else if (out[0] == TOS_DATA_NOT_AVAILABLE ||
732 out[0] == TOS_NOT_INITIALIZED) {
5a2813e9
AA
733 pr_err("Accelerometer not initialized\n");
734 return -EIO;
1864bbc2 735 } else if (out[0] == TOS_NOT_SUPPORTED) {
5a2813e9
AA
736 pr_info("Accelerometer not supported\n");
737 return -ENODEV;
738 }
739
740 return 0;
741}
742
743static int toshiba_accelerometer_get(struct toshiba_acpi_dev *dev,
744 u32 *xy, u32 *z)
745{
258c5903
AA
746 u32 in[TCI_WORDS] = { HCI_GET, HCI_ACCELEROMETER, 0, 1, 0, 0 };
747 u32 out[TCI_WORDS];
5a2813e9
AA
748 acpi_status status;
749
750 /* Check the Accelerometer status */
258c5903 751 status = tci_raw(dev, in, out);
1864bbc2 752 if (ACPI_FAILURE(status) || out[0] == TOS_INPUT_DATA_ERROR) {
5a2813e9
AA
753 pr_err("ACPI call to query the accelerometer failed\n");
754 return -EIO;
755 }
756
757 *xy = out[2];
758 *z = out[4];
759
760 return 0;
761}
def6c4e2 762
c41a40c5 763/* Bluetooth rfkill handlers */
764
135740de 765static u32 hci_get_bt_present(struct toshiba_acpi_dev *dev, bool *present)
c41a40c5 766{
767 u32 hci_result;
768 u32 value, value2;
769
770 value = 0;
771 value2 = 0;
893f3f62 772 hci_result = hci_read2(dev, HCI_WIRELESS, &value, &value2);
1864bbc2 773 if (hci_result == TOS_SUCCESS)
c41a40c5 774 *present = (value & HCI_WIRELESS_BT_PRESENT) ? true : false;
775
776 return hci_result;
777}
778
135740de 779static u32 hci_get_radio_state(struct toshiba_acpi_dev *dev, bool *radio_state)
c41a40c5 780{
781 u32 hci_result;
782 u32 value, value2;
783
784 value = 0;
785 value2 = 0x0001;
893f3f62 786 hci_result = hci_read2(dev, HCI_WIRELESS, &value, &value2);
c41a40c5 787
788 *radio_state = value & HCI_WIRELESS_KILL_SWITCH;
789 return hci_result;
790}
791
19d337df 792static int bt_rfkill_set_block(void *data, bool blocked)
c41a40c5 793{
19d337df 794 struct toshiba_acpi_dev *dev = data;
c41a40c5 795 u32 result1, result2;
796 u32 value;
19d337df 797 int err;
c41a40c5 798 bool radio_state;
c41a40c5 799
19d337df 800 value = (blocked == false);
c41a40c5 801
19d337df 802 mutex_lock(&dev->mutex);
1864bbc2 803 if (hci_get_radio_state(dev, &radio_state) != TOS_SUCCESS) {
32bcd5cb 804 err = -EIO;
19d337df
JB
805 goto out;
806 }
c41a40c5 807
19d337df
JB
808 if (!radio_state) {
809 err = 0;
810 goto out;
c41a40c5 811 }
812
893f3f62
AA
813 result1 = hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER);
814 result2 = hci_write2(dev, HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH);
c41a40c5 815
1864bbc2 816 if (result1 != TOS_SUCCESS || result2 != TOS_SUCCESS)
32bcd5cb 817 err = -EIO;
19d337df
JB
818 else
819 err = 0;
820 out:
821 mutex_unlock(&dev->mutex);
822 return err;
c41a40c5 823}
824
19d337df 825static void bt_rfkill_poll(struct rfkill *rfkill, void *data)
c41a40c5 826{
c41a40c5 827 bool new_rfk_state;
828 bool value;
829 u32 hci_result;
19d337df
JB
830 struct toshiba_acpi_dev *dev = data;
831
832 mutex_lock(&dev->mutex);
c41a40c5 833
135740de 834 hci_result = hci_get_radio_state(dev, &value);
1864bbc2 835 if (hci_result != TOS_SUCCESS) {
19d337df
JB
836 /* Can't do anything useful */
837 mutex_unlock(&dev->mutex);
82e7784f 838 return;
19d337df 839 }
c41a40c5 840
841 new_rfk_state = value;
842
c41a40c5 843 mutex_unlock(&dev->mutex);
844
19d337df
JB
845 if (rfkill_set_hw_state(rfkill, !new_rfk_state))
846 bt_rfkill_set_block(data, true);
c41a40c5 847}
848
19d337df
JB
849static const struct rfkill_ops toshiba_rfk_ops = {
850 .set_block = bt_rfkill_set_block,
851 .poll = bt_rfkill_poll,
852};
853
121b7b0d
AI
854static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, bool *enabled)
855{
856 u32 hci_result;
857 u32 status;
858
893f3f62 859 hci_result = hci_read1(dev, HCI_TR_BACKLIGHT, &status);
121b7b0d 860 *enabled = !status;
1864bbc2 861 return hci_result == TOS_SUCCESS ? 0 : -EIO;
121b7b0d
AI
862}
863
864static int set_tr_backlight_status(struct toshiba_acpi_dev *dev, bool enable)
865{
866 u32 hci_result;
867 u32 value = !enable;
868
893f3f62 869 hci_result = hci_write1(dev, HCI_TR_BACKLIGHT, value);
1864bbc2 870 return hci_result == TOS_SUCCESS ? 0 : -EIO;
121b7b0d
AI
871}
872
4be44fcd 873static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
1da177e4 874
62cce752 875static int __get_lcd_brightness(struct toshiba_acpi_dev *dev)
1da177e4
LT
876{
877 u32 hci_result;
878 u32 value;
121b7b0d
AI
879 int brightness = 0;
880
881 if (dev->tr_backlight_supported) {
882 bool enabled;
883 int ret = get_tr_backlight_status(dev, &enabled);
884 if (ret)
885 return ret;
886 if (enabled)
887 return 0;
888 brightness++;
889 }
1da177e4 890
893f3f62 891 hci_result = hci_read1(dev, HCI_LCD_BRIGHTNESS, &value);
1864bbc2 892 if (hci_result == TOS_SUCCESS)
121b7b0d 893 return brightness + (value >> HCI_LCD_BRIGHTNESS_SHIFT);
32bcd5cb
SF
894
895 return -EIO;
c9263557
HM
896}
897
62cce752
SF
898static int get_lcd_brightness(struct backlight_device *bd)
899{
900 struct toshiba_acpi_dev *dev = bl_get_data(bd);
901 return __get_lcd_brightness(dev);
902}
903
936c8bcd 904static int lcd_proc_show(struct seq_file *m, void *v)
c9263557 905{
135740de
SF
906 struct toshiba_acpi_dev *dev = m->private;
907 int value;
121b7b0d 908 int levels;
135740de
SF
909
910 if (!dev->backlight_dev)
911 return -ENODEV;
c9263557 912
121b7b0d 913 levels = dev->backlight_dev->props.max_brightness + 1;
62cce752 914 value = get_lcd_brightness(dev->backlight_dev);
c9263557 915 if (value >= 0) {
936c8bcd 916 seq_printf(m, "brightness: %d\n", value);
121b7b0d 917 seq_printf(m, "brightness_levels: %d\n", levels);
32bcd5cb 918 return 0;
1da177e4
LT
919 }
920
32bcd5cb
SF
921 pr_err("Error reading LCD brightness\n");
922 return -EIO;
936c8bcd
AD
923}
924
925static int lcd_proc_open(struct inode *inode, struct file *file)
926{
d9dda78b 927 return single_open(file, lcd_proc_show, PDE_DATA(inode));
1da177e4
LT
928}
929
62cce752 930static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
c9263557 931{
a39f46df 932 u32 hci_result;
c9263557 933
121b7b0d
AI
934 if (dev->tr_backlight_supported) {
935 bool enable = !value;
936 int ret = set_tr_backlight_status(dev, enable);
937 if (ret)
938 return ret;
939 if (value)
940 value--;
941 }
942
a39f46df
AA
943 value = value << HCI_LCD_BRIGHTNESS_SHIFT;
944 hci_result = hci_write1(dev, HCI_LCD_BRIGHTNESS, value);
945 return hci_result == TOS_SUCCESS ? 0 : -EIO;
c9263557
HM
946}
947
948static int set_lcd_status(struct backlight_device *bd)
949{
135740de 950 struct toshiba_acpi_dev *dev = bl_get_data(bd);
62cce752 951 return set_lcd_brightness(dev, bd->props.brightness);
c9263557
HM
952}
953
936c8bcd
AD
954static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
955 size_t count, loff_t *pos)
1da177e4 956{
d9dda78b 957 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
936c8bcd
AD
958 char cmd[42];
959 size_t len;
1da177e4 960 int value;
c8af57eb 961 int ret;
121b7b0d 962 int levels = dev->backlight_dev->props.max_brightness + 1;
1da177e4 963
936c8bcd
AD
964 len = min(count, sizeof(cmd) - 1);
965 if (copy_from_user(cmd, buf, len))
966 return -EFAULT;
967 cmd[len] = '\0';
968
969 if (sscanf(cmd, " brightness : %i", &value) == 1 &&
121b7b0d 970 value >= 0 && value < levels) {
62cce752 971 ret = set_lcd_brightness(dev, value);
c8af57eb
MO
972 if (ret == 0)
973 ret = count;
974 } else {
c9263557 975 ret = -EINVAL;
c8af57eb 976 }
c9263557 977 return ret;
1da177e4
LT
978}
979
936c8bcd
AD
980static const struct file_operations lcd_proc_fops = {
981 .owner = THIS_MODULE,
982 .open = lcd_proc_open,
983 .read = seq_read,
984 .llseek = seq_lseek,
985 .release = single_release,
986 .write = lcd_proc_write,
987};
988
36d03f93
SF
989static int get_video_status(struct toshiba_acpi_dev *dev, u32 *status)
990{
991 u32 hci_result;
992
893f3f62 993 hci_result = hci_read1(dev, HCI_VIDEO_OUT, status);
1864bbc2 994 return hci_result == TOS_SUCCESS ? 0 : -EIO;
36d03f93
SF
995}
996
936c8bcd 997static int video_proc_show(struct seq_file *m, void *v)
1da177e4 998{
135740de 999 struct toshiba_acpi_dev *dev = m->private;
1da177e4 1000 u32 value;
36d03f93 1001 int ret;
1da177e4 1002
36d03f93
SF
1003 ret = get_video_status(dev, &value);
1004 if (!ret) {
1da177e4
LT
1005 int is_lcd = (value & HCI_VIDEO_OUT_LCD) ? 1 : 0;
1006 int is_crt = (value & HCI_VIDEO_OUT_CRT) ? 1 : 0;
4be44fcd 1007 int is_tv = (value & HCI_VIDEO_OUT_TV) ? 1 : 0;
936c8bcd
AD
1008 seq_printf(m, "lcd_out: %d\n", is_lcd);
1009 seq_printf(m, "crt_out: %d\n", is_crt);
1010 seq_printf(m, "tv_out: %d\n", is_tv);
1da177e4
LT
1011 }
1012
36d03f93 1013 return ret;
1da177e4
LT
1014}
1015
936c8bcd 1016static int video_proc_open(struct inode *inode, struct file *file)
1da177e4 1017{
d9dda78b 1018 return single_open(file, video_proc_show, PDE_DATA(inode));
936c8bcd
AD
1019}
1020
1021static ssize_t video_proc_write(struct file *file, const char __user *buf,
1022 size_t count, loff_t *pos)
1023{
d9dda78b 1024 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
936c8bcd 1025 char *cmd, *buffer;
36d03f93 1026 int ret;
1da177e4
LT
1027 int value;
1028 int remain = count;
1029 int lcd_out = -1;
1030 int crt_out = -1;
1031 int tv_out = -1;
b4482a4b 1032 u32 video_out;
1da177e4 1033
936c8bcd
AD
1034 cmd = kmalloc(count + 1, GFP_KERNEL);
1035 if (!cmd)
1036 return -ENOMEM;
1037 if (copy_from_user(cmd, buf, count)) {
1038 kfree(cmd);
1039 return -EFAULT;
1040 }
1041 cmd[count] = '\0';
1042
1043 buffer = cmd;
1044
1da177e4
LT
1045 /* scan expression. Multiple expressions may be delimited with ;
1046 *
1047 * NOTE: to keep scanning simple, invalid fields are ignored
1048 */
1049 while (remain) {
1050 if (sscanf(buffer, " lcd_out : %i", &value) == 1)
1051 lcd_out = value & 1;
1052 else if (sscanf(buffer, " crt_out : %i", &value) == 1)
1053 crt_out = value & 1;
1054 else if (sscanf(buffer, " tv_out : %i", &value) == 1)
1055 tv_out = value & 1;
1056 /* advance to one character past the next ; */
1057 do {
1058 ++buffer;
1059 --remain;
1060 }
4be44fcd 1061 while (remain && *(buffer - 1) != ';');
1da177e4
LT
1062 }
1063
936c8bcd
AD
1064 kfree(cmd);
1065
36d03f93
SF
1066 ret = get_video_status(dev, &video_out);
1067 if (!ret) {
9e113e00 1068 unsigned int new_video_out = video_out;
1da177e4
LT
1069 if (lcd_out != -1)
1070 _set_bit(&new_video_out, HCI_VIDEO_OUT_LCD, lcd_out);
1071 if (crt_out != -1)
1072 _set_bit(&new_video_out, HCI_VIDEO_OUT_CRT, crt_out);
1073 if (tv_out != -1)
1074 _set_bit(&new_video_out, HCI_VIDEO_OUT_TV, tv_out);
1075 /* To avoid unnecessary video disruption, only write the new
1076 * video setting if something changed. */
1077 if (new_video_out != video_out)
32bcd5cb 1078 ret = write_acpi_int(METHOD_VIDEO_OUT, new_video_out);
1da177e4
LT
1079 }
1080
32bcd5cb 1081 return ret ? ret : count;
1da177e4
LT
1082}
1083
936c8bcd
AD
1084static const struct file_operations video_proc_fops = {
1085 .owner = THIS_MODULE,
1086 .open = video_proc_open,
1087 .read = seq_read,
1088 .llseek = seq_lseek,
1089 .release = single_release,
1090 .write = video_proc_write,
1091};
1092
36d03f93
SF
1093static int get_fan_status(struct toshiba_acpi_dev *dev, u32 *status)
1094{
1095 u32 hci_result;
1096
893f3f62 1097 hci_result = hci_read1(dev, HCI_FAN, status);
1864bbc2 1098 return hci_result == TOS_SUCCESS ? 0 : -EIO;
36d03f93
SF
1099}
1100
936c8bcd 1101static int fan_proc_show(struct seq_file *m, void *v)
1da177e4 1102{
135740de 1103 struct toshiba_acpi_dev *dev = m->private;
36d03f93 1104 int ret;
1da177e4
LT
1105 u32 value;
1106
36d03f93
SF
1107 ret = get_fan_status(dev, &value);
1108 if (!ret) {
936c8bcd 1109 seq_printf(m, "running: %d\n", (value > 0));
135740de 1110 seq_printf(m, "force_on: %d\n", dev->force_fan);
1da177e4
LT
1111 }
1112
36d03f93 1113 return ret;
936c8bcd
AD
1114}
1115
1116static int fan_proc_open(struct inode *inode, struct file *file)
1117{
d9dda78b 1118 return single_open(file, fan_proc_show, PDE_DATA(inode));
1da177e4
LT
1119}
1120
936c8bcd
AD
1121static ssize_t fan_proc_write(struct file *file, const char __user *buf,
1122 size_t count, loff_t *pos)
1da177e4 1123{
d9dda78b 1124 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
936c8bcd
AD
1125 char cmd[42];
1126 size_t len;
1da177e4
LT
1127 int value;
1128 u32 hci_result;
1129
936c8bcd
AD
1130 len = min(count, sizeof(cmd) - 1);
1131 if (copy_from_user(cmd, buf, len))
1132 return -EFAULT;
1133 cmd[len] = '\0';
1134
1135 if (sscanf(cmd, " force_on : %i", &value) == 1 &&
4be44fcd 1136 value >= 0 && value <= 1) {
893f3f62 1137 hci_result = hci_write1(dev, HCI_FAN, value);
1864bbc2 1138 if (hci_result != TOS_SUCCESS)
32bcd5cb 1139 return -EIO;
1da177e4 1140 else
135740de 1141 dev->force_fan = value;
1da177e4
LT
1142 } else {
1143 return -EINVAL;
1144 }
1145
1146 return count;
1147}
1148
936c8bcd
AD
1149static const struct file_operations fan_proc_fops = {
1150 .owner = THIS_MODULE,
1151 .open = fan_proc_open,
1152 .read = seq_read,
1153 .llseek = seq_lseek,
1154 .release = single_release,
1155 .write = fan_proc_write,
1156};
1157
1158static int keys_proc_show(struct seq_file *m, void *v)
1da177e4 1159{
135740de 1160 struct toshiba_acpi_dev *dev = m->private;
1da177e4
LT
1161 u32 hci_result;
1162 u32 value;
1163
11948b93 1164 if (!dev->key_event_valid && dev->system_event_supported) {
893f3f62 1165 hci_result = hci_read1(dev, HCI_SYSTEM_EVENT, &value);
1864bbc2 1166 if (hci_result == TOS_SUCCESS) {
135740de
SF
1167 dev->key_event_valid = 1;
1168 dev->last_key_event = value;
1864bbc2 1169 } else if (hci_result == TOS_FIFO_EMPTY) {
1da177e4 1170 /* better luck next time */
1864bbc2 1171 } else if (hci_result == TOS_NOT_SUPPORTED) {
1da177e4
LT
1172 /* This is a workaround for an unresolved issue on
1173 * some machines where system events sporadically
1174 * become disabled. */
893f3f62 1175 hci_result = hci_write1(dev, HCI_SYSTEM_EVENT, 1);
7e33460d 1176 pr_notice("Re-enabled hotkeys\n");
1da177e4 1177 } else {
7e33460d 1178 pr_err("Error reading hotkey status\n");
32bcd5cb 1179 return -EIO;
1da177e4
LT
1180 }
1181 }
1182
135740de
SF
1183 seq_printf(m, "hotkey_ready: %d\n", dev->key_event_valid);
1184 seq_printf(m, "hotkey: 0x%04x\n", dev->last_key_event);
936c8bcd
AD
1185 return 0;
1186}
1da177e4 1187
936c8bcd
AD
1188static int keys_proc_open(struct inode *inode, struct file *file)
1189{
d9dda78b 1190 return single_open(file, keys_proc_show, PDE_DATA(inode));
1da177e4
LT
1191}
1192
936c8bcd
AD
1193static ssize_t keys_proc_write(struct file *file, const char __user *buf,
1194 size_t count, loff_t *pos)
1da177e4 1195{
d9dda78b 1196 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
936c8bcd
AD
1197 char cmd[42];
1198 size_t len;
1da177e4
LT
1199 int value;
1200
936c8bcd
AD
1201 len = min(count, sizeof(cmd) - 1);
1202 if (copy_from_user(cmd, buf, len))
1203 return -EFAULT;
1204 cmd[len] = '\0';
1205
1206 if (sscanf(cmd, " hotkey_ready : %i", &value) == 1 && value == 0) {
135740de 1207 dev->key_event_valid = 0;
1da177e4
LT
1208 } else {
1209 return -EINVAL;
1210 }
1211
1212 return count;
1213}
1214
936c8bcd
AD
1215static const struct file_operations keys_proc_fops = {
1216 .owner = THIS_MODULE,
1217 .open = keys_proc_open,
1218 .read = seq_read,
1219 .llseek = seq_lseek,
1220 .release = single_release,
1221 .write = keys_proc_write,
1222};
1223
1224static int version_proc_show(struct seq_file *m, void *v)
1da177e4 1225{
936c8bcd
AD
1226 seq_printf(m, "driver: %s\n", TOSHIBA_ACPI_VERSION);
1227 seq_printf(m, "proc_interface: %d\n", PROC_INTERFACE_VERSION);
1228 return 0;
1da177e4
LT
1229}
1230
936c8bcd
AD
1231static int version_proc_open(struct inode *inode, struct file *file)
1232{
d9dda78b 1233 return single_open(file, version_proc_show, PDE_DATA(inode));
936c8bcd
AD
1234}
1235
1236static const struct file_operations version_proc_fops = {
1237 .owner = THIS_MODULE,
1238 .open = version_proc_open,
1239 .read = seq_read,
1240 .llseek = seq_lseek,
1241 .release = single_release,
1242};
1243
1da177e4
LT
1244/* proc and module init
1245 */
1246
1247#define PROC_TOSHIBA "toshiba"
1248
b859f159 1249static void create_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
1da177e4 1250{
36d03f93
SF
1251 if (dev->backlight_dev)
1252 proc_create_data("lcd", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1253 &lcd_proc_fops, dev);
1254 if (dev->video_supported)
1255 proc_create_data("video", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1256 &video_proc_fops, dev);
1257 if (dev->fan_supported)
1258 proc_create_data("fan", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1259 &fan_proc_fops, dev);
1260 if (dev->hotkey_dev)
1261 proc_create_data("keys", S_IRUGO | S_IWUSR, toshiba_proc_dir,
1262 &keys_proc_fops, dev);
135740de
SF
1263 proc_create_data("version", S_IRUGO, toshiba_proc_dir,
1264 &version_proc_fops, dev);
1da177e4
LT
1265}
1266
36d03f93 1267static void remove_toshiba_proc_entries(struct toshiba_acpi_dev *dev)
1da177e4 1268{
36d03f93
SF
1269 if (dev->backlight_dev)
1270 remove_proc_entry("lcd", toshiba_proc_dir);
1271 if (dev->video_supported)
1272 remove_proc_entry("video", toshiba_proc_dir);
1273 if (dev->fan_supported)
1274 remove_proc_entry("fan", toshiba_proc_dir);
1275 if (dev->hotkey_dev)
1276 remove_proc_entry("keys", toshiba_proc_dir);
936c8bcd 1277 remove_proc_entry("version", toshiba_proc_dir);
1da177e4
LT
1278}
1279
acc2472e 1280static const struct backlight_ops toshiba_backlight_data = {
121b7b0d 1281 .options = BL_CORE_SUSPENDRESUME,
62cce752
SF
1282 .get_brightness = get_lcd_brightness,
1283 .update_status = set_lcd_status,
c9263557 1284};
ea6b31f4 1285
360f0f39
AA
1286/*
1287 * Sysfs files
1288 */
93f8c16d
AA
1289static ssize_t toshiba_kbd_bl_mode_store(struct device *dev,
1290 struct device_attribute *attr,
1291 const char *buf, size_t count);
1292static ssize_t toshiba_kbd_bl_mode_show(struct device *dev,
1293 struct device_attribute *attr,
1294 char *buf);
1295static ssize_t toshiba_kbd_type_show(struct device *dev,
1296 struct device_attribute *attr,
1297 char *buf);
1298static ssize_t toshiba_available_kbd_modes_show(struct device *dev,
1299 struct device_attribute *attr,
1300 char *buf);
1301static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev,
1302 struct device_attribute *attr,
1303 const char *buf, size_t count);
1304static ssize_t toshiba_kbd_bl_timeout_show(struct device *dev,
1305 struct device_attribute *attr,
1306 char *buf);
1307static ssize_t toshiba_touchpad_store(struct device *dev,
1308 struct device_attribute *attr,
1309 const char *buf, size_t count);
1310static ssize_t toshiba_touchpad_show(struct device *dev,
1311 struct device_attribute *attr,
1312 char *buf);
1313static ssize_t toshiba_position_show(struct device *dev,
1314 struct device_attribute *attr,
1315 char *buf);
1316
1317static DEVICE_ATTR(kbd_backlight_mode, S_IRUGO | S_IWUSR,
1318 toshiba_kbd_bl_mode_show, toshiba_kbd_bl_mode_store);
1319static DEVICE_ATTR(kbd_type, S_IRUGO, toshiba_kbd_type_show, NULL);
1320static DEVICE_ATTR(available_kbd_modes, S_IRUGO,
1321 toshiba_available_kbd_modes_show, NULL);
1322static DEVICE_ATTR(kbd_backlight_timeout, S_IRUGO | S_IWUSR,
1323 toshiba_kbd_bl_timeout_show, toshiba_kbd_bl_timeout_store);
1324static DEVICE_ATTR(touchpad, S_IRUGO | S_IWUSR,
1325 toshiba_touchpad_show, toshiba_touchpad_store);
1326static DEVICE_ATTR(position, S_IRUGO, toshiba_position_show, NULL);
1327
1328static struct attribute *toshiba_attributes[] = {
1329 &dev_attr_kbd_backlight_mode.attr,
1330 &dev_attr_kbd_type.attr,
1331 &dev_attr_available_kbd_modes.attr,
1332 &dev_attr_kbd_backlight_timeout.attr,
1333 &dev_attr_touchpad.attr,
1334 &dev_attr_position.attr,
1335 NULL,
1336};
1337
1338static umode_t toshiba_sysfs_is_visible(struct kobject *,
1339 struct attribute *, int);
1340
1341static struct attribute_group toshiba_attr_group = {
1342 .is_visible = toshiba_sysfs_is_visible,
1343 .attrs = toshiba_attributes,
1344};
360f0f39
AA
1345
1346static ssize_t toshiba_kbd_bl_mode_store(struct device *dev,
1347 struct device_attribute *attr,
1348 const char *buf, size_t count)
1349{
1350 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
aeaac098
DC
1351 int mode;
1352 int time;
1353 int ret;
1354
360f0f39 1355
aeaac098
DC
1356 ret = kstrtoint(buf, 0, &mode);
1357 if (ret)
1358 return ret;
93f8c16d
AA
1359
1360 /* Check for supported modes depending on keyboard backlight type */
1361 if (toshiba->kbd_type == 1) {
1362 /* Type 1 supports SCI_KBD_MODE_FNZ and SCI_KBD_MODE_AUTO */
1363 if (mode != SCI_KBD_MODE_FNZ && mode != SCI_KBD_MODE_AUTO)
1364 return -EINVAL;
1365 } else if (toshiba->kbd_type == 2) {
1366 /* Type 2 doesn't support SCI_KBD_MODE_FNZ */
1367 if (mode != SCI_KBD_MODE_AUTO && mode != SCI_KBD_MODE_ON &&
1368 mode != SCI_KBD_MODE_OFF)
1369 return -EINVAL;
1370 }
360f0f39
AA
1371
1372 /* Set the Keyboard Backlight Mode where:
360f0f39
AA
1373 * Auto - KBD backlight turns off automatically in given time
1374 * FN-Z - KBD backlight "toggles" when hotkey pressed
93f8c16d
AA
1375 * ON - KBD backlight is always on
1376 * OFF - KBD backlight is always off
360f0f39 1377 */
93f8c16d
AA
1378
1379 /* Only make a change if the actual mode has changed */
aeaac098 1380 if (toshiba->kbd_mode != mode) {
93f8c16d 1381 /* Shift the time to "base time" (0x3c0000 == 60 seconds) */
360f0f39 1382 time = toshiba->kbd_time << HCI_MISC_SHIFT;
93f8c16d
AA
1383
1384 /* OR the "base time" to the actual method format */
1385 if (toshiba->kbd_type == 1) {
1386 /* Type 1 requires the current mode */
1387 time |= toshiba->kbd_mode;
1388 } else if (toshiba->kbd_type == 2) {
1389 /* Type 2 requires the desired mode */
1390 time |= mode;
1391 }
1392
aeaac098
DC
1393 ret = toshiba_kbd_illum_status_set(toshiba, time);
1394 if (ret)
1395 return ret;
93f8c16d
AA
1396
1397 /* Update sysfs entries on successful mode change*/
1398 ret = sysfs_update_group(&toshiba->acpi_dev->dev.kobj,
1399 &toshiba_attr_group);
1400 if (ret)
1401 return ret;
1402
360f0f39
AA
1403 toshiba->kbd_mode = mode;
1404 }
1405
1406 return count;
1407}
1408
1409static ssize_t toshiba_kbd_bl_mode_show(struct device *dev,
1410 struct device_attribute *attr,
1411 char *buf)
1412{
1413 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1414 u32 time;
1415
1416 if (toshiba_kbd_illum_status_get(toshiba, &time) < 0)
1417 return -EIO;
1418
93f8c16d
AA
1419 return sprintf(buf, "%i\n", time & SCI_KBD_MODE_MASK);
1420}
1421
1422static ssize_t toshiba_kbd_type_show(struct device *dev,
1423 struct device_attribute *attr,
1424 char *buf)
1425{
1426 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1427
1428 return sprintf(buf, "%d\n", toshiba->kbd_type);
1429}
1430
1431static ssize_t toshiba_available_kbd_modes_show(struct device *dev,
1432 struct device_attribute *attr,
1433 char *buf)
1434{
1435 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1436
1437 if (toshiba->kbd_type == 1)
1438 return sprintf(buf, "%x %x\n",
1439 SCI_KBD_MODE_FNZ, SCI_KBD_MODE_AUTO);
1440
1441 return sprintf(buf, "%x %x %x\n",
1442 SCI_KBD_MODE_AUTO, SCI_KBD_MODE_ON, SCI_KBD_MODE_OFF);
360f0f39
AA
1443}
1444
1445static ssize_t toshiba_kbd_bl_timeout_store(struct device *dev,
1446 struct device_attribute *attr,
1447 const char *buf, size_t count)
1448{
1449 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
eabde0fa
AA
1450 int time;
1451 int ret;
360f0f39 1452
eabde0fa
AA
1453 ret = kstrtoint(buf, 0, &time);
1454 if (ret)
1455 return ret;
1456
1457 /* Check for supported values depending on kbd_type */
1458 if (toshiba->kbd_type == 1) {
1459 if (time < 0 || time > 60)
1460 return -EINVAL;
1461 } else if (toshiba->kbd_type == 2) {
1462 if (time < 1 || time > 60)
1463 return -EINVAL;
1464 }
1465
1466 /* Set the Keyboard Backlight Timeout */
360f0f39 1467
eabde0fa
AA
1468 /* Only make a change if the actual timeout has changed */
1469 if (toshiba->kbd_time != time) {
1470 /* Shift the time to "base time" (0x3c0000 == 60 seconds) */
360f0f39 1471 time = time << HCI_MISC_SHIFT;
eabde0fa
AA
1472 /* OR the "base time" to the actual method format */
1473 if (toshiba->kbd_type == 1)
1474 time |= SCI_KBD_MODE_FNZ;
1475 else if (toshiba->kbd_type == 2)
1476 time |= SCI_KBD_MODE_AUTO;
1477
1478 ret = toshiba_kbd_illum_status_set(toshiba, time);
1479 if (ret)
1480 return ret;
1481
360f0f39
AA
1482 toshiba->kbd_time = time >> HCI_MISC_SHIFT;
1483 }
1484
1485 return count;
1486}
1487
1488static ssize_t toshiba_kbd_bl_timeout_show(struct device *dev,
1489 struct device_attribute *attr,
1490 char *buf)
1491{
1492 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1493 u32 time;
1494
1495 if (toshiba_kbd_illum_status_get(toshiba, &time) < 0)
1496 return -EIO;
1497
1498 return sprintf(buf, "%i\n", time >> HCI_MISC_SHIFT);
1499}
ea6b31f4 1500
9d8658ac
AA
1501static ssize_t toshiba_touchpad_store(struct device *dev,
1502 struct device_attribute *attr,
1503 const char *buf, size_t count)
1504{
1505 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1506 int state;
c8a41669 1507 int ret;
9d8658ac
AA
1508
1509 /* Set the TouchPad on/off, 0 - Disable | 1 - Enable */
c8a41669
AA
1510 ret = kstrtoint(buf, 0, &state);
1511 if (ret)
1512 return ret;
1513 if (state != 0 && state != 1)
1514 return -EINVAL;
1515
1516 ret = toshiba_touchpad_set(toshiba, state);
1517 if (ret)
1518 return ret;
9d8658ac
AA
1519
1520 return count;
1521}
1522
1523static ssize_t toshiba_touchpad_show(struct device *dev,
1524 struct device_attribute *attr, char *buf)
1525{
1526 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1527 u32 state;
1528 int ret;
1529
1530 ret = toshiba_touchpad_get(toshiba, &state);
1531 if (ret < 0)
1532 return ret;
1533
1534 return sprintf(buf, "%i\n", state);
1535}
ea6b31f4 1536
5a2813e9
AA
1537static ssize_t toshiba_position_show(struct device *dev,
1538 struct device_attribute *attr, char *buf)
1539{
1540 struct toshiba_acpi_dev *toshiba = dev_get_drvdata(dev);
1541 u32 xyval, zval, tmp;
1542 u16 x, y, z;
1543 int ret;
1544
1545 xyval = zval = 0;
1546 ret = toshiba_accelerometer_get(toshiba, &xyval, &zval);
1547 if (ret < 0)
1548 return ret;
1549
1550 x = xyval & HCI_ACCEL_MASK;
1551 tmp = xyval >> HCI_MISC_SHIFT;
1552 y = tmp & HCI_ACCEL_MASK;
1553 z = zval & HCI_ACCEL_MASK;
1554
1555 return sprintf(buf, "%d %d %d\n", x, y, z);
1556}
360f0f39 1557
360f0f39
AA
1558static umode_t toshiba_sysfs_is_visible(struct kobject *kobj,
1559 struct attribute *attr, int idx)
1560{
1561 struct device *dev = container_of(kobj, struct device, kobj);
1562 struct toshiba_acpi_dev *drv = dev_get_drvdata(dev);
1563 bool exists = true;
1564
1565 if (attr == &dev_attr_kbd_backlight_mode.attr)
1566 exists = (drv->kbd_illum_supported) ? true : false;
1567 else if (attr == &dev_attr_kbd_backlight_timeout.attr)
1568 exists = (drv->kbd_mode == SCI_KBD_MODE_AUTO) ? true : false;
9d8658ac
AA
1569 else if (attr == &dev_attr_touchpad.attr)
1570 exists = (drv->touchpad_supported) ? true : false;
5a2813e9
AA
1571 else if (attr == &dev_attr_position.attr)
1572 exists = (drv->accelerometer_supported) ? true : false;
360f0f39
AA
1573
1574 return exists ? attr->mode : 0;
1575}
1576
29cd293f
SF
1577static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
1578 struct serio *port)
1579{
98280374 1580 if (str & I8042_STR_AUXDATA)
29cd293f
SF
1581 return false;
1582
1583 if (unlikely(data == 0xe0))
1584 return false;
1585
1586 if ((data & 0x7f) == TOS1900_FN_SCAN) {
1587 schedule_work(&toshiba_acpi->hotkey_work);
1588 return true;
1589 }
1590
1591 return false;
1592}
1593
1594static void toshiba_acpi_hotkey_work(struct work_struct *work)
1595{
1596 acpi_handle ec_handle = ec_get_handle();
1597 acpi_status status;
1598
1599 if (!ec_handle)
1600 return;
1601
1602 status = acpi_evaluate_object(ec_handle, "NTFY", NULL, NULL);
1603 if (ACPI_FAILURE(status))
1604 pr_err("ACPI NTFY method execution failed\n");
1605}
1606
1607/*
1608 * Returns hotkey scancode, or < 0 on failure.
1609 */
1610static int toshiba_acpi_query_hotkey(struct toshiba_acpi_dev *dev)
1611{
74facaf7 1612 unsigned long long value;
29cd293f
SF
1613 acpi_status status;
1614
74facaf7
ZR
1615 status = acpi_evaluate_integer(dev->acpi_dev->handle, "INFO",
1616 NULL, &value);
1617 if (ACPI_FAILURE(status)) {
29cd293f
SF
1618 pr_err("ACPI INFO method execution failed\n");
1619 return -EIO;
1620 }
1621
74facaf7 1622 return value;
29cd293f
SF
1623}
1624
1625static void toshiba_acpi_report_hotkey(struct toshiba_acpi_dev *dev,
1626 int scancode)
1627{
1628 if (scancode == 0x100)
1629 return;
1630
1631 /* act on key press; ignore key release */
1632 if (scancode & 0x80)
1633 return;
1634
1635 if (!sparse_keymap_report_event(dev->hotkey_dev, scancode, 1, true))
1636 pr_info("Unknown key %x\n", scancode);
1637}
1638
b859f159 1639static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
6335e4d5
MG
1640{
1641 acpi_status status;
e2e19606 1642 acpi_handle ec_handle;
384a7cd9 1643 int error;
29cd293f 1644 u32 hci_result;
fe808bfb 1645 const struct key_entry *keymap = toshiba_acpi_keymap;
6335e4d5 1646
135740de 1647 dev->hotkey_dev = input_allocate_device();
b222cca6 1648 if (!dev->hotkey_dev)
6335e4d5 1649 return -ENOMEM;
6335e4d5 1650
135740de 1651 dev->hotkey_dev->name = "Toshiba input device";
6e02cc7e 1652 dev->hotkey_dev->phys = "toshiba_acpi/input0";
135740de 1653 dev->hotkey_dev->id.bustype = BUS_HOST;
6335e4d5 1654
fe808bfb
TI
1655 if (dmi_check_system(toshiba_alt_keymap_dmi))
1656 keymap = toshiba_acpi_alt_keymap;
1657 error = sparse_keymap_setup(dev->hotkey_dev, keymap, NULL);
384a7cd9
DT
1658 if (error)
1659 goto err_free_dev;
1660
29cd293f
SF
1661 /*
1662 * For some machines the SCI responsible for providing hotkey
1663 * notification doesn't fire. We can trigger the notification
1664 * whenever the Fn key is pressed using the NTFY method, if
1665 * supported, so if it's present set up an i8042 key filter
1666 * for this purpose.
1667 */
1668 status = AE_ERROR;
1669 ec_handle = ec_get_handle();
e2e19606 1670 if (ec_handle && acpi_has_method(ec_handle, "NTFY")) {
29cd293f
SF
1671 INIT_WORK(&dev->hotkey_work, toshiba_acpi_hotkey_work);
1672
1673 error = i8042_install_filter(toshiba_acpi_i8042_filter);
1674 if (error) {
1675 pr_err("Error installing key filter\n");
1676 goto err_free_keymap;
1677 }
1678
1679 dev->ntfy_supported = 1;
1680 }
1681
1682 /*
1683 * Determine hotkey query interface. Prefer using the INFO
1684 * method when it is available.
1685 */
e2e19606 1686 if (acpi_has_method(dev->acpi_dev->handle, "INFO"))
29cd293f 1687 dev->info_supported = 1;
e2e19606 1688 else {
893f3f62 1689 hci_result = hci_write1(dev, HCI_SYSTEM_EVENT, 1);
1864bbc2 1690 if (hci_result == TOS_SUCCESS)
29cd293f
SF
1691 dev->system_event_supported = 1;
1692 }
1693
1694 if (!dev->info_supported && !dev->system_event_supported) {
1695 pr_warn("No hotkey query interface found\n");
1696 goto err_remove_filter;
1697 }
1698
6e02cc7e 1699 status = acpi_evaluate_object(dev->acpi_dev->handle, "ENAB", NULL, NULL);
384a7cd9 1700 if (ACPI_FAILURE(status)) {
7e33460d 1701 pr_info("Unable to enable hotkeys\n");
384a7cd9 1702 error = -ENODEV;
29cd293f 1703 goto err_remove_filter;
6335e4d5
MG
1704 }
1705
135740de 1706 error = input_register_device(dev->hotkey_dev);
384a7cd9 1707 if (error) {
7e33460d 1708 pr_info("Unable to register input device\n");
29cd293f 1709 goto err_remove_filter;
6335e4d5
MG
1710 }
1711
893f3f62 1712 hci_result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE);
6335e4d5 1713 return 0;
384a7cd9 1714
29cd293f
SF
1715 err_remove_filter:
1716 if (dev->ntfy_supported)
1717 i8042_remove_filter(toshiba_acpi_i8042_filter);
384a7cd9 1718 err_free_keymap:
135740de 1719 sparse_keymap_free(dev->hotkey_dev);
384a7cd9 1720 err_free_dev:
135740de
SF
1721 input_free_device(dev->hotkey_dev);
1722 dev->hotkey_dev = NULL;
384a7cd9 1723 return error;
6335e4d5
MG
1724}
1725
b859f159 1726static int toshiba_acpi_setup_backlight(struct toshiba_acpi_dev *dev)
62cce752
SF
1727{
1728 struct backlight_properties props;
1729 int brightness;
1730 int ret;
121b7b0d 1731 bool enabled;
62cce752
SF
1732
1733 /*
1734 * Some machines don't support the backlight methods at all, and
1735 * others support it read-only. Either of these is pretty useless,
1736 * so only register the backlight device if the backlight method
1737 * supports both reads and writes.
1738 */
1739 brightness = __get_lcd_brightness(dev);
1740 if (brightness < 0)
1741 return 0;
1742 ret = set_lcd_brightness(dev, brightness);
1743 if (ret) {
1744 pr_debug("Backlight method is read-only, disabling backlight support\n");
1745 return 0;
1746 }
1747
121b7b0d
AI
1748 /* Determine whether or not BIOS supports transflective backlight */
1749 ret = get_tr_backlight_status(dev, &enabled);
1750 dev->tr_backlight_supported = !ret;
1751
53039f22 1752 memset(&props, 0, sizeof(props));
62cce752
SF
1753 props.type = BACKLIGHT_PLATFORM;
1754 props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
62cce752 1755
121b7b0d
AI
1756 /* adding an extra level and having 0 change to transflective mode */
1757 if (dev->tr_backlight_supported)
1758 props.max_brightness++;
1759
62cce752
SF
1760 dev->backlight_dev = backlight_device_register("toshiba",
1761 &dev->acpi_dev->dev,
1762 dev,
1763 &toshiba_backlight_data,
1764 &props);
1765 if (IS_ERR(dev->backlight_dev)) {
1766 ret = PTR_ERR(dev->backlight_dev);
1767 pr_err("Could not register toshiba backlight device\n");
1768 dev->backlight_dev = NULL;
1769 return ret;
1770 }
1771
1772 dev->backlight_dev->props.brightness = brightness;
1773 return 0;
1774}
1775
51fac838 1776static int toshiba_acpi_remove(struct acpi_device *acpi_dev)
c9263557 1777{
135740de 1778 struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
6335e4d5 1779
36d03f93 1780 remove_toshiba_proc_entries(dev);
ea6b31f4 1781
360f0f39
AA
1782 if (dev->sysfs_created)
1783 sysfs_remove_group(&dev->acpi_dev->dev.kobj,
1784 &toshiba_attr_group);
c41a40c5 1785
29cd293f
SF
1786 if (dev->ntfy_supported) {
1787 i8042_remove_filter(toshiba_acpi_i8042_filter);
1788 cancel_work_sync(&dev->hotkey_work);
1789 }
1790
135740de
SF
1791 if (dev->hotkey_dev) {
1792 input_unregister_device(dev->hotkey_dev);
1793 sparse_keymap_free(dev->hotkey_dev);
1794 }
c9263557 1795
135740de
SF
1796 if (dev->bt_rfk) {
1797 rfkill_unregister(dev->bt_rfk);
1798 rfkill_destroy(dev->bt_rfk);
1799 }
c9263557 1800
00981810 1801 backlight_device_unregister(dev->backlight_dev);
c9263557 1802
36d03f93 1803 if (dev->illumination_supported)
135740de 1804 led_classdev_unregister(&dev->led_dev);
ea6b31f4 1805
360f0f39
AA
1806 if (dev->kbd_led_registered)
1807 led_classdev_unregister(&dev->kbd_led);
ea6b31f4 1808
def6c4e2
AA
1809 if (dev->eco_supported)
1810 led_classdev_unregister(&dev->eco_led);
6c3f6e6c 1811
29cd293f
SF
1812 if (toshiba_acpi)
1813 toshiba_acpi = NULL;
1814
135740de 1815 kfree(dev);
c41a40c5 1816
135740de 1817 return 0;
c9263557
HM
1818}
1819
b859f159 1820static const char *find_hci_method(acpi_handle handle)
a540d6b5 1821{
e2e19606 1822 if (acpi_has_method(handle, "GHCI"))
a540d6b5
SF
1823 return "GHCI";
1824
e2e19606 1825 if (acpi_has_method(handle, "SPFC"))
a540d6b5
SF
1826 return "SPFC";
1827
1828 return NULL;
1829}
1830
b859f159 1831static int toshiba_acpi_add(struct acpi_device *acpi_dev)
1da177e4 1832{
135740de 1833 struct toshiba_acpi_dev *dev;
a540d6b5 1834 const char *hci_method;
36d03f93 1835 u32 dummy;
c41a40c5 1836 bool bt_present;
c41a40c5 1837 int ret = 0;
1da177e4 1838
29cd293f
SF
1839 if (toshiba_acpi)
1840 return -EBUSY;
1841
135740de
SF
1842 pr_info("Toshiba Laptop ACPI Extras version %s\n",
1843 TOSHIBA_ACPI_VERSION);
1844
a540d6b5
SF
1845 hci_method = find_hci_method(acpi_dev->handle);
1846 if (!hci_method) {
1847 pr_err("HCI interface not found\n");
6e02cc7e 1848 return -ENODEV;
a540d6b5 1849 }
6e02cc7e 1850
135740de
SF
1851 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1852 if (!dev)
1853 return -ENOMEM;
1854 dev->acpi_dev = acpi_dev;
a540d6b5 1855 dev->method_hci = hci_method;
135740de 1856 acpi_dev->driver_data = dev;
360f0f39 1857 dev_set_drvdata(&acpi_dev->dev, dev);
fb9802fa 1858
6e02cc7e
SF
1859 if (toshiba_acpi_setup_keyboard(dev))
1860 pr_info("Unable to activate hotkeys\n");
135740de
SF
1861
1862 mutex_init(&dev->mutex);
1da177e4 1863
62cce752
SF
1864 ret = toshiba_acpi_setup_backlight(dev);
1865 if (ret)
135740de 1866 goto error;
1da177e4 1867
c41a40c5 1868 /* Register rfkill switch for Bluetooth */
1864bbc2 1869 if (hci_get_bt_present(dev, &bt_present) == TOS_SUCCESS && bt_present) {
135740de
SF
1870 dev->bt_rfk = rfkill_alloc("Toshiba Bluetooth",
1871 &acpi_dev->dev,
1872 RFKILL_TYPE_BLUETOOTH,
1873 &toshiba_rfk_ops,
1874 dev);
1875 if (!dev->bt_rfk) {
7e33460d 1876 pr_err("unable to allocate rfkill device\n");
135740de
SF
1877 ret = -ENOMEM;
1878 goto error;
c41a40c5 1879 }
1880
135740de 1881 ret = rfkill_register(dev->bt_rfk);
c41a40c5 1882 if (ret) {
7e33460d 1883 pr_err("unable to register rfkill device\n");
135740de
SF
1884 rfkill_destroy(dev->bt_rfk);
1885 goto error;
38aefbc5 1886 }
c41a40c5 1887 }
1888
135740de
SF
1889 if (toshiba_illumination_available(dev)) {
1890 dev->led_dev.name = "toshiba::illumination";
1891 dev->led_dev.max_brightness = 1;
1892 dev->led_dev.brightness_set = toshiba_illumination_set;
1893 dev->led_dev.brightness_get = toshiba_illumination_get;
1894 if (!led_classdev_register(&acpi_dev->dev, &dev->led_dev))
36d03f93 1895 dev->illumination_supported = 1;
6c3f6e6c 1896 }
ea6b31f4 1897
def6c4e2
AA
1898 if (toshiba_eco_mode_available(dev)) {
1899 dev->eco_led.name = "toshiba::eco_mode";
1900 dev->eco_led.max_brightness = 1;
1901 dev->eco_led.brightness_set = toshiba_eco_mode_set_status;
1902 dev->eco_led.brightness_get = toshiba_eco_mode_get_status;
1903 if (!led_classdev_register(&dev->acpi_dev->dev, &dev->eco_led))
1904 dev->eco_supported = 1;
1905 }
ea6b31f4 1906
93f8c16d 1907 dev->kbd_illum_supported = toshiba_kbd_illum_available(dev);
360f0f39
AA
1908 /*
1909 * Only register the LED if KBD illumination is supported
1910 * and the keyboard backlight operation mode is set to FN-Z
1911 */
1912 if (dev->kbd_illum_supported && dev->kbd_mode == SCI_KBD_MODE_FNZ) {
1913 dev->kbd_led.name = "toshiba::kbd_backlight";
1914 dev->kbd_led.max_brightness = 1;
1915 dev->kbd_led.brightness_set = toshiba_kbd_backlight_set;
1916 dev->kbd_led.brightness_get = toshiba_kbd_backlight_get;
1917 if (!led_classdev_register(&dev->acpi_dev->dev, &dev->kbd_led))
1918 dev->kbd_led_registered = 1;
1919 }
ea6b31f4 1920
9d8658ac
AA
1921 ret = toshiba_touchpad_get(dev, &dummy);
1922 dev->touchpad_supported = !ret;
ea6b31f4 1923
5a2813e9
AA
1924 ret = toshiba_accelerometer_supported(dev);
1925 dev->accelerometer_supported = !ret;
6c3f6e6c 1926
36d03f93
SF
1927 /* Determine whether or not BIOS supports fan and video interfaces */
1928
1929 ret = get_video_status(dev, &dummy);
1930 dev->video_supported = !ret;
1931
1932 ret = get_fan_status(dev, &dummy);
1933 dev->fan_supported = !ret;
1934
360f0f39
AA
1935 ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,
1936 &toshiba_attr_group);
1937 if (ret) {
1938 dev->sysfs_created = 0;
1939 goto error;
1940 }
1941 dev->sysfs_created = !ret;
1942
36d03f93
SF
1943 create_toshiba_proc_entries(dev);
1944
29cd293f
SF
1945 toshiba_acpi = dev;
1946
c41a40c5 1947 return 0;
135740de
SF
1948
1949error:
51fac838 1950 toshiba_acpi_remove(acpi_dev);
135740de
SF
1951 return ret;
1952}
1953
1954static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event)
1955{
1956 struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
1957 u32 hci_result, value;
11948b93 1958 int retries = 3;
29cd293f 1959 int scancode;
135740de 1960
29cd293f 1961 if (event != 0x80)
135740de 1962 return;
11948b93 1963
29cd293f
SF
1964 if (dev->info_supported) {
1965 scancode = toshiba_acpi_query_hotkey(dev);
1966 if (scancode < 0)
1967 pr_err("Failed to query hotkey event\n");
1968 else if (scancode != 0)
1969 toshiba_acpi_report_hotkey(dev, scancode);
1970 } else if (dev->system_event_supported) {
1971 do {
893f3f62 1972 hci_result = hci_read1(dev, HCI_SYSTEM_EVENT, &value);
29cd293f 1973 switch (hci_result) {
1864bbc2 1974 case TOS_SUCCESS:
29cd293f
SF
1975 toshiba_acpi_report_hotkey(dev, (int)value);
1976 break;
1864bbc2 1977 case TOS_NOT_SUPPORTED:
29cd293f
SF
1978 /*
1979 * This is a workaround for an unresolved
1980 * issue on some machines where system events
1981 * sporadically become disabled.
1982 */
893f3f62
AA
1983 hci_result =
1984 hci_write1(dev, HCI_SYSTEM_EVENT, 1);
29cd293f
SF
1985 pr_notice("Re-enabled hotkeys\n");
1986 /* fall through */
1987 default:
1988 retries--;
1989 break;
135740de 1990 }
1864bbc2 1991 } while (retries && hci_result != TOS_FIFO_EMPTY);
29cd293f 1992 }
135740de
SF
1993}
1994
3567a4e2 1995#ifdef CONFIG_PM_SLEEP
43d2fd3b 1996static int toshiba_acpi_suspend(struct device *device)
29cd293f 1997{
43d2fd3b 1998 struct toshiba_acpi_dev *dev = acpi_driver_data(to_acpi_device(device));
29cd293f
SF
1999 u32 result;
2000
2001 if (dev->hotkey_dev)
893f3f62 2002 result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_DISABLE);
29cd293f
SF
2003
2004 return 0;
2005}
2006
43d2fd3b 2007static int toshiba_acpi_resume(struct device *device)
29cd293f 2008{
43d2fd3b 2009 struct toshiba_acpi_dev *dev = acpi_driver_data(to_acpi_device(device));
29cd293f 2010 u32 result;
e7fdb762
BT
2011 acpi_status status;
2012
2013 if (dev->hotkey_dev) {
2014 status = acpi_evaluate_object(dev->acpi_dev->handle, "ENAB",
2015 NULL, NULL);
2016 if (ACPI_FAILURE(status))
2017 pr_info("Unable to re-enable hotkeys\n");
29cd293f 2018
893f3f62 2019 result = hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE);
e7fdb762 2020 }
29cd293f
SF
2021
2022 return 0;
2023}
3567a4e2 2024#endif
135740de 2025
43d2fd3b
RW
2026static SIMPLE_DEV_PM_OPS(toshiba_acpi_pm,
2027 toshiba_acpi_suspend, toshiba_acpi_resume);
2028
135740de
SF
2029static struct acpi_driver toshiba_acpi_driver = {
2030 .name = "Toshiba ACPI driver",
2031 .owner = THIS_MODULE,
2032 .ids = toshiba_device_ids,
2033 .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
2034 .ops = {
2035 .add = toshiba_acpi_add,
2036 .remove = toshiba_acpi_remove,
2037 .notify = toshiba_acpi_notify,
2038 },
43d2fd3b 2039 .drv.pm = &toshiba_acpi_pm,
135740de
SF
2040};
2041
2042static int __init toshiba_acpi_init(void)
2043{
2044 int ret;
2045
f11f999e
SF
2046 /*
2047 * Machines with this WMI guid aren't supported due to bugs in
2048 * their AML. This check relies on wmi initializing before
2049 * toshiba_acpi to guarantee guids have been identified.
2050 */
2051 if (wmi_has_guid(TOSHIBA_WMI_EVENT_GUID))
2052 return -ENODEV;
2053
135740de
SF
2054 toshiba_proc_dir = proc_mkdir(PROC_TOSHIBA, acpi_root_dir);
2055 if (!toshiba_proc_dir) {
2056 pr_err("Unable to create proc dir " PROC_TOSHIBA "\n");
2057 return -ENODEV;
2058 }
2059
2060 ret = acpi_bus_register_driver(&toshiba_acpi_driver);
2061 if (ret) {
2062 pr_err("Failed to register ACPI driver: %d\n", ret);
2063 remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
2064 }
2065
2066 return ret;
2067}
2068
2069static void __exit toshiba_acpi_exit(void)
2070{
2071 acpi_bus_unregister_driver(&toshiba_acpi_driver);
2072 if (toshiba_proc_dir)
2073 remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
1da177e4
LT
2074}
2075
2076module_init(toshiba_acpi_init);
2077module_exit(toshiba_acpi_exit);