public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation
@ 2009-12-17 12:15 Chaithrika U S
  2009-12-18 11:03 ` Janakiram Sistla
  0 siblings, 1 reply; 6+ messages in thread
From: Chaithrika U S @ 2009-12-17 12:15 UTC (permalink / raw)
  To: linux-kernel; +Cc: akpm, davinci-linux-open-source, khilman, Chaithrika U S

Improve the suspend and resume callbacks in DaVinci MMC
host controller driver.

Tested on DA850/OMAP-L138 EVM. This testing requires patches
which add suspend-to-RAM support to DA850/OMAP-L138 SoC[1].

[1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/
2009-September/016118.html

Signed-off-by: Chaithrika U S <chaithrika@ti.com>
---
Applies to Linus' kernel tree.

 drivers/mmc/host/davinci_mmc.c |   31 +++++++++++++++++++++++++++++--
 1 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 25645bf..7d05cc1 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -170,6 +170,7 @@ struct mmc_davinci_host {
 #define DAVINCI_MMC_DATADIR_READ	1
 #define DAVINCI_MMC_DATADIR_WRITE	2
 	unsigned char data_dir;
+	unsigned char suspended;
 
 	/* buffer is used during PIO of one scatterlist segment, and
 	 * is updated along with buffer_bytes_left.  bytes_left applies
@@ -1300,15 +1301,41 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
 static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg)
 {
 	struct mmc_davinci_host *host = platform_get_drvdata(pdev);
+	int ret;
 
-	return mmc_suspend_host(host->mmc, msg);
+	mmc_host_enable(host->mmc);
+	ret = mmc_suspend_host(host->mmc, msg);
+	if (!ret) {
+		writel(0, host->base + DAVINCI_MMCIM);
+		mmc_davinci_reset_ctrl(host, 1);
+		mmc_host_disable(host->mmc);
+		clk_disable(host->clk);
+		host->suspended = 1;
+	} else {
+		host->suspended = 0;
+		mmc_host_disable(host->mmc);
+	}
+
+	return ret;
 }
 
 static int davinci_mmcsd_resume(struct platform_device *pdev)
 {
 	struct mmc_davinci_host *host = platform_get_drvdata(pdev);
+	int ret;
 
-	return mmc_resume_host(host->mmc);
+	if (!host->suspended)
+		return 0;
+
+	clk_enable(host->clk);
+	mmc_host_enable(host->mmc);
+
+	mmc_davinci_reset_ctrl(host, 0);
+	ret = mmc_resume_host(host->mmc);
+	if (!ret)
+		host->suspended = 0;
+
+	return ret;
 }
 #else
 #define davinci_mmcsd_suspend	NULL
-- 
1.5.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] davinci: MMC: updates to suspend/resume  implementation
  2009-12-17 12:15 [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation Chaithrika U S
@ 2009-12-18 11:03 ` Janakiram Sistla
  2010-01-05 23:53   ` Kevin Hilman
  0 siblings, 1 reply; 6+ messages in thread
From: Janakiram Sistla @ 2009-12-18 11:03 UTC (permalink / raw)
  To: Chaithrika U S; +Cc: linux-kernel, akpm, davinci-linux-open-source, khilman

On 12/17/09, Chaithrika U S <chaithrika@ti.com> wrote:
> Improve the suspend and resume callbacks in DaVinci MMC
> host controller driver.
[Ram] I came cross in the mailing some days back that "direct"
.suspend and .resume calls will stop being supported.Is This
true??This patch does require a migration then again.

> Tested on DA850/OMAP-L138 EVM. This testing requires patches
> which add suspend-to-RAM support to DA850/OMAP-L138 SoC[1].
>
> [1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/
> 2009-September/016118.html
>
> Signed-off-by: Chaithrika U S <chaithrika@ti.com>
> ---
> Applies to Linus' kernel tree.
>
>  drivers/mmc/host/davinci_mmc.c |   31 +++++++++++++++++++++++++++++--
>  1 files changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
> index 25645bf..7d05cc1 100644
> --- a/drivers/mmc/host/davinci_mmc.c
> +++ b/drivers/mmc/host/davinci_mmc.c
> @@ -170,6 +170,7 @@ struct mmc_davinci_host {
>  #define DAVINCI_MMC_DATADIR_READ       1
>  #define DAVINCI_MMC_DATADIR_WRITE      2
>        unsigned char data_dir;
> +       unsigned char suspended;
>
>        /* buffer is used during PIO of one scatterlist segment, and
>         * is updated along with buffer_bytes_left.  bytes_left applies
> @@ -1300,15 +1301,41 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
>  static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg)
>  {
>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
> +       int ret;
>
> -       return mmc_suspend_host(host->mmc, msg);
> +       mmc_host_enable(host->mmc);
> +       ret = mmc_suspend_host(host->mmc, msg);
> +       if (!ret) {
> +               writel(0, host->base + DAVINCI_MMCIM);
> +               mmc_davinci_reset_ctrl(host, 1);
> +               mmc_host_disable(host->mmc);
> +               clk_disable(host->clk);
> +               host->suspended = 1;
> +       } else {
> +               host->suspended = 0;
> +               mmc_host_disable(host->mmc);
> +       }
> +
> +       return ret;
>  }
>
>  static int davinci_mmcsd_resume(struct platform_device *pdev)
>  {
>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
> +       int ret;
>
> -       return mmc_resume_host(host->mmc);
> +       if (!host->suspended)
> +               return 0;
> +
> +       clk_enable(host->clk);
> +       mmc_host_enable(host->mmc);
> +
> +       mmc_davinci_reset_ctrl(host, 0);
> +       ret = mmc_resume_host(host->mmc);
> +       if (!ret)
> +               host->suspended = 0;
> +
> +       return ret;
>  }
>  #else
>  #define davinci_mmcsd_suspend  NULL
> --
> 1.5.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] davinci: MMC: updates to suspend/resume  implementation
  2009-12-18 11:03 ` Janakiram Sistla
@ 2010-01-05 23:53   ` Kevin Hilman
  2010-01-06  4:53     ` Chaithrika U S
  0 siblings, 1 reply; 6+ messages in thread
From: Kevin Hilman @ 2010-01-05 23:53 UTC (permalink / raw)
  To: Janakiram Sistla
  Cc: Chaithrika U S, linux-kernel, akpm, davinci-linux-open-source

Janakiram Sistla <janakiram.sistla@gmail.com> writes:

> On 12/17/09, Chaithrika U S <chaithrika@ti.com> wrote:
>> Improve the suspend and resume callbacks in DaVinci MMC
>> host controller driver.
>
> [Ram] I came cross in the mailing some days back that "direct"
> .suspend and .resume calls will stop being supported.Is This
> true??This patch does require a migration then again.

Yes, this patch (or an additional patch) will have to update the
MMC driver to use dev_pm_ops.

See this commit in Linus' tree where I converted the smc91x driver.
Something like this will nee dto be done for this driver as well.

Kevin

commit 9f950f72e57fe4bf9b16ace67e4cc5ffcee79d00
Author: Kevin Hilman <khilman@deeprootsystems.com>
Date:   Tue Nov 24 12:57:47 2009 +0000

    NET: smc91x: convert to dev_pm_ops
    
    Convert smc91x driver from legacy PM hooks over to using dev_pm_ops.
    
    Tested on OMAP3 platform.
    
    Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
    Acked-by: Nicolas Pitre <nico@fluxnic.net>
    Signed-off-by: David S. Miller <davem@davemloft.net>

>> Tested on DA850/OMAP-L138 EVM. This testing requires patches
>> which add suspend-to-RAM support to DA850/OMAP-L138 SoC[1].
>>
>> [1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/
>> 2009-September/016118.html
>>
>> Signed-off-by: Chaithrika U S <chaithrika@ti.com>
>> ---
>> Applies to Linus' kernel tree.
>>
>>  drivers/mmc/host/davinci_mmc.c |   31 +++++++++++++++++++++++++++++--
>>  1 files changed, 29 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
>> index 25645bf..7d05cc1 100644
>> --- a/drivers/mmc/host/davinci_mmc.c
>> +++ b/drivers/mmc/host/davinci_mmc.c
>> @@ -170,6 +170,7 @@ struct mmc_davinci_host {
>>  #define DAVINCI_MMC_DATADIR_READ       1
>>  #define DAVINCI_MMC_DATADIR_WRITE      2
>>        unsigned char data_dir;
>> +       unsigned char suspended;
>>
>>        /* buffer is used during PIO of one scatterlist segment, and
>>         * is updated along with buffer_bytes_left.  bytes_left applies
>> @@ -1300,15 +1301,41 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
>>  static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg)
>>  {
>>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
>> +       int ret;
>>
>> -       return mmc_suspend_host(host->mmc, msg);
>> +       mmc_host_enable(host->mmc);
>> +       ret = mmc_suspend_host(host->mmc, msg);
>> +       if (!ret) {
>> +               writel(0, host->base + DAVINCI_MMCIM);
>> +               mmc_davinci_reset_ctrl(host, 1);
>> +               mmc_host_disable(host->mmc);
>> +               clk_disable(host->clk);
>> +               host->suspended = 1;
>> +       } else {
>> +               host->suspended = 0;
>> +               mmc_host_disable(host->mmc);
>> +       }
>> +
>> +       return ret;
>>  }
>>
>>  static int davinci_mmcsd_resume(struct platform_device *pdev)
>>  {
>>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
>> +       int ret;
>>
>> -       return mmc_resume_host(host->mmc);
>> +       if (!host->suspended)
>> +               return 0;
>> +
>> +       clk_enable(host->clk);
>> +       mmc_host_enable(host->mmc);
>> +
>> +       mmc_davinci_reset_ctrl(host, 0);
>> +       ret = mmc_resume_host(host->mmc);
>> +       if (!ret)
>> +               host->suspended = 0;
>> +
>> +       return ret;
>>  }
>>  #else
>>  #define davinci_mmcsd_suspend  NULL
>> --
>> 1.5.6
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH 2/2] davinci: MMC: updates to suspend/resume  implementation
  2010-01-05 23:53   ` Kevin Hilman
@ 2010-01-06  4:53     ` Chaithrika U S
  0 siblings, 0 replies; 6+ messages in thread
From: Chaithrika U S @ 2010-01-06  4:53 UTC (permalink / raw)
  To: 'Kevin Hilman', 'Janakiram Sistla'
  Cc: linux-kernel, akpm, davinci-linux-open-source

On Wed, Jan 06, 2010 at 05:23:53, Kevin Hilman wrote:
> Janakiram Sistla <janakiram.sistla@gmail.com> writes:
> 
> > On 12/17/09, Chaithrika U S <chaithrika@ti.com> wrote:
> >> Improve the suspend and resume callbacks in DaVinci MMC
> >> host controller driver.
> >
> > [Ram] I came cross in the mailing some days back that "direct"
> > .suspend and .resume calls will stop being supported.Is This
> > true??This patch does require a migration then again.
> 
> Yes, this patch (or an additional patch) will have to update the
> MMC driver to use dev_pm_ops.
> 
> See this commit in Linus' tree where I converted the smc91x driver.
> Something like this will nee dto be done for this driver as well.

OK. I will submit an updated version of this patch soon.

Regards, 
Chaithrika

> 
> Kevin
> 
> commit 9f950f72e57fe4bf9b16ace67e4cc5ffcee79d00
> Author: Kevin Hilman <khilman@deeprootsystems.com>
> Date:   Tue Nov 24 12:57:47 2009 +0000
> 
>     NET: smc91x: convert to dev_pm_ops
>     
>     Convert smc91x driver from legacy PM hooks over to using dev_pm_ops.
>     
>     Tested on OMAP3 platform.
>     
>     Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
>     Acked-by: Nicolas Pitre <nico@fluxnic.net>
>     Signed-off-by: David S. Miller <davem@davemloft.net>
> 
> >> Tested on DA850/OMAP-L138 EVM. This testing requires patches
> >> which add suspend-to-RAM support to DA850/OMAP-L138 SoC[1].
> >>
> >> [1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/
> >> 2009-September/016118.html
> >>
> >> Signed-off-by: Chaithrika U S <chaithrika@ti.com>
> >> ---
> >> Applies to Linus' kernel tree.
> >>
> >>  drivers/mmc/host/davinci_mmc.c |   31 +++++++++++++++++++++++++++++--
> >>  1 files changed, 29 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
> >> index 25645bf..7d05cc1 100644
> >> --- a/drivers/mmc/host/davinci_mmc.c
> >> +++ b/drivers/mmc/host/davinci_mmc.c
> >> @@ -170,6 +170,7 @@ struct mmc_davinci_host {
> >>  #define DAVINCI_MMC_DATADIR_READ       1
> >>  #define DAVINCI_MMC_DATADIR_WRITE      2
> >>        unsigned char data_dir;
> >> +       unsigned char suspended;
> >>
> >>        /* buffer is used during PIO of one scatterlist segment, and
> >>         * is updated along with buffer_bytes_left.  bytes_left applies
> >> @@ -1300,15 +1301,41 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
> >>  static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg)
> >>  {
> >>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
> >> +       int ret;
> >>
> >> -       return mmc_suspend_host(host->mmc, msg);
> >> +       mmc_host_enable(host->mmc);
> >> +       ret = mmc_suspend_host(host->mmc, msg);
> >> +       if (!ret) {
> >> +               writel(0, host->base + DAVINCI_MMCIM);
> >> +               mmc_davinci_reset_ctrl(host, 1);
> >> +               mmc_host_disable(host->mmc);
> >> +               clk_disable(host->clk);
> >> +               host->suspended = 1;
> >> +       } else {
> >> +               host->suspended = 0;
> >> +               mmc_host_disable(host->mmc);
> >> +       }
> >> +
> >> +       return ret;
> >>  }
> >>
> >>  static int davinci_mmcsd_resume(struct platform_device *pdev)
> >>  {
> >>        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
> >> +       int ret;
> >>
> >> -       return mmc_resume_host(host->mmc);
> >> +       if (!host->suspended)
> >> +               return 0;
> >> +
> >> +       clk_enable(host->clk);
> >> +       mmc_host_enable(host->mmc);
> >> +
> >> +       mmc_davinci_reset_ctrl(host, 0);
> >> +       ret = mmc_resume_host(host->mmc);
> >> +       if (!ret)
> >> +               host->suspended = 0;
> >> +
> >> +       return ret;
> >>  }
> >>  #else
> >>  #define davinci_mmcsd_suspend  NULL
> >> --
> >> 1.5.6
> >>
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> >> the body of a message to majordomo@vger.kernel.org
> >> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >> Please read the FAQ at  http://www.tux.org/lkml/
> >>
> 



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation
  2010-03-16 20:30 [PATCH 1/2] davinci: MMC: Add a function to control reset state of the controller Kevin Hilman
@ 2010-03-16 20:30 ` Kevin Hilman
  2010-03-22 19:43   ` Andrew Morton
  0 siblings, 1 reply; 6+ messages in thread
From: Kevin Hilman @ 2010-03-16 20:30 UTC (permalink / raw)
  To: linux-mmc
  Cc: Chaithrika U S, Andrew Morton, Vipin Bhandari, Kevin Hilman,
	Sudhakar Rajashekhara, linux-kernel

From: Chaithrika U S <chaithrika@ti.com>

Improve the suspend and resume callbacks in DaVinci MMC host controller driver.
Modify the reset status of the contorller and clock during suspend and resume.
Also migrate the power management callbacks from platform driver to dev_pm_ops
structure.

Tested on DA850/OMAP-L138 EVM.

Signed-off-by: Chaithrika U S <chaithrika@ti.com>
Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
---
I thought this series had made it into -mm for 2.6.34, but I guess not.
Here it is again for 2.6.35.

 drivers/mmc/host/davinci_mmc.c |   51 +++++++++++++++++++++++++++++++++------
 1 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 56afe0a..e4d1591 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -171,6 +171,7 @@ struct mmc_davinci_host {
 #define DAVINCI_MMC_DATADIR_READ	1
 #define DAVINCI_MMC_DATADIR_WRITE	2
 	unsigned char data_dir;
+	unsigned char suspended;
 
 	/* buffer is used during PIO of one scatterlist segment, and
 	 * is updated along with buffer_bytes_left.  bytes_left applies
@@ -1332,32 +1333,66 @@ static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM
-static int davinci_mmcsd_suspend(struct platform_device *pdev, pm_message_t msg)
+static int davinci_mmcsd_suspend(struct device *dev)
 {
+	struct platform_device *pdev = to_platform_device(dev);
 	struct mmc_davinci_host *host = platform_get_drvdata(pdev);
+	struct pm_message msg = { PM_EVENT_SUSPEND };
+	int ret;
 
-	return mmc_suspend_host(host->mmc, msg);
+	mmc_host_enable(host->mmc);
+	ret = mmc_suspend_host(host->mmc, msg);
+	if (!ret) {
+		writel(0, host->base + DAVINCI_MMCIM);
+		mmc_davinci_reset_ctrl(host, 1);
+		mmc_host_disable(host->mmc);
+		clk_disable(host->clk);
+		host->suspended = 1;
+	} else {
+		host->suspended = 0;
+		mmc_host_disable(host->mmc);
+	}
+
+	return ret;
 }
 
-static int davinci_mmcsd_resume(struct platform_device *pdev)
+static int davinci_mmcsd_resume(struct device *dev)
 {
+	struct platform_device *pdev = to_platform_device(dev);
 	struct mmc_davinci_host *host = platform_get_drvdata(pdev);
+	int ret;
 
-	return mmc_resume_host(host->mmc);
+	if (!host->suspended)
+		return 0;
+
+	clk_enable(host->clk);
+	mmc_host_enable(host->mmc);
+
+	mmc_davinci_reset_ctrl(host, 0);
+	ret = mmc_resume_host(host->mmc);
+	if (!ret)
+		host->suspended = 0;
+
+	return ret;
 }
+
+static struct dev_pm_ops davinci_mmcsd_pm = {
+	.suspend        = davinci_mmcsd_suspend,
+	.resume         = davinci_mmcsd_resume,
+};
+
+#define davinci_mmcsd_pm_ops (&davinci_mmcsd_pm)
 #else
-#define davinci_mmcsd_suspend	NULL
-#define davinci_mmcsd_resume	NULL
+#define davinci_mmcsd_pm_ops NULL
 #endif
 
 static struct platform_driver davinci_mmcsd_driver = {
 	.driver		= {
 		.name	= "davinci_mmc",
 		.owner	= THIS_MODULE,
+		.pm	= davinci_mmcsd_pm_ops,
 	},
 	.remove		= __exit_p(davinci_mmcsd_remove),
-	.suspend	= davinci_mmcsd_suspend,
-	.resume		= davinci_mmcsd_resume,
 };
 
 static int __init davinci_mmcsd_init(void)
-- 
1.7.0.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation
  2010-03-16 20:30 ` [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation Kevin Hilman
@ 2010-03-22 19:43   ` Andrew Morton
  0 siblings, 0 replies; 6+ messages in thread
From: Andrew Morton @ 2010-03-22 19:43 UTC (permalink / raw)
  To: Kevin Hilman
  Cc: linux-mmc, Chaithrika U S, Vipin Bhandari, Sudhakar Rajashekhara,
	linux-kernel

On Tue, 16 Mar 2010 13:30:25 -0700
Kevin Hilman <khilman@deeprootsystems.com> wrote:

> +static struct dev_pm_ops davinci_mmcsd_pm = {
> +	.suspend        = davinci_mmcsd_suspend,
> +	.resume         = davinci_mmcsd_resume,
> +};

checkpatch said

WARNING: struct dev_pm_ops should normally be const
#83: FILE: drivers/mmc/host/davinci_mmc.c:1379:
+static struct dev_pm_ops davinci_mmcsd_pm = {

I'll make that change.  Please check.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-03-22 19:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-17 12:15 [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation Chaithrika U S
2009-12-18 11:03 ` Janakiram Sistla
2010-01-05 23:53   ` Kevin Hilman
2010-01-06  4:53     ` Chaithrika U S
  -- strict thread matches above, loose matches on Subject: below --
2010-03-16 20:30 [PATCH 1/2] davinci: MMC: Add a function to control reset state of the controller Kevin Hilman
2010-03-16 20:30 ` [PATCH 2/2] davinci: MMC: updates to suspend/resume implementation Kevin Hilman
2010-03-22 19:43   ` Andrew Morton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox