Commit 84051eb4 authored by Mark Cave-Ayland's avatar Mark Cave-Ayland Committed by David Gibson
Browse files

adb: add property to disable direct reg 3 writes



MacOS 9 has a bug in its PMU driver whereby after configuring the ADB bus
devices it sends another write to reg 3 on both devices resetting them
both back to the same address.

Add a new disable_direct_reg3_writes property to ADBDevice to disable these
direct writes which can enabled just for the upcoming pmu-adb support.

Signed-off-by: default avatarMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent fb6649f1
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -261,7 +261,9 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
                trace_adb_kbd_request_change_addr(d->devaddr);
                break;
            default:
                if (!d->disable_direct_reg3_writes) {
                    d->devaddr = buf[1] & 0xf;

                    /* we support handlers:
                     * 1: Apple Standard Keyboard
                     * 2: Apple Extended Keyboard (LShift = RShift)
@@ -273,6 +275,7 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,

                    trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
                                                                  d->handler);
                }
                break;
            }
        }
+20 −17
Original line number Diff line number Diff line
@@ -142,7 +142,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
                trace_adb_mouse_request_change_addr(d->devaddr);
                break;
            default:
                if (!d->disable_direct_reg3_writes) {
                    d->devaddr = buf[1] & 0xf;

                    /* we support handlers:
                     * 0x01: Classic Apple Mouse Protocol / 100 cpi operations
                     * 0x02: Classic Apple Mouse Protocol / 200 cpi operations
@@ -158,8 +160,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
                        d->handler = buf[2];
                    }

                trace_adb_mouse_request_change_addr_and_handler(d->devaddr,
                                                                d->handler);
                    trace_adb_mouse_request_change_addr_and_handler(
                        d->devaddr, d->handler);
                }
                break;
            }
        }
+7 −0
Original line number Diff line number Diff line
@@ -113,11 +113,18 @@ static void adb_device_realizefn(DeviceState *dev, Error **errp)
    bus->devices[bus->nb_devices++] = d;
}

static Property adb_device_properties[] = {
    DEFINE_PROP_BOOL("disable-direct-reg3-writes", ADBDevice,
                     disable_direct_reg3_writes, false),
    DEFINE_PROP_END_OF_LIST(),
};

static void adb_device_class_init(ObjectClass *oc, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(oc);

    dc->realize = adb_device_realizefn;
    dc->props = adb_device_properties;
    dc->bus_type = TYPE_ADB_BUS;
}

+1 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct ADBDevice {

    int devaddr;
    int handler;
    bool disable_direct_reg3_writes;
};

#define ADB_DEVICE_CLASS(cls) \