diff mbox

[U-Boot,18/18] arm: mx6: cm_fx6: add sata support

Message ID 1407051288-17324-19-git-send-email-nikita@compulab.co.il
State Changes Requested
Delegated to: Stefano Babic
Headers show

Commit Message

Nikita Kiryanov Aug. 3, 2014, 7:34 a.m. UTC
Add support for SATA.

Cc: Igor Grinberg <grinberg@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Tom Rini <trini@ti.com>
Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
---
 board/compulab/cm_fx6/cm_fx6.c | 90 ++++++++++++++++++++++++++++++++++++++++++
 board/compulab/cm_fx6/common.h | 13 ++++++
 include/configs/cm_fx6.h       | 36 ++++++++++++++++-
 3 files changed, 138 insertions(+), 1 deletion(-)

Comments

Marek Vasut Aug. 3, 2014, 2:10 p.m. UTC | #1
On Sunday, August 03, 2014 at 09:34:48 AM, Nikita Kiryanov wrote:
> Add support for SATA.
> 
> Cc: Igor Grinberg <grinberg@compulab.co.il>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Tom Rini <trini@ti.com>
> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>

I'd just squash all the cf_mx6 patches into the "add cf_mx6 board" patch.

Best regards,
Marek Vasut
Igor Grinberg Aug. 4, 2014, 7:23 a.m. UTC | #2
Hi Marek,

On 08/03/14 17:10, Marek Vasut wrote:
> On Sunday, August 03, 2014 at 09:34:48 AM, Nikita Kiryanov wrote:
>> Add support for SATA.
>>
>> Cc: Igor Grinberg <grinberg@compulab.co.il>
>> Cc: Stefano Babic <sbabic@denx.de>
>> Cc: Tom Rini <trini@ti.com>
>> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
> 
> I'd just squash all the cf_mx6 patches into the "add cf_mx6 board" patch.

Well, I tend to disagree on this.
I find extremely hard to review the "long long squashed into one patch" patches.
It is much easier to review small, functionality oriented, patches.
Marek Vasut Aug. 4, 2014, 8:27 a.m. UTC | #3
On Monday, August 04, 2014 at 09:23:12 AM, Igor Grinberg wrote:
> Hi Marek,
> 
> On 08/03/14 17:10, Marek Vasut wrote:
> > On Sunday, August 03, 2014 at 09:34:48 AM, Nikita Kiryanov wrote:
> >> Add support for SATA.
> >> 
> >> Cc: Igor Grinberg <grinberg@compulab.co.il>
> >> Cc: Stefano Babic <sbabic@denx.de>
> >> Cc: Tom Rini <trini@ti.com>
> >> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
> > 
> > I'd just squash all the cf_mx6 patches into the "add cf_mx6 board" patch.
> 
> Well, I tend to disagree on this.
> I find extremely hard to review the "long long squashed into one patch"
> patches. It is much easier to review small, functionality oriented,
> patches.

You do have a valid point when it comes to review, all right. There's no point 
in keeping them separate when they're applied though. Tough decisions this is. 
Let's see what others think then .

Best regards,
Marek Vasut
Igor Grinberg Aug. 4, 2014, 10:47 a.m. UTC | #4
On 08/04/14 11:27, Marek Vasut wrote:
> On Monday, August 04, 2014 at 09:23:12 AM, Igor Grinberg wrote:
>> Hi Marek,
>>
>> On 08/03/14 17:10, Marek Vasut wrote:
>>> On Sunday, August 03, 2014 at 09:34:48 AM, Nikita Kiryanov wrote:
>>>> Add support for SATA.
>>>>
>>>> Cc: Igor Grinberg <grinberg@compulab.co.il>
>>>> Cc: Stefano Babic <sbabic@denx.de>
>>>> Cc: Tom Rini <trini@ti.com>
>>>> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
>>>
>>> I'd just squash all the cf_mx6 patches into the "add cf_mx6 board" patch.
>>
>> Well, I tend to disagree on this.
>> I find extremely hard to review the "long long squashed into one patch"
>> patches. It is much easier to review small, functionality oriented,
>> patches.
> 
> You do have a valid point when it comes to review, all right. There's no point 
> in keeping them separate when they're applied though. Tough decisions this is. 

When it comes to keeping them separate when applied, I'd disagree also...
Keeping the changes small and functionality oriented helps:
a) bisect-ability and blaming/reverting granularity
b) gives an opportunity to better explain the change in the commit message
c) easier fixing of merge conflicts (if any)
d) learning curve for new developers in the log (as to how to add features/fix bugs)
e) a bit more burden on maintainers ;-)
Marek Vasut Aug. 4, 2014, 10:53 a.m. UTC | #5
On Monday, August 04, 2014 at 12:47:38 PM, Igor Grinberg wrote:
> On 08/04/14 11:27, Marek Vasut wrote:
> > On Monday, August 04, 2014 at 09:23:12 AM, Igor Grinberg wrote:
> >> Hi Marek,
> >> 
> >> On 08/03/14 17:10, Marek Vasut wrote:
> >>> On Sunday, August 03, 2014 at 09:34:48 AM, Nikita Kiryanov wrote:
> >>>> Add support for SATA.
> >>>> 
> >>>> Cc: Igor Grinberg <grinberg@compulab.co.il>
> >>>> Cc: Stefano Babic <sbabic@denx.de>
> >>>> Cc: Tom Rini <trini@ti.com>
> >>>> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
> >>> 
> >>> I'd just squash all the cf_mx6 patches into the "add cf_mx6 board"
> >>> patch.
> >> 
> >> Well, I tend to disagree on this.
> >> I find extremely hard to review the "long long squashed into one patch"
> >> patches. It is much easier to review small, functionality oriented,
> >> patches.
> > 
> > You do have a valid point when it comes to review, all right. There's no
> > point in keeping them separate when they're applied though. Tough
> > decisions this is.
> 
> When it comes to keeping them separate when applied, I'd disagree also...
> Keeping the changes small and functionality oriented helps:
> a) bisect-ability and blaming/reverting granularity
> b) gives an opportunity to better explain the change in the commit message
> c) easier fixing of merge conflicts (if any)
> d) learning curve for new developers in the log (as to how to add
> features/fix bugs) e) a bit more burden on maintainers ;-)

I cannot disagree with neither ;-) Let's go with the split approach then

Best regards,
Marek Vasut
diff mbox

Patch

diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c
index d06b00e..fe80376 100644
--- a/board/compulab/cm_fx6/cm_fx6.c
+++ b/board/compulab/cm_fx6/cm_fx6.c
@@ -12,10 +12,12 @@ 
 #include <miiphy.h>
 #include <netdev.h>
 #include <fdt_support.h>
+#include <sata.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/iomux.h>
 #include <asm/imx-common/mxc_i2c.h>
+#include <asm/imx-common/sata.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include "common.h"
@@ -23,6 +25,94 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_DWC_AHSATA
+static int cm_fx6_issd_gpios[] = {
+	/* The order of the GPIOs in the array is important! */
+	CM_FX6_SATA_PHY_SLP,
+	CM_FX6_SATA_NRSTDLY,
+	CM_FX6_SATA_PWREN,
+	CM_FX6_SATA_NSTANDBY1,
+	CM_FX6_SATA_NSTANDBY2,
+	CM_FX6_SATA_LDO_EN,
+};
+
+static void cm_fx6_sata_power(int on)
+{
+	int i;
+
+	if (!on) { /* tell the iSSD that the power will be removed */
+		gpio_direction_output(CM_FX6_SATA_PWLOSS_INT, 1);
+		mdelay(10);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(cm_fx6_issd_gpios); i++) {
+		gpio_direction_output(cm_fx6_issd_gpios[i], on);
+		udelay(100);
+	}
+
+	if (!on) /* for compatibility lower the power loss interrupt */
+		gpio_direction_output(CM_FX6_SATA_PWLOSS_INT, 0);
+}
+
+static iomux_v3_cfg_t const sata_pads[] = {
+	/* SATA PWR */
+	IOMUX_PADS(PAD_ENET_TX_EN__GPIO1_IO28 | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_A22__GPIO2_IO16    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_D20__GPIO3_IO20    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_A25__GPIO5_IO02    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	/* SATA CTRL */
+	IOMUX_PADS(PAD_ENET_TXD0__GPIO1_IO30  | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_D29__GPIO3_IO29    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_A23__GPIO6_IO06    | MUX_PAD_CTRL(NO_PAD_CTRL)),
+	IOMUX_PADS(PAD_EIM_BCLK__GPIO6_IO31   | MUX_PAD_CTRL(NO_PAD_CTRL)),
+
+};
+
+static void cm_fx6_setup_issd(void)
+{
+	SETUP_IOMUX_PADS(sata_pads);
+	/* Make sure this gpio has logical 0 value */
+	gpio_direction_output(CM_FX6_SATA_PWLOSS_INT, 0);
+	udelay(100);
+
+	cm_fx6_sata_power(0);
+	mdelay(250);
+	cm_fx6_sata_power(1);
+}
+
+#define CM_FX6_SATA_INIT_RETRIES	10
+int sata_initialize(void)
+{
+	int err, i;
+
+	cm_fx6_setup_issd();
+	for (i = 0; i < CM_FX6_SATA_INIT_RETRIES; i++) {
+		err = setup_sata();
+		if (err) {
+			printf("SATA setup failed: %d\n", err);
+			return err;
+		}
+
+		udelay(100);
+
+		err = __sata_initialize();
+		if (!err)
+			break;
+
+		/* There is no device on the SATA port */
+		if (sata_port_status(0, 0) == 0)
+			break;
+
+		/* There's a device, but link not established. Retry */
+	}
+
+	return err;
+}
+#else
+static void cm_fx6_setup_issd(void) {}
+#endif
+
 #ifdef CONFIG_SYS_I2C_MXC
 #define I2C_PAD_CTRL	(PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
 			PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
diff --git a/board/compulab/cm_fx6/common.h b/board/compulab/cm_fx6/common.h
index bd04d62..ddccffb 100644
--- a/board/compulab/cm_fx6/common.h
+++ b/board/compulab/cm_fx6/common.h
@@ -19,6 +19,19 @@ 
 #define CM_FX6_ENET_NRST	IMX_GPIO_NR(2, 8)
 #define CM_FX6_USB_HUB_RST	IMX_GPIO_NR(7, 8)
 #define SB_FX6_USB_OTG_PWR	IMX_GPIO_NR(3, 22)
+#define CM_FX6_ENET_NRST	IMX_GPIO_NR(2, 8)
+#define CM_FX6_USB_HUB_RST	IMX_GPIO_NR(7, 8)
+#define SB_FX6_USB_OTG_PWR	IMX_GPIO_NR(3, 22)
+#define CM_FX6_SATA_PWREN	IMX_GPIO_NR(1, 28)
+#define CM_FX6_SATA_VDDC_CTRL	IMX_GPIO_NR(1, 30)
+#define CM_FX6_SATA_LDO_EN	IMX_GPIO_NR(2, 16)
+#define CM_FX6_SATA_NSTANDBY1	IMX_GPIO_NR(3, 20)
+#define CM_FX6_SATA_PHY_SLP	IMX_GPIO_NR(3, 23)
+#define CM_FX6_SATA_STBY_REQ	IMX_GPIO_NR(3, 29)
+#define CM_FX6_SATA_NSTANDBY2	IMX_GPIO_NR(5, 2)
+#define CM_FX6_SATA_NRSTDLY	IMX_GPIO_NR(6, 6)
+#define CM_FX6_SATA_PWLOSS_INT	IMX_GPIO_NR(6, 31)
+
 
 #if defined(CONFIG_FSL_ESDHC)
 #include <fsl_esdhc.h>
diff --git a/include/configs/cm_fx6.h b/include/configs/cm_fx6.h
index b49fd29..8021299 100644
--- a/include/configs/cm_fx6.h
+++ b/include/configs/cm_fx6.h
@@ -133,6 +133,19 @@ 
 	"mmcboot=echo Booting from mmc ...; " \
 		"run mmcargs; " \
 		"run doboot\0" \
+	"satadev=0\0" \
+	"sataroot=/dev/sda2 rw rootwait\0" \
+	"sataargs=setenv bootargs console=${console} " \
+		"root=${sataroot} " \
+		"${video}\0" \
+	"loadsatabootscript=fatload sata ${satadev} ${loadaddr} ${bootscr}\0" \
+	"satabootscript=echo Running bootscript from sata ...; " \
+		"source ${loadaddr}\0" \
+	"sataloadkernel=fatload sata ${satadev} ${loadaddr} ${kernel}\0" \
+	"sataloadfdt=fatload sata ${satadev} ${fdtaddr} ${fdtfile}\0" \
+	"sataboot=echo Booting from sata ...; "\
+		"run sataargs; " \
+		"run doboot\0" \
 	"nandroot=/dev/mtdblock4 rw\0" \
 	"nandrootfstype=ubifs\0" \
 	"nandargs=setenv bootargs console=${console} " \
@@ -159,7 +172,19 @@ 
 					"run mmcboot;" \
 				"fi;" \
 			"fi;" \
-		"fi;"
+		"fi;" \
+		"if sata init; then " \
+			"if run loadsatabootscript; then " \
+				"run satabootscript;" \
+			"else "\
+				"if run sataloadkernel; then " \
+					"if ${loadfdt}; then " \
+						"run sataloadfdt; " \
+					"fi;" \
+					"run sataboot;" \
+				"fi;" \
+			"fi;" \
+		"fi;\0"
 
 #define CONFIG_BOOTCOMMAND \
 	"run setboottypem; run boot"
@@ -225,6 +250,15 @@ 
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
 #define CONFIG_SYS_I2C_EEPROM_BUS	2
 
+/* SATA */
+#define CONFIG_CMD_SATA
+#define CONFIG_SYS_SATA_MAX_DEVICE	1
+#define CONFIG_LIBATA
+#define CONFIG_LBA48
+#define CONFIG_DWC_AHSATA
+#define CONFIG_DWC_AHSATA_PORT_ID	0
+#define CONFIG_DWC_AHSATA_BASE_ADDR	SATA_ARB_BASE_ADDR
+
 /* GPIO */
 #define CONFIG_MXC_GPIO