@@ -517,6 +517,8 @@ struct omap_dss_driver {
};
int omap_dss_register_driver(struct omap_dss_driver *);
+int omap_dss_register_driver_probe(struct omap_dss_driver *,
+ int (*probe)(struct omap_dss_device *));
void omap_dss_unregister_driver(struct omap_dss_driver *);
void omap_dss_get_device(struct omap_dss_device *dssdev);
@@ -447,6 +447,50 @@ void omap_dss_unregister_driver(struct omap_dss_driver *dssdriver)
}
EXPORT_SYMBOL(omap_dss_unregister_driver);
+static int omap_dss_driver_probe_fail(struct device *dev)
+{
+ return -ENXIO;
+}
+
+static int find_any_dev(struct device *dev, void *data)
+{
+ struct omap_dss_driver *dssdrv = data;
+ return dev->driver == &dssdrv->driver;
+}
+
+int omap_dss_register_driver_probe(struct omap_dss_driver *dssdriver,
+ int (*probe)(struct omap_dss_device *))
+{
+ int r;
+
+ /* make sure driver won't have bind/unbind attributes */
+ dssdriver->driver.suppress_bind_attrs = true;
+
+ /* temporary section violation during probe() */
+ dssdriver->probe = probe;
+ r = omap_dss_register_driver(dssdriver);
+
+ /* fixup that section violation */
+
+ dssdriver->probe = NULL;
+ dssdriver->driver.probe = omap_dss_driver_probe_fail;
+
+ if (r)
+ return r;
+
+ /* find any device using this driver */
+ r = bus_for_each_dev(&dss_bus_type, NULL, dssdriver, find_any_dev);
+
+ if (r == 0) {
+ /* no devices for this driver */
+ omap_dss_unregister_driver(dssdriver);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(omap_dss_register_driver_probe);
+
/* DEVICE */
static void reset_device(struct device *dev, int check)
{