]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/arm/mach-mx6/board-mx6q_sabreauto.c
ENGR00243339 imx: sata: disable sata phy when sata is not enabled
[karo-tx-linux.git] / arch / arm / mach-mx6 / board-mx6q_sabreauto.c
index a90ade9ef87614db49d5e7e30f79099fb7f2079b..4222730bbaba51682a550c0532f520f9d616eed4 100644 (file)
@@ -839,11 +839,22 @@ static int mx6q_sabreauto_sata_init(struct device *dev, void __iomem *addr)
        tmpdata = clk_get_rate(clk) / 1000;
        clk_put(clk);
 
+#ifdef CONFIG_SATA_AHCI_PLATFORM
        ret = sata_init(addr, tmpdata);
        if (ret == 0)
                return ret;
+#else
+       usleep_range(1000, 2000);
+       /* AHCI PHY enter into PDDQ mode if the AHCI module is not enabled */
+       tmpdata = readl(addr + PORT_PHY_CTL);
+       writel(tmpdata | PORT_PHY_CTL_PDDQ_LOC, addr + PORT_PHY_CTL);
+       pr_info("No AHCI save PWR: PDDQ %s\n", ((readl(addr + PORT_PHY_CTL)
+                                       >> 20) & 1) ? "enabled" : "disabled");
+#endif
 
 release_sata_clk:
+       /* disable SATA_PHY PLL */
+       writel((readl(IOMUXC_GPR13) & ~0x2), IOMUXC_GPR13);
        clk_disable(sata_clk);
 put_sata_clk:
        clk_put(sata_clk);
@@ -851,6 +862,7 @@ put_sata_clk:
        return ret;
 }
 
+#ifdef CONFIG_SATA_AHCI_PLATFORM
 static void mx6q_sabreauto_sata_exit(struct device *dev)
 {
        clk_disable(sata_clk);
@@ -862,6 +874,7 @@ static struct ahci_platform_data mx6q_sabreauto_sata_data = {
        .init = mx6q_sabreauto_sata_init,
        .exit = mx6q_sabreauto_sata_exit,
 };
+#endif
 
 static struct imx_asrc_platform_data imx_asrc_data = {
        .channel_bits   = 4,
@@ -1588,8 +1601,14 @@ static void __init mx6_board_init(void)
 
        imx_add_viv_gpu(&imx6_gpu_data, &imx6q_gpu_pdata);
        imx6q_sabreauto_init_usb();
-       if (cpu_is_mx6q())
+       if (cpu_is_mx6q()) {
+#ifdef CONFIG_SATA_AHCI_PLATFORM
                imx6q_add_ahci(0, &mx6q_sabreauto_sata_data);
+#else
+               mx6q_sabreauto_sata_init(NULL,
+                       (void __iomem *)ioremap(MX6Q_SATA_BASE_ADDR, SZ_4K));
+#endif
+       }
        imx6q_add_vpu();
        imx6q_init_audio();
        platform_device_register(&sabreauto_vmmc_reg_devices);