OSDN Git Service

Merge remote branch 'stable/linux-2.6.35.y' into android-2.6.35
authorDima Zavin <dima@android.com>
Fri, 8 Oct 2010 21:37:48 +0000 (14:37 -0700)
committerDima Zavin <dima@android.com>
Fri, 8 Oct 2010 21:37:48 +0000 (14:37 -0700)
Conflicts:
drivers/mmc/core/core.c

Change-Id: If12b25725eccb07b385f5898be75d052ff75a3f2

15 files changed:
1  2 
drivers/base/power/main.c
drivers/char/mem.c
drivers/mmc/core/core.c
drivers/mtd/nand/nand_base.c
include/linux/mm.h
include/linux/mmc/host.h
include/linux/sched.h
include/net/tcp.h
kernel/fork.c
kernel/sched.c
mm/page_alloc.c
net/Kconfig
net/ipv4/devinet.c
net/ipv4/tcp.c
net/l2tp/l2tp_eth.c

Simple merge
Simple merge
@@@ -1082,8 -1057,18 +1082,19 @@@ void mmc_rescan(struct work_struct *wor
                container_of(work, struct mmc_host, detect.work);
        u32 ocr;
        int err;
+       unsigned long flags;
 +      int extend_wakelock = 0;
  
+       spin_lock_irqsave(&host->lock, flags);
+       if (host->rescan_disable) {
+               spin_unlock_irqrestore(&host->lock, flags);
+               return;
+       }
+       spin_unlock_irqrestore(&host->lock, flags);
        mmc_bus_get(host);
  
        /* if there is a card registered, check whether it is still present */
@@@ -1370,35 -1313,58 +1362,74 @@@ int mmc_resume_host(struct mmc_host *ho
        }
        mmc_bus_put(host);
  
-       /*
-        * We add a slight delay here so that resume can progress
-        * in parallel.
-        */
-       mmc_detect_change(host, 1);
        return err;
  }
  EXPORT_SYMBOL(mmc_resume_host);
  
+ /* Do the card removal on suspend if card is assumed removeable
+  * Do that in pm notifier while userspace isn't yet frozen, so we will be able
+    to sync the card.
+ */
+ int mmc_pm_notify(struct notifier_block *notify_block,
+                                       unsigned long mode, void *unused)
+ {
+       struct mmc_host *host = container_of(
+               notify_block, struct mmc_host, pm_notify);
+       unsigned long flags;
+       switch (mode) {
+       case PM_HIBERNATION_PREPARE:
+       case PM_SUSPEND_PREPARE:
+               spin_lock_irqsave(&host->lock, flags);
+               host->rescan_disable = 1;
+               spin_unlock_irqrestore(&host->lock, flags);
+               cancel_delayed_work_sync(&host->detect);
+               if (!host->bus_ops || host->bus_ops->suspend)
+                       break;
+               mmc_claim_host(host);
+               if (host->bus_ops->remove)
+                       host->bus_ops->remove(host);
+               mmc_detach_bus(host);
+               mmc_release_host(host);
+               host->pm_flags = 0;
+               break;
+       case PM_POST_SUSPEND:
+       case PM_POST_HIBERNATION:
+               spin_lock_irqsave(&host->lock, flags);
+               host->rescan_disable = 0;
+               spin_unlock_irqrestore(&host->lock, flags);
+               mmc_detect_change(host, 0);
+       }
+       return 0;
+ }
  #endif
  
 +#ifdef CONFIG_MMC_EMBEDDED_SDIO
 +void mmc_set_embedded_sdio_data(struct mmc_host *host,
 +                              struct sdio_cis *cis,
 +                              struct sdio_cccr *cccr,
 +                              struct sdio_embedded_func *funcs,
 +                              int num_funcs)
 +{
 +      host->embedded_sdio_data.cis = cis;
 +      host->embedded_sdio_data.cccr = cccr;
 +      host->embedded_sdio_data.funcs = funcs;
 +      host->embedded_sdio_data.num_funcs = num_funcs;
 +}
 +
 +EXPORT_SYMBOL(mmc_set_embedded_sdio_data);
 +#endif
 +
  static int __init mmc_init(void)
  {
        int ret;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc kernel/fork.c
Simple merge
diff --cc kernel/sched.c
Simple merge
diff --cc mm/page_alloc.c
Simple merge
diff --cc net/Kconfig
Simple merge
Simple merge
diff --cc net/ipv4/tcp.c
Simple merge
Simple merge