19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 #include <linux/kernel.h>
22 #include <linux/module.h>
24 #include <linux/bitops.h>
28 #include <linux/device.h>
30 #include <linux/input.h>
34 #define MODULENAME "fujitsu-tablet"
36 #define ACPI_FUJITSU_CLASS "fujitsu"
38 #define INVERT_TABLET_MODE_BIT 0x01
39 #define INVERT_DOCK_STATE_BIT 0x02
40 #define FORCE_TABLET_MODE_IF_UNDOCK 0x04
143 static u8 fujitsu_ack(
void)
148 static u8 fujitsu_status(
void)
153 static u8 fujitsu_read_register(
const u8 addr)
159 static void fujitsu_send_state(
void)
162 int dock, tablet_mode;
164 state = fujitsu_read_register(0xdd);
173 tablet_mode = state & 0x01;
175 tablet_mode = !tablet_mode;
183 static void fujitsu_reset(
void)
189 while ((fujitsu_status() & 0x02) && (--timeout))
192 fujitsu_send_state();
198 struct input_dev *
idev;
202 idev = input_allocate_device();
206 idev->dev.parent = parent;
210 idev->id.vendor = 0x1734;
211 idev->id.product = 0x0001;
212 idev->id.version = 0x0101;
214 idev->keycode =
fujitsu.config.keymap;
215 idev->keycodesize =
sizeof(
fujitsu.config.keymap[0]);
222 input_set_capability(idev,
EV_KEY,
fujitsu.config.keymap[i]);
229 error = input_register_device(idev);
231 input_free_device(idev);
239 static void input_fujitsu_remove(
void)
241 input_unregister_device(
fujitsu.idev);
246 unsigned long keymask,
changed;
251 if (
unlikely(!(fujitsu_status() & 0x01)))
254 fujitsu_send_state();
256 keymask = fujitsu_read_register(0xde);
257 keymask |= fujitsu_read_register(0xdf) << 8;
260 changed = keymask ^
fujitsu.prev_keymask;
262 fujitsu.prev_keymask = keymask;
266 pressed = keymask & changed &
BIT(i);
271 input_report_key(
fujitsu.idev, keycode, pressed);
284 sizeof(
fujitsu.config.keymap));
289 fujitsu_dmi_common(dmi);
296 fujitsu_dmi_common(dmi);
304 .callback = fujitsu_dmi_lifebook,
305 .ident =
"Fujitsu Siemens P/T Series",
310 .driver_data = keymap_Lifebook_Tseries
313 .callback = fujitsu_dmi_lifebook,
314 .ident =
"Fujitsu Lifebook T Series",
319 .driver_data = keymap_Lifebook_Tseries
322 .callback = fujitsu_dmi_stylistic,
323 .ident =
"Fujitsu Siemens Stylistic T Series",
328 .driver_data = keymap_Stylistic_Tseries
331 .callback = fujitsu_dmi_lifebook,
332 .ident =
"Fujitsu LifeBook U810",
337 .driver_data = keymap_Lifebook_U810
340 .callback = fujitsu_dmi_stylistic,
341 .ident =
"Fujitsu Siemens Stylistic ST5xxx Series",
346 .driver_data = keymap_Stylistic_ST5xxx
349 .callback = fujitsu_dmi_stylistic,
350 .ident =
"Fujitsu Siemens Stylistic ST5xxx Series",
355 .driver_data = keymap_Stylistic_ST5xxx
358 .callback = fujitsu_dmi_lifebook,
359 .ident =
"Unknown (using defaults)",
364 .driver_data = keymap_Lifebook_Tseries
393 static int __devinit acpi_fujitsu_add(
struct acpi_device *adev)
402 fujitsu_walk_resources,
NULL);
412 error = input_fujitsu_setup(&adev->dev,
418 input_fujitsu_remove();
428 input_fujitsu_remove();
435 static int __devexit acpi_fujitsu_remove(
struct acpi_device *adev,
int type)
439 input_fujitsu_remove();
443 #ifdef CONFIG_PM_SLEEP
444 static int acpi_fujitsu_resume(
struct device *
dev)
453 static struct acpi_driver acpi_fujitsu_driver = {
458 .add = acpi_fujitsu_add,
459 .remove = acpi_fujitsu_remove,
461 .drv.pm = &acpi_fujitsu_pm,
464 static int __init fujitsu_module_init(
void)
477 static void __exit fujitsu_module_exit(
void)