|
@@ -391,3 +391,71 @@ static int n8x0_mmc_get_cover_state(struct device *dev, int slot)
|
|
static void n8x0_mmc_callback(void *data, u8 card_mask)
|
|
static void n8x0_mmc_callback(void *data, u8 card_mask)
|
|
{
|
|
{
|
|
int bit, *openp, index;
|
|
int bit, *openp, index;
|
|
|
|
+
|
|
|
|
+ if (machine_is_nokia_n800()) {
|
|
|
|
+ bit = 1 << 1;
|
|
|
|
+ openp = &slot2_cover_open;
|
|
|
|
+ index = 1;
|
|
|
|
+ } else {
|
|
|
|
+ bit = 1;
|
|
|
|
+ openp = &slot1_cover_open;
|
|
|
|
+ index = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (card_mask & bit)
|
|
|
|
+ *openp = 1;
|
|
|
|
+ else
|
|
|
|
+ *openp = 0;
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_MMC_OMAP
|
|
|
|
+ omap_mmc_notify_cover_event(mmc_device, index, *openp);
|
|
|
|
+#else
|
|
|
|
+ pr_warn("MMC: notify cover event not available\n");
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int n8x0_mmc_late_init(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ int r, bit, *openp;
|
|
|
|
+ int vs2sel;
|
|
|
|
+
|
|
|
|
+ mmc_device = dev;
|
|
|
|
+
|
|
|
|
+ r = menelaus_set_slot_sel(1);
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
+ if (machine_is_nokia_n800())
|
|
|
|
+ vs2sel = 0;
|
|
|
|
+ else
|
|
|
|
+ vs2sel = 2;
|
|
|
|
+
|
|
|
|
+ r = menelaus_set_mmc_slot(2, 0, vs2sel, 1);
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
+ n8x0_mmc_set_power(dev, 0, MMC_POWER_ON, 16); /* MMC_VDD_28_29 */
|
|
|
|
+ n8x0_mmc_set_power(dev, 1, MMC_POWER_ON, 16);
|
|
|
|
+
|
|
|
|
+ r = menelaus_set_mmc_slot(1, 1, 0, 1);
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+ r = menelaus_set_mmc_slot(2, 1, vs2sel, 1);
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
+ r = menelaus_get_slot_pin_states();
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
+ if (machine_is_nokia_n800()) {
|
|
|
|
+ bit = 1 << 1;
|
|
|
|
+ openp = &slot2_cover_open;
|
|
|
|
+ } else {
|
|
|
|
+ bit = 1;
|
|
|
|
+ openp = &slot1_cover_open;
|
|
|
|
+ slot2_cover_open = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* All slot pin bits seem to be inversed until first switch change */
|
|
|
|
+ if (r == 0xf || r == (0xf & ~bit))
|