|
@@ -1133,3 +1133,41 @@ static int __init omap_device_init(void)
|
|
|
return 0;
|
|
|
}
|
|
|
core_initcall(omap_device_init);
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap_device_late_idle - idle devices without drivers
|
|
|
+ * @dev: struct device * associated with omap_device
|
|
|
+ * @data: unused
|
|
|
+ *
|
|
|
+ * Check the driver bound status of this device, and idle it
|
|
|
+ * if there is no driver attached.
|
|
|
+ */
|
|
|
+static int __init omap_device_late_idle(struct device *dev, void *data)
|
|
|
+{
|
|
|
+ struct platform_device *pdev = to_platform_device(dev);
|
|
|
+ struct omap_device *od = to_omap_device(pdev);
|
|
|
+
|
|
|
+ if (!od)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If omap_device state is enabled, but has no driver bound,
|
|
|
+ * idle it.
|
|
|
+ */
|
|
|
+ if (od->_driver_status != BUS_NOTIFY_BOUND_DRIVER) {
|
|
|
+ if (od->_state == OMAP_DEVICE_STATE_ENABLED) {
|
|
|
+ dev_warn(dev, "%s: enabled but no driver. Idling\n",
|
|
|
+ __func__);
|
|
|
+ omap_device_idle(pdev);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int __init omap_device_late_init(void)
|
|
|
+{
|
|
|
+ bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+late_initcall(omap_device_late_init);
|