summaryrefslogtreecommitdiffstats
path: root/sys/dev/sio/sio_puc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sio/sio_puc.c')
-rw-r--r--sys/dev/sio/sio_puc.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/sys/dev/sio/sio_puc.c b/sys/dev/sio/sio_puc.c
index 0ae0e7d..37691f7 100644
--- a/sys/dev/sio/sio_puc.c
+++ b/sys/dev/sio/sio_puc.c
@@ -62,6 +62,34 @@ static driver_t sio_puc_driver = {
0,
};
+/*
+ * Don't cut and paste this to other drivers. It is a horrible kludge
+ * which will fail to work and also be unnecessary in future versions.
+ */
+static void
+sio_puc_kludge_unit(device_t dev)
+{
+ devclass_t dc;
+ int err;
+ int start;
+ int unit;
+
+ unit = 0;
+ start = 0;
+ while (resource_int_value("sio", unit, "port", &start) == 0 &&
+ start > 0)
+ unit++;
+ if (device_get_unit(dev) < unit) {
+ dc = device_get_devclass(dev);
+ while (devclass_get_device(dc, unit))
+ unit++;
+ device_printf(dev, "moving to sio%d\n", unit);
+ err = device_set_unit(dev, unit); /* EVIL DO NOT COPY */
+ if (err)
+ device_printf(dev, "error moving device %d\n", err);
+ }
+}
+
static int
sio_puc_attach(device_t dev)
{
@@ -70,6 +98,7 @@ sio_puc_attach(device_t dev)
if (BUS_READ_IVAR(device_get_parent(dev), dev, PUC_IVAR_CLOCK,
&rclk) != 0)
rclk = DEFAULT_RCLK;
+ sio_puc_kludge_unit(dev);
return (sioattach(dev, 0, rclk));
}
OpenPOWER on IntegriCloud