Page MenuHomeFreeBSD

D43211.diff
No OneTemporary

D43211.diff

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 <sys/cdefs.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -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);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 29, 8:47 AM (13 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17839178
Default Alt Text
D43211.diff (3 KB)

Event Timeline