From f0a7b7e38004b974d98af7b50ffa62afbe613bd3 Mon Sep 17 00:00:00 2001 From: Richard Zhu Date: Thu, 28 Nov 2013 14:40:42 +0800 Subject: [PATCH] ENGR00291110 sata: can not link up after suspend resume issue: sata phy link down after suspend resume on imx6q TO1.3. solution: sata phy ref clock should be gated off/on in suspend/resume Signed-off-by: Richard Zhu --- arch/arm/mach-mx6/board-mx6q_arm2.c | 23 +++++++++++++++++++++++ arch/arm/mach-mx6/board-mx6q_sabreauto.c | 23 +++++++++++++++++++++++ arch/arm/mach-mx6/board-mx6q_sabrelite.c | 23 +++++++++++++++++++++++ arch/arm/mach-mx6/board-mx6q_sabresd.c | 23 +++++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/arch/arm/mach-mx6/board-mx6q_arm2.c b/arch/arm/mach-mx6/board-mx6q_arm2.c index 8280805..5ca47f9 100644 --- a/arch/arm/mach-mx6/board-mx6q_arm2.c +++ b/arch/arm/mach-mx6/board-mx6q_arm2.c @@ -1357,9 +1357,32 @@ static void mx6_arm2_sata_exit(struct device *dev) } +static int imx_ahci_suspend(struct device *dev) +{ + writel((readl(IOMUXC_GPR13) & ~0x2), IOMUXC_GPR13); + clk_disable(sata_clk); + + return 0; +} + +static int imx_ahci_resume(struct device *dev) +{ + int ret; + + ret = clk_enable(sata_clk); + if (ret) + dev_err(dev, "can't enable sata clock.\n"); + + writel(((readl(IOMUXC_GPR13) & ~0x2) | 0x2), IOMUXC_GPR13); + + return 0; +} + static struct ahci_platform_data mx6_arm2_sata_data = { .init = mx6_arm2_sata_init, .exit = mx6_arm2_sata_exit, + .suspend = imx_ahci_suspend, + .resume = imx_ahci_resume, }; #endif diff --git a/arch/arm/mach-mx6/board-mx6q_sabreauto.c b/arch/arm/mach-mx6/board-mx6q_sabreauto.c index 7c1fada..fb4fdcd 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabreauto.c +++ b/arch/arm/mach-mx6/board-mx6q_sabreauto.c @@ -953,9 +953,32 @@ static void mx6q_sabreauto_sata_exit(struct device *dev) } +static int imx_ahci_suspend(struct device *dev) +{ + writel((readl(IOMUXC_GPR13) & ~0x2), IOMUXC_GPR13); + clk_disable(sata_clk); + + return 0; +} + +static int imx_ahci_resume(struct device *dev) +{ + int ret; + + ret = clk_enable(sata_clk); + if (ret) + dev_err(dev, "can't enable sata clock.\n"); + + writel(((readl(IOMUXC_GPR13) & ~0x2) | 0x2), IOMUXC_GPR13); + + return 0; +} + static struct ahci_platform_data mx6q_sabreauto_sata_data = { .init = mx6q_sabreauto_sata_init, .exit = mx6q_sabreauto_sata_exit, + .suspend = imx_ahci_suspend, + .resume = imx_ahci_resume, }; #endif diff --git a/arch/arm/mach-mx6/board-mx6q_sabrelite.c b/arch/arm/mach-mx6/board-mx6q_sabrelite.c index 1fe0f7b..c4757fb 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabrelite.c +++ b/arch/arm/mach-mx6/board-mx6q_sabrelite.c @@ -757,9 +757,32 @@ static void mx6q_sabrelite_sata_exit(struct device *dev) clk_put(sata_clk); } +static int imx_ahci_suspend(struct device *dev) +{ + writel((readl(IOMUXC_GPR13) & ~0x2), IOMUXC_GPR13); + clk_disable(sata_clk); + + return 0; +} + +static int imx_ahci_resume(struct device *dev) +{ + int ret; + + ret = clk_enable(sata_clk); + if (ret) + dev_err(dev, "can't enable sata clock.\n"); + + writel(((readl(IOMUXC_GPR13) & ~0x2) | 0x2), IOMUXC_GPR13); + + return 0; +} + static struct ahci_platform_data mx6q_sabrelite_sata_data = { .init = mx6q_sabrelite_sata_init, .exit = mx6q_sabrelite_sata_exit, + .suspend = imx_ahci_suspend, + .resume = imx_ahci_resume, }; #endif diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c index 3f9a845..b7b9bab 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabresd.c +++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c @@ -1220,9 +1220,32 @@ static void mx6q_sabresd_sata_exit(struct device *dev) clk_put(sata_clk); } +static int imx_ahci_suspend(struct device *dev) +{ + writel((readl(IOMUXC_GPR13) & ~0x2), IOMUXC_GPR13); + clk_disable(sata_clk); + + return 0; +} + +static int imx_ahci_resume(struct device *dev) +{ + int ret; + + ret = clk_enable(sata_clk); + if (ret) + dev_err(dev, "can't enable sata clock.\n"); + + writel(((readl(IOMUXC_GPR13) & ~0x2) | 0x2), IOMUXC_GPR13); + + return 0; +} + static struct ahci_platform_data mx6q_sabresd_sata_data = { .init = mx6q_sabresd_sata_init, .exit = mx6q_sabresd_sata_exit, + .suspend = imx_ahci_suspend, + .resume = imx_ahci_resume, }; #endif -- 1.9.1