mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 07:34:31 +00:00
arm: mx6: cm_fx6: add sata support
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>
This commit is contained in:
parent
f66113c0ef
commit
206f38f727
3 changed files with 134 additions and 0 deletions
|
@ -13,10 +13,12 @@
|
||||||
#include <miiphy.h>
|
#include <miiphy.h>
|
||||||
#include <netdev.h>
|
#include <netdev.h>
|
||||||
#include <fdt_support.h>
|
#include <fdt_support.h>
|
||||||
|
#include <sata.h>
|
||||||
#include <asm/arch/crm_regs.h>
|
#include <asm/arch/crm_regs.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <asm/arch/iomux.h>
|
#include <asm/arch/iomux.h>
|
||||||
#include <asm/imx-common/mxc_i2c.h>
|
#include <asm/imx-common/mxc_i2c.h>
|
||||||
|
#include <asm/imx-common/sata.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -24,6 +26,91 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
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;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_I2C_MXC
|
#ifdef CONFIG_SYS_I2C_MXC
|
||||||
#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
|
#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
|
||||||
PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
|
PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
|
||||||
|
|
|
@ -19,6 +19,19 @@
|
||||||
#define CM_FX6_ENET_NRST IMX_GPIO_NR(2, 8)
|
#define CM_FX6_ENET_NRST IMX_GPIO_NR(2, 8)
|
||||||
#define CM_FX6_USB_HUB_RST IMX_GPIO_NR(7, 8)
|
#define CM_FX6_USB_HUB_RST IMX_GPIO_NR(7, 8)
|
||||||
#define SB_FX6_USB_OTG_PWR IMX_GPIO_NR(3, 22)
|
#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)
|
||||||
|
|
||||||
|
|
||||||
void cm_fx6_set_usdhc_iomux(void);
|
void cm_fx6_set_usdhc_iomux(void);
|
||||||
void cm_fx6_set_ecspi_iomux(void);
|
void cm_fx6_set_ecspi_iomux(void);
|
||||||
|
|
|
@ -128,6 +128,19 @@
|
||||||
"mmcboot=echo Booting from mmc ...; " \
|
"mmcboot=echo Booting from mmc ...; " \
|
||||||
"run mmcargs; " \
|
"run mmcargs; " \
|
||||||
"run doboot\0" \
|
"run doboot\0" \
|
||||||
|
"satadev=0\0" \
|
||||||
|
"sataroot=/dev/sda2 rw rootwait\0" \
|
||||||
|
"sataargs=setenv bootargs console=${console} " \
|
||||||
|
"root=${sataroot} " \
|
||||||
|
"${video}\0" \
|
||||||
|
"loadsatabootscript=load sata ${satadev} ${loadaddr} ${bootscr}\0" \
|
||||||
|
"satabootscript=echo Running bootscript from sata ...; " \
|
||||||
|
"source ${loadaddr}\0" \
|
||||||
|
"sataloadkernel=load sata ${satadev} ${loadaddr} ${kernel}\0" \
|
||||||
|
"sataloadfdt=load sata ${satadev} ${fdtaddr} ${fdtfile}\0" \
|
||||||
|
"sataboot=echo Booting from sata ...; "\
|
||||||
|
"run sataargs; " \
|
||||||
|
"run doboot\0" \
|
||||||
"nandroot=/dev/mtdblock4 rw\0" \
|
"nandroot=/dev/mtdblock4 rw\0" \
|
||||||
"nandrootfstype=ubifs\0" \
|
"nandrootfstype=ubifs\0" \
|
||||||
"nandargs=setenv bootargs console=${console} " \
|
"nandargs=setenv bootargs console=${console} " \
|
||||||
|
@ -155,6 +168,18 @@
|
||||||
"fi;" \
|
"fi;" \
|
||||||
"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;" \
|
||||||
"run nandboot\0"
|
"run nandboot\0"
|
||||||
|
|
||||||
#define CONFIG_BOOTCOMMAND \
|
#define CONFIG_BOOTCOMMAND \
|
||||||
|
@ -221,6 +246,15 @@
|
||||||
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
|
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
|
||||||
#define CONFIG_SYS_I2C_EEPROM_BUS 2
|
#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 */
|
/* GPIO */
|
||||||
#define CONFIG_MXC_GPIO
|
#define CONFIG_MXC_GPIO
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue