186 lines
8.7 KiB
Diff
186 lines
8.7 KiB
Diff
|
Support for USB HID devices on the new Macbook Airs. From -next.
|
||
|
|
||
|
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
||
|
index eaeca56..6c52203 100644
|
||
|
--- a/drivers/hid/hid-apple.c
|
||
|
+++ b/drivers/hid/hid-apple.c
|
||
|
@@ -59,6 +59,27 @@ struct apple_key_translation {
|
||
|
u8 flags;
|
||
|
};
|
||
|
|
||
|
+static const struct apple_key_translation macbookair_fn_keys[] = {
|
||
|
+ { KEY_BACKSPACE, KEY_DELETE },
|
||
|
+ { KEY_ENTER, KEY_INSERT },
|
||
|
+ { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F6, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F7, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F8, KEY_NEXTSONG, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F9, KEY_MUTE, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F10, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F11, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_F12, KEY_EJECTCD, APPLE_FLAG_FKEY },
|
||
|
+ { KEY_UP, KEY_PAGEUP },
|
||
|
+ { KEY_DOWN, KEY_PAGEDOWN },
|
||
|
+ { KEY_LEFT, KEY_HOME },
|
||
|
+ { KEY_RIGHT, KEY_END },
|
||
|
+ { }
|
||
|
+};
|
||
|
+
|
||
|
static const struct apple_key_translation apple_fn_keys[] = {
|
||
|
{ KEY_BACKSPACE, KEY_DELETE },
|
||
|
{ KEY_ENTER, KEY_INSERT },
|
||
|
@@ -157,10 +178,15 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
||
|
if (fnmode) {
|
||
|
int do_translate;
|
||
|
|
||
|
- trans = apple_find_translation((hid->product < 0x21d ||
|
||
|
- hid->product >= 0x300) ?
|
||
|
- powerbook_fn_keys : apple_fn_keys,
|
||
|
- usage->code);
|
||
|
+ if(hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI &&
|
||
|
+ hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) {
|
||
|
+ trans = apple_find_translation(macbookair_fn_keys, usage->code);
|
||
|
+ } else if (hid->product < 0x21d || hid->product >= 0x300) {
|
||
|
+ trans = apple_find_translation(powerbook_fn_keys, usage->code);
|
||
|
+ } else {
|
||
|
+ trans = apple_find_translation(apple_fn_keys, usage->code);
|
||
|
+ }
|
||
|
+
|
||
|
if (trans) {
|
||
|
if (test_bit(usage->code, asc->pressed_fn))
|
||
|
do_translate = 1;
|
||
|
@@ -436,6 +462,18 @@ static const struct hid_device_id apple_devices[] = {
|
||
|
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||
|
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
||
|
+ .driver_data = APPLE_HAS_FN },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
||
|
+ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
||
|
+ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
||
|
+ .driver_data = APPLE_HAS_FN },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
||
|
+ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
||
|
+ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
|
||
|
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
|
||
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
||
|
index b3393e1..53ac909 100644
|
||
|
--- a/drivers/hid/hid-core.c
|
||
|
+++ b/drivers/hid/hid-core.c
|
||
|
@@ -1274,6 +1274,12 @@ static const struct hid_device_id hid_blacklist[] = {
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
||
|
@@ -1760,6 +1766,12 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||
|
{ }
|
||
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||
|
index 68114db..104b9f9 100644
|
||
|
--- a/drivers/hid/hid-ids.h
|
||
|
+++ b/drivers/hid/hid-ids.h
|
||
|
@@ -97,6 +97,12 @@
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
||
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
|
||
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
||
|
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||
|
|
||
|
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c
|
||
|
index b952317..ee82851 100644
|
||
|
--- a/drivers/input/mouse/bcm5974.c
|
||
|
+++ b/drivers/input/mouse/bcm5974.c
|
||
|
@@ -55,6 +55,14 @@
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||
|
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||
|
+/* MacbookAir3,2 (unibody), aka wellspring5 */
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
||
|
+/* MacbookAir3,1 (unibody), aka wellspring4 */
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
||
|
+#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
||
|
|
||
|
#define BCM5974_DEVICE(prod) { \
|
||
|
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
||
|
@@ -80,6 +88,14 @@ static const struct usb_device_id bcm5974_table[] = {
|
||
|
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
|
||
|
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
|
||
|
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||
|
+ /* MacbookAir3,2 */
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
||
|
+ /* MacbookAir3,1 */
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
||
|
+ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
||
|
/* Terminating entry */
|
||
|
{}
|
||
|
};
|
||
|
@@ -234,6 +250,30 @@ static const struct bcm5974_config bcm5974_config_table[] = {
|
||
|
{ DIM_X, DIM_X / SN_COORD, -4460, 5166 },
|
||
|
{ DIM_Y, DIM_Y / SN_COORD, -75, 6700 }
|
||
|
},
|
||
|
+ {
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI,
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4_ISO,
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4_JIS,
|
||
|
+ HAS_INTEGRATED_BUTTON,
|
||
|
+ 0x84, sizeof(struct bt_data),
|
||
|
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||
|
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||
|
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||
|
+ { DIM_X, DIM_X / SN_COORD, -4620, 5140 },
|
||
|
+ { DIM_Y, DIM_Y / SN_COORD, -150, 6600 }
|
||
|
+ },
|
||
|
+ {
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI,
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO,
|
||
|
+ USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS,
|
||
|
+ HAS_INTEGRATED_BUTTON,
|
||
|
+ 0x84, sizeof(struct bt_data),
|
||
|
+ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||
|
+ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||
|
+ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||
|
+ { DIM_X, DIM_X / SN_COORD, -4616, 5112 },
|
||
|
+ { DIM_Y, DIM_Y / SN_COORD, -142, 5234 }
|
||
|
+ },
|
||
|
{}
|
||
|
};
|