From: Franz S. <fs...@us...> - 2002-01-27 22:22:59
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/macintosh In directory usw-pr-cvs1:/tmp/cvs-serv26410/linux/drivers/macintosh Modified Files: Makefile adbhid.c Log Message: Sync PPC stuff with linux-dj. Index: Makefile =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/macintosh/Makefile,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- Makefile 2001/10/06 16:11:13 1.7 +++ Makefile 2002/01/27 22:22:56 1.8 @@ -15,7 +15,7 @@ # Objects that export symbols. -export-objs := adb.o rtc.o via-pmu.o +export-objs := adb.o rtc.o mac_hid.o via-pmu.o # Object file lists. @@ -29,10 +29,14 @@ obj-$(CONFIG_PMAC_PBOOK) += mediabay.o obj-$(CONFIG_MAC_SERIAL) += macserial.o obj-$(CONFIG_NVRAM) += nvram.o +obj-$(CONFIG_MAC_EMUMOUSEBTN) += mac_hid.o +obj-$(CONFIG_INPUT_ADBHID) += adbhid.o obj-$(CONFIG_PPC_RTC) += rtc.o +obj-$(CONFIG_ANSLCD) += ans-lcd.o obj-$(CONFIG_ADB_PMU) += via-pmu.o obj-$(CONFIG_ADB_CUDA) += via-cuda.o +obj-$(CONFIG_PMAC_APM_EMU) += apm_emu.o obj-$(CONFIG_ADB) += adb.o obj-$(CONFIG_ADB_MACII) += via-macii.o Index: adbhid.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/macintosh/adbhid.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- adbhid.c 2002/01/24 19:51:26 1.1 +++ adbhid.c 2002/01/27 22:22:56 1.2 @@ -276,26 +276,39 @@ break; case 0x1f: /* Powerbook button device */ { + int down = (data[1] == (data[1] & 0xf)); #ifdef CONFIG_PMAC_BACKLIGHT int backlight = get_backlight_level(); - +#endif /* * XXX: Where is the contrast control for the passive? * -- Cort */ - switch (data[1]) { + switch (data[1] & 0x0f) { case 0x8: /* mute */ + input_report_key(&adbhid[id]->input, KEY_MUTE, + down); break; - case 0x7: /* contrast decrease */ + case 0x7: /* volume decrease */ + input_report_key(&adbhid[id]->input, KEY_VOLUMEDOWN, + down); break; - case 0x6: /* contrast increase */ + case 0x6: /* volume increase */ + input_report_key(&adbhid[id]->input, KEY_VOLUMEUP, + down); break; + case 0xb: /* eject */ + input_report_key(&adbhid[id]->input, KEY_EJECTCD, + down); + break; + +#ifdef CONFIG_PMAC_BACKLIGHT case 0xa: /* brightness decrease */ - if (backlight < 0) + if (!down || backlight < 0) break; if (backlight > BACKLIGHT_OFF) set_backlight_level(backlight-1); @@ -304,15 +317,15 @@ break; case 0x9: /* brightness increase */ - if (backlight < 0) + if (!down || backlight < 0) break; if (backlight < BACKLIGHT_MAX) set_backlight_level(backlight+1); else set_backlight_level(BACKLIGHT_MAX); break; - } #endif /* CONFIG_PMAC_BACKLIGHT */ + } } break; } @@ -505,6 +518,11 @@ break; case 0x1f: /* Powerbook button device */ sprintf(adbhid[id]->name, "ADB Powerbook buttons"); + adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + set_bit(KEY_MUTE, adbhid[id]->input.keybit); + set_bit(KEY_VOLUMEUP, adbhid[id]->input.keybit); + set_bit(KEY_VOLUMEDOWN, adbhid[id]->input.keybit); + set_bit(KEY_EJECTCD, adbhid[id]->input.keybit); break; } if (adbhid[id]->name[0]) @@ -543,16 +561,38 @@ } +static u16 +adbhid_input_reregister(int id, int default_id, int org_handler_id, + int cur_handler_id, int mk) +{ + if (adbhid[id]) { + if (adbhid[id]->input.idproduct != + ((id << 12)|(default_id << 8)|org_handler_id)) { + adbhid_input_unregister(id); + adbhid_input_register(id, default_id, org_handler_id, + cur_handler_id, mk); + } + } else + adbhid_input_register(id, default_id, org_handler_id, + cur_handler_id, mk); + return 1<<id; +} + +static void +adbhid_input_devcleanup(u16 exist) +{ + int i; + for(i=1; i<16; i++) + if (adbhid[i] && !(exist&(1<<i))) + adbhid_input_unregister(i); +} + static void adbhid_probe(void) { struct adb_request req; int i, default_id, org_handler_id, cur_handler_id; - - for (i = 1; i < 16; i++) { - if (adbhid[i]) - adbhid_input_unregister(i); - } + u16 reg = 0; adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input); adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input); @@ -581,14 +621,16 @@ printk("ADB keyboard at %d, handler 1\n", id); adb_get_infos(id, &default_id, &cur_handler_id); - adbhid_input_register(id, default_id, org_handler_id, cur_handler_id, 0); + reg |= adbhid_input_reregister(id, default_id, org_handler_id, + cur_handler_id, 0); } for (i = 0; i < buttons_ids.nids; i++) { int id = buttons_ids.id[i]; adb_get_infos(id, &default_id, &org_handler_id); - adbhid_input_register(id, default_id, org_handler_id, org_handler_id, 0); + reg |= adbhid_input_reregister(id, default_id, org_handler_id, + org_handler_id, 0); } /* Try to switch all mice to handler 4, or 2 for three-button @@ -677,9 +719,10 @@ printk("\n"); adb_get_infos(id, &default_id, &cur_handler_id); - adbhid_input_register(id, default_id, org_handler_id, - cur_handler_id, mouse_kind); - } + reg |= adbhid_input_reregister(id, default_id, org_handler_id, + cur_handler_id, mouse_kind); + } + adbhid_input_devcleanup(reg); } static void @@ -691,12 +734,13 @@ printk(" (trackpad)"); adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1, - ADB_READREG(id,1)); + ADB_READREG(id,1)); if (req.reply_len < 8) printk("bad length for reg. 1\n"); else { memcpy(r1_buffer, &req.reply[1], 8); + adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,1), r1_buffer[0], @@ -705,7 +749,7 @@ r1_buffer[3], r1_buffer[4], r1_buffer[5], - 0x0d, /*r1_buffer[6],*/ + 0x0d, r1_buffer[7]); adb_request(&req, NULL, ADBREQ_SYNC, 9, @@ -718,7 +762,7 @@ 0x8a, 0x1b, 0x50); - + adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,1), r1_buffer[0], @@ -729,6 +773,9 @@ r1_buffer[5], 0x03, /*r1_buffer[6],*/ r1_buffer[7]); + + /* Without this flush, the trackpad may be locked up */ + adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id)); } } |