Merge branch '2022-03-14-regression-fixes'
- Regression fixes for RK3399 eMMC, j721e Sierra SerDes driver, vexpress64 autoboot and tbs2910 image size
This commit is contained in:
commit
e8ebdf6ac7
@ -397,36 +397,34 @@ void configure_serdes_torrent(void)
|
||||
|
||||
void configure_serdes_sierra(void)
|
||||
{
|
||||
struct udevice *dev, *lnk_dev;
|
||||
struct phy serdes;
|
||||
struct udevice *dev, *link_dev;
|
||||
struct phy link;
|
||||
int ret, count, i;
|
||||
int link_count = 0;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PHY_CADENCE_SIERRA))
|
||||
return;
|
||||
|
||||
ret = uclass_get_device_by_driver(UCLASS_PHY,
|
||||
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||
DM_DRIVER_GET(sierra_phy_provider),
|
||||
&dev);
|
||||
if (ret)
|
||||
printf("Sierra init failed:%d\n", ret);
|
||||
|
||||
serdes.dev = dev;
|
||||
serdes.id = 0;
|
||||
|
||||
count = device_get_child_count(dev);
|
||||
for (i = 0; i < count; i++) {
|
||||
ret = device_get_child(dev, i, &lnk_dev);
|
||||
ret = device_get_child(dev, i, &link_dev);
|
||||
if (ret)
|
||||
printf("probe of sierra child node %d failed\n", i);
|
||||
if (link_dev->driver->id == UCLASS_PHY) {
|
||||
link.dev = link_dev;
|
||||
link.id = link_count++;
|
||||
|
||||
ret = generic_phy_power_on(&link);
|
||||
if (ret)
|
||||
printf("phy_power_on failed !!\n");
|
||||
}
|
||||
}
|
||||
|
||||
ret = generic_phy_init(&serdes);
|
||||
if (ret)
|
||||
printf("phy_init failed!!\n");
|
||||
|
||||
ret = generic_phy_power_on(&serdes);
|
||||
if (ret)
|
||||
printf("phy_power_on failed !!\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOARD_LATE_INIT
|
||||
|
@ -14,6 +14,7 @@ CONFIG_DEFAULT_DEVICE_TREE="imx6q-tbs2910"
|
||||
CONFIG_PRE_CON_BUF_ADDR=0x7c000000
|
||||
CONFIG_CMD_HDMIDETECT=y
|
||||
CONFIG_AHCI=y
|
||||
CONFIG_LTO=y
|
||||
CONFIG_SUPPORT_RAW_INITRD=y
|
||||
CONFIG_BOOTDELAY=3
|
||||
CONFIG_USE_BOOTCOMMAND=y
|
||||
|
@ -17,7 +17,7 @@ CONFIG_ANDROID_BOOT_IMAGE=y
|
||||
CONFIG_BOOTDELAY=1
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyAMA0 earlycon=pl011,0x1c090000 debug user_debug=31 loglevel=9"
|
||||
CONFIG_BOOTCOMMAND="if smhload ${boot_name} ${boot_addr_r}; then set bootargs; abootimg addr ${boot_addr_r}; abootimg get dtb --index=0 fdt_addr_r; bootm ${boot_addr_r} ${boot_addr_r} ${fdt_addr_r}; else; set fdt_high 0xffffffffffffffff; set initrd_high 0xffffffffffffffff; smhload ${kernel_name} ${kernel_addr}; smhload ${fdtfile} ${fdt_addr_r}; smhload ${ramdisk_name} ${ramdisk_addr_r} ramdisk_end; fdt addr ${fdt_addr_r}; fdt resize; fdt chosen ${ramdisk_addr_r} ${ramdisk_end}; booti $kernel_addr - $fdt_addr_r; fi"
|
||||
CONFIG_BOOTCOMMAND="if smhload ${boot_name} ${boot_addr_r}; then setenv bootargs; abootimg addr ${boot_addr_r}; abootimg get dtb --index=0 fdt_addr_r; bootm ${boot_addr_r} ${boot_addr_r} ${fdt_addr_r}; else; setenv fdt_high 0xffffffffffffffff; setenv initrd_high 0xffffffffffffffff; smhload ${kernel_name} ${kernel_addr_r}; smhload ${fdtfile} ${fdt_addr_r}; smhload ${ramdisk_name} ${ramdisk_addr_r} ramdisk_end; fdt addr ${fdt_addr_r}; fdt resize; fdt chosen ${ramdisk_addr_r} ${ramdisk_end}; booti $kernel_addr_r - $fdt_addr_r; fi"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_SYS_PROMPT="VExpress64# "
|
||||
|
@ -90,9 +90,33 @@ struct rockchip_sdhc {
|
||||
};
|
||||
|
||||
struct sdhci_data {
|
||||
int (*emmc_set_clock)(struct sdhci_host *host, unsigned int clock);
|
||||
int (*emmc_phy_init)(struct udevice *dev);
|
||||
int (*get_phy)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* set_control_reg() - Set SDHCI control registers
|
||||
*
|
||||
* This is the set_control_reg() SDHCI operation that should be
|
||||
* used for the hardware this driver data is associated with.
|
||||
* Normally, this is used to set up control registers for
|
||||
* voltage level and UHS speed mode.
|
||||
*
|
||||
* @host: SDHCI host structure
|
||||
*/
|
||||
void (*set_control_reg)(struct sdhci_host *host);
|
||||
|
||||
/**
|
||||
* set_ios_post() - Host specific hook after set_ios() calls
|
||||
*
|
||||
* This is the set_ios_post() SDHCI operation that should be
|
||||
* used for the hardware this driver data is associated with.
|
||||
* Normally, this is a hook that is called after sdhci_set_ios()
|
||||
* that does any necessary host-specific configuration.
|
||||
*
|
||||
* @host: SDHCI host structure
|
||||
* Return: 0 if successful, -ve on error
|
||||
*/
|
||||
int (*set_ios_post)(struct sdhci_host *host);
|
||||
};
|
||||
|
||||
static int rk3399_emmc_phy_init(struct udevice *dev)
|
||||
@ -182,15 +206,28 @@ static int rk3399_emmc_get_phy(struct udevice *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3399_sdhci_emmc_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
static void rk3399_sdhci_set_control_reg(struct sdhci_host *host)
|
||||
{
|
||||
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
|
||||
struct mmc *mmc = host->mmc;
|
||||
uint clock = mmc->tran_speed;
|
||||
int cycle_phy = host->clock != clock && clock > EMMC_MIN_FREQ;
|
||||
|
||||
if (cycle_phy)
|
||||
rk3399_emmc_phy_power_off(priv->phy);
|
||||
|
||||
sdhci_set_clock(host->mmc, clock);
|
||||
sdhci_set_control_reg(host);
|
||||
};
|
||||
|
||||
static int rk3399_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
{
|
||||
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
|
||||
struct mmc *mmc = host->mmc;
|
||||
uint clock = mmc->tran_speed;
|
||||
int cycle_phy = host->clock != clock && clock > EMMC_MIN_FREQ;
|
||||
|
||||
if (!clock)
|
||||
clock = mmc->clock;
|
||||
|
||||
if (cycle_phy)
|
||||
rk3399_emmc_phy_power_on(priv->phy, clock);
|
||||
@ -269,10 +306,8 @@ static int rk3568_emmc_get_phy(struct udevice *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
static int rk3568_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
{
|
||||
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
|
||||
struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev);
|
||||
struct mmc *mmc = host->mmc;
|
||||
uint clock = mmc->tran_speed;
|
||||
u32 reg;
|
||||
@ -280,8 +315,7 @@ static int rockchip_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
if (!clock)
|
||||
clock = mmc->clock;
|
||||
|
||||
if (data->emmc_set_clock)
|
||||
data->emmc_set_clock(host, clock);
|
||||
rk3568_sdhci_emmc_set_clock(host, clock);
|
||||
|
||||
if (mmc->selected_mode == MMC_HS_400 || mmc->selected_mode == MMC_HS_400_ES) {
|
||||
reg = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
||||
@ -295,6 +329,26 @@ static int rockchip_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rockchip_sdhci_set_control_reg(struct sdhci_host *host)
|
||||
{
|
||||
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
|
||||
struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev);
|
||||
|
||||
if (data->set_control_reg)
|
||||
data->set_control_reg(host);
|
||||
}
|
||||
|
||||
static int rockchip_sdhci_set_ios_post(struct sdhci_host *host)
|
||||
{
|
||||
struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
|
||||
struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev);
|
||||
|
||||
if (data->set_ios_post)
|
||||
return data->set_ios_post(host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_sdhci_execute_tuning(struct mmc *mmc, u8 opcode)
|
||||
{
|
||||
struct sdhci_host *host = dev_get_priv(mmc->dev);
|
||||
@ -358,6 +412,7 @@ static int rockchip_sdhci_execute_tuning(struct mmc *mmc, u8 opcode)
|
||||
static struct sdhci_ops rockchip_sdhci_ops = {
|
||||
.set_ios_post = rockchip_sdhci_set_ios_post,
|
||||
.platform_execute_tuning = &rockchip_sdhci_execute_tuning,
|
||||
.set_control_reg = rockchip_sdhci_set_control_reg,
|
||||
};
|
||||
|
||||
static int rockchip_sdhci_probe(struct udevice *dev)
|
||||
@ -436,15 +491,16 @@ static int rockchip_sdhci_bind(struct udevice *dev)
|
||||
}
|
||||
|
||||
static const struct sdhci_data rk3399_data = {
|
||||
.emmc_set_clock = rk3399_sdhci_emmc_set_clock,
|
||||
.get_phy = rk3399_emmc_get_phy,
|
||||
.emmc_phy_init = rk3399_emmc_phy_init,
|
||||
.set_control_reg = rk3399_sdhci_set_control_reg,
|
||||
.set_ios_post = rk3399_sdhci_set_ios_post,
|
||||
};
|
||||
|
||||
static const struct sdhci_data rk3568_data = {
|
||||
.emmc_set_clock = rk3568_sdhci_emmc_set_clock,
|
||||
.get_phy = rk3568_emmc_get_phy,
|
||||
.emmc_phy_init = rk3568_emmc_phy_init,
|
||||
.set_ios_post = rk3568_sdhci_set_ios_post,
|
||||
};
|
||||
|
||||
static const struct udevice_id sdhci_ids[] = {
|
||||
|
@ -358,26 +358,10 @@ static inline int cdns_reset_deassert(struct reset_control *rst)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct cdns_sierra_inst *phy_get_drvdata(struct phy *phy)
|
||||
static int cdns_sierra_link_init(struct phy *gphy)
|
||||
{
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(phy->dev);
|
||||
int index;
|
||||
|
||||
if (phy->id >= SIERRA_MAX_LANES)
|
||||
return NULL;
|
||||
|
||||
for (index = 0; index < sp->nsubnodes; index++) {
|
||||
if (phy->id == sp->phys[index]->mlane)
|
||||
return sp->phys[index];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int cdns_sierra_phy_init(struct phy *gphy)
|
||||
{
|
||||
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
|
||||
struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev);
|
||||
struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
|
||||
struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev->parent);
|
||||
struct cdns_sierra_data *init_data = phy->init_data;
|
||||
struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
|
||||
enum cdns_sierra_phy_type phy_type = ins->phy_type;
|
||||
@ -443,10 +427,11 @@ static int cdns_sierra_phy_init(struct phy *gphy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdns_sierra_phy_on(struct phy *gphy)
|
||||
static int cdns_sierra_link_on(struct phy *gphy)
|
||||
{
|
||||
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
|
||||
struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev->parent);
|
||||
|
||||
struct udevice *dev = gphy->dev;
|
||||
u32 val;
|
||||
int ret;
|
||||
@ -503,16 +488,16 @@ static int cdns_sierra_phy_on(struct phy *gphy)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cdns_sierra_phy_off(struct phy *gphy)
|
||||
static int cdns_sierra_link_off(struct phy *gphy)
|
||||
{
|
||||
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
|
||||
struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
|
||||
|
||||
return reset_assert_bulk(ins->lnk_rst);
|
||||
}
|
||||
|
||||
static int cdns_sierra_phy_reset(struct phy *gphy)
|
||||
static int cdns_sierra_link_reset(struct phy *gphy)
|
||||
{
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev);
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev->parent);
|
||||
|
||||
reset_control_assert(sp->phy_rst);
|
||||
reset_control_deassert(sp->phy_rst);
|
||||
@ -520,10 +505,10 @@ static int cdns_sierra_phy_reset(struct phy *gphy)
|
||||
};
|
||||
|
||||
static const struct phy_ops ops = {
|
||||
.init = cdns_sierra_phy_init,
|
||||
.power_on = cdns_sierra_phy_on,
|
||||
.power_off = cdns_sierra_phy_off,
|
||||
.reset = cdns_sierra_phy_reset,
|
||||
.init = cdns_sierra_link_init,
|
||||
.power_on = cdns_sierra_link_on,
|
||||
.power_off = cdns_sierra_link_off,
|
||||
.reset = cdns_sierra_link_reset,
|
||||
};
|
||||
|
||||
struct cdns_sierra_pll_mux_sel {
|
||||
@ -580,7 +565,7 @@ static const struct clk_ops cdns_sierra_pll_mux_ops = {
|
||||
.set_parent = cdns_sierra_pll_mux_set_parent,
|
||||
};
|
||||
|
||||
int cdns_sierra_pll_mux_probe(struct udevice *dev)
|
||||
static int cdns_sierra_pll_mux_probe(struct udevice *dev)
|
||||
{
|
||||
struct cdns_sierra_pll_mux *priv = dev_get_priv(dev);
|
||||
struct cdns_sierra_phy *sp = dev_get_priv(dev->parent);
|
||||
@ -1012,9 +997,8 @@ static int cdns_sierra_phy_get_resets(struct cdns_sierra_phy *sp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdns_sierra_bind_link_nodes(struct cdns_sierra_phy *sp)
|
||||
static int cdns_sierra_phy_bind(struct udevice *dev)
|
||||
{
|
||||
struct udevice *dev = sp->dev;
|
||||
struct driver *link_drv;
|
||||
ofnode child;
|
||||
int rc;
|
||||
@ -1079,6 +1063,7 @@ U_BOOT_DRIVER(sierra_phy_link) = {
|
||||
.name = "sierra_phy_link",
|
||||
.id = UCLASS_PHY,
|
||||
.probe = cdns_sierra_link_probe,
|
||||
.ops = &ops,
|
||||
.priv_auto = sizeof(struct cdns_sierra_inst),
|
||||
};
|
||||
|
||||
@ -1141,10 +1126,6 @@ static int cdns_sierra_phy_probe(struct udevice *dev)
|
||||
}
|
||||
|
||||
sp->autoconf = dev_read_bool(dev, "cdns,autoconf");
|
||||
/* Binding link nodes as children to serdes */
|
||||
ret = cdns_sierra_bind_link_nodes(sp);
|
||||
if (ret)
|
||||
goto clk_disable;
|
||||
|
||||
dev_info(dev, "sierra probed\n");
|
||||
return 0;
|
||||
@ -1971,10 +1952,10 @@ static const struct udevice_id cdns_sierra_id_table[] = {
|
||||
|
||||
U_BOOT_DRIVER(sierra_phy_provider) = {
|
||||
.name = "cdns,sierra",
|
||||
.id = UCLASS_PHY,
|
||||
.id = UCLASS_MISC,
|
||||
.of_match = cdns_sierra_id_table,
|
||||
.probe = cdns_sierra_phy_probe,
|
||||
.remove = cdns_sierra_phy_remove,
|
||||
.ops = &ops,
|
||||
.bind = cdns_sierra_phy_bind,
|
||||
.priv_auto = sizeof(struct cdns_sierra_phy),
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user