diff --git a/sys/compat/linuxkpi/common/include/linux/device.h b/sys/compat/linuxkpi/common/include/linux/device.h --- a/sys/compat/linuxkpi/common/include/linux/device.h +++ b/sys/compat/linuxkpi/common/include/linux/device.h @@ -514,6 +514,7 @@ bsddev = dev->bsddev; dev->bsddev = NULL; + dev->devt = 0; if (bsddev != NULL && dev->bsddev_attached_here) { bus_topo_lock(); diff --git a/sys/compat/linuxkpi/common/src/linux_i2c.c b/sys/compat/linuxkpi/common/src/linux_i2c.c --- a/sys/compat/linuxkpi/common/src/linux_i2c.c +++ b/sys/compat/linuxkpi/common/src/linux_i2c.c @@ -24,6 +24,7 @@ * */ +#include #include #include #include @@ -51,19 +52,23 @@ }; static struct sx lkpi_sx_i2c; +static struct class *i2c_class; static void lkpi_sysinit_i2c(void *arg __unused) { - sx_init(&lkpi_sx_i2c, "lkpi-i2c"); + i2c_class = class_create(THIS_MODULE, "lkpi_iic"); } static void lkpi_sysuninit_i2c(void *arg __unused) { - sx_destroy(&lkpi_sx_i2c); + if (i2c_class) { + class_destroy(i2c_class); + i2c_class = NULL; + } } SYSINIT(lkpi_i2c, SI_SUB_DRIVERS, SI_ORDER_ANY, @@ -151,8 +156,7 @@ sizeof(struct lkpi_iic_softc), }; -DRIVER_MODULE(lkpi_iic, drmn, lkpi_iic_driver, 0, 0); -DRIVER_MODULE(lkpi_iic, drm, lkpi_iic_driver, 0, 0); +DRIVER_MODULE(lkpi_iic, lkpi_iic, lkpi_iic_driver, 0, 0); DRIVER_MODULE(iicbus, lkpi_iic, iicbus_driver, 0, 0); MODULE_DEPEND(linuxkpi, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER); @@ -324,18 +328,21 @@ device_printf(adapter->dev.parent->bsddev, "Adding i2c adapter %s\n", adapter->name); sx_xlock(&lkpi_sx_i2c); - lkpi_iic = device_add_child(adapter->dev.parent->bsddev, "lkpi_iic", -1); + if (adapter->dev.class == NULL) + adapter->dev.class = i2c_class; + device_register(&adapter->dev); + lkpi_iic = device_add_child(adapter->dev.bsddev, "lkpi_iic", -1); if (lkpi_iic == NULL) { - device_printf(adapter->dev.parent->bsddev, "Couldn't add lkpi_iic\n"); + device_printf(adapter->dev.bsddev, "Couldn't add lkpi_iic\n"); sx_xunlock(&lkpi_sx_i2c); return (ENXIO); } bus_topo_lock(); - error = bus_generic_attach(adapter->dev.parent->bsddev); + error = bus_generic_attach(adapter->dev.bsddev); bus_topo_unlock(); if (error) { - device_printf(adapter->dev.parent->bsddev, + device_printf(adapter->dev.bsddev, "failed to attach child: error %d\n", error); sx_xunlock(&lkpi_sx_i2c); return (ENXIO); @@ -348,40 +355,13 @@ int lkpi_i2c_del_adapter(struct i2c_adapter *adapter) { - device_t child; - int unit, rv; - if (adapter == NULL) return (-EINVAL); if (bootverbose) - device_printf(adapter->dev.parent->bsddev, + device_printf(adapter->dev.bsddev, "Removing i2c adapter %s\n", adapter->name); sx_xlock(&lkpi_sx_i2c); - unit = 0; - while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", unit++)) != NULL) { - - if (adapter == LKPI_IIC_GET_ADAPTER(child)) { - bus_topo_lock(); - device_delete_child(adapter->dev.parent->bsddev, child); - bus_topo_unlock(); - rv = 0; - goto out; - } - } - - unit = 0; - while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", unit++)) != NULL) { - - if (adapter == LKPI_IIC_GET_ADAPTER(child)) { - bus_topo_lock(); - device_delete_child(adapter->dev.parent->bsddev, child); - bus_topo_unlock(); - rv = 0; - goto out; - } - } - rv = -EINVAL; -out: + device_unregister(&adapter->dev); sx_xunlock(&lkpi_sx_i2c); - return (rv); + return (0); }