Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linuxkpi/common/src/linux_i2c.c
Show First 20 Lines • Show All 215 Lines • ▼ Show 20 Lines | lkpi_i2c_add_adapter(struct i2c_adapter *adapter) | ||||
sx_xlock(&lkpi_sx_i2c); | sx_xlock(&lkpi_sx_i2c); | ||||
lkpi_iic = device_add_child(adapter->dev.parent->bsddev, "lkpi_iic", -1); | lkpi_iic = device_add_child(adapter->dev.parent->bsddev, "lkpi_iic", -1); | ||||
if (lkpi_iic == NULL) { | if (lkpi_iic == NULL) { | ||||
device_printf(adapter->dev.parent->bsddev, "Couldn't add lkpi_iic\n"); | device_printf(adapter->dev.parent->bsddev, "Couldn't add lkpi_iic\n"); | ||||
sx_xunlock(&lkpi_sx_i2c); | sx_xunlock(&lkpi_sx_i2c); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
bus_topo_lock(); | |||||
error = bus_generic_attach(adapter->dev.parent->bsddev); | error = bus_generic_attach(adapter->dev.parent->bsddev); | ||||
bus_topo_unlock(); | |||||
if (error) { | if (error) { | ||||
device_printf(adapter->dev.parent->bsddev, | device_printf(adapter->dev.parent->bsddev, | ||||
"failed to attach child: error %d\n", error); | "failed to attach child: error %d\n", error); | ||||
sx_xunlock(&lkpi_sx_i2c); | sx_xunlock(&lkpi_sx_i2c); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
LKPI_IIC_ADD_ADAPTER(lkpi_iic, adapter); | LKPI_IIC_ADD_ADAPTER(lkpi_iic, adapter); | ||||
sx_xunlock(&lkpi_sx_i2c); | sx_xunlock(&lkpi_sx_i2c); | ||||
Show All 11 Lines | lkpi_i2c_del_adapter(struct i2c_adapter *adapter) | ||||
if (bootverbose) | if (bootverbose) | ||||
device_printf(adapter->dev.parent->bsddev, | device_printf(adapter->dev.parent->bsddev, | ||||
"Removing i2c adapter %s\n", adapter->name); | "Removing i2c adapter %s\n", adapter->name); | ||||
sx_xlock(&lkpi_sx_i2c); | sx_xlock(&lkpi_sx_i2c); | ||||
unit = 0; | unit = 0; | ||||
while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", unit++)) != NULL) { | while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iic", unit++)) != NULL) { | ||||
if (adapter == LKPI_IIC_GET_ADAPTER(child)) { | if (adapter == LKPI_IIC_GET_ADAPTER(child)) { | ||||
bus_topo_lock(); | |||||
device_delete_child(adapter->dev.parent->bsddev, child); | device_delete_child(adapter->dev.parent->bsddev, child); | ||||
bus_topo_unlock(); | |||||
rv = 0; | rv = 0; | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
unit = 0; | unit = 0; | ||||
while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", unit++)) != NULL) { | while ((child = device_find_child(adapter->dev.parent->bsddev, "lkpi_iicbb", unit++)) != NULL) { | ||||
if (adapter == LKPI_IIC_GET_ADAPTER(child)) { | if (adapter == LKPI_IIC_GET_ADAPTER(child)) { | ||||
bus_topo_lock(); | |||||
device_delete_child(adapter->dev.parent->bsddev, child); | device_delete_child(adapter->dev.parent->bsddev, child); | ||||
bus_topo_unlock(); | |||||
rv = 0; | rv = 0; | ||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
rv = -EINVAL; | rv = -EINVAL; | ||||
out: | out: | ||||
sx_xunlock(&lkpi_sx_i2c); | sx_xunlock(&lkpi_sx_i2c); | ||||
return (rv); | return (rv); | ||||
} | } |