diff options
Diffstat (limited to 'arch')
23 files changed, 745 insertions, 148 deletions
| diff --git a/arch/arm/cpu/armv7/am33xx/ddr.c b/arch/arm/cpu/armv7/am33xx/ddr.c index fa697c74a..5b0454c3e 100644 --- a/arch/arm/cpu/armv7/am33xx/ddr.c +++ b/arch/arm/cpu/armv7/am33xx/ddr.c @@ -89,15 +89,12 @@ void config_ddr_phy(const struct emif_regs *regs, int nr)  void config_cmd_ctrl(const struct cmd_control *cmd, int nr)  {  	writel(cmd->cmd0csratio, &ddr_cmd_reg[nr]->cm0csratio); -	writel(cmd->cmd0dldiff, &ddr_cmd_reg[nr]->cm0dldiff);  	writel(cmd->cmd0iclkout, &ddr_cmd_reg[nr]->cm0iclkout);  	writel(cmd->cmd1csratio, &ddr_cmd_reg[nr]->cm1csratio); -	writel(cmd->cmd1dldiff, &ddr_cmd_reg[nr]->cm1dldiff);  	writel(cmd->cmd1iclkout, &ddr_cmd_reg[nr]->cm1iclkout);  	writel(cmd->cmd2csratio, &ddr_cmd_reg[nr]->cm2csratio); -	writel(cmd->cmd2dldiff, &ddr_cmd_reg[nr]->cm2dldiff);  	writel(cmd->cmd2iclkout, &ddr_cmd_reg[nr]->cm2iclkout);  } @@ -121,10 +118,6 @@ void config_ddr_data(const struct ddr_data *data, int nr)  			&(ddr_data_reg[nr]+i)->dt0fwsratio0);  		writel(data->datawrsratio0,  			&(ddr_data_reg[nr]+i)->dt0wrsratio0); -		writel(data->datauserank0delay, -			&(ddr_data_reg[nr]+i)->dt0rdelays0); -		writel(data->datadldiff0, -			&(ddr_data_reg[nr]+i)->dt0dldiff0);  	}  } diff --git a/arch/arm/cpu/armv7/omap-common/Makefile b/arch/arm/cpu/armv7/omap-common/Makefile index 4d3a165f5..679c1a18a 100644 --- a/arch/arm/cpu/armv7/omap-common/Makefile +++ b/arch/arm/cpu/armv7/omap-common/Makefile @@ -17,6 +17,11 @@ obj-y	+= vc.o  obj-y	+= abb.o  endif +ifneq ($(CONFIG_OMAP54XX),) +COBJS	+= pipe3-phy.o +obj-$(CONFIG_SCSI_AHCI_PLAT) += sata.o +endif +  ifeq ($(CONFIG_OMAP34XX),)  obj-y	+= boot-common.o  obj-y	+= lowlevel_init.o diff --git a/arch/arm/cpu/armv7/omap-common/emif-common.c b/arch/arm/cpu/armv7/omap-common/emif-common.c index b0e1caa35..5a3f2858c 100644 --- a/arch/arm/cpu/armv7/omap-common/emif-common.c +++ b/arch/arm/cpu/armv7/omap-common/emif-common.c @@ -206,7 +206,7 @@ void emif_update_timings(u32 base, const struct emif_regs *regs)  	}  } -static void ddr3_leveling(u32 base, const struct emif_regs *regs) +static void omap5_ddr3_leveling(u32 base, const struct emif_regs *regs)  {  	struct emif_reg_struct *emif = (struct emif_reg_struct *)base; @@ -217,47 +217,86 @@ static void ddr3_leveling(u32 base, const struct emif_regs *regs)  	/*  	 * Set invert_clkout (if activated)--DDR_PHYCTRL_1 -	 * Invert clock adds an additional half cycle delay on the command -	 * interface.  The additional half cycle, is usually meant to enable -	 * leveling in the situation that DQS is later than CK on the board.It -	 * also helps provide some additional margin for leveling. +	 * Invert clock adds an additional half cycle delay on the +	 * command interface.  The additional half cycle, is usually +	 * meant to enable leveling in the situation that DQS is later +	 * than CK on the board.It also helps provide some additional +	 * margin for leveling.  	 */ -	writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1); -	writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1_shdw); +	writel(regs->emif_ddr_phy_ctlr_1, +	       &emif->emif_ddr_phy_ctrl_1); + +	writel(regs->emif_ddr_phy_ctlr_1, +	       &emif->emif_ddr_phy_ctrl_1_shdw);  	__udelay(130);  	writel(((LP_MODE_DISABLE << EMIF_REG_LP_MODE_SHIFT) -		& EMIF_REG_LP_MODE_MASK), &emif->emif_pwr_mgmt_ctrl); +	       & EMIF_REG_LP_MODE_MASK), &emif->emif_pwr_mgmt_ctrl);  	/* Launch Full leveling */  	writel(DDR3_FULL_LVL, &emif->emif_rd_wr_lvl_ctl);  	/* Wait till full leveling is complete */  	readl(&emif->emif_rd_wr_lvl_ctl); -	__udelay(130); +	      __udelay(130);  	/* Read data eye leveling no of samples */  	config_data_eye_leveling_samples(base); -	/* Launch 8 incremental WR_LVL- to compensate for PHY limitation */ -	writel(0x2 << EMIF_REG_WRLVLINC_INT_SHIFT, &emif->emif_rd_wr_lvl_ctl); +	/* +	 * Launch 8 incremental WR_LVL- to compensate for +	 * PHY limitation. +	 */ +	writel(0x2 << EMIF_REG_WRLVLINC_INT_SHIFT, +	       &emif->emif_rd_wr_lvl_ctl); +  	__udelay(130);  	/* Launch Incremental leveling */  	writel(DDR3_INC_LVL, &emif->emif_rd_wr_lvl_ctl); -	__udelay(130); +	       __udelay(130);  } -static void ddr3_sw_leveling(u32 base, const struct emif_regs *regs) +static void dra7_ddr3_leveling(u32 base, const struct emif_regs *regs)  {  	struct emif_reg_struct *emif = (struct emif_reg_struct *)base; -	writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1); -	writel(regs->emif_ddr_phy_ctlr_1, &emif->emif_ddr_phy_ctrl_1_shdw); +	u32 fifo_reg; + +	fifo_reg = readl(&emif->emif_ddr_fifo_misaligned_clear_1); +	writel(fifo_reg | 0x00000100, +	       &emif->emif_ddr_fifo_misaligned_clear_1); + +	fifo_reg = readl(&emif->emif_ddr_fifo_misaligned_clear_2); +	writel(fifo_reg | 0x00000100, +	       &emif->emif_ddr_fifo_misaligned_clear_2); + +	/* Launch Full leveling */ +	writel(DDR3_FULL_LVL, &emif->emif_rd_wr_lvl_ctl); + +	/* Wait till full leveling is complete */ +	readl(&emif->emif_rd_wr_lvl_ctl); +	      __udelay(130); + +	/* Read data eye leveling no of samples */  	config_data_eye_leveling_samples(base); -	writel(regs->emif_rd_wr_lvl_ctl, &emif->emif_rd_wr_lvl_ctl); -	writel(regs->sdram_config, &emif->emif_sdram_config); +	/* +	 * Disable leveling. This is because if leveling is kept +	 * enabled, then PHY triggers a false leveling during +	 * EMIF-idle scenario which results in wrong delay +	 * values getting updated. After this the EMIF becomes +	 * unaccessible. So disable it after the first time +	 */ +	writel(0x0, &emif->emif_rd_wr_lvl_rmp_ctl); +} + +static void ddr3_leveling(u32 base, const struct emif_regs *regs) +{ +	if (is_omap54xx()) +		omap5_ddr3_leveling(base, regs); +	else +		dra7_ddr3_leveling(base, regs);  }  static void ddr3_init(u32 base, const struct emif_regs *regs) @@ -270,9 +309,6 @@ static void ddr3_init(u32 base, const struct emif_regs *regs)  	 * defined, contents of mode Registers must be fully initialized.  	 * H/W takes care of this initialization  	 */ -	writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config); -	writel(regs->sdram_config_init, &emif->emif_sdram_config); -  	writel(regs->emif_ddr_phy_ctlr_1_init, &emif->emif_ddr_phy_ctrl_1);  	/* Update timing registers */ @@ -283,15 +319,24 @@ static void ddr3_init(u32 base, const struct emif_regs *regs)  	writel(regs->ref_ctrl, &emif->emif_sdram_ref_ctrl);  	writel(regs->read_idle_ctrl, &emif->emif_read_idlectrl); -	do_ext_phy_settings(base, regs); +	/* +	 * The same sequence should work on OMAP5432 as well. But strange that +	 * it is not working +	 */ +	if (omap_revision() == DRA752_ES1_0) { +		do_ext_phy_settings(base, regs); +		writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config); +		writel(regs->sdram_config_init, &emif->emif_sdram_config); +	} else { +		writel(regs->sdram_config2, &emif->emif_lpddr2_nvm_config); +		writel(regs->sdram_config_init, &emif->emif_sdram_config); +		do_ext_phy_settings(base, regs); +	}  	/* enable leveling */  	writel(regs->emif_rd_wr_lvl_rmp_ctl, &emif->emif_rd_wr_lvl_rmp_ctl); -	if (omap_revision() == DRA752_ES1_0) -		ddr3_sw_leveling(base, regs); -	else -		ddr3_leveling(base, regs); +	ddr3_leveling(base, regs);  }  #ifndef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS @@ -1079,10 +1124,7 @@ static void do_sdram_init(u32 base)  	if (warm_reset() && (emif_sdram_type() == EMIF_SDRAM_TYPE_DDR3)) {  		set_lpmode_selfrefresh(base);  		emif_reset_phy(base); -		if (omap_revision() == DRA752_ES1_0) -			ddr3_sw_leveling(base, regs); -		else -			ddr3_leveling(base, regs); +		ddr3_leveling(base, regs);  	}  	/* Write to the shadow registers */ @@ -1244,6 +1286,42 @@ void dmm_init(u32 base)  } +static void do_bug0039_workaround(u32 base) +{ +	u32 val, i, clkctrl; +	struct emif_reg_struct *emif_base = (struct emif_reg_struct *)base; +	const struct read_write_regs *bug_00339_regs; +	u32 iterations; +	u32 *phy_status_base = &emif_base->emif_ddr_phy_status[0]; +	u32 *phy_ctrl_base = &emif_base->emif_ddr_ext_phy_ctrl_1; + +	if (is_dra7xx()) +		phy_status_base++; + +	bug_00339_regs = get_bug_regs(&iterations); + +	/* Put EMIF in to idle */ +	clkctrl = __raw_readl((*prcm)->cm_memif_clkstctrl); +	__raw_writel(0x0, (*prcm)->cm_memif_clkstctrl); + +	/* Copy the phy status registers in to phy ctrl shadow registers */ +	for (i = 0; i < iterations; i++) { +		val = __raw_readl(phy_status_base + +				  bug_00339_regs[i].read_reg - 1); + +		__raw_writel(val, phy_ctrl_base + +			     ((bug_00339_regs[i].write_reg - 1) << 1)); + +		__raw_writel(val, phy_ctrl_base + +			     (bug_00339_regs[i].write_reg << 1) - 1); +	} + +	/* Disable leveling */ +	writel(0x0, &emif_base->emif_rd_wr_lvl_rmp_ctl); + +	__raw_writel(clkctrl,  (*prcm)->cm_memif_clkstctrl); +} +  /*   * SDRAM initialization:   * SDRAM initialization has two parts: @@ -1319,5 +1397,11 @@ void sdram_init(void)  			debug("get_ram_size() successful");  	} +	if (sdram_type == EMIF_SDRAM_TYPE_DDR3 && +	    (!in_sdram && !warm_reset())) { +		do_bug0039_workaround(EMIF1_BASE); +		do_bug0039_workaround(EMIF2_BASE); +	} +  	debug("<<sdram_init()\n");  } diff --git a/arch/arm/cpu/armv7/omap-common/pipe3-phy.c b/arch/arm/cpu/armv7/omap-common/pipe3-phy.c new file mode 100644 index 000000000..b71d76941 --- /dev/null +++ b/arch/arm/cpu/armv7/omap-common/pipe3-phy.c @@ -0,0 +1,231 @@ +/* + * TI PIPE3 PHY + * + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * SPDX-License-Identifier:     GPL-2.0+ + */ + +#include <common.h> +#include <sata.h> +#include <asm/arch/clock.h> +#include <asm/arch/sys_proto.h> +#include <asm/io.h> +#include <asm/errno.h> +#include "pipe3-phy.h" + +/* PLLCTRL Registers */ +#define PLL_STATUS              0x00000004 +#define PLL_GO                  0x00000008 +#define PLL_CONFIGURATION1      0x0000000C +#define PLL_CONFIGURATION2      0x00000010 +#define PLL_CONFIGURATION3      0x00000014 +#define PLL_CONFIGURATION4      0x00000020 + +#define PLL_REGM_MASK           0x001FFE00 +#define PLL_REGM_SHIFT          9 +#define PLL_REGM_F_MASK         0x0003FFFF +#define PLL_REGM_F_SHIFT        0 +#define PLL_REGN_MASK           0x000001FE +#define PLL_REGN_SHIFT          1 +#define PLL_SELFREQDCO_MASK     0x0000000E +#define PLL_SELFREQDCO_SHIFT    1 +#define PLL_SD_MASK             0x0003FC00 +#define PLL_SD_SHIFT            10 +#define SET_PLL_GO              0x1 +#define PLL_TICOPWDN            BIT(16) +#define PLL_LDOPWDN             BIT(15) +#define PLL_LOCK                0x2 +#define PLL_IDLE                0x1 + +/* PHY POWER CONTROL Register */ +#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK         0x003FC000 +#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT        0xE + +#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK        0xFFC00000 +#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT       0x16 + +#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWERON       0x3 +#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF      0x0 + + +#define PLL_IDLE_TIME   100     /* in milliseconds */ +#define PLL_LOCK_TIME   100     /* in milliseconds */ + +static inline u32 omap_pipe3_readl(void __iomem *addr, unsigned offset) +{ +	return __raw_readl(addr + offset); +} + +static inline void omap_pipe3_writel(void __iomem *addr, unsigned offset, +		u32 data) +{ +	__raw_writel(data, addr + offset); +} + +static struct pipe3_dpll_params *omap_pipe3_get_dpll_params(struct omap_pipe3 +									*pipe3) +{ +	u32 rate; +	struct pipe3_dpll_map *dpll_map = pipe3->dpll_map; + +	rate = get_sys_clk_freq(); + +	for (; dpll_map->rate; dpll_map++) { +		if (rate == dpll_map->rate) +			return &dpll_map->params; +	} + +	printf("%s: No DPLL configuration for %u Hz SYS CLK\n", +	       __func__, rate); +	return NULL; +} + + +static int omap_pipe3_wait_lock(struct omap_pipe3 *phy) +{ +	u32 val; +	int timeout = PLL_LOCK_TIME; + +	do { +		mdelay(1); +		val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); +		if (val & PLL_LOCK) +			break; +	} while (--timeout); + +	if (!(val & PLL_LOCK)) { +		printf("%s: DPLL failed to lock\n", __func__); +		return -EBUSY; +	} + +	return 0; +} + +static int omap_pipe3_dpll_program(struct omap_pipe3 *phy) +{ +	u32                     val; +	struct pipe3_dpll_params *dpll_params; + +	dpll_params = omap_pipe3_get_dpll_params(phy); +	if (!dpll_params) { +		printf("%s: Invalid DPLL parameters\n", __func__); +		return -EINVAL; +	} + +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); +	val &= ~PLL_REGN_MASK; +	val |= dpll_params->n << PLL_REGN_SHIFT; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); + +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); +	val &= ~PLL_SELFREQDCO_MASK; +	val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); + +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); +	val &= ~PLL_REGM_MASK; +	val |= dpll_params->m << PLL_REGM_SHIFT; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); + +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4); +	val &= ~PLL_REGM_F_MASK; +	val |= dpll_params->mf << PLL_REGM_F_SHIFT; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val); + +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3); +	val &= ~PLL_SD_MASK; +	val |= dpll_params->sd << PLL_SD_SHIFT; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val); + +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO); + +	return omap_pipe3_wait_lock(phy); +} + +static void omap_control_phy_power(struct omap_pipe3 *phy, int on) +{ +	u32 val, rate; + +	val = readl(phy->power_reg); + +	rate = get_sys_clk_freq(); +	rate = rate/1000000; + +	if (on) { +		val &= ~(OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK | +				OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK); +		val |= OMAP_CTRL_PIPE3_PHY_TX_RX_POWERON << +			OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT; +		val |= rate << +			OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT; +	} else { +		val &= ~OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK; +		val |= OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF << +			OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT; +	} + +	writel(val, phy->power_reg); +} + +int phy_pipe3_power_on(struct omap_pipe3 *phy) +{ +	int ret; +	u32 val; + +	/* Program the DPLL only if not locked */ +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); +	if (!(val & PLL_LOCK)) { +		ret = omap_pipe3_dpll_program(phy); +		if (ret) +			return ret; +	} else { +		/* else just bring it out of IDLE mode */ +		val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); +		if (val & PLL_IDLE) { +			val &= ~PLL_IDLE; +			omap_pipe3_writel(phy->pll_ctrl_base, +					  PLL_CONFIGURATION2, val); +			ret = omap_pipe3_wait_lock(phy); +			if (ret) +				return ret; +		} +	} + +	/* Power up the PHY */ +	omap_control_phy_power(phy, 1); + +	return 0; +} + +int phy_pipe3_power_off(struct omap_pipe3 *phy) +{ +	u32 val; +	int timeout = PLL_IDLE_TIME; + +	/* Power down the PHY */ +	omap_control_phy_power(phy, 0); + +	/* Put DPLL in IDLE mode */ +	val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); +	val |= PLL_IDLE; +	omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); + +	/* wait for LDO and Oscillator to power down */ +	do { +		mdelay(1); +		val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); +		if ((val & PLL_TICOPWDN) && (val & PLL_LDOPWDN)) +			break; +	} while (--timeout); + +	if (!(val & PLL_TICOPWDN) || !(val & PLL_LDOPWDN)) { +		printf("%s: Failed to power down DPLL: PLL_STATUS 0x%x\n", +		       __func__, val); +		return -EBUSY; +	} + +	return 0; +} + diff --git a/arch/arm/cpu/armv7/omap-common/pipe3-phy.h b/arch/arm/cpu/armv7/omap-common/pipe3-phy.h new file mode 100644 index 000000000..441f49a3f --- /dev/null +++ b/arch/arm/cpu/armv7/omap-common/pipe3-phy.h @@ -0,0 +1,36 @@ +/* + * TI PIPE3 PHY + * + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * SPDX-License-Identifier:     GPL-2.0+ + */ + +#ifndef __OMAP_PIPE3_PHY_H +#define __OMAP_PIPE3_PHY_H + +struct pipe3_dpll_params { +	u16     m; +	u8      n; +	u8      freq:3; +	u8      sd; +	u32     mf; +}; + +struct pipe3_dpll_map { +	unsigned long rate; +	struct pipe3_dpll_params params; +}; + +struct omap_pipe3 { +	void __iomem            *pll_ctrl_base; +	void __iomem		*power_reg; +	struct pipe3_dpll_map   *dpll_map; +}; + + +int phy_pipe3_power_on(struct omap_pipe3 *phy); +int phy_pipe3_power_off(struct omap_pipe3 *pipe3); + +#endif /* __OMAP_PIPE3_PHY_H */ diff --git a/arch/arm/cpu/armv7/omap-common/sata.c b/arch/arm/cpu/armv7/omap-common/sata.c new file mode 100644 index 000000000..f5468c4c9 --- /dev/null +++ b/arch/arm/cpu/armv7/omap-common/sata.c @@ -0,0 +1,75 @@ +/* + * TI SATA platform driver + * + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * SPDX-License-Identifier:     GPL-2.0+ + */ + +#include <common.h> +#include <ahci.h> +#include <scsi.h> +#include <asm/arch/clock.h> +#include <asm/arch/sata.h> +#include <asm/io.h> +#include "pipe3-phy.h" + +static struct pipe3_dpll_map dpll_map_sata[] = { +	{12000000, {1000, 7, 4, 6, 0} },        /* 12 MHz */ +	{16800000, {714, 7, 4, 6, 0} },         /* 16.8 MHz */ +	{19200000, {625, 7, 4, 6, 0} },         /* 19.2 MHz */ +	{20000000, {600, 7, 4, 6, 0} },         /* 20 MHz */ +	{26000000, {461, 7, 4, 6, 0} },         /* 26 MHz */ +	{38400000, {312, 7, 4, 6, 0} },         /* 38.4 MHz */ +	{ },                                    /* Terminator */ +}; + +struct omap_pipe3 sata_phy = { +	.pll_ctrl_base = (void __iomem *)TI_SATA_PLLCTRL_BASE, +	/* .power_reg is updated at runtime */ +	.dpll_map = dpll_map_sata, +}; + +int omap_sata_init(void) +{ +	int ret; +	u32 val; + +	u32 const clk_domains_sata[] = { +		0 +	}; + +	u32 const clk_modules_hw_auto_sata[] = { +		(*prcm)->cm_l3init_ocp2scp3_clkctrl, +		0 +	}; + +	u32 const clk_modules_explicit_en_sata[] = { +		(*prcm)->cm_l3init_sata_clkctrl, +		0 +	}; + +	do_enable_clocks(clk_domains_sata, +			 clk_modules_hw_auto_sata, +			 clk_modules_explicit_en_sata, +			 0); + +	/* Enable optional functional clock for SATA */ +	setbits_le32((*prcm)->cm_l3init_sata_clkctrl, +		     SATA_CLKCTRL_OPTFCLKEN_MASK); + +	sata_phy.power_reg = (void __iomem *)(*ctrl)->control_phy_power_sata; + +	/* Power up the PHY */ +	phy_pipe3_power_on(&sata_phy); + +	/* Enable SATA module, No Idle, No Standby */ +	val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO; +	writel(val, TI_SATA_WRAPPER_BASE + TI_SATA_SYSCONFIG); + +	ret = ahci_init(DWC_AHSATA_BASE); +	scsi_scan(1); + +	return ret; +} diff --git a/arch/arm/cpu/armv7/omap3/clock.c b/arch/arm/cpu/armv7/omap3/clock.c index 9f989ff86..ae9c4c318 100644 --- a/arch/arm/cpu/armv7/omap3/clock.c +++ b/arch/arm/cpu/armv7/omap3/clock.c @@ -730,8 +730,6 @@ void per_clocks_enable(void)  		sr32(&prcm_base->fclken_cam, 0, 32, FCK_CAM_ON);  		sr32(&prcm_base->iclken_cam, 0, 32, ICK_CAM_ON);  	} -	sr32(&prcm_base->fclken_per, 0, 32, FCK_PER_ON); -	sr32(&prcm_base->iclken_per, 0, 32, ICK_PER_ON);  	sdelay(1000);  } diff --git a/arch/arm/cpu/armv7/omap4/hw_data.c b/arch/arm/cpu/armv7/omap4/hw_data.c index 6a225c8cb..1b2f43924 100644 --- a/arch/arm/cpu/armv7/omap4/hw_data.c +++ b/arch/arm/cpu/armv7/omap4/hw_data.c @@ -288,17 +288,21 @@ struct vcores_data omap4460_volts = {  	.mm.pmic = &twl6030,  }; +/* + * Take closest integer part of the mV value corresponding to a TWL6032 SMPS + * voltage selection code. Aligned with OMAP4470 ES1.0 OCA V.0.7. + */  struct vcores_data omap4470_volts = { -	.mpu.value = 1200, +	.mpu.value = 1202,  	.mpu.addr = SMPS_REG_ADDR_SMPS1,  	.mpu.pmic = &twl6030,  	.core.value = 1126, -	.core.addr = SMPS_REG_ADDR_SMPS1, +	.core.addr = SMPS_REG_ADDR_SMPS2,  	.core.pmic = &twl6030, -	.mm.value = 1137, -	.mm.addr = SMPS_REG_ADDR_SMPS1, +	.mm.value = 1139, +	.mm.addr = SMPS_REG_ADDR_SMPS5,  	.mm.pmic = &twl6030,  }; diff --git a/arch/arm/cpu/armv7/omap4/sdram_elpida.c b/arch/arm/cpu/armv7/omap4/sdram_elpida.c index e4c831637..6903696e1 100644 --- a/arch/arm/cpu/armv7/omap4/sdram_elpida.c +++ b/arch/arm/cpu/armv7/omap4/sdram_elpida.c @@ -32,7 +32,7 @@  #ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS -static const struct emif_regs emif_regs_elpida_200_mhz_2cs = { +const struct emif_regs emif_regs_elpida_200_mhz_2cs = {  	.sdram_config_init		= 0x80000eb9,  	.sdram_config			= 0x80001ab9,  	.ref_ctrl			= 0x0000030c, @@ -46,7 +46,7 @@ static const struct emif_regs emif_regs_elpida_200_mhz_2cs = {  	.emif_ddr_phy_ctlr_1		= 0x049ff808  }; -static const struct emif_regs emif_regs_elpida_380_mhz_1cs = { +const struct emif_regs emif_regs_elpida_380_mhz_1cs = {  	.sdram_config_init		= 0x80000eb1,  	.sdram_config			= 0x80001ab1,  	.ref_ctrl			= 0x000005cd, @@ -321,3 +321,8 @@ void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)  {  	*regs = &mr_regs;  } + +__weak const struct read_write_regs *get_bug_regs(u32 *iterations) +{ +	return 0; +} diff --git a/arch/arm/cpu/armv7/omap5/hw_data.c b/arch/arm/cpu/armv7/omap5/hw_data.c index a1b249e73..82910e87a 100644 --- a/arch/arm/cpu/armv7/omap5/hw_data.c +++ b/arch/arm/cpu/armv7/omap5/hw_data.c @@ -600,6 +600,7 @@ const struct ctrl_ioregs ioregs_omap5432_es1 = {  	.ctrl_ddrio_1 = DDR_IO_1_VREF_CELLS_DDR3_VALUE,  	.ctrl_ddrio_2 = DDR_IO_2_VREF_CELLS_DDR3_VALUE,  	.ctrl_emif_sdram_config_ext = SDRAM_CONFIG_EXT_RD_LVL_11_SAMPLES, +	.ctrl_emif_sdram_config_ext_final = SDRAM_CONFIG_EXT_RD_LVL_4_SAMPLES,  };  const struct ctrl_ioregs ioregs_omap5432_es2 = { @@ -610,16 +611,18 @@ const struct ctrl_ioregs ioregs_omap5432_es2 = {  	.ctrl_ddrio_1 = DDR_IO_1_VREF_CELLS_DDR3_VALUE_ES2,  	.ctrl_ddrio_2 = DDR_IO_2_VREF_CELLS_DDR3_VALUE_ES2,  	.ctrl_emif_sdram_config_ext = SDRAM_CONFIG_EXT_RD_LVL_11_SAMPLES, +	.ctrl_emif_sdram_config_ext_final = SDRAM_CONFIG_EXT_RD_LVL_4_SAMPLES,  };  const struct ctrl_ioregs ioregs_dra7xx_es1 = {  	.ctrl_ddrch = 0x40404040,  	.ctrl_lpddr2ch = 0x40404040,  	.ctrl_ddr3ch = 0x80808080, -	.ctrl_ddrio_0 = 0xbae8c631, -	.ctrl_ddrio_1 = 0xb46318d8, +	.ctrl_ddrio_0 = 0xA2084210, +	.ctrl_ddrio_1 = 0x84210840,  	.ctrl_ddrio_2 = 0x84210000, -	.ctrl_emif_sdram_config_ext = 0xb2c00000, +	.ctrl_emif_sdram_config_ext = 0x0001C1A7, +	.ctrl_emif_sdram_config_ext_final = 0x000101A7,  	.ctrl_ddr_ctrl_ext_0 = 0xA2000000,  }; diff --git a/arch/arm/cpu/armv7/omap5/hwinit.c b/arch/arm/cpu/armv7/omap5/hwinit.c index 1065891ae..5386ae056 100644 --- a/arch/arm/cpu/armv7/omap5/hwinit.c +++ b/arch/arm/cpu/armv7/omap5/hwinit.c @@ -168,12 +168,6 @@ void do_io_settings(void)  		io_settings_lpddr2();  	else  		io_settings_ddr3(); - -	/* Efuse settings */ -	writel(EFUSE_1, (*ctrl)->control_efuse_1); -	writel(EFUSE_2, (*ctrl)->control_efuse_2); -	writel(EFUSE_3, (*ctrl)->control_efuse_3); -	writel(EFUSE_4, (*ctrl)->control_efuse_4);  }  static const struct srcomp_params srcomp_parameters[NUM_SYS_CLKS] = { @@ -297,13 +291,17 @@ void srcomp_enable(void)  void config_data_eye_leveling_samples(u32 emif_base)  { +	const struct ctrl_ioregs *ioregs; + +	get_ioregs(&ioregs); +  	/*EMIF_SDRAM_CONFIG_EXT-Read data eye leveling no of samples =4*/  	if (emif_base == EMIF1_BASE) -		writel(SDRAM_CONFIG_EXT_RD_LVL_4_SAMPLES, -			(*ctrl)->control_emif1_sdram_config_ext); +		writel(ioregs->ctrl_emif_sdram_config_ext_final, +		       (*ctrl)->control_emif1_sdram_config_ext);  	else if (emif_base == EMIF2_BASE) -		writel(SDRAM_CONFIG_EXT_RD_LVL_4_SAMPLES, -			(*ctrl)->control_emif2_sdram_config_ext); +		writel(ioregs->ctrl_emif_sdram_config_ext_final, +		       (*ctrl)->control_emif2_sdram_config_ext);  }  void init_omap_revision(void) diff --git a/arch/arm/cpu/armv7/omap5/prcm-regs.c b/arch/arm/cpu/armv7/omap5/prcm-regs.c index 304ac1c17..77c428b53 100644 --- a/arch/arm/cpu/armv7/omap5/prcm-regs.c +++ b/arch/arm/cpu/armv7/omap5/prcm-regs.c @@ -203,8 +203,10 @@ struct prcm_regs const omap5_es1_prcm = {  	.cm_l3init_hsusbotg_clkctrl = 0x4a009360,  	.cm_l3init_hsusbtll_clkctrl = 0x4a009368,  	.cm_l3init_p1500_clkctrl = 0x4a009378, +	.cm_l3init_sata_clkctrl = 0x4a009388,  	.cm_l3init_fsusb_clkctrl = 0x4a0093d0,  	.cm_l3init_ocp2scp1_clkctrl = 0x4a0093e0, +	.cm_l3init_ocp2scp3_clkctrl = 0x4a0093e8,  	/* cm2.l4per */  	.cm_l4per_clkstctrl = 0x4a009400, @@ -296,6 +298,7 @@ struct omap_sys_ctrl_regs const omap5_ctrl = {  	.control_status				= 0x4A002134,  	.control_std_fuse_opp_vdd_mpu_2		= 0x4A0021B4,  	.control_phy_power_usb 			= 0x4A002370, +	.control_phy_power_sata			= 0x4A002374,  	.control_padconf_core_base		= 0x4A002800,  	.control_paconf_global			= 0x4A002DA0,  	.control_paconf_mode			= 0x4A002DA4, @@ -373,6 +376,7 @@ struct omap_sys_ctrl_regs const omap5_ctrl = {  struct omap_sys_ctrl_regs const dra7xx_ctrl = {  	.control_status				= 0x4A002134, +	.control_phy_power_sata			= 0x4A002374,  	.control_core_mac_id_0_lo		= 0x4A002514,  	.control_core_mac_id_0_hi		= 0x4A002518,  	.control_core_mac_id_1_lo		= 0x4A00251C, @@ -698,6 +702,7 @@ struct prcm_regs const omap5_es2_prcm = {  	.cm_l3init_hsusbotg_clkctrl = 0x4a009660,  	.cm_l3init_hsusbtll_clkctrl = 0x4a009668,  	.cm_l3init_p1500_clkctrl = 0x4a009678, +	.cm_l3init_sata_clkctrl = 0x4a009688,  	.cm_l3init_fsusb_clkctrl = 0x4a0096d0,  	.cm_l3init_ocp2scp1_clkctrl = 0x4a0096e0,  	.cm_l3init_ocp2scp3_clkctrl = 0x4a0096e8, @@ -891,9 +896,11 @@ struct prcm_regs const dra7xx_prcm = {  	.cm_l3init_hsusbhost_clkctrl		= 0x4a009340,  	.cm_l3init_hsusbotg_clkctrl		= 0x4a009348,  	.cm_l3init_hsusbtll_clkctrl		= 0x4a009350, +	.cm_l3init_sata_clkctrl			= 0x4a009388,  	.cm_gmac_clkstctrl			= 0x4a0093c0,  	.cm_gmac_gmac_clkctrl			= 0x4a0093d0,  	.cm_l3init_ocp2scp1_clkctrl		= 0x4a0093e0, +	.cm_l3init_ocp2scp3_clkctrl		= 0x4a0093e8,  	/* cm2.l4per */  	.cm_l4per_clkstctrl			= 0x4a009700, diff --git a/arch/arm/cpu/armv7/omap5/sdram.c b/arch/arm/cpu/armv7/omap5/sdram.c index e65c1160e..2e1870609 100644 --- a/arch/arm/cpu/armv7/omap5/sdram.c +++ b/arch/arm/cpu/armv7/omap5/sdram.c @@ -148,13 +148,13 @@ const struct emif_regs emif_1_regs_ddr3_532_mhz_1cs_dra_es1 = {  	.read_idle_ctrl                 = 0x00050000,  	.zq_config                      = 0x0007190B,  	.temp_alert_config              = 0x00000000, -	.emif_ddr_phy_ctlr_1_init       = 0x0E20400A, -	.emif_ddr_phy_ctlr_1            = 0x0E24400A, -	.emif_ddr_ext_phy_ctrl_1        = 0x04040100, -	.emif_ddr_ext_phy_ctrl_2        = 0x009E009E, -	.emif_ddr_ext_phy_ctrl_3        = 0x009E009E, -	.emif_ddr_ext_phy_ctrl_4        = 0x009E009E, -	.emif_ddr_ext_phy_ctrl_5        = 0x009E009E, +	.emif_ddr_phy_ctlr_1_init       = 0x0024400A, +	.emif_ddr_phy_ctlr_1            = 0x0024400A, +	.emif_ddr_ext_phy_ctrl_1        = 0x10040100, +	.emif_ddr_ext_phy_ctrl_2        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_3        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_4        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_5        = 0x00B000B0,  	.emif_rd_wr_lvl_rmp_win         = 0x00000000,  	.emif_rd_wr_lvl_rmp_ctl         = 0x80000000,  	.emif_rd_wr_lvl_ctl             = 0x00000000, @@ -172,13 +172,13 @@ const struct emif_regs emif_2_regs_ddr3_532_mhz_1cs_dra_es1 = {  	.read_idle_ctrl                 = 0x00050000,  	.zq_config                      = 0x0007190B,  	.temp_alert_config              = 0x00000000, -	.emif_ddr_phy_ctlr_1_init       = 0x0020400A, -	.emif_ddr_phy_ctlr_1            = 0x0E24400A, -	.emif_ddr_ext_phy_ctrl_1        = 0x04040100, -	.emif_ddr_ext_phy_ctrl_2        = 0x009D009D, -	.emif_ddr_ext_phy_ctrl_3        = 0x009D009D, -	.emif_ddr_ext_phy_ctrl_4        = 0x009D009D, -	.emif_ddr_ext_phy_ctrl_5        = 0x009D009D, +	.emif_ddr_phy_ctlr_1_init       = 0x0024400A, +	.emif_ddr_phy_ctlr_1            = 0x0024400A, +	.emif_ddr_ext_phy_ctrl_1        = 0x10040100, +	.emif_ddr_ext_phy_ctrl_2        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_3        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_4        = 0x00B000B0, +	.emif_ddr_ext_phy_ctrl_5        = 0x00B000B0,  	.emif_rd_wr_lvl_rmp_win         = 0x00000000,  	.emif_rd_wr_lvl_rmp_ctl         = 0x80000000,  	.emif_rd_wr_lvl_ctl             = 0x00000000, @@ -306,7 +306,7 @@ void emif_get_device_details(u32 emif_nr,  #endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */ -const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG] = { +const u32 ext_phy_ctrl_const_base[] = {  	0x01004010,  	0x00001004,  	0x04010040, @@ -329,7 +329,7 @@ const u32 ext_phy_ctrl_const_base[EMIF_EXT_PHY_CTRL_CONST_REG] = {  	0x0  }; -const u32 ddr3_ext_phy_ctrl_const_base_es1[EMIF_EXT_PHY_CTRL_CONST_REG] = { +const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {  	0x01004010,  	0x00001004,  	0x04010040, @@ -352,7 +352,7 @@ const u32 ddr3_ext_phy_ctrl_const_base_es1[EMIF_EXT_PHY_CTRL_CONST_REG] = {  	0x0  }; -const u32 ddr3_ext_phy_ctrl_const_base_es2[EMIF_EXT_PHY_CTRL_CONST_REG] = { +const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {  	0x50D4350D,  	0x00000D43,  	0x04010040, @@ -376,51 +376,61 @@ const u32 ddr3_ext_phy_ctrl_const_base_es2[EMIF_EXT_PHY_CTRL_CONST_REG] = {  };  const u32 -dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[EMIF_EXT_PHY_CTRL_CONST_REG] = { -	0x009E009E, -	0x002E002E, -	0x002E002E, -	0x002E002E, -	0x002E002E, -	0x002E002E, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x004D004D, -	0x0, -	0x600020, +dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = { +	0x00B000B0, +	0x00400040, +	0x00400040, +	0x00400040, +	0x00400040, +	0x00400040, +	0x00800080, +	0x00800080, +	0x00800080, +	0x00800080, +	0x00800080, +	0x00600060, +	0x00600060, +	0x00600060, +	0x00600060, +	0x00600060, +	0x00800080, +	0x00800080,  	0x40010080, -	0x8102040 +	0x08102040, +	0x0, +	0x0, +	0x0, +	0x0, +	0x0  };  const u32 -dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[EMIF_EXT_PHY_CTRL_CONST_REG] = { -	0x009D009D, -	0x002D002D, -	0x002D002D, -	0x002D002D, -	0x002D002D, -	0x002D002D, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, -	0x00570057, +dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = { +	0x00BB00BB, +	0x00440044, +	0x00440044, +	0x00440044, +	0x00440044, +	0x00440044, +	0x007F007F, +	0x007F007F, +	0x007F007F, +	0x007F007F, +	0x007F007F, +	0x00600060, +	0x00600060, +	0x00600060, +	0x00600060, +	0x00600060,  	0x0, -	0x600020, +	0x00600020,  	0x40010080, -	0x8102040 +	0x08102040, +	0x0, +	0x0, +	0x0, +	0x0, +	0x0  };  const struct lpddr2_mr_regs mr_regs = { @@ -431,27 +441,38 @@ const struct lpddr2_mr_regs mr_regs = {  	.mr16	= MR16_REF_FULL_ARRAY  }; -static void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs) +static void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, +					     const u32 **regs, +					     u32 *size)  {  	switch (omap_revision()) {  	case OMAP5430_ES1_0:  	case OMAP5430_ES2_0:  		*regs = ext_phy_ctrl_const_base; +		*size = ARRAY_SIZE(ext_phy_ctrl_const_base);  		break;  	case OMAP5432_ES1_0:  		*regs = ddr3_ext_phy_ctrl_const_base_es1; +		*size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);  		break;  	case OMAP5432_ES2_0:  		*regs = ddr3_ext_phy_ctrl_const_base_es2; +		*size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);  		break;  	case DRA752_ES1_0: -		if (emif_nr == 1) +		if (emif_nr == 1) {  			*regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1; -		else +			*size = +			ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1); +		} else {  			*regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2; +			*size = +			ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2); +		}  		break;  	default:  		*regs = ddr3_ext_phy_ctrl_const_base_es2; +		*size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);  	}  } @@ -468,6 +489,7 @@ void do_ext_phy_settings(u32 base, const struct emif_regs *regs)  	u32 emif_nr;  	const u32 *ext_phy_ctrl_const_regs;  	u32 i = 0; +	u32 size;  	emif_nr = (base == EMIF1_BASE) ? 1 : 2; @@ -487,8 +509,10 @@ void do_ext_phy_settings(u32 base, const struct emif_regs *regs)  	 * external phy 6-24 registers do not change with  	 * ddr frequency  	 */ -	emif_get_ext_phy_ctrl_const_regs(emif_nr, &ext_phy_ctrl_const_regs); -	for (i = 0; i < EMIF_EXT_PHY_CTRL_CONST_REG; i++) { +	emif_get_ext_phy_ctrl_const_regs(emif_nr, +					 &ext_phy_ctrl_const_regs, &size); + +	for (i = 0; i < size; i++) {  		writel(ext_phy_ctrl_const_regs[i],  		       emif_ext_phy_ctrl_base++);  		/* Update shadow registers */ @@ -545,6 +569,74 @@ static const struct lpddr2_device_timings dev_4G_S4_timings = {  	.min_tck	= &min_tck,  }; +/* + * List of status registers to be controlled back to control registers + * after initial leveling + * readreg, writereg + */ +const struct read_write_regs omap5_bug_00339_regs[] = { +	{ 8,  5 }, +	{ 9,  6 }, +	{ 10, 7 }, +	{ 14, 8 }, +	{ 15, 9 }, +	{ 16, 10 }, +	{ 11, 2 }, +	{ 12, 3 }, +	{ 13, 4 }, +	{ 17, 11 }, +	{ 18, 12 }, +	{ 19, 13 }, +}; + +const struct read_write_regs dra_bug_00339_regs[] = { +	{ 7,  7 }, +	{ 8,  8 }, +	{ 9,  9 }, +	{ 10, 10 }, +	{ 11, 11 }, +	{ 12, 2 }, +	{ 13, 3 }, +	{ 14, 4 }, +	{ 15, 5 }, +	{ 16, 6 }, +	{ 17, 12 }, +	{ 18, 13 }, +	{ 19, 14 }, +	{ 20, 15 }, +	{ 21, 16 }, +	{ 22, 17 }, +	{ 23, 18 }, +	{ 24, 19 }, +	{ 25, 20 }, +	{ 26, 21} +}; + +const struct read_write_regs *get_bug_regs(u32 *iterations) +{ +	const struct read_write_regs *bug_00339_regs_ptr = NULL; + +	switch (omap_revision()) { +	case OMAP5430_ES1_0: +	case OMAP5430_ES2_0: +	case OMAP5432_ES1_0: +	case OMAP5432_ES2_0: +		bug_00339_regs_ptr = omap5_bug_00339_regs; +		*iterations = sizeof(omap5_bug_00339_regs)/ +			     sizeof(omap5_bug_00339_regs[0]); +		break; +	case DRA752_ES1_0: +		bug_00339_regs_ptr = dra_bug_00339_regs; +		*iterations = sizeof(dra_bug_00339_regs)/ +			     sizeof(dra_bug_00339_regs[0]); +		break; +	default: +		printf("\n Error: UnKnown SOC"); +	} + +	return bug_00339_regs_ptr; +} +  void emif_get_device_timings_sdp(u32 emif_nr,  		const struct lpddr2_device_timings **cs0_device_timings,  		const struct lpddr2_device_timings **cs1_device_timings) diff --git a/arch/arm/include/asm/arch-am33xx/ddr_defs.h b/arch/arm/include/asm/arch-am33xx/ddr_defs.h index fe48b5fed..2278358ab 100644 --- a/arch/arm/include/asm/arch-am33xx/ddr_defs.h +++ b/arch/arm/include/asm/arch-am33xx/ddr_defs.h @@ -18,7 +18,6 @@  #define VTP_CTRL_READY		(0x1 << 5)  #define VTP_CTRL_ENABLE		(0x1 << 6)  #define VTP_CTRL_START_EN	(0x1) -#define PHY_DLL_LOCK_DIFF	0x0  #define DDR_CKE_CTRL_NORMAL	0x1  #define PHY_EN_DYN_PWRDN	(0x1 << 20) @@ -29,7 +28,6 @@  #define MT47H128M16RT25E_EMIF_TIM3		0x0000033F  #define MT47H128M16RT25E_EMIF_SDCFG		0x41805332  #define MT47H128M16RT25E_EMIF_SDREF		0x0000081a -#define MT47H128M16RT25E_DLL_LOCK_DIFF		0x0  #define MT47H128M16RT25E_RATIO			0x80  #define MT47H128M16RT25E_INVERT_CLKOUT		0x00  #define MT47H128M16RT25E_RD_DQS			0x12 @@ -38,7 +36,6 @@  #define MT47H128M16RT25E_PHY_GATELVL		0x00  #define MT47H128M16RT25E_PHY_WR_DATA		0x40  #define MT47H128M16RT25E_PHY_FIFO_WE		0x80 -#define MT47H128M16RT25E_PHY_RANK0_DELAY		0x1  #define MT47H128M16RT25E_IOCTRL_VALUE		0x18B  /* Micron MT41J128M16JT-125 */ @@ -49,7 +46,6 @@  #define MT41J128MJT125_EMIF_SDCFG		0x61C04AB2  #define MT41J128MJT125_EMIF_SDREF		0x0000093B  #define MT41J128MJT125_ZQ_CFG			0x50074BE4 -#define MT41J128MJT125_DLL_LOCK_DIFF		0x1  #define MT41J128MJT125_RATIO			0x40  #define MT41J128MJT125_INVERT_CLKOUT		0x1  #define MT41J128MJT125_RD_DQS			0x3B @@ -58,6 +54,12 @@  #define MT41J128MJT125_PHY_FIFO_WE		0x100  #define MT41J128MJT125_IOCTRL_VALUE		0x18B +/* Micron MT41J64M16JT-125 */ +#define MT41J64MJT125_EMIF_SDCFG		0x61C04A32 + +/* Micron MT41J256M16JT-125 */ +#define MT41J256MJT125_EMIF_SDCFG		0x61C04B32 +  /* Micron MT41J256M8HX-15E */  #define MT41J256M8HX15E_EMIF_READ_LATENCY	0x06  #define MT41J256M8HX15E_EMIF_TIM1		0x0888A39B @@ -66,7 +68,6 @@  #define MT41J256M8HX15E_EMIF_SDCFG		0x61C04B32  #define MT41J256M8HX15E_EMIF_SDREF		0x0000093B  #define MT41J256M8HX15E_ZQ_CFG			0x50074BE4 -#define MT41J256M8HX15E_DLL_LOCK_DIFF		0x1  #define MT41J256M8HX15E_RATIO			0x40  #define MT41J256M8HX15E_INVERT_CLKOUT		0x1  #define MT41J256M8HX15E_RD_DQS			0x3B @@ -83,7 +84,6 @@  #define MT41K256M16HA125E_EMIF_SDCFG		0x61C05332  #define MT41K256M16HA125E_EMIF_SDREF		0xC30  #define MT41K256M16HA125E_ZQ_CFG		0x50074BE4 -#define MT41K256M16HA125E_DLL_LOCK_DIFF		0x1  #define MT41K256M16HA125E_RATIO			0x80  #define MT41K256M16HA125E_INVERT_CLKOUT		0x0  #define MT41K256M16HA125E_RD_DQS		0x38 @@ -100,7 +100,6 @@  #define MT41J512M8RH125_EMIF_SDCFG		0x61C04BB2  #define MT41J512M8RH125_EMIF_SDREF		0x0000093B  #define MT41J512M8RH125_ZQ_CFG			0x50074BE4 -#define MT41J512M8RH125_DLL_LOCK_DIFF		0x1  #define MT41J512M8RH125_RATIO			0x80  #define MT41J512M8RH125_INVERT_CLKOUT		0x0  #define MT41J512M8RH125_RD_DQS			0x3B @@ -117,7 +116,6 @@  #define K4B2G1646EBIH9_EMIF_SDCFG		0x61C052B2  #define K4B2G1646EBIH9_EMIF_SDREF		0x00000C30  #define K4B2G1646EBIH9_ZQ_CFG			0x50074BE4 -#define K4B2G1646EBIH9_DLL_LOCK_DIFF		0x1  #define K4B2G1646EBIH9_RATIO			0x80  #define K4B2G1646EBIH9_INVERT_CLKOUT		0x0  #define K4B2G1646EBIH9_RD_DQS			0x35 @@ -149,18 +147,15 @@ void config_ddr_phy(const struct emif_regs *regs, int nr);  struct ddr_cmd_regs {  	unsigned int resv0[7];  	unsigned int cm0csratio;	/* offset 0x01C */ -	unsigned int resv1[2]; -	unsigned int cm0dldiff;		/* offset 0x028 */ +	unsigned int resv1[3];  	unsigned int cm0iclkout;	/* offset 0x02C */  	unsigned int resv2[8];  	unsigned int cm1csratio;	/* offset 0x050 */ -	unsigned int resv3[2]; -	unsigned int cm1dldiff;		/* offset 0x05C */ +	unsigned int resv3[3];  	unsigned int cm1iclkout;	/* offset 0x060 */  	unsigned int resv4[8];  	unsigned int cm2csratio;	/* offset 0x084 */ -	unsigned int resv5[2]; -	unsigned int cm2dldiff;		/* offset 0x090 */ +	unsigned int resv5[3];  	unsigned int cm2iclkout;	/* offset 0x094 */  	unsigned int resv6[3];  }; @@ -197,24 +192,21 @@ struct ddr_regs {  	unsigned int cm0configclk;	/* offset 0x010 */  	unsigned int resv1[2];  	unsigned int cm0csratio;	/* offset 0x01C */ -	unsigned int resv2[2]; -	unsigned int cm0dldiff;		/* offset 0x028 */ +	unsigned int resv2[3];  	unsigned int cm0iclkout;	/* offset 0x02C */  	unsigned int resv3[4];  	unsigned int cm1config;		/* offset 0x040 */  	unsigned int cm1configclk;	/* offset 0x044 */  	unsigned int resv4[2];  	unsigned int cm1csratio;	/* offset 0x050 */ -	unsigned int resv5[2]; -	unsigned int cm1dldiff;		/* offset 0x05C */ +	unsigned int resv5[3];  	unsigned int cm1iclkout;	/* offset 0x060 */  	unsigned int resv6[4];  	unsigned int cm2config;		/* offset 0x074 */  	unsigned int cm2configclk;	/* offset 0x078 */  	unsigned int resv7[2];  	unsigned int cm2csratio;	/* offset 0x084 */ -	unsigned int resv8[2]; -	unsigned int cm2dldiff;		/* offset 0x090 */ +	unsigned int resv8[3];  	unsigned int cm2iclkout;	/* offset 0x094 */  	unsigned int resv9[12];  	unsigned int dt0rdsratio0;	/* offset 0x0C8 */ @@ -243,17 +235,14 @@ struct cmd_control {  	unsigned long cmd0csratio;  	unsigned long cmd0csforce;  	unsigned long cmd0csdelay; -	unsigned long cmd0dldiff;  	unsigned long cmd0iclkout;  	unsigned long cmd1csratio;  	unsigned long cmd1csforce;  	unsigned long cmd1csdelay; -	unsigned long cmd1dldiff;  	unsigned long cmd1iclkout;  	unsigned long cmd2csratio;  	unsigned long cmd2csforce;  	unsigned long cmd2csdelay; -	unsigned long cmd2dldiff;  	unsigned long cmd2iclkout;  }; @@ -267,8 +256,6 @@ struct ddr_data {  	unsigned long datagiratio0;  	unsigned long datafwsratio0;  	unsigned long datawrsratio0; -	unsigned long datauserank0delay; -	unsigned long datadldiff0;  };  /** diff --git a/arch/arm/include/asm/arch-davinci/hardware.h b/arch/arm/include/asm/arch-davinci/hardware.h index 7aaf4bff8..27b1844ee 100644 --- a/arch/arm/include/asm/arch-davinci/hardware.h +++ b/arch/arm/include/asm/arch-davinci/hardware.h @@ -478,8 +478,9 @@ struct davinci_syscfg_regs {  	dv_reg	rsvd[13];  	dv_reg	kick0;  	dv_reg	kick1; -	dv_reg	rsvd1[53]; +	dv_reg	rsvd1[52];  	dv_reg	mstpri[3]; +	dv_reg  rsvd2;  	dv_reg	pinmux[20];  	dv_reg	suspsrc;  	dv_reg	chipsig; diff --git a/arch/arm/include/asm/arch-omap3/clock.h b/arch/arm/include/asm/arch-omap3/clock.h index be669c156..1912cc9a6 100644 --- a/arch/arm/include/asm/arch-omap3/clock.h +++ b/arch/arm/include/asm/arch-omap3/clock.h @@ -27,8 +27,6 @@  #define ICK_DSS_ON	0x00000001  #define FCK_CAM_ON	0x00000001  #define ICK_CAM_ON	0x00000001 -#define FCK_PER_ON	0x0003ffff -#define ICK_PER_ON	0x0003ffff  /* Used to index into DPLL parameter tables */  typedef struct { diff --git a/arch/arm/include/asm/arch-omap3/omap3.h b/arch/arm/include/asm/arch-omap3/omap3.h index 7fb549af5..65a599502 100644 --- a/arch/arm/include/asm/arch-omap3/omap3.h +++ b/arch/arm/include/asm/arch-omap3/omap3.h @@ -55,6 +55,7 @@ struct control_prog_io {  #define OMAP34XX_UART1			(OMAP34XX_L4_IO_BASE + 0x6a000)  #define OMAP34XX_UART2			(OMAP34XX_L4_IO_BASE + 0x6c000)  #define OMAP34XX_UART3			(OMAP34XX_L4_PER + 0x20000) +#define OMAP34XX_UART4			(OMAP34XX_L4_PER + 0x42000)  /* General Purpose Timers */  #define OMAP34XX_GPT1			0x48318000 diff --git a/arch/arm/include/asm/arch-omap4/sys_proto.h b/arch/arm/include/asm/arch-omap4/sys_proto.h index 39c531632..ce8217f69 100644 --- a/arch/arm/include/asm/arch-omap4/sys_proto.h +++ b/arch/arm/include/asm/arch-omap4/sys_proto.h @@ -16,6 +16,10 @@  DECLARE_GLOBAL_DATA_PTR; +extern const struct emif_regs emif_regs_elpida_200_mhz_2cs; +extern const struct emif_regs emif_regs_elpida_380_mhz_1cs; +extern const struct emif_regs emif_regs_elpida_400_mhz_1cs; +extern const struct emif_regs emif_regs_elpida_400_mhz_2cs;  struct omap_sysinfo {  	char *board_string;  }; diff --git a/arch/arm/include/asm/arch-omap5/clock.h b/arch/arm/include/asm/arch-omap5/clock.h index 8869b5001..2dfe4efb4 100644 --- a/arch/arm/include/asm/arch-omap5/clock.h +++ b/arch/arm/include/asm/arch-omap5/clock.h @@ -137,6 +137,9 @@  #define HSMMC_CLKCTRL_CLKSEL_MASK		(1 << 24)  #define HSMMC_CLKCTRL_CLKSEL_DIV_MASK		(1 << 25) +/* CM_L3INIT_SATA_CLKCTRL */ +#define SATA_CLKCTRL_OPTFCLKEN_MASK		(1 << 8) +  /* CM_WKUP_GPTIMER1_CLKCTRL */  #define GPTIMER1_CLKCTRL_CLKSEL_MASK		(1 << 24) diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h index 3c2306fe3..590235be0 100644 --- a/arch/arm/include/asm/arch-omap5/omap.h +++ b/arch/arm/include/asm/arch-omap5/omap.h @@ -64,6 +64,9 @@  /* QSPI */  #define QSPI_BASE		0x4B300000 +/* SATA */ +#define DWC_AHSATA_BASE		0x4A140000 +  /*   * Hardware Register Details   */ @@ -239,6 +242,7 @@ struct ctrl_ioregs {  	u32 ctrl_ddrio_1;  	u32 ctrl_ddrio_2;  	u32 ctrl_emif_sdram_config_ext; +	u32 ctrl_emif_sdram_config_ext_final;  	u32 ctrl_ddr_ctrl_ext_0;  }; diff --git a/arch/arm/include/asm/arch-omap5/sata.h b/arch/arm/include/asm/arch-omap5/sata.h new file mode 100644 index 000000000..2ca894773 --- /dev/null +++ b/arch/arm/include/asm/arch-omap5/sata.h @@ -0,0 +1,48 @@ +/* + * SATA Wrapper Register map + * + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * SPDX-License-Identifier:     GPL-2.0+ + */ + +#ifndef _TI_SATA_H +#define _TI_SATA_H + +/* SATA Wrapper module */ +#define TI_SATA_WRAPPER_BASE		(OMAP54XX_L4_CORE_BASE + 0x141100) +/* SATA PHY Module */ +#define TI_SATA_PLLCTRL_BASE		(OMAP54XX_L4_CORE_BASE + 0x96800) + +/* SATA Wrapper register offsets */ +#define TI_SATA_SYSCONFIG			0x00 +#define TI_SATA_CDRLOCK				0x04 + +/* Register Set */ +#define TI_SATA_SYSCONFIG_OVERRIDE0		(1 << 16) +#define TI_SATA_SYSCONFIG_STANDBY_MASK		(0x3 << 4) +#define TI_SATA_SYSCONFIG_IDLE_MASK		(0x3 << 2) + +/* Standby modes */ +#define TI_SATA_STANDBY_FORCE			0x0 +#define TI_SATA_STANDBY_NO			(0x1 << 4) +#define TI_SATA_STANDBY_SMART_WAKE		(0x3 << 4) +#define TI_SATA_STANDBY_SMART			(0x2 << 4) + +/* Idle modes */ +#define TI_SATA_IDLE_FORCE			0x0 +#define TI_SATA_IDLE_NO				(0x1 << 2) +#define TI_SATA_IDLE_SMART_WAKE			(0x3 << 2) +#define TI_SATA_IDLE_SMART			(0x2 << 2) + +#ifdef CONFIG_SCSI_AHCI_PLAT +int omap_sata_init(void); +#else +static inline int omap_sata_init(void) +{ +	return 0; +} +#endif /* CONFIG_SCSI_AHCI_PLAT */ + +#endif /* _TI_SATA_H */ diff --git a/arch/arm/include/asm/emif.h b/arch/arm/include/asm/emif.h index 1b94a99c5..d9d521a51 100644 --- a/arch/arm/include/asm/emif.h +++ b/arch/arm/include/asm/emif.h @@ -581,7 +581,6 @@  	(0xFF << EMIF_SYS_ADDR_SHIFT))  #define EMIF_EXT_PHY_CTRL_TIMING_REG	0x5 -#define EMIF_EXT_PHY_CTRL_CONST_REG	0x14  /* Reg mapping structure */  struct emif_reg_struct { @@ -641,7 +640,9 @@ struct emif_reg_struct {  	u32 emif_ddr_phy_ctrl_2;  	u32 padding7[12];  	u32 emif_rd_wr_exec_thresh; -	u32 padding8[55]; +	u32 padding8[7]; +	u32 emif_ddr_phy_status[21]; +	u32 padding9[27];  	u32 emif_ddr_ext_phy_ctrl_1;  	u32 emif_ddr_ext_phy_ctrl_1_shdw;  	u32 emif_ddr_ext_phy_ctrl_2; @@ -690,6 +691,9 @@ struct emif_reg_struct {  	u32 emif_ddr_ext_phy_ctrl_23_shdw;  	u32 emif_ddr_ext_phy_ctrl_24;  	u32 emif_ddr_ext_phy_ctrl_24_shdw; +	u32 padding[22]; +	u32 emif_ddr_fifo_misaligned_clear_1; +	u32 emif_ddr_fifo_misaligned_clear_2;  };  struct dmm_lisa_map_regs { @@ -1139,6 +1143,11 @@ struct lpddr2_mr_regs {  	s8 mr16;  }; +struct read_write_regs { +	u32 read_reg; +	u32 write_reg; +}; +  /* assert macros */  #if defined(DEBUG)  #define emif_assert(c)	({ if (!(c)) for (;;); }) @@ -1167,4 +1176,5 @@ extern u32 *const T_den;  void config_data_eye_leveling_samples(u32 emif_base);  u32 emif_sdram_type(void); +const struct read_write_regs *get_bug_regs(u32 *iterations);  #endif diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index 8a395e8a1..a78f99079 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -226,6 +226,7 @@ struct prcm_regs {  	u32 cm_l3init_hsusbotg_clkctrl;  	u32 cm_l3init_hsusbtll_clkctrl;  	u32 cm_l3init_p1500_clkctrl; +	u32 cm_l3init_sata_clkctrl;  	u32 cm_l3init_fsusb_clkctrl;  	u32 cm_l3init_ocp2scp1_clkctrl;  	u32 cm_l3init_ocp2scp3_clkctrl; @@ -366,6 +367,7 @@ struct omap_sys_ctrl_regs {  	u32 control_ldosram_mpu_voltage_ctrl;  	u32 control_ldosram_core_voltage_ctrl;  	u32 control_usbotghs_ctrl; +	u32 control_phy_power_sata;  	u32 control_padconf_core_base;  	u32 control_paconf_global;  	u32 control_paconf_mode; @@ -605,6 +607,14 @@ static inline u8 is_omap54xx(void)  	extern u32 *const omap_si_rev;  	return ((*omap_si_rev & 0xFF000000) == OMAP54xx);  } + +#define DRA7XX		0x07000000 + +static inline u8 is_dra7xx(void) +{ +	extern u32 *const omap_si_rev; +	return ((*omap_si_rev & 0xFF000000) == DRA7XX); +}  #endif  /* |