+void omap_mmc_notify_cover_event(struct device *dev, int slot, int is_closed)
+{
+ struct mmc_omap_host *host = dev_get_drvdata(dev);
+
+ BUG_ON(slot >= host->nr_slots);
+
+ /* Other subsystems can call in here before we're initialised. */
+ if (host->nr_slots == 0 || !host->slots[slot])
+ return;
+
+ schedule_work(&host->slots[slot]->switch_work);
+}
+
+static void mmc_omap_switch_timer(unsigned long arg)
+{
+ struct mmc_omap_slot *slot = (struct mmc_omap_slot *) arg;
+
+ schedule_work(&slot->switch_work);
+}
+
+static void mmc_omap_cover_handler(struct work_struct *work)
+{
+ struct mmc_omap_slot *slot = container_of(work, struct mmc_omap_slot,
+ switch_work);
+ int cover_open;
+
+ cover_open = mmc_omap_cover_is_open(slot);
+ if (cover_open != slot->cover_open) {
+ sysfs_notify(&slot->mmc->class_dev.kobj, NULL, "cover_switch");
+ slot->cover_open = cover_open;
+ dev_info(mmc_dev(slot->mmc), "cover is now %s\n",
+ cover_open ? "open" : "closed");
+ }
+ mmc_detect_change(slot->mmc, slot->id);
+}
+