[linux-sunxi] [PATCH v5 13/14] ARM: sun4i: dts: Add ahci / sata support

2014-01-22 Thread Hans de Goede
From: Oliver Schinagl oli...@schinagl.nl

This patch adds sunxi sata support to A10 boards that have such a connector.
Some boards also feature a regulator via a GPIO and support for this is also
added.

Signed-off-by: Olliver Schinagl oli...@schinagl.nl
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 arch/arm/boot/dts/sun4i-a10-a1000.dts  |  4 
 arch/arm/boot/dts/sun4i-a10-cubieboard.dts |  6 +
 arch/arm/boot/dts/sun4i-a10.dtsi   |  8 +++
 arch/arm/boot/dts/sunxi-ahci-reg.dtsi  | 38 ++
 4 files changed, 56 insertions(+)
 create mode 100644 arch/arm/boot/dts/sunxi-ahci-reg.dtsi

diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts 
b/arch/arm/boot/dts/sun4i-a10-a1000.dts
index aef8207..3fb7305 100644
--- a/arch/arm/boot/dts/sun4i-a10-a1000.dts
+++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts
@@ -48,6 +48,10 @@
status = okay;
};
 
+   ahci: sata@01c18000 {
+   status = okay;
+   };
+
pinctrl@01c20800 {
mmc0_cd_pin_a1000: mmc0_cd_pin@0 {
allwinner,pins = PH1;
diff --git a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts 
b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
index f50fb2b..6ae1110 100644
--- a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
+++ b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
@@ -12,6 +12,7 @@
 
 /dts-v1/;
 /include/ sun4i-a10.dtsi
+/include/ sunxi-ahci-reg.dtsi
 
 / {
model = Cubietech Cubieboard;
@@ -51,6 +52,11 @@
status = okay;
};
 
+   ahci: sata@01c18000 {
+   target-supply = reg_ahci_5v;
+   status = okay;
+   };
+
pinctrl@01c20800 {
mmc0_cd_pin_cubieboard: mmc0_cd_pin@0 {
allwinner,pins = PH1;
diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi
index 4736dd2..198dcda 100644
--- a/arch/arm/boot/dts/sun4i-a10.dtsi
+++ b/arch/arm/boot/dts/sun4i-a10.dtsi
@@ -331,6 +331,14 @@
status = disabled;
};
 
+   ahci: sata@01c18000 {
+   compatible = allwinner,sun4i-a10-ahci;
+   reg = 0x01c18000 0x1000;
+   interrupts = 56;
+   clocks = pll6 0, ahb_gates 25;
+   status = disabled;
+   };
+
intc: interrupt-controller@01c20400 {
compatible = allwinner,sun4i-ic;
reg = 0x01c20400 0x400;
diff --git a/arch/arm/boot/dts/sunxi-ahci-reg.dtsi 
b/arch/arm/boot/dts/sunxi-ahci-reg.dtsi
new file mode 100644
index 000..955b197
--- /dev/null
+++ b/arch/arm/boot/dts/sunxi-ahci-reg.dtsi
@@ -0,0 +1,38 @@
+/*
+ * sunxi boards sata target power supply common code
+ *
+ * Copyright 2014 - Hans de Goede hdego...@redhat.com
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/ {
+   soc@01c0 {
+   ahci_pwr_pin_a: ahci_pwr_pin@0 {
+   allwinner,pins = PB8;
+   allwinner,function = gpio_out;
+   allwinner,drive = 0;
+   allwinner,pull = 0;
+   };
+   };
+
+   regulators {
+   compatible = simple-bus;
+   pinctrl-names = default;
+
+   reg_ahci_5v: ahci-5v {
+   compatible = regulator-fixed;
+   regulator-name = ahci-5v;
+   regulator-min-microvolt = 500;
+   regulator-max-microvolt = 500;
+   pinctrl-0 = ahci_pwr_pin_a;
+   gpio = pio 1 8 0;
+   enable-active-high;
+   };
+   };
+};
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v5 07/14] ahci-platform: Library-ise ahci_probe functionality

2014-01-22 Thread Hans de Goede
ahci_probe consists of 3 steps:
1) Get resources (get mmio, clks, regulator)
2) Enable resources, handled by ahci_platform_enable_resouces
3) The more or less standard ahci-host controller init sequence

This commit refactors step 1 and 3 into separate functions, so the platform
drivers for AHCI implementations which need a specific order in step 2,
and / or need to do some custom register poking at some time, can re-use
ahci-platform.c code without needing to copy and paste it.

Note that ahci_platform_init_host's prototype takes the 3 non function
members of ahci_platform_data as arguments, the idea is that drivers using
the new exported utility functions will not use ahci_platform_data at all,
and hopefully in the future ahci_platform_data can go away entirely.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci_platform.c   | 158 --
 include/linux/ahci_platform.h |  14 
 2 files changed, 106 insertions(+), 66 deletions(-)

diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index 1cce7a2..b260ebe 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -150,60 +150,31 @@ void ahci_platform_disable_resources(struct 
ahci_host_priv *hpriv)
 EXPORT_SYMBOL_GPL(ahci_platform_disable_resources);
 
 
-static void ahci_put_clks(struct ahci_host_priv *hpriv)
-{
-   int c;
-
-   for (c = 0; c  AHCI_MAX_CLKS  hpriv-clks[c]; c++)
-   clk_put(hpriv-clks[c]);
-}
-
-static int ahci_probe(struct platform_device *pdev)
+struct ahci_host_priv *ahci_platform_get_resources(
+   struct platform_device *pdev)
 {
struct device *dev = pdev-dev;
-   struct ahci_platform_data *pdata = dev_get_platdata(dev);
-   const struct platform_device_id *id = platform_get_device_id(pdev);
-   struct ata_port_info pi = ahci_port_info[id ? id-driver_data : 0];
-   const struct ata_port_info *ppi[] = { pi, NULL };
struct ahci_host_priv *hpriv;
-   struct ata_host *host;
-   struct resource *mem;
struct clk *clk;
-   int i, irq, max_clk, n_ports, rc;
-
-   mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   if (!mem) {
-   dev_err(dev, no mmio space\n);
-   return -EINVAL;
-   }
-
-   irq = platform_get_irq(pdev, 0);
-   if (irq = 0) {
-   dev_err(dev, no irq\n);
-   return -EINVAL;
-   }
-
-   if (pdata  pdata-ata_port_info)
-   pi = *pdata-ata_port_info;
+   int i, max_clk, rc;
 
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
if (!hpriv) {
dev_err(dev, can't alloc ahci_host_priv\n);
-   return -ENOMEM;
+   return ERR_PTR(-ENOMEM);
}
 
-   hpriv-flags |= (unsigned long)pi.private_data;
-
-   hpriv-mmio = devm_ioremap(dev, mem-start, resource_size(mem));
+   hpriv-mmio = devm_ioremap_resource(dev,
+ platform_get_resource(pdev, IORESOURCE_MEM, 0));
if (!hpriv-mmio) {
-   dev_err(dev, can't map %pR\n, mem);
-   return -ENOMEM;
+   dev_err(dev, no mmio space\n);
+   return ERR_PTR(-EINVAL);
}
 
hpriv-target_pwr = devm_regulator_get_optional(dev, target);
if (IS_ERR(hpriv-target_pwr)) {
if (PTR_ERR(hpriv-target_pwr) == -EPROBE_DEFER)
-   return -EPROBE_DEFER;
+   return ERR_PTR(-EPROBE_DEFER);
hpriv-target_pwr = NULL;
}
 
@@ -223,27 +194,48 @@ static int ahci_probe(struct platform_device *pdev)
hpriv-clks[i] = clk;
}
 
-   rc = ahci_platform_enable_resources(hpriv);
-   if (rc)
-   goto free_clk;
+   return hpriv;
 
-   /*
-* Some platforms might need to prepare for mmio region access,
-* which could be done in the following init call. So, the mmio
-* region shouldn't be accessed before init (if provided) has
-* returned successfully.
-*/
-   if (pdata  pdata-init) {
-   rc = pdata-init(dev, hpriv);
-   if (rc)
-   goto disable_resources;
-   }
+free_clk:
+   while (--i = 0)
+   clk_put(hpriv-clks[i]);
+   return ERR_PTR(rc);
+}
+EXPORT_SYMBOL_GPL(ahci_platform_get_resources);
+
+void ahci_platform_put_resources(struct ahci_host_priv *hpriv)
+{
+   int c;
+
+   for (c = 0; c  AHCI_MAX_CLKS  hpriv-clks[c]; c++)
+   clk_put(hpriv-clks[c]);
+}
+EXPORT_SYMBOL_GPL(ahci_platform_put_resources);
+
+
+int ahci_platform_init_host(struct platform_device *pdev,
+   struct ahci_host_priv *hpriv,
+   const struct ata_port_info *pi_template,
+   unsigned int force_port_map,
+   unsigned int mask_port_map)
+{
+   struct device *dev = 

[linux-sunxi] [PATCH v5 08/14] ahci-platform: Library-ise suspend / resume functionality

2014-01-22 Thread Hans de Goede
Split suspend / resume code into host suspend / resume functionality and
resource enable / disabling phases, and export the new suspend_ / resume_host
functions.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci_platform.c   | 55 +++
 include/linux/ahci_platform.h |  7 ++
 2 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index b260ebe..ba93930 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -353,14 +353,12 @@ static void ahci_host_stop(struct ata_host *host)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int ahci_suspend(struct device *dev)
+int ahci_platform_suspend_host(struct device *dev)
 {
-   struct ahci_platform_data *pdata = dev_get_platdata(dev);
struct ata_host *host = dev_get_drvdata(dev);
struct ahci_host_priv *hpriv = host-private_data;
void __iomem *mmio = hpriv-mmio;
u32 ctl;
-   int rc;
 
if (hpriv-flags  AHCI_HFLAG_NO_SUSPEND) {
dev_err(dev, firmware update required for suspend/resume\n);
@@ -377,7 +375,37 @@ static int ahci_suspend(struct device *dev)
writel(ctl, mmio + HOST_CTL);
readl(mmio + HOST_CTL); /* flush */
 
-   rc = ata_host_suspend(host, PMSG_SUSPEND);
+   return ata_host_suspend(host, PMSG_SUSPEND);
+}
+EXPORT_SYMBOL_GPL(ahci_platform_suspend_host);
+
+int ahci_platform_resume_host(struct device *dev)
+{
+   struct ata_host *host = dev_get_drvdata(dev);
+   int rc;
+
+   if (dev-power.power_state.event == PM_EVENT_SUSPEND) {
+   rc = ahci_reset_controller(host);
+   if (rc)
+   return rc;
+
+   ahci_init_controller(host);
+   }
+
+   ata_host_resume(host);
+
+   return 0;
+}
+EXPORT_SYMBOL_GPL(ahci_platform_resume_host);
+
+int ahci_platform_suspend(struct device *dev)
+{
+   struct ahci_platform_data *pdata = dev_get_platdata(dev);
+   struct ata_host *host = dev_get_drvdata(dev);
+   struct ahci_host_priv *hpriv = host-private_data;
+   int rc;
+
+   rc = ahci_platform_suspend_host(dev);
if (rc)
return rc;
 
@@ -388,8 +416,9 @@ static int ahci_suspend(struct device *dev)
 
return 0;
 }
+EXPORT_SYMBOL_GPL(ahci_platform_suspend);
 
-static int ahci_resume(struct device *dev)
+int ahci_platform_resume(struct device *dev)
 {
struct ahci_platform_data *pdata = dev_get_platdata(dev);
struct ata_host *host = dev_get_drvdata(dev);
@@ -406,15 +435,9 @@ static int ahci_resume(struct device *dev)
goto disable_resources;
}
 
-   if (dev-power.power_state.event == PM_EVENT_SUSPEND) {
-   rc = ahci_reset_controller(host);
-   if (rc)
-   goto disable_resources;
-
-   ahci_init_controller(host);
-   }
-
-   ata_host_resume(host);
+   rc = ahci_platform_resume_host(dev);
+   if (rc)
+   goto disable_resources;
 
return 0;
 
@@ -423,9 +446,11 @@ disable_resources:
 
return rc;
 }
+EXPORT_SYMBOL_GPL(ahci_platform_resume);
 #endif
 
-static SIMPLE_DEV_PM_OPS(ahci_pm_ops, ahci_suspend, ahci_resume);
+static SIMPLE_DEV_PM_OPS(ahci_pm_ops, ahci_platform_suspend,
+ahci_platform_resume);
 
 static const struct of_device_id ahci_of_match[] = {
{ .compatible = snps,spear-ahci, },
diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h
index 1dc7602..b484ac0 100644
--- a/include/linux/ahci_platform.h
+++ b/include/linux/ahci_platform.h
@@ -50,4 +50,11 @@ int ahci_platform_init_host(struct platform_device *pdev,
unsigned int force_port_map,
unsigned int mask_port_map);
 
+#ifdef CONFIG_PM_SLEEP
+int ahci_platform_suspend_host(struct device *dev);
+int ahci_platform_resume_host(struct device *dev);
+int ahci_platform_suspend(struct device *dev);
+int ahci_platform_resume(struct device *dev);
+#endif
+
 #endif /* _AHCI_PLATFORM_H */
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v5 11/14] ahci-imx: Add imx_ahci_phy_init / _exit helpers

2014-01-22 Thread Hans de Goede
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci_imx.c | 142 +++--
 1 file changed, 77 insertions(+), 65 deletions(-)

diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index 2210866..e58e062 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -51,6 +51,7 @@ static int ahci_imx_hotplug;
 module_param_named(hotplug, ahci_imx_hotplug, int, 0644);
 MODULE_PARM_DESC(hotplug, AHCI IMX hot-plug support (0=Don't support, 
1=support));
 
+static void imx_ahci_phy_exit(struct ahci_host_priv *hpriv);
 static void ahci_imx_host_stop(struct ata_host *host);
 
 static void ahci_imx_error_handler(struct ata_port *ap)
@@ -78,10 +79,8 @@ static void ahci_imx_error_handler(struct ata_port *ap)
 */
reg_val = readl(mmio + PORT_PHY_CTL);
writel(reg_val | PORT_PHY_CTL_PDDQ_LOC, mmio + PORT_PHY_CTL);
-   regmap_update_bits(imxpriv-gpr, IOMUXC_GPR13,
-   IMX6Q_GPR13_SATA_MPLL_CLK_EN,
-   !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
-   ahci_platform_disable_clks(hpriv);
+
+   imx_ahci_phy_exit(hpriv);
imxpriv-no_device = true;
 }
 
@@ -98,40 +97,18 @@ static const struct ata_port_info ahci_imx_port_info = {
.port_ops   = ahci_imx_ops,
 };
 
-static int imx_ahci_probe(struct platform_device *pdev)
+static int imx_ahci_phy_init(struct ahci_host_priv *hpriv)
 {
-   struct device *dev = pdev-dev;
-   struct ahci_host_priv *hpriv;
-   struct imx_ahci_priv *imxpriv;
-   unsigned int reg_val;
+   struct imx_ahci_priv *imxpriv = hpriv-plat_data;
int rc;
 
-   imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL);
-   if (!imxpriv)
-   return -ENOMEM;
-
-   hpriv = ahci_platform_get_resources(pdev);
-   if (IS_ERR(hpriv))
-   return PTR_ERR(hpriv);
-   if (!hpriv-clks[CLK_AHB]) {
-   dev_err(dev, no ahb clk, need sata, sata_ref and ahb clks\n);
-   rc = -ENOENT;
-   goto put_resources;
-   }
-   hpriv-plat_data = imxpriv;
-
-   imxpriv-gpr =
-   syscon_regmap_lookup_by_compatible(fsl,imx6q-iomuxc-gpr);
-   if (IS_ERR(imxpriv-gpr)) {
-   dev_err(dev, failed to find fsl,imx6q-iomux-gpr regmap\n);
-   rc = PTR_ERR(imxpriv-gpr);
-   goto put_resources;
-   }
+   if (imxpriv-no_device)
+   return 0;
 
if (hpriv-target_pwr) {
rc = regulator_enable(hpriv-target_pwr);
if (rc)
-   goto put_resources;
+   return rc;
}
 
rc = ahci_platform_enable_clks(hpriv);
@@ -144,7 +121,8 @@ static int imx_ahci_probe(struct platform_device *pdev)
 * is 0x07ff, and the other one write for setting
 * the mpll_clk_en.
 */
-   regmap_update_bits(imxpriv-gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK
+   regmap_update_bits(imxpriv-gpr, IOMUXC_GPR13
+   , IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK
| IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK
| IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK
| IMX6Q_GPR13_SATA_SPD_MODE_MASK
@@ -162,9 +140,69 @@ static int imx_ahci_probe(struct platform_device *pdev)
| IMX6Q_GPR13_SATA_TX_ATTEN_9_16
| IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB
| IMX6Q_GPR13_SATA_TX_LVL_1_025_V);
-   regmap_update_bits(imxpriv-gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+
+   regmap_update_bits(imxpriv-gpr, IOMUXC_GPR13,
+   IMX6Q_GPR13_SATA_MPLL_CLK_EN,
IMX6Q_GPR13_SATA_MPLL_CLK_EN);
-   usleep_range(100, 200);
+
+   usleep_range(1000, 2000);
+   return 0;
+
+disable_regulator:
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
+   return rc;
+}
+
+static void imx_ahci_phy_exit(struct ahci_host_priv *hpriv)
+{
+   struct imx_ahci_priv *imxpriv = hpriv-plat_data;
+
+   if (imxpriv-no_device)
+   return;
+
+   regmap_update_bits(imxpriv-gpr, IOMUXC_GPR13,
+   IMX6Q_GPR13_SATA_MPLL_CLK_EN,
+   !IMX6Q_GPR13_SATA_MPLL_CLK_EN);
+   ahci_platform_disable_clks(hpriv);
+
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
+}
+
+static int imx_ahci_probe(struct platform_device *pdev)
+{
+   struct device *dev = pdev-dev;
+   struct ahci_host_priv *hpriv;
+   struct imx_ahci_priv *imxpriv;
+   unsigned int reg_val;
+   int rc;
+
+   imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL);
+   if (!imxpriv)
+   return -ENOMEM;
+
+   hpriv = ahci_platform_get_resources(pdev);
+   if (IS_ERR(hpriv))
+   return PTR_ERR(hpriv);
+   if (!hpriv-clks[CLK_AHB]) {
+   dev_err(dev, no ahb clk, 

[linux-sunxi] [PATCH v5 06/14] ahci-platform: Add enable_ / disable_resources helper functions

2014-01-22 Thread Hans de Goede
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci_platform.c   | 83 ---
 include/linux/ahci_platform.h |  2 ++
 2 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index 2f319e9..1cce7a2 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -117,6 +117,39 @@ void ahci_platform_disable_clks(struct ahci_host_priv 
*hpriv)
 EXPORT_SYMBOL_GPL(ahci_platform_disable_clks);
 
 
+int ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
+{
+   int rc;
+
+   if (hpriv-target_pwr) {
+   rc = regulator_enable(hpriv-target_pwr);
+   if (rc)
+   return rc;
+   }
+
+   rc = ahci_platform_enable_clks(hpriv);
+   if (rc)
+   goto disable_regulator;
+
+   return 0;
+
+disable_regulator:
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
+   return rc;
+}
+EXPORT_SYMBOL_GPL(ahci_platform_enable_resources);
+
+void ahci_platform_disable_resources(struct ahci_host_priv *hpriv)
+{
+   ahci_platform_disable_clks(hpriv);
+
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
+}
+EXPORT_SYMBOL_GPL(ahci_platform_disable_resources);
+
+
 static void ahci_put_clks(struct ahci_host_priv *hpriv)
 {
int c;
@@ -190,15 +223,9 @@ static int ahci_probe(struct platform_device *pdev)
hpriv-clks[i] = clk;
}
 
-   if (hpriv-target_pwr) {
-   rc = regulator_enable(hpriv-target_pwr);
-   if (rc)
-   goto free_clk;
-   }
-
-   rc = ahci_enable_clks(dev, hpriv);
+   rc = ahci_platform_enable_resources(hpriv);
if (rc)
-   goto disable_regulator;
+   goto free_clk;
 
/*
 * Some platforms might need to prepare for mmio region access,
@@ -209,7 +236,7 @@ static int ahci_probe(struct platform_device *pdev)
if (pdata  pdata-init) {
rc = pdata-init(dev, hpriv);
if (rc)
-   goto disable_unprepare_clk;
+   goto disable_resources;
}
 
ahci_save_initial_config(dev, hpriv,
@@ -279,11 +306,8 @@ static int ahci_probe(struct platform_device *pdev)
 pdata_exit:
if (pdata  pdata-exit)
pdata-exit(dev);
-disable_unprepare_clk:
-   ahci_disable_clks(hpriv);
-disable_regulator:
-   if (hpriv-target_pwr)
-   regulator_disable(hpriv-target_pwr);
+disable_resources:
+   ahci_platform_disable_resources(hpriv);
 free_clk:
ahci_put_clks(hpriv);
return rc;
@@ -298,11 +322,8 @@ static void ahci_host_stop(struct ata_host *host)
if (pdata  pdata-exit)
pdata-exit(dev);
 
-   ahci_disable_clks(hpriv);
+   ahci_platform_disable_resources(hpriv);
ahci_put_clks(hpriv);
-
-   if (hpriv-target_pwr)
-   regulator_disable(hpriv-target_pwr);
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -337,10 +358,7 @@ static int ahci_suspend(struct device *dev)
if (pdata  pdata-suspend)
return pdata-suspend(dev);
 
-   ahci_disable_clks(hpriv);
-
-   if (hpriv-target_pwr)
-   regulator_disable(hpriv-target_pwr);
+   ahci_platform_disable_resources(hpriv);
 
return 0;
 }
@@ -352,26 +370,20 @@ static int ahci_resume(struct device *dev)
struct ahci_host_priv *hpriv = host-private_data;
int rc;
 
-   if (hpriv-target_pwr) {
-   rc = regulator_enable(hpriv-target_pwr);
-   if (rc)
-   return rc;
-   }
-
-   rc = ahci_enable_clks(dev, hpriv);
+   rc = ahci_platform_enable_resources(hpriv);
if (rc)
-   goto disable_regulator;
+   return rc;
 
if (pdata  pdata-resume) {
rc = pdata-resume(dev);
if (rc)
-   goto disable_unprepare_clk;
+   goto disable_resources;
}
 
if (dev-power.power_state.event == PM_EVENT_SUSPEND) {
rc = ahci_reset_controller(host);
if (rc)
-   goto disable_unprepare_clk;
+   goto disable_resources;
 
ahci_init_controller(host);
}
@@ -380,11 +392,8 @@ static int ahci_resume(struct device *dev)
 
return 0;
 
-disable_unprepare_clk:
-   ahci_disable_clks(hpriv);
-disable_regulator:
-   if (hpriv-target_pwr)
-   regulator_disable(hpriv-target_pwr);
+disable_resources:
+   ahci_platform_disable_resources(hpriv);
 
return rc;
 }
diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h
index 0071d0b..5e5f85e 100644
--- a/include/linux/ahci_platform.h
+++ b/include/linux/ahci_platform.h
@@ -33,5 +33,7 @@ struct ahci_platform_data {
 
 int 

[linux-sunxi] [PATCH v5 05/14] ahci-platform: Add support for an optional regulator for sata-target power

2014-01-22 Thread Hans de Goede
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 .../devicetree/bindings/ata/ahci-platform.txt  |  1 +
 drivers/ata/ahci_platform.c| 35 --
 include/linux/ahci.h   |  2 ++
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt 
b/Documentation/devicetree/bindings/ata/ahci-platform.txt
index 3ced07d..1ac807f 100644
--- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
+++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
@@ -11,6 +11,7 @@ Required properties:
 Optional properties:
 - dma-coherent  : Present if dma operations are coherent
 - clocks: a list of phandle + clock specifier pairs
+- target-supply : regulator for SATA target power
 
 Example:
 sata@ffe08000 {
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index aaa0c08..2f319e9 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -167,6 +167,13 @@ static int ahci_probe(struct platform_device *pdev)
return -ENOMEM;
}
 
+   hpriv-target_pwr = devm_regulator_get_optional(dev, target);
+   if (IS_ERR(hpriv-target_pwr)) {
+   if (PTR_ERR(hpriv-target_pwr) == -EPROBE_DEFER)
+   return -EPROBE_DEFER;
+   hpriv-target_pwr = NULL;
+   }
+
max_clk = dev-of_node ? AHCI_MAX_CLKS : 1;
for (i = 0; i  max_clk; i++) {
if (i == 0)
@@ -183,9 +190,15 @@ static int ahci_probe(struct platform_device *pdev)
hpriv-clks[i] = clk;
}
 
+   if (hpriv-target_pwr) {
+   rc = regulator_enable(hpriv-target_pwr);
+   if (rc)
+   goto free_clk;
+   }
+
rc = ahci_enable_clks(dev, hpriv);
if (rc)
-   goto free_clk;
+   goto disable_regulator;
 
/*
 * Some platforms might need to prepare for mmio region access,
@@ -268,6 +281,9 @@ pdata_exit:
pdata-exit(dev);
 disable_unprepare_clk:
ahci_disable_clks(hpriv);
+disable_regulator:
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
 free_clk:
ahci_put_clks(hpriv);
return rc;
@@ -284,6 +300,9 @@ static void ahci_host_stop(struct ata_host *host)
 
ahci_disable_clks(hpriv);
ahci_put_clks(hpriv);
+
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -320,6 +339,9 @@ static int ahci_suspend(struct device *dev)
 
ahci_disable_clks(hpriv);
 
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
+
return 0;
 }
 
@@ -330,9 +352,15 @@ static int ahci_resume(struct device *dev)
struct ahci_host_priv *hpriv = host-private_data;
int rc;
 
+   if (hpriv-target_pwr) {
+   rc = regulator_enable(hpriv-target_pwr);
+   if (rc)
+   return rc;
+   }
+
rc = ahci_enable_clks(dev, hpriv);
if (rc)
-   return rc;
+   goto disable_regulator;
 
if (pdata  pdata-resume) {
rc = pdata-resume(dev);
@@ -354,6 +382,9 @@ static int ahci_resume(struct device *dev)
 
 disable_unprepare_clk:
ahci_disable_clks(hpriv);
+disable_regulator:
+   if (hpriv-target_pwr)
+   regulator_disable(hpriv-target_pwr);
 
return rc;
 }
diff --git a/include/linux/ahci.h b/include/linux/ahci.h
index 19970b0..ac69cdc 100644
--- a/include/linux/ahci.h
+++ b/include/linux/ahci.h
@@ -22,6 +22,7 @@
 #define __LINUX_AHCI_H__
 
 #include linux/clk.h
+#include linux/regulator/consumer.h
 
 #define AHCI_MAX_CLKS  3
 
@@ -40,6 +41,7 @@ struct ahci_host_priv {
u32 em_buf_sz;  /* EM buffer size in byte */
u32 em_msg_type;/* EM message type */
struct clk  *clks[AHCI_MAX_CLKS]; /* Optional */
+   struct regulator*target_pwr;/* Optional */
void*plat_data; /* Other platform data */
/* Optional ahci_start_engine override */
void(*start_engine)(struct ata_port *ap);
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v5 09/14] ARM: sunxi: Add support for Allwinner SUNXi SoCs sata to ahci_platform

2014-01-22 Thread Hans de Goede
From: Olliver Schinagl oli...@schinagl.nl

This patch adds support for the ahci sata controler found on Allwinner A10
and A20 SoCs to the ahci_platform driver.

Orignally written by Olliver Schinagl using the approach of having a platform
device which probe method creates a new child platform device which gets
driven by ahci_platform.c, as done by ahci_imx.c .

Refactored by Hans de Goede to add most of the non sunxi specific functionality
to ahci_platform.c and use a platform_data pointer from of_device_id for the
sunxi specific bits.

Signed-off-by: Olliver Schinagl oli...@schinagl.nl
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 .../devicetree/bindings/ata/ahci-platform.txt  |  18 +-
 drivers/ata/Kconfig|   9 +
 drivers/ata/Makefile   |   1 +
 drivers/ata/ahci_sunxi.c   | 251 +
 4 files changed, 276 insertions(+), 3 deletions(-)
 create mode 100644 drivers/ata/ahci_sunxi.c

diff --git a/Documentation/devicetree/bindings/ata/ahci-platform.txt 
b/Documentation/devicetree/bindings/ata/ahci-platform.txt
index 1ac807f..78b2e80 100644
--- a/Documentation/devicetree/bindings/ata/ahci-platform.txt
+++ b/Documentation/devicetree/bindings/ata/ahci-platform.txt
@@ -4,7 +4,9 @@ SATA nodes are defined to describe on-chip Serial ATA 
controllers.
 Each SATA controller should have its own node.
 
 Required properties:
-- compatible: compatible list, contains snps,spear-ahci
+- compatible: compatible list, one of snps,spear-ahci,
+  snps,exynos5440-ahci, ibm,476gtr-ahci, or
+  allwinner,sun4i-a10-ahci
 - interrupts: interrupt mapping for SATA IRQ
 - reg   : registers mapping
 
@@ -13,10 +15,20 @@ Optional properties:
 - clocks: a list of phandle + clock specifier pairs
 - target-supply : regulator for SATA target power
 
-Example:
+allwinner,sun4i-a10-ahci required properties:
+- clocks: index 0 must point to the sata_ref clk, 1 to the ahb clk
+
+Examples:
 sata@ffe08000 {
compatible = snps,spear-ahci;
reg = 0xffe08000 0x1000;
interrupts = 115;
-
 };
+
+   ahci: sata@01c18000 {
+   compatible = allwinner,sun4i-a10-ahci;
+   reg = 0x01c18000 0x1000;
+   interrupts = 56;
+   clocks = pll6 0, ahb_gates 25;
+   target-supply = reg_ahci_5v;
+   };
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
index 4e73772..cc67cc0 100644
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
@@ -106,6 +106,15 @@ config AHCI_IMX
 
  If unsure, say N.
 
+config AHCI_SUNXI
+   tristate Allwinner sunxi AHCI SATA support
+   depends on ARCH_SUNXI  SATA_AHCI_PLATFORM
+   help
+ This option enables support for the Allwinner sunxi SoC's
+ onboard AHCI SATA.
+
+ If unsure, say N.
+
 config SATA_FSL
tristate Freescale 3.0Gbps SATA support
depends on FSL_SOC
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
index 46518c6..246050b 100644
--- a/drivers/ata/Makefile
+++ b/drivers/ata/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_SATA_SIL24)  += sata_sil24.o
 obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o
 obj-$(CONFIG_SATA_HIGHBANK)+= sata_highbank.o libahci.o
 obj-$(CONFIG_AHCI_IMX) += ahci_imx.o
+obj-$(CONFIG_AHCI_SUNXI)   += ahci_sunxi.o
 
 # SFF w/ custom DMA
 obj-$(CONFIG_PDC_ADMA) += pdc_adma.o
diff --git a/drivers/ata/ahci_sunxi.c b/drivers/ata/ahci_sunxi.c
new file mode 100644
index 000..568a211
--- /dev/null
+++ b/drivers/ata/ahci_sunxi.c
@@ -0,0 +1,251 @@
+/*
+ * Allwinner sunxi AHCI SATA platform driver
+ * Copyright 2013 Olliver Schinagl oli...@schinagl.nl
+ * Copyright 2014 Hans de Goede hdego...@redhat.com
+ *
+ * based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov
+ * Based on code from Allwinner Technology Co., Ltd. www.allwinnertech.com,
+ * Daniel Wang danielw...@allwinnertech.com
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ */
+
+#include linux/ahci_platform.h
+#include linux/clk.h
+#include linux/errno.h
+#include linux/kernel.h
+#include linux/module.h
+#include linux/of_device.h
+#include linux/platform_device.h
+#include linux/regulator/consumer.h
+#include ahci.h
+
+#define AHCI_BISTAFR 0x00a0
+#define AHCI_BISTCR 0x00a4
+#define AHCI_BISTFCTR 0x00a8
+#define AHCI_BISTSR 0x00ac
+#define AHCI_BISTDECR 0x00b0
+#define AHCI_DIAGNR0 0x00b4
+#define 

[linux-sunxi] [PATCH v5 01/14] libahci: Allow drivers to override start_engine

2014-01-22 Thread Hans de Goede
Allwinner A10 and A20 ARM SoCs have an AHCI sata controller which needs a
special register to be poked before starting the DMA engine.

This register gets reset on an ahci_stop_engine call, so there is no other
place then ahci_start_engine where this poking can be done.

This commit allows drivers to override ahci_start_engine behavior for use by
the Allwinner AHCI driver (and potentially other drivers in the future).

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci.c  |  6 --
 drivers/ata/ahci.h  |  3 ++-
 drivers/ata/libahci.c   | 27 ++-
 drivers/ata/sata_highbank.c |  3 ++-
 4 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index c0ed4f27..bb4c903 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -559,6 +559,7 @@ static int ahci_vt8251_hardreset(struct ata_link *link, 
unsigned int *class,
 unsigned long deadline)
 {
struct ata_port *ap = link-ap;
+   struct ahci_host_priv *hpriv = ap-host-private_data;
bool online;
int rc;
 
@@ -569,7 +570,7 @@ static int ahci_vt8251_hardreset(struct ata_link *link, 
unsigned int *class,
rc = sata_link_hardreset(link, sata_ehc_deb_timing(link-eh_context),
 deadline, online, NULL);
 
-   ahci_start_engine(ap);
+   hpriv-start_engine(ap);
 
DPRINTK(EXIT, rc=%d, class=%u\n, rc, *class);
 
@@ -584,6 +585,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, 
unsigned int *class,
 {
struct ata_port *ap = link-ap;
struct ahci_port_priv *pp = ap-private_data;
+   struct ahci_host_priv *hpriv = ap-host-private_data;
u8 *d2h_fis = pp-rx_fis + RX_FIS_D2H_REG;
struct ata_taskfile tf;
bool online;
@@ -599,7 +601,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, 
unsigned int *class,
rc = sata_link_hardreset(link, sata_ehc_deb_timing(link-eh_context),
 deadline, online, NULL);
 
-   ahci_start_engine(ap);
+   hpriv-start_engine(ap);
 
/* The pseudo configuration device on SIMG4726 attached to
 * ASUS P5W-DH Deluxe doesn't send signature FIS after
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
index 2289efd..2c04211 100644
--- a/drivers/ata/ahci.h
+++ b/drivers/ata/ahci.h
@@ -323,6 +323,8 @@ struct ahci_host_priv {
u32 em_msg_type;/* EM message type */
struct clk  *clk;   /* Only for platforms 
supporting clk */
void*plat_data; /* Other platform data */
+   /* Optional ahci_start_engine override */
+   void(*start_engine)(struct ata_port *ap);
 };
 
 extern int ahci_ignore_sss;
@@ -357,7 +359,6 @@ int ahci_do_softreset(struct ata_link *link, unsigned int 
*class,
  int (*check_ready)(struct ata_link *link));
 
 int ahci_stop_engine(struct ata_port *ap);
-void ahci_start_engine(struct ata_port *ap);
 int ahci_check_ready(struct ata_link *link);
 int ahci_kick_engine(struct ata_port *ap);
 int ahci_port_resume(struct ata_port *ap);
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index c482f8c..96d128c 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -69,6 +69,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, 
u32 state,
 
 static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
 static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
+static void ahci_start_engine(struct ata_port *ap);
 static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc);
 static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
 static int ahci_port_start(struct ata_port *ap);
@@ -500,6 +501,9 @@ void ahci_save_initial_config(struct device *dev,
hpriv-cap = cap;
hpriv-cap2 = cap2;
hpriv-port_map = port_map;
+
+   if (!hpriv-start_engine)
+   hpriv-start_engine = ahci_start_engine;
 }
 EXPORT_SYMBOL_GPL(ahci_save_initial_config);
 
@@ -565,7 +569,7 @@ static int ahci_scr_write(struct ata_link *link, unsigned 
int sc_reg, u32 val)
return -EINVAL;
 }
 
-void ahci_start_engine(struct ata_port *ap)
+static void ahci_start_engine(struct ata_port *ap)
 {
void __iomem *port_mmio = ahci_port_base(ap);
u32 tmp;
@@ -576,7 +580,6 @@ void ahci_start_engine(struct ata_port *ap)
writel(tmp, port_mmio + PORT_CMD);
readl(port_mmio + PORT_CMD); /* flush */
 }
-EXPORT_SYMBOL_GPL(ahci_start_engine);
 
 int ahci_stop_engine(struct ata_port *ap)
 {
@@ -766,7 +769,7 @@ static void ahci_start_port(struct ata_port *ap)
 
/* enable DMA */
if (!(hpriv-flags  AHCI_HFLAG_DELAY_ENGINE))
-   ahci_start_engine(ap);
+   hpriv-start_engine(ap);
 
/* turn on LEDs */
if (ap-flags  ATA_FLAG_EM) {
@@ -1234,7 

[linux-sunxi] [PATCH v5 03/14] ahci-platform: Pass ahci_host_priv ptr to ahci_platform_data init method

2014-01-22 Thread Hans de Goede
Some ahci_platform_data-init methods need access to the ahci_host_priv data.

When calling ahci_platform_data-init the ata_host has not been allocated yet,
so access to ahci_host_priv through the dev argument is not possible.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 arch/arm/mach-davinci/devices-da8xx.c |  5 +++--
 arch/arm/mach-spear/spear1340.c   |  2 +-
 drivers/ata/ahci_imx.c| 12 ++--
 drivers/ata/ahci_platform.c   |  2 +-
 include/linux/ahci_platform.h |  3 ++-
 5 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/arch/arm/mach-davinci/devices-da8xx.c 
b/arch/arm/mach-davinci/devices-da8xx.c
index 78829c5..28e7c4c 100644
--- a/arch/arm/mach-davinci/devices-da8xx.c
+++ b/arch/arm/mach-davinci/devices-da8xx.c
@@ -14,6 +14,7 @@
 #include linux/platform_device.h
 #include linux/dma-contiguous.h
 #include linux/serial_8250.h
+#include linux/ahci.h
 #include linux/ahci_platform.h
 #include linux/clk.h
 #include linux/reboot.h
@@ -1061,7 +1062,7 @@ static unsigned long da850_sata_xtal[] = {
KHZ_TO_HZ(6),
 };
 
-static int da850_sata_init(struct device *dev, void __iomem *addr)
+static int da850_sata_init(struct device *dev, struct ahci_host_priv *hpriv)
 {
int i, ret;
unsigned int val;
@@ -1096,7 +1097,7 @@ static int da850_sata_init(struct device *dev, void 
__iomem *addr)
SATA_PHY_TXSWING(3) |
SATA_PHY_ENPLL(1);
 
-   __raw_writel(val, addr + SATA_P0PHYCR_REG);
+   __raw_writel(val, hpriv-mmio + SATA_P0PHYCR_REG);
 
return 0;
 
diff --git a/arch/arm/mach-spear/spear1340.c b/arch/arm/mach-spear/spear1340.c
index 3fb6834..9e2f3ac 100644
--- a/arch/arm/mach-spear/spear1340.c
+++ b/arch/arm/mach-spear/spear1340.c
@@ -77,7 +77,7 @@
SPEAR1340_MIPHY_PLL_RATIO_TOP(25))
 
 /* SATA device registration */
-static int sata_miphy_init(struct device *dev, void __iomem *addr)
+static int sata_miphy_init(struct device *dev, struct ahci_host_priv *hpriv)
 {
writel(SPEAR1340_SATA_CFG_VAL, SPEAR1340_PCIE_SATA_CFG);
writel(SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK,
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index 3e23e99..49fa0ca 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -91,7 +91,7 @@ static const struct ata_port_info ahci_imx_port_info = {
.port_ops   = ahci_imx_ops,
 };
 
-static int imx6q_sata_init(struct device *dev, void __iomem *mmio)
+static int imx6q_sata_init(struct device *dev, struct ahci_host_priv *hpriv)
 {
int ret = 0;
unsigned int reg_val;
@@ -145,19 +145,19 @@ static int imx6q_sata_init(struct device *dev, void 
__iomem *mmio)
 * Implement the port0.
 * Get the ahb clock rate, and configure the TIMER1MS register.
 */
-   reg_val = readl(mmio + HOST_CAP);
+   reg_val = readl(hpriv-mmio + HOST_CAP);
if (!(reg_val  HOST_CAP_SSS)) {
reg_val |= HOST_CAP_SSS;
-   writel(reg_val, mmio + HOST_CAP);
+   writel(reg_val, hpriv-mmio + HOST_CAP);
}
-   reg_val = readl(mmio + HOST_PORTS_IMPL);
+   reg_val = readl(hpriv-mmio + HOST_PORTS_IMPL);
if (!(reg_val  0x1)) {
reg_val |= 0x1;
-   writel(reg_val, mmio + HOST_PORTS_IMPL);
+   writel(reg_val, hpriv-mmio + HOST_PORTS_IMPL);
}
 
reg_val = clk_get_rate(imxpriv-ahb_clk) / 1000;
-   writel(reg_val, mmio + HOST_TIMER1MS);
+   writel(reg_val, hpriv-mmio + HOST_TIMER1MS);
 
return 0;
 }
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
index 4b231ba..434ab89 100644
--- a/drivers/ata/ahci_platform.c
+++ b/drivers/ata/ahci_platform.c
@@ -149,7 +149,7 @@ static int ahci_probe(struct platform_device *pdev)
 * returned successfully.
 */
if (pdata  pdata-init) {
-   rc = pdata-init(dev, hpriv-mmio);
+   rc = pdata-init(dev, hpriv);
if (rc)
goto disable_unprepare_clk;
}
diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h
index 73a2500..737fe38 100644
--- a/include/linux/ahci_platform.h
+++ b/include/linux/ahci_platform.h
@@ -19,9 +19,10 @@
 
 struct device;
 struct ata_port_info;
+struct ahci_host_priv;
 
 struct ahci_platform_data {
-   int (*init)(struct device *dev, void __iomem *addr);
+   int (*init)(struct device *dev, struct ahci_host_priv *hpriv);
void (*exit)(struct device *dev);
int (*suspend)(struct device *dev);
int (*resume)(struct device *dev);
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v5 12/14] ahci-imx: Fix link not coming back up after suspend / resume

2014-01-22 Thread Hans de Goede
The phy needs to be re-initialized on resume for the link to properly come
back up.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/ata/ahci_imx.c | 22 +++---
 1 file changed, 3 insertions(+), 19 deletions(-)

diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
index e58e062..68d89fa 100644
--- a/drivers/ata/ahci_imx.c
+++ b/drivers/ata/ahci_imx.c
@@ -265,27 +265,11 @@ static int imx_ahci_resume(struct device *dev)
 {
struct ata_host *host = dev_get_drvdata(dev);
struct ahci_host_priv *hpriv = host-private_data;
-   struct imx_ahci_priv *imxpriv = hpriv-plat_data;
int ret;
 
-   if (hpriv-target_pwr) {
-   ret = regulator_enable(hpriv-target_pwr);
-   if (ret)
-   return ret;
-   }
-
-   if (!imxpriv-no_device) {
-   ret = ahci_platform_enable_clks(hpriv);
-   if (ret  0) {
-   dev_err(dev, pre-enable sata_ref clock err:%d\n, ret);
-   return ret;
-   }
-
-   regmap_update_bits(imxpriv-gpr, IOMUXC_GPR13,
-   IMX6Q_GPR13_SATA_MPLL_CLK_EN,
-   IMX6Q_GPR13_SATA_MPLL_CLK_EN);
-   usleep_range(1000, 2000);
-   }
+   ret = imx_ahci_phy_init(hpriv);
+   if (ret)
+   return ret;
 
return ahci_platform_resume_host(dev);
 }
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [linux-sunxi] Doing some sunxi hacking in Brussels the Friday before Fosdem ?

2014-01-22 Thread Hans de Goede

Hi,

On 01/14/2014 11:22 AM, Carlo Caione wrote:

On Mon, Jan 13, 2014 at 5:13 PM, Hans de Goede hdego...@redhat.com wrote:

Hi All,

I know it is pretty late for this, and that most of you have already made
travel
arrangements, sorry about that.

I have this last moment spontaneous idea that it would be fun for people who
are in or
near Brussels anyways (*), to do some sunxi hacking on the Friday before
Fosdem.

Benjamin Henrion, who is also helping with organizing the sunxi dinner
Saturday evening,
has reserved some room for this at the urlab hackerspace: http://urlab.be/
which is around the corner of the Fosdem venue.

If you think this would be fun and plan to join us Friday please let me
know. If I get out of bed early enough I can be there at 10 AM, but as you
can
imagine if no-one else is coming (or just not that early) then I'll probably
go
there a bit later :)

AFAIK, we can stay there till as late as we want, although I think we'll
probably
head out for dinner and then to the Beerfest at 20pm at the latest.


I'll be in bruxelles around 4pm, a bit late :(
Anyway let me know if there will be people there.


I will be at the urlab at around 12:00 (if I make my train connection otherwise
13:00), I plan to stay till 20:00 and then go out for dinner. Maybe I'll see
you there, if not I'm sure we'll meet on Saturday.

Regards,

Hans

--
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [linux-sunxi] Pre-fosdem linux-sunxi workshop

2014-01-22 Thread Hans de Goede

Hi,

On 01/21/2014 11:40 PM, Benjamin Henrion wrote:

Hi,

I put some details about the pre-fosdem linux-sunxi workshop here:

http://wiki.urlab.be/Evenement:Linux-sunxi_workshop


Thanks for organizing this. Since there won't be much early birds,
I'm going to first bring my children to school as I do every
Friday, so I will be at the urlab at around 12:00 (if I make my
train connection otherwise 13:00), Iplan to stay till 20:00 and then
go out for dinner.

Regards,

Hans

--
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v2 0/5] clk: sunxi: Add support for USB clocks and reset bits

2014-01-22 Thread Hans de Goede
Hi Emilio, Maxime, et al,

Emilio, here is v2 of my patch-set adding support for sunxi-clk USB clocks and
reset bits. This addresses all your review comments from v1.

Can you add the first 2 patches to your queue of patches for Mike for 3.15 ?

Maxime, can you add patch 3-5 which add the dt bindings for this to your
tree please ?

Thanks  Regards,

Hans

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v2 2/5] clk: sunxi: Add USB clock register defintions

2014-01-22 Thread Hans de Goede
From: Roman Byshko rbys...@gmail.com

Add register definitions for the usb-clk register found on sun4i, sun5i and
sun7i SoCs.

Signed-off-by: Roman Byshko rbys...@gmail.com
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 Documentation/devicetree/bindings/clock/sunxi.txt |  5 +
 drivers/clk/sunxi/clk-sunxi.c | 12 
 2 files changed, 17 insertions(+)

diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt 
b/Documentation/devicetree/bindings/clock/sunxi.txt
index 79c7197..8bccb6a 100644
--- a/Documentation/devicetree/bindings/clock/sunxi.txt
+++ b/Documentation/devicetree/bindings/clock/sunxi.txt
@@ -37,6 +37,8 @@ Required properties:
allwinner,sun6i-a31-apb2-gates-clk - for the APB2 gates on A31
allwinner,sun4i-mod0-clk - for the module 0 family of clocks
allwinner,sun7i-a20-out-clk - for the external output clocks
+   allwinner,sun4i-usb-gates-clk - for usb gates + resets on A10 / A20
+   allwinner,sun5i-a13-usb-gates-clk - for usb gates + resets on A13
 
 Required properties for all clocks:
 - reg : shall be the control register address for the clock.
@@ -49,6 +51,9 @@ Required properties for all clocks:
 Additionally, allwinner,*-gates-clk clocks require:
 - clock-output-names : the corresponding gate names that the clock controls
 
+And allwinner,*-usb-gates-clk clocks also require:
+- reset-cells : shall be set to 1
+
 Clock consumers should specify the desired clocks they use with a
 clocks phandle cell. Consumers that are using a gated clock should
 provide an additional ID in their clock property. This ID is the
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
index f1a147c..18cbc3c 100644
--- a/drivers/clk/sunxi/clk-sunxi.c
+++ b/drivers/clk/sunxi/clk-sunxi.c
@@ -813,6 +813,16 @@ static const struct gates_data sun4i_ahb_gates_data 
__initconst = {
.mask = {0x7F77FFF, 0x14FB3F},
 };
 
+static const struct gates_data sun4i_usb_gates_data __initconst = {
+   .mask = {0x1C0},
+   .reset_mask = 0x07,
+};
+
+static const struct gates_data sun5i_a13_usb_gates_data __initconst = {
+   .mask = {0x140},
+   .reset_mask = 0x03,
+};
+
 static const struct gates_data sun5i_a10s_ahb_gates_data __initconst = {
.mask = {0x147667e7, 0x185915},
 };
@@ -1159,6 +1169,8 @@ static const struct of_device_id clk_gates_match[] 
__initconst = {
{.compatible = allwinner,sun6i-a31-apb1-gates-clk, .data = 
sun6i_a31_apb1_gates_data,},
{.compatible = allwinner,sun7i-a20-apb1-gates-clk, .data = 
sun7i_a20_apb1_gates_data,},
{.compatible = allwinner,sun6i-a31-apb2-gates-clk, .data = 
sun6i_a31_apb2_gates_data,},
+   {.compatible = allwinner,sun4i-usb-gates-clk, .data = 
sun4i_usb_gates_data,},
+   {.compatible = allwinner,sun5i-a13-usb-gates-clk, .data = 
sun5i_a13_usb_gates_data,},
{}
 };
 
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v2 5/5] ARM: sun7i: dt: Add bindings for USB clocks

2014-01-22 Thread Hans de Goede
From: Roman Byshko rbys...@gmail.com

Signed-off-by: Roman Byshko rbys...@gmail.com
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 arch/arm/boot/dts/sun7i-a20.dtsi | 9 +
 1 file changed, 9 insertions(+)

diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi
index 57f1fc9..a44b3b3 100644
--- a/arch/arm/boot/dts/sun7i-a20.dtsi
+++ b/arch/arm/boot/dts/sun7i-a20.dtsi
@@ -280,6 +280,15 @@
clock-output-names = ir1;
};
 
+   usb_clk: clk@01c200cc {
+   #clock-cells = 1;
+   #reset-cells = 1;
+   compatible = allwinner,sun4i-usb-gates-clk;
+   reg = 0x01c200cc 0x4;
+   clocks = pll6 1;
+   clock-output-names = usb_ohci0, usb_ohci1, 
usb_phy;
+   };
+
spi3_clk: clk@01c200d4 {
#clock-cells = 0;
compatible = allwinner,sun4i-mod0-clk;
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v2 4/5] ARM: sun5i: dt: Add bindings for USB clocks

2014-01-22 Thread Hans de Goede
From: Roman Byshko rbys...@gmail.com

Signed-off-by: Roman Byshko rbys...@gmail.com
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 arch/arm/boot/dts/sun5i-a10s.dtsi | 9 +
 arch/arm/boot/dts/sun5i-a13.dtsi  | 9 +
 2 files changed, 18 insertions(+)

diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi 
b/arch/arm/boot/dts/sun5i-a10s.dtsi
index 9591959..44235e7 100644
--- a/arch/arm/boot/dts/sun5i-a10s.dtsi
+++ b/arch/arm/boot/dts/sun5i-a10s.dtsi
@@ -255,6 +255,15 @@
clock-output-names = ir0;
};
 
+   usb_clk: clk@01c200cc {
+   #clock-cells = 1;
+   #reset-cells = 1;
+   compatible = allwinner,sun5i-a13-usb-gates-clk;
+   reg = 0x01c200cc 0x4;
+   clocks = pll6 1;
+   clock-output-names = usb_ohci0, usb_phy;
+   };
+
mbus_clk: clk@01c2015c {
#clock-cells = 0;
compatible = allwinner,sun4i-mod0-clk;
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi
index f6f2c81..4193fdf 100644
--- a/arch/arm/boot/dts/sun5i-a13.dtsi
+++ b/arch/arm/boot/dts/sun5i-a13.dtsi
@@ -252,6 +252,15 @@
clock-output-names = ir0;
};
 
+   usb_clk: clk@01c200cc {
+   #clock-cells = 1;
+   #reset-cells = 1;
+   compatible = allwinner,sun5i-a13-usb-gates-clk;
+   reg = 0x01c200cc 0x4;
+   clocks = pll6 1;
+   clock-output-names = usb_ohci0, usb_phy;
+   };
+
mbus_clk: clk@01c2015c {
#clock-cells = 0;
compatible = allwinner,sun4i-mod0-clk;
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


[linux-sunxi] [PATCH v2 3/5] ARM: sun4i: dt: Add bindings for USB clocks

2014-01-22 Thread Hans de Goede
From: Roman Byshko rbys...@gmail.com

Signed-off-by: Roman Byshko rbys...@gmail.com
Signed-off-by: Hans de Goede hdego...@redhat.com
---
 arch/arm/boot/dts/sun4i-a10.dtsi | 9 +
 1 file changed, 9 insertions(+)

diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi
index 7264ef9..913674b 100644
--- a/arch/arm/boot/dts/sun4i-a10.dtsi
+++ b/arch/arm/boot/dts/sun4i-a10.dtsi
@@ -290,6 +290,15 @@
clock-output-names = ir1;
};
 
+   usb_clk: clk@01c200cc {
+   #clock-cells = 1;
+   #reset-cells = 1;
+   compatible = allwinner,sun4i-usb-gates-clk;
+   reg = 0x01c200cc 0x4;
+   clocks = pll6 1;
+   clock-output-names = usb_ohci0, usb_ohci1, 
usb_phy;
+   };
+
spi3_clk: clk@01c200d4 {
#clock-cells = 0;
compatible = allwinner,sun4i-mod0-clk;
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: [linux-sunxi] Re: iNet K70E board

2014-01-22 Thread Luc Verhaegen
On Wed, Jan 22, 2014 at 12:27:14PM -0800, fachkar.dataw...@gmail.com wrote:
   Do not send emails to people directly, especially when they are general 
   sunxi questions. Use the mailing list.
  
   it did not boot could be a great many things. Attach serial and find 
   out.
  
   The image attached shows only a tiny part of the board. So it usually 
   would not be very useful to begin with.
 
   But... Even with this small part of the board visible, it is clear that 
   this is a completely different board from the k70hc. Please work through 
   the http://linux-sunxi.org/New_Device_howto meticulously before you do 
   anything else.

Wtf happened here?

 Thanks Luc, Following are the detailed steps i followed to create the SD card:
 
 1. connected a serial console and booted to a working android then ran the 
 a10-meminfo
 root@android:/ # a10-meminfo-static   
 
 dram_clk  = 408
 dram_type = 3
 dram_rank_num = 1
 dram_chip_density = 4096
 dram_io_width = 16
 dram_bus_width= 32
 dram_cas  = 9
 dram_zq   = 0x7f
 dram_odt_en   = 0
 dram_tpr0 = 0x42d899b7
 dram_tpr1 = 0xa090
 dram_tpr2 = 0x22a00
 dram_tpr3 = 0x0
 dram_emr1 = 0x4
 dram_emr2 = 0x10
 dram_emr3 = 0x0
 root@android:/ #
 2. copy and pull script.bin from nanda partition
  
 3. git clone -b sunxi https://github.com/linux-sunxi/u-boot-sunxi.git
 
 4. followed the steps in 
 http://linux-sunxi.org/U-Boot#Adding_a_new_device_to_U-Boot  and added :
 
 [ +obj-$(CONFIG_INET_K70HC)+= dram_inet_k70e.o ] to board/sunxi/Makefile. 
 [ +Active  arm armv7 sunxi -  sunxi   INet_K70E   sun7i:INET_K70E,SPL ] 
 to boards.cfg.
 And finally created new file: board/sunxi/dram_inet_k70e.c based on 
 board/sunxi/dram_inet_k70hc.c based on the Luc Verhaegen 's 
 board/sunxi/dram_inet_k70hc.c, then update the values according to 
 a10-meminfo output
 
 5. compiled u-boot and got u-boot-sunxi-with-spl.bin :
 ~/sunxi/u-boot-sunxi make -j4 INet_K70HC 
 CROSS_COMPILE=/home/fachkar/lichee_a20/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
 
 6. created two partitions on the sd card:  +16M partition and the partition 
 is the remaining of 8 GB
 
 7. copied script.bin and the extracted uImage to first partition of +16M on 
 the SD card
 
 8. Also on the +16MB partition created boot.cmd and boot.src as per 
 http://linux-sunxi.org/Manual_build_howto . which contains:
 
 setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 
 ${extra}
 fatload mmc 0 0x4300 script.bin || ext2load mmc 0 0x4300 script.bin
 fatload mmc 0 0x4800 uImage || ext2load mmc 0 0x4800 boot/uImage
 bootm 0x4800
 
 9. umount both partitions of the sd card and fused u-boot-sunxi-with-spl.bin:
 
 sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdf bs=1024 seek=8
 
 when trying to boot from sd card, LCD back light does not turn on, and 
 nothing shows on console, any advise?
 appreciated again
 
 ferar

There are many places above where i seriously frown, and i could pick it 
apart and find a few faults or two.

But what really bothers me is that you haven't even started creating a 
wiki page for the inet_k70e. You are _not_ meticulously working through
http://linux-sunxi.org/New_Device_howto and therefor whatever you are 
writing above is pretty pointless.

Luc Verhaegen.

-- 
You received this message because you are subscribed to the Google Groups 
linux-sunxi group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.