diff --git a/sys/dev/drm/intel_iic.c b/sys/dev/drm/intel_iic.c index 8a45971..4c82acf 100644 --- a/sys/dev/drm/intel_iic.c +++ b/sys/dev/drm/intel_iic.c @@ -455,6 +455,7 @@ intel_iicbb_attach(device_t idev) { struct intel_iic_softc *sc; struct drm_i915_private *dev_priv; + device_t bitbang; int pin; sc = device_get_softc(idev); @@ -467,15 +468,21 @@ intel_iicbb_attach(device_t idev) sc->reg0 = pin | GMBUS_RATE_100KHZ; + /* add generic bit-banging code */ + bitbang = device_add_child(idev, "iicbb", -1); + device_probe_and_attach(bitbang); + return (0); } +/* static int intel_iicbb_detach(device_t idev) { return (0); } +*/ static device_method_t intel_gmbus_methods[] = { DEVMETHOD(device_probe, intel_gmbus_probe), @@ -497,7 +504,7 @@ DRIVER_MODULE_ORDERED(intel_gmbus, drm, intel_gmbus_driver, static device_method_t intel_iicbb_methods[] = { DEVMETHOD(device_probe, intel_iicbb_probe), DEVMETHOD(device_attach, intel_iicbb_attach), - DEVMETHOD(device_detach, intel_iicbb_detach), + DEVMETHOD(device_detach, bus_generic_detach), DEVMETHOD(iicbb_callback, iicbus_null_callback), DEVMETHOD(iicbb_reset, intel_iic_reset), DEVMETHOD(iicbb_setsda, intel_iicbb_setsda), @@ -514,6 +521,7 @@ static driver_t intel_iicbb_driver = { static devclass_t intel_iicbb_devclass; DRIVER_MODULE_ORDERED(intel_iicbb, drm, intel_iicbb_driver, intel_iicbb_devclass, 0, 0, SI_ORDER_FIRST); +DRIVER_MODULE(iicbb, intel_iicbb, iicbb_driver, iicbb_devclass, 0, 0); static int intel_ddc_port_probe(device_t idev) @@ -566,6 +574,7 @@ static devclass_t intel_ddc_port_devclass; DRIVER_MODULE_ORDERED(intel_ddc_port, intel_gmbus, intel_ddc_port_driver, intel_ddc_port_devclass, 0, 0, SI_ORDER_SECOND); +#if 0 static device_method_t intel_ddc_bb_port_methods[] = { DEVMETHOD(device_probe, intel_ddc_port_probe), DEVMETHOD(device_attach, intel_ddc_port_attach), @@ -580,11 +589,13 @@ static driver_t intel_ddc_bb_port_driver = { static devclass_t intel_ddc_bb_port_devclass; DRIVER_MODULE_ORDERED(intel_ddc_bb_port, intel_iicbb, intel_ddc_bb_port_driver, intel_ddc_bb_port_devclass, 0, 0, SI_ORDER_SECOND); +#endif int intel_setup_gmbus(struct drm_device *dev) { struct drm_i915_private *dev_priv; + device_t iic_dev; int i, ret; dev_priv = dev->dev_private; @@ -624,6 +635,18 @@ intel_setup_gmbus(struct drm_device *dev) goto err; } + iic_dev = device_find_child(dev_priv->bbbus_bridge[i], "iicbb", -1); + if (iic_dev == NULL) { + DRM_ERROR("bbbus bridge doesn't have iicbb child\n"); + goto err; + } + iic_dev = device_find_child(iic_dev, "iicbus", -1); + if (iic_dev == NULL) { + DRM_ERROR("bbbus bridge doesn't have iicbus grandchild\n"); + goto err; + } + dev_priv->bbbus[i] = iic_dev; +#if 0 dev_priv->bbbus[i] = device_add_child(dev_priv->bbbus_bridge[i], "intel_ddc_bb_port", i); if (dev_priv->bbbus[i] == NULL) { @@ -637,7 +660,7 @@ intel_setup_gmbus(struct drm_device *dev) DRM_ERROR("bbbus port %d attach error %d\n", i, ret); goto err; } - +#endif dev_priv->gmbus_bridge[i] = device_add_child(dev->device, "intel_gmbus", i); if (dev_priv->gmbus_bridge[i] == NULL) {