Pull sony into release branch
This commit is contained in:
@@ -142,43 +142,124 @@ struct sony_laptop_keypress {
|
|||||||
int key;
|
int key;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Correspondance table between sonypi events and input layer events */
|
/* Correspondance table between sonypi events
|
||||||
static struct {
|
* and input layer indexes in the keymap
|
||||||
int sonypiev;
|
*/
|
||||||
int inputev;
|
static int sony_laptop_input_index[] = {
|
||||||
} sony_laptop_inputkeys[] = {
|
-1, /* no event */
|
||||||
{ SONYPI_EVENT_CAPTURE_PRESSED, KEY_CAMERA },
|
-1, /* SONYPI_EVENT_JOGDIAL_DOWN */
|
||||||
{ SONYPI_EVENT_FNKEY_ONLY, KEY_FN },
|
-1, /* SONYPI_EVENT_JOGDIAL_UP */
|
||||||
{ SONYPI_EVENT_FNKEY_ESC, KEY_FN_ESC },
|
-1, /* SONYPI_EVENT_JOGDIAL_DOWN_PRESSED */
|
||||||
{ SONYPI_EVENT_FNKEY_F1, KEY_FN_F1 },
|
-1, /* SONYPI_EVENT_JOGDIAL_UP_PRESSED */
|
||||||
{ SONYPI_EVENT_FNKEY_F2, KEY_FN_F2 },
|
-1, /* SONYPI_EVENT_JOGDIAL_PRESSED */
|
||||||
{ SONYPI_EVENT_FNKEY_F3, KEY_FN_F3 },
|
-1, /* SONYPI_EVENT_JOGDIAL_RELEASED */
|
||||||
{ SONYPI_EVENT_FNKEY_F4, KEY_FN_F4 },
|
0, /* SONYPI_EVENT_CAPTURE_PRESSED */
|
||||||
{ SONYPI_EVENT_FNKEY_F5, KEY_FN_F5 },
|
1, /* SONYPI_EVENT_CAPTURE_RELEASED */
|
||||||
{ SONYPI_EVENT_FNKEY_F6, KEY_FN_F6 },
|
2, /* SONYPI_EVENT_CAPTURE_PARTIALPRESSED */
|
||||||
{ SONYPI_EVENT_FNKEY_F7, KEY_FN_F7 },
|
3, /* SONYPI_EVENT_CAPTURE_PARTIALRELEASED */
|
||||||
{ SONYPI_EVENT_FNKEY_F8, KEY_FN_F8 },
|
4, /* SONYPI_EVENT_FNKEY_ESC */
|
||||||
{ SONYPI_EVENT_FNKEY_F9, KEY_FN_F9 },
|
5, /* SONYPI_EVENT_FNKEY_F1 */
|
||||||
{ SONYPI_EVENT_FNKEY_F10, KEY_FN_F10 },
|
6, /* SONYPI_EVENT_FNKEY_F2 */
|
||||||
{ SONYPI_EVENT_FNKEY_F11, KEY_FN_F11 },
|
7, /* SONYPI_EVENT_FNKEY_F3 */
|
||||||
{ SONYPI_EVENT_FNKEY_F12, KEY_FN_F12 },
|
8, /* SONYPI_EVENT_FNKEY_F4 */
|
||||||
{ SONYPI_EVENT_FNKEY_1, KEY_FN_1 },
|
9, /* SONYPI_EVENT_FNKEY_F5 */
|
||||||
{ SONYPI_EVENT_FNKEY_2, KEY_FN_2 },
|
10, /* SONYPI_EVENT_FNKEY_F6 */
|
||||||
{ SONYPI_EVENT_FNKEY_D, KEY_FN_D },
|
11, /* SONYPI_EVENT_FNKEY_F7 */
|
||||||
{ SONYPI_EVENT_FNKEY_E, KEY_FN_E },
|
12, /* SONYPI_EVENT_FNKEY_F8 */
|
||||||
{ SONYPI_EVENT_FNKEY_F, KEY_FN_F },
|
13, /* SONYPI_EVENT_FNKEY_F9 */
|
||||||
{ SONYPI_EVENT_FNKEY_S, KEY_FN_S },
|
14, /* SONYPI_EVENT_FNKEY_F10 */
|
||||||
{ SONYPI_EVENT_FNKEY_B, KEY_FN_B },
|
15, /* SONYPI_EVENT_FNKEY_F11 */
|
||||||
{ SONYPI_EVENT_BLUETOOTH_PRESSED, KEY_BLUE },
|
16, /* SONYPI_EVENT_FNKEY_F12 */
|
||||||
{ SONYPI_EVENT_BLUETOOTH_ON, KEY_BLUE },
|
17, /* SONYPI_EVENT_FNKEY_1 */
|
||||||
{ SONYPI_EVENT_PKEY_P1, KEY_PROG1 },
|
18, /* SONYPI_EVENT_FNKEY_2 */
|
||||||
{ SONYPI_EVENT_PKEY_P2, KEY_PROG2 },
|
19, /* SONYPI_EVENT_FNKEY_D */
|
||||||
{ SONYPI_EVENT_PKEY_P3, KEY_PROG3 },
|
20, /* SONYPI_EVENT_FNKEY_E */
|
||||||
{ SONYPI_EVENT_BACK_PRESSED, KEY_BACK },
|
21, /* SONYPI_EVENT_FNKEY_F */
|
||||||
{ SONYPI_EVENT_HELP_PRESSED, KEY_HELP },
|
22, /* SONYPI_EVENT_FNKEY_S */
|
||||||
{ SONYPI_EVENT_ZOOM_PRESSED, KEY_ZOOM },
|
23, /* SONYPI_EVENT_FNKEY_B */
|
||||||
{ SONYPI_EVENT_THUMBPHRASE_PRESSED, BTN_THUMB },
|
24, /* SONYPI_EVENT_BLUETOOTH_PRESSED */
|
||||||
{ 0, 0 },
|
25, /* SONYPI_EVENT_PKEY_P1 */
|
||||||
|
26, /* SONYPI_EVENT_PKEY_P2 */
|
||||||
|
27, /* SONYPI_EVENT_PKEY_P3 */
|
||||||
|
28, /* SONYPI_EVENT_BACK_PRESSED */
|
||||||
|
-1, /* SONYPI_EVENT_LID_CLOSED */
|
||||||
|
-1, /* SONYPI_EVENT_LID_OPENED */
|
||||||
|
29, /* SONYPI_EVENT_BLUETOOTH_ON */
|
||||||
|
30, /* SONYPI_EVENT_BLUETOOTH_OFF */
|
||||||
|
31, /* SONYPI_EVENT_HELP_PRESSED */
|
||||||
|
32, /* SONYPI_EVENT_FNKEY_ONLY */
|
||||||
|
33, /* SONYPI_EVENT_JOGDIAL_FAST_DOWN */
|
||||||
|
34, /* SONYPI_EVENT_JOGDIAL_FAST_UP */
|
||||||
|
35, /* SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED */
|
||||||
|
36, /* SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED */
|
||||||
|
37, /* SONYPI_EVENT_JOGDIAL_VFAST_DOWN */
|
||||||
|
38, /* SONYPI_EVENT_JOGDIAL_VFAST_UP */
|
||||||
|
39, /* SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED */
|
||||||
|
40, /* SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED */
|
||||||
|
41, /* SONYPI_EVENT_ZOOM_PRESSED */
|
||||||
|
42, /* SONYPI_EVENT_THUMBPHRASE_PRESSED */
|
||||||
|
43, /* SONYPI_EVENT_MEYE_FACE */
|
||||||
|
44, /* SONYPI_EVENT_MEYE_OPPOSITE */
|
||||||
|
45, /* SONYPI_EVENT_MEMORYSTICK_INSERT */
|
||||||
|
46, /* SONYPI_EVENT_MEMORYSTICK_EJECT */
|
||||||
|
-1, /* SONYPI_EVENT_ANYBUTTON_RELEASED */
|
||||||
|
-1, /* SONYPI_EVENT_BATTERY_INSERT */
|
||||||
|
-1, /* SONYPI_EVENT_BATTERY_REMOVE */
|
||||||
|
-1, /* SONYPI_EVENT_FNKEY_RELEASED */
|
||||||
|
47, /* SONYPI_EVENT_WIRELESS_ON */
|
||||||
|
48, /* SONYPI_EVENT_WIRELESS_OFF */
|
||||||
|
};
|
||||||
|
|
||||||
|
static int sony_laptop_input_keycode_map[] = {
|
||||||
|
KEY_CAMERA, /* 0 SONYPI_EVENT_CAPTURE_PRESSED */
|
||||||
|
KEY_RESERVED, /* 1 SONYPI_EVENT_CAPTURE_RELEASED */
|
||||||
|
KEY_RESERVED, /* 2 SONYPI_EVENT_CAPTURE_PARTIALPRESSED */
|
||||||
|
KEY_RESERVED, /* 3 SONYPI_EVENT_CAPTURE_PARTIALRELEASED */
|
||||||
|
KEY_FN_ESC, /* 4 SONYPI_EVENT_FNKEY_ESC */
|
||||||
|
KEY_FN_F1, /* 5 SONYPI_EVENT_FNKEY_F1 */
|
||||||
|
KEY_FN_F2, /* 6 SONYPI_EVENT_FNKEY_F2 */
|
||||||
|
KEY_FN_F3, /* 7 SONYPI_EVENT_FNKEY_F3 */
|
||||||
|
KEY_FN_F4, /* 8 SONYPI_EVENT_FNKEY_F4 */
|
||||||
|
KEY_FN_F5, /* 9 SONYPI_EVENT_FNKEY_F5 */
|
||||||
|
KEY_FN_F6, /* 10 SONYPI_EVENT_FNKEY_F6 */
|
||||||
|
KEY_FN_F7, /* 11 SONYPI_EVENT_FNKEY_F7 */
|
||||||
|
KEY_FN_F8, /* 12 SONYPI_EVENT_FNKEY_F8 */
|
||||||
|
KEY_FN_F9, /* 13 SONYPI_EVENT_FNKEY_F9 */
|
||||||
|
KEY_FN_F10, /* 14 SONYPI_EVENT_FNKEY_F10 */
|
||||||
|
KEY_FN_F11, /* 15 SONYPI_EVENT_FNKEY_F11 */
|
||||||
|
KEY_FN_F12, /* 16 SONYPI_EVENT_FNKEY_F12 */
|
||||||
|
KEY_FN_F1, /* 17 SONYPI_EVENT_FNKEY_1 */
|
||||||
|
KEY_FN_F2, /* 18 SONYPI_EVENT_FNKEY_2 */
|
||||||
|
KEY_FN_D, /* 19 SONYPI_EVENT_FNKEY_D */
|
||||||
|
KEY_FN_E, /* 20 SONYPI_EVENT_FNKEY_E */
|
||||||
|
KEY_FN_F, /* 21 SONYPI_EVENT_FNKEY_F */
|
||||||
|
KEY_FN_S, /* 22 SONYPI_EVENT_FNKEY_S */
|
||||||
|
KEY_FN_B, /* 23 SONYPI_EVENT_FNKEY_B */
|
||||||
|
KEY_BLUETOOTH, /* 24 SONYPI_EVENT_BLUETOOTH_PRESSED */
|
||||||
|
KEY_PROG1, /* 25 SONYPI_EVENT_PKEY_P1 */
|
||||||
|
KEY_PROG2, /* 26 SONYPI_EVENT_PKEY_P2 */
|
||||||
|
KEY_PROG3, /* 27 SONYPI_EVENT_PKEY_P3 */
|
||||||
|
KEY_BACK, /* 28 SONYPI_EVENT_BACK_PRESSED */
|
||||||
|
KEY_BLUETOOTH, /* 29 SONYPI_EVENT_BLUETOOTH_ON */
|
||||||
|
KEY_BLUETOOTH, /* 30 SONYPI_EVENT_BLUETOOTH_OFF */
|
||||||
|
KEY_HELP, /* 31 SONYPI_EVENT_HELP_PRESSED */
|
||||||
|
KEY_FN, /* 32 SONYPI_EVENT_FNKEY_ONLY */
|
||||||
|
KEY_RESERVED, /* 33 SONYPI_EVENT_JOGDIAL_FAST_DOWN */
|
||||||
|
KEY_RESERVED, /* 34 SONYPI_EVENT_JOGDIAL_FAST_UP */
|
||||||
|
KEY_RESERVED, /* 35 SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED */
|
||||||
|
KEY_RESERVED, /* 36 SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED */
|
||||||
|
KEY_RESERVED, /* 37 SONYPI_EVENT_JOGDIAL_VFAST_DOWN */
|
||||||
|
KEY_RESERVED, /* 38 SONYPI_EVENT_JOGDIAL_VFAST_UP */
|
||||||
|
KEY_RESERVED, /* 39 SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED */
|
||||||
|
KEY_RESERVED, /* 40 SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED */
|
||||||
|
KEY_ZOOM, /* 41 SONYPI_EVENT_ZOOM_PRESSED */
|
||||||
|
BTN_THUMB, /* 42 SONYPI_EVENT_THUMBPHRASE_PRESSED */
|
||||||
|
KEY_RESERVED, /* 43 SONYPI_EVENT_MEYE_FACE */
|
||||||
|
KEY_RESERVED, /* 44 SONYPI_EVENT_MEYE_OPPOSITE */
|
||||||
|
KEY_RESERVED, /* 45 SONYPI_EVENT_MEMORYSTICK_INSERT */
|
||||||
|
KEY_RESERVED, /* 46 SONYPI_EVENT_MEMORYSTICK_EJECT */
|
||||||
|
KEY_WLAN, /* 47 SONYPI_EVENT_WIRELESS_ON */
|
||||||
|
KEY_WLAN, /* 48 SONYPI_EVENT_WIRELESS_OFF */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* release buttons after a short delay if pressed */
|
/* release buttons after a short delay if pressed */
|
||||||
@@ -202,7 +283,6 @@ static void sony_laptop_report_input_event(u8 event)
|
|||||||
struct input_dev *jog_dev = sony_laptop_input.jog_dev;
|
struct input_dev *jog_dev = sony_laptop_input.jog_dev;
|
||||||
struct input_dev *key_dev = sony_laptop_input.key_dev;
|
struct input_dev *key_dev = sony_laptop_input.key_dev;
|
||||||
struct sony_laptop_keypress kp = { NULL };
|
struct sony_laptop_keypress kp = { NULL };
|
||||||
int i;
|
|
||||||
|
|
||||||
if (event == SONYPI_EVENT_FNKEY_RELEASED) {
|
if (event == SONYPI_EVENT_FNKEY_RELEASED) {
|
||||||
/* Nothing, not all VAIOs generate this event */
|
/* Nothing, not all VAIOs generate this event */
|
||||||
@@ -231,17 +311,22 @@ static void sony_laptop_report_input_event(u8 event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
for (i = 0; sony_laptop_inputkeys[i].sonypiev; i++)
|
if (event > ARRAY_SIZE (sony_laptop_input_keycode_map)) {
|
||||||
if (event == sony_laptop_inputkeys[i].sonypiev) {
|
dprintk("sony_laptop_report_input_event, event not known: %d\n", event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sony_laptop_input_index[event] != -1) {
|
||||||
|
kp.key = sony_laptop_input_keycode_map[sony_laptop_input_index[event]];
|
||||||
|
if (kp.key != KEY_UNKNOWN)
|
||||||
kp.dev = key_dev;
|
kp.dev = key_dev;
|
||||||
kp.key = sony_laptop_inputkeys[i].inputev;
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kp.dev) {
|
if (kp.dev) {
|
||||||
input_report_key(kp.dev, kp.key, 1);
|
input_report_key(kp.dev, kp.key, 1);
|
||||||
|
/* we emit the scancode so we can always remap the key */
|
||||||
|
input_event(kp.dev, EV_MSC, MSC_SCAN, event);
|
||||||
input_sync(kp.dev);
|
input_sync(kp.dev);
|
||||||
kfifo_put(sony_laptop_input.fifo,
|
kfifo_put(sony_laptop_input.fifo,
|
||||||
(unsigned char *)&kp, sizeof(kp));
|
(unsigned char *)&kp, sizeof(kp));
|
||||||
@@ -296,11 +381,18 @@ static int sony_laptop_setup_input(void)
|
|||||||
key_dev->id.vendor = PCI_VENDOR_ID_SONY;
|
key_dev->id.vendor = PCI_VENDOR_ID_SONY;
|
||||||
|
|
||||||
/* Initialize the Input Drivers: special keys */
|
/* Initialize the Input Drivers: special keys */
|
||||||
key_dev->evbit[0] = BIT(EV_KEY);
|
set_bit(EV_KEY, key_dev->evbit);
|
||||||
for (i = 0; sony_laptop_inputkeys[i].sonypiev; i++)
|
set_bit(EV_MSC, key_dev->evbit);
|
||||||
if (sony_laptop_inputkeys[i].inputev)
|
set_bit(MSC_SCAN, key_dev->mscbit);
|
||||||
set_bit(sony_laptop_inputkeys[i].inputev,
|
key_dev->keycodesize = sizeof(sony_laptop_input_keycode_map[0]);
|
||||||
key_dev->keybit);
|
key_dev->keycodemax = ARRAY_SIZE(sony_laptop_input_keycode_map);
|
||||||
|
key_dev->keycode = &sony_laptop_input_keycode_map;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(sony_laptop_input_keycode_map); i++) {
|
||||||
|
if (sony_laptop_input_keycode_map[i] != KEY_RESERVED) {
|
||||||
|
set_bit(sony_laptop_input_keycode_map[i],
|
||||||
|
key_dev->keybit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
error = input_register_device(key_dev);
|
error = input_register_device(key_dev);
|
||||||
if (error)
|
if (error)
|
||||||
@@ -487,6 +579,14 @@ SNC_HANDLE_NAMES(audiopower_set, "AZPW");
|
|||||||
SNC_HANDLE_NAMES(lanpower_get, "GLNP");
|
SNC_HANDLE_NAMES(lanpower_get, "GLNP");
|
||||||
SNC_HANDLE_NAMES(lanpower_set, "LNPW");
|
SNC_HANDLE_NAMES(lanpower_set, "LNPW");
|
||||||
|
|
||||||
|
SNC_HANDLE_NAMES(lidstate_get, "GLID");
|
||||||
|
|
||||||
|
SNC_HANDLE_NAMES(indicatorlamp_get, "GILS");
|
||||||
|
SNC_HANDLE_NAMES(indicatorlamp_set, "SILS");
|
||||||
|
|
||||||
|
SNC_HANDLE_NAMES(gainbass_get, "GMGB");
|
||||||
|
SNC_HANDLE_NAMES(gainbass_set, "CMGB");
|
||||||
|
|
||||||
SNC_HANDLE_NAMES(PID_get, "GPID");
|
SNC_HANDLE_NAMES(PID_get, "GPID");
|
||||||
|
|
||||||
SNC_HANDLE_NAMES(CTR_get, "GCTR");
|
SNC_HANDLE_NAMES(CTR_get, "GCTR");
|
||||||
@@ -507,6 +607,12 @@ static struct sony_nc_value sony_nc_values[] = {
|
|||||||
boolean_validate, 0),
|
boolean_validate, 0),
|
||||||
SNC_HANDLE(lanpower, snc_lanpower_get, snc_lanpower_set,
|
SNC_HANDLE(lanpower, snc_lanpower_get, snc_lanpower_set,
|
||||||
boolean_validate, 1),
|
boolean_validate, 1),
|
||||||
|
SNC_HANDLE(lidstate, snc_lidstate_get, NULL,
|
||||||
|
boolean_validate, 0),
|
||||||
|
SNC_HANDLE(indicatorlamp, snc_indicatorlamp_get, snc_indicatorlamp_set,
|
||||||
|
boolean_validate, 0),
|
||||||
|
SNC_HANDLE(gainbass, snc_gainbass_get, snc_gainbass_set,
|
||||||
|
boolean_validate, 0),
|
||||||
/* unknown methods */
|
/* unknown methods */
|
||||||
SNC_HANDLE(PID, snc_PID_get, NULL, NULL, 1),
|
SNC_HANDLE(PID, snc_PID_get, NULL, NULL, 1),
|
||||||
SNC_HANDLE(CTR, snc_CTR_get, snc_CTR_set, NULL, 1),
|
SNC_HANDLE(CTR, snc_CTR_get, snc_CTR_set, NULL, 1),
|
||||||
@@ -688,14 +794,117 @@ static struct backlight_ops sony_backlight_ops = {
|
|||||||
.get_brightness = sony_backlight_get_brightness,
|
.get_brightness = sony_backlight_get_brightness,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* New SNC-only Vaios event mapping to driver known keys
|
||||||
|
*/
|
||||||
|
struct sony_nc_event {
|
||||||
|
u8 data;
|
||||||
|
u8 event;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sony_nc_event *sony_nc_events;
|
||||||
|
|
||||||
|
/* Vaio C* --maybe also FE*, N* and AR* ?-- special init sequence
|
||||||
|
* for Fn keys
|
||||||
|
*/
|
||||||
|
static int sony_nc_C_enable(struct dmi_system_id *id)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
printk(KERN_NOTICE DRV_PFX "detected %s\n", id->ident);
|
||||||
|
|
||||||
|
sony_nc_events = id->driver_data;
|
||||||
|
|
||||||
|
if (acpi_callsetfunc(sony_nc_acpi_handle, "SN02", 0x4, &result) < 0
|
||||||
|
|| acpi_callsetfunc(sony_nc_acpi_handle, "SN07", 0x2, &result) < 0
|
||||||
|
|| acpi_callsetfunc(sony_nc_acpi_handle, "SN02", 0x10, &result) < 0
|
||||||
|
|| acpi_callsetfunc(sony_nc_acpi_handle, "SN07", 0x0, &result) < 0
|
||||||
|
|| acpi_callsetfunc(sony_nc_acpi_handle, "SN03", 0x2, &result) < 0
|
||||||
|
|| acpi_callsetfunc(sony_nc_acpi_handle, "SN07", 0x101, &result) < 0) {
|
||||||
|
printk(KERN_WARNING DRV_PFX "failed to initialize SNC, some "
|
||||||
|
"functionalities may be missing\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sony_nc_event sony_C_events[] = {
|
||||||
|
{ 0x81, SONYPI_EVENT_FNKEY_F1 },
|
||||||
|
{ 0x01, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0x85, SONYPI_EVENT_FNKEY_F5 },
|
||||||
|
{ 0x05, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0x86, SONYPI_EVENT_FNKEY_F6 },
|
||||||
|
{ 0x06, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0x87, SONYPI_EVENT_FNKEY_F7 },
|
||||||
|
{ 0x07, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0x8A, SONYPI_EVENT_FNKEY_F10 },
|
||||||
|
{ 0x0A, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0x8C, SONYPI_EVENT_FNKEY_F12 },
|
||||||
|
{ 0x0C, SONYPI_EVENT_FNKEY_RELEASED },
|
||||||
|
{ 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SNC-only model map */
|
||||||
|
struct dmi_system_id sony_nc_ids[] = {
|
||||||
|
{
|
||||||
|
.ident = "Sony Vaio FE Series",
|
||||||
|
.callback = sony_nc_C_enable,
|
||||||
|
.driver_data = sony_C_events,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FE"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.ident = "Sony Vaio C Series",
|
||||||
|
.callback = sony_nc_C_enable,
|
||||||
|
.driver_data = sony_C_events,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-C"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ACPI callbacks
|
* ACPI callbacks
|
||||||
*/
|
*/
|
||||||
static void sony_acpi_notify(acpi_handle handle, u32 event, void *data)
|
static void sony_acpi_notify(acpi_handle handle, u32 event, void *data)
|
||||||
{
|
{
|
||||||
dprintk("sony_acpi_notify, event: %d\n", event);
|
struct sony_nc_event *evmap;
|
||||||
sony_laptop_report_input_event(event);
|
u32 ev = event;
|
||||||
acpi_bus_generate_event(sony_nc_acpi_device, 1, event);
|
int result;
|
||||||
|
|
||||||
|
if (ev == 0x92) {
|
||||||
|
/* read the key pressed from EC.GECR
|
||||||
|
* A call to SN07 with 0x0202 will do it as well respecting
|
||||||
|
* the current protocol on different OSes
|
||||||
|
*
|
||||||
|
* Note: the path for GECR may be
|
||||||
|
* \_SB.PCI0.LPCB.EC (C, FE, AR, N and friends)
|
||||||
|
* \_SB.PCI0.PIB.EC0 (VGN-FR notifications are sent directly, no GECR)
|
||||||
|
*
|
||||||
|
* TODO: we may want to do the same for the older GHKE -need
|
||||||
|
* dmi list- so this snippet may become one more callback.
|
||||||
|
*/
|
||||||
|
if (acpi_callsetfunc(handle, "SN07", 0x0202, &result) < 0)
|
||||||
|
dprintk("sony_acpi_notify, unable to decode event 0x%.2x\n", ev);
|
||||||
|
else
|
||||||
|
ev = result & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sony_nc_events)
|
||||||
|
for (evmap = sony_nc_events; evmap->event; evmap++) {
|
||||||
|
if (evmap->data == ev) {
|
||||||
|
ev = evmap->event;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintk("sony_acpi_notify, event: 0x%.2x\n", ev);
|
||||||
|
sony_laptop_report_input_event(ev);
|
||||||
|
acpi_bus_generate_event(sony_nc_acpi_device, 1, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
|
static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
|
||||||
@@ -732,6 +941,10 @@ static int sony_nc_resume(struct acpi_device *device)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* re-initialize models with specific requirements */
|
||||||
|
dmi_check_system(sony_nc_ids);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,6 +963,15 @@ static int sony_nc_add(struct acpi_device *device)
|
|||||||
|
|
||||||
sony_nc_acpi_handle = device->handle;
|
sony_nc_acpi_handle = device->handle;
|
||||||
|
|
||||||
|
/* read device status */
|
||||||
|
result = acpi_bus_get_status(device);
|
||||||
|
/* bail IFF the above call was successful and the device is not present */
|
||||||
|
if (!result && !device->status.present) {
|
||||||
|
dprintk("Device not present\n");
|
||||||
|
result = -ENODEV;
|
||||||
|
goto outwalk;
|
||||||
|
}
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
status = acpi_walk_namespace(ACPI_TYPE_METHOD, sony_nc_acpi_handle,
|
status = acpi_walk_namespace(ACPI_TYPE_METHOD, sony_nc_acpi_handle,
|
||||||
1, sony_walk_callback, NULL, NULL);
|
1, sony_walk_callback, NULL, NULL);
|
||||||
@@ -760,6 +982,15 @@ static int sony_nc_add(struct acpi_device *device)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* try to _INI the device if such method exists (ACPI spec 3.0-6.5.1
|
||||||
|
* should be respected as we already checked for the device presence above */
|
||||||
|
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, METHOD_NAME__INI, &handle))) {
|
||||||
|
dprintk("Invoking _INI\n");
|
||||||
|
if (ACPI_FAILURE(acpi_evaluate_object(sony_nc_acpi_handle, METHOD_NAME__INI,
|
||||||
|
NULL, NULL)))
|
||||||
|
dprintk("_INI Method failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* setup input devices and helper fifo */
|
/* setup input devices and helper fifo */
|
||||||
result = sony_laptop_setup_input();
|
result = sony_laptop_setup_input();
|
||||||
if (result) {
|
if (result) {
|
||||||
@@ -772,7 +1003,7 @@ static int sony_nc_add(struct acpi_device *device)
|
|||||||
ACPI_DEVICE_NOTIFY,
|
ACPI_DEVICE_NOTIFY,
|
||||||
sony_acpi_notify, NULL);
|
sony_acpi_notify, NULL);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_WARNING DRV_PFX "unable to install notify handler\n");
|
printk(KERN_WARNING DRV_PFX "unable to install notify handler (%u)\n", status);
|
||||||
result = -ENODEV;
|
result = -ENODEV;
|
||||||
goto outinput;
|
goto outinput;
|
||||||
}
|
}
|
||||||
@@ -795,6 +1026,9 @@ static int sony_nc_add(struct acpi_device *device)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* initialize models with specific requirements */
|
||||||
|
dmi_check_system(sony_nc_ids);
|
||||||
|
|
||||||
result = sony_pf_add();
|
result = sony_pf_add();
|
||||||
if (result)
|
if (result)
|
||||||
goto outbacklight;
|
goto outbacklight;
|
||||||
@@ -908,7 +1142,9 @@ static struct acpi_driver sony_nc_driver = {
|
|||||||
#define SONYPI_DEVICE_TYPE2 0x00000002
|
#define SONYPI_DEVICE_TYPE2 0x00000002
|
||||||
#define SONYPI_DEVICE_TYPE3 0x00000004
|
#define SONYPI_DEVICE_TYPE3 0x00000004
|
||||||
|
|
||||||
#define SONY_PIC_EV_MASK 0xff
|
#define SONYPI_TYPE1_OFFSET 0x04
|
||||||
|
#define SONYPI_TYPE2_OFFSET 0x12
|
||||||
|
#define SONYPI_TYPE3_OFFSET 0x12
|
||||||
|
|
||||||
struct sony_pic_ioport {
|
struct sony_pic_ioport {
|
||||||
struct acpi_resource_io io;
|
struct acpi_resource_io io;
|
||||||
@@ -922,6 +1158,7 @@ struct sony_pic_irq {
|
|||||||
|
|
||||||
struct sony_pic_dev {
|
struct sony_pic_dev {
|
||||||
int model;
|
int model;
|
||||||
|
u16 evport_offset;
|
||||||
u8 camera_power;
|
u8 camera_power;
|
||||||
u8 bluetooth_power;
|
u8 bluetooth_power;
|
||||||
u8 wwan_power;
|
u8 wwan_power;
|
||||||
@@ -1999,20 +2236,17 @@ end:
|
|||||||
static irqreturn_t sony_pic_irq(int irq, void *dev_id)
|
static irqreturn_t sony_pic_irq(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
u32 port_val = 0;
|
|
||||||
u8 ev = 0;
|
u8 ev = 0;
|
||||||
u8 data_mask = 0;
|
u8 data_mask = 0;
|
||||||
u8 device_event = 0;
|
u8 device_event = 0;
|
||||||
|
|
||||||
struct sony_pic_dev *dev = (struct sony_pic_dev *) dev_id;
|
struct sony_pic_dev *dev = (struct sony_pic_dev *) dev_id;
|
||||||
|
|
||||||
acpi_os_read_port(dev->cur_ioport->io.minimum, &port_val,
|
ev = inb_p(dev->cur_ioport->io.minimum);
|
||||||
dev->cur_ioport->io.address_length);
|
data_mask = inb_p(dev->cur_ioport->io.minimum + dev->evport_offset);
|
||||||
ev = port_val & SONY_PIC_EV_MASK;
|
|
||||||
data_mask = 0xff & (port_val >> (dev->cur_ioport->io.address_length - 8));
|
|
||||||
|
|
||||||
dprintk("event (0x%.8x [%.2x] [%.2x]) at port 0x%.4x\n",
|
dprintk("event ([%.2x] [%.2x]) at port 0x%.4x(+0x%.2x)\n",
|
||||||
port_val, ev, data_mask, dev->cur_ioport->io.minimum);
|
ev, data_mask, dev->cur_ioport->io.minimum, dev->evport_offset);
|
||||||
|
|
||||||
if (ev == 0x00 || ev == 0xff)
|
if (ev == 0x00 || ev == 0xff)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
@@ -2103,6 +2337,20 @@ static int sony_pic_add(struct acpi_device *device)
|
|||||||
spic_dev.model = sony_pic_detect_device_type();
|
spic_dev.model = sony_pic_detect_device_type();
|
||||||
mutex_init(&spic_dev.lock);
|
mutex_init(&spic_dev.lock);
|
||||||
|
|
||||||
|
/* model specific characteristics */
|
||||||
|
switch(spic_dev.model) {
|
||||||
|
case SONYPI_DEVICE_TYPE1:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE1_OFFSET;
|
||||||
|
break;
|
||||||
|
case SONYPI_DEVICE_TYPE3:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE3_OFFSET;
|
||||||
|
break;
|
||||||
|
case SONYPI_DEVICE_TYPE2:
|
||||||
|
default:
|
||||||
|
spic_dev.evport_offset = SONYPI_TYPE2_OFFSET;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* read _PRS resources */
|
/* read _PRS resources */
|
||||||
result = sony_pic_possible_resources(device);
|
result = sony_pic_possible_resources(device);
|
||||||
if (result) {
|
if (result) {
|
||||||
|
Reference in New Issue
Block a user