summaryrefslogtreecommitdiff
path: root/sys/dev/sio
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2007-11-30 21:36:12 +0000
committerPeter Wemm <peter@FreeBSD.org>2007-11-30 21:36:12 +0000
commit585484b918b236bccc6c1c18a3948193dcf5313e (patch)
tree2cb1ef6748ad779ac1f546f7080fede3b7071a2c /sys/dev/sio
parente16aed66eef3dd58c2d272aacb6b20e47abebf9f (diff)
Notes
Diffstat (limited to 'sys/dev/sio')
-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 0ae0e7d6424d..37691f74d6f2 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));
}