From mboxrd@z Thu Jan 1 00:00:00 1970 From: Soeren Moch Date: Mon, 25 Feb 2019 11:39:24 +0100 Subject: [U-Boot] [PATCH v2 11/23] apalis_imx6: migrate mmc and sata to using driver model In-Reply-To: <20190208171226.16169-12-marcel@ziswiler.com> References: <20190208171226.16169-1-marcel@ziswiler.com> <20190208171226.16169-12-marcel@ziswiler.com> Message-ID: <02a5efb8-bd29-c567-6110-f850939dd19f@web.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 08.02.19 18:12, Marcel Ziswiler wrote: > From: Marcel Ziswiler > > Migrate MMC and SATA to using driver model. > > While at it also enable SCSI driver model. > > Signed-off-by: Marcel Ziswiler [also reply to v2 of this series to avoid that this gets lost in patchwork] Hi Marcel, Thank you for providing this solution to keep SATA working on i.MX6 under DM_SCSI. I also want to use this on a tbs2910 board, there was a long list of other boards needing this functionality [1]. Can you implement the UCLASS at a more general place, e.g. drivers/ata/dwc_ahsata.c directly, instead of your board file? So this functionality could easily be enabled for other boards. Thank you, Soeren [1] https://lists.denx.de/pipermail/u-boot/2018-November/349368.html > --- > > Changes in v2: None > > board/toradex/apalis_imx6/apalis_imx6.c | 98 +++++++++++++++---------- > configs/apalis_imx6_defconfig | 3 + > include/configs/apalis_imx6.h | 3 - > 3 files changed, 61 insertions(+), 43 deletions(-) > > diff --git a/board/toradex/apalis_imx6/apalis_imx6.c b/board/toradex/apalis_imx6/apalis_imx6.c > index 2c16c31021..db06c4e064 100644 > --- a/board/toradex/apalis_imx6/apalis_imx6.c > +++ b/board/toradex/apalis_imx6/apalis_imx6.c > @@ -9,6 +9,7 @@ > #include > #include > > +#include > #include > #include > #include > @@ -22,7 +23,9 @@ > #include > #include > #include > +#include > #include > +#include > #include > #include > #include > @@ -60,6 +63,8 @@ DECLARE_GLOBAL_DATA_PTR; > > #define OUTPUT_RGB (PAD_CTL_SPEED_MED|PAD_CTL_DSE_60ohm|PAD_CTL_SRE_FAST) > > +#define APALIS_IMX6_SATA_INIT_RETRIES 10 > + > int dram_init(void) > { > /* use the DDR controllers configured size */ > @@ -79,6 +84,7 @@ iomux_v3_cfg_t const uart1_pads_dte[] = { > MX6_PAD_CSI0_DAT11__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL), > }; > > +#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD) > /* Apalis MMC1 */ > iomux_v3_cfg_t const usdhc1_pads[] = { > MX6_PAD_SD1_CLK__SD1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), > @@ -121,6 +127,7 @@ iomux_v3_cfg_t const usdhc3_pads[] = { > MX6_PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), > MX6_PAD_SD3_RST__GPIO7_IO08 | MUX_PAD_CTRL(WEAK_PULLUP) | MUX_MODE_SION, > }; > +#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */ > > int mx6_rgmii_rework(struct phy_device *phydev) > { > @@ -288,7 +295,7 @@ int board_ehci_power(int port, int on) > } > #endif > > -#ifdef CONFIG_FSL_ESDHC > +#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD) > /* use the following sequence: eMMC, MMC1, SD1 */ > struct fsl_esdhc_cfg usdhc_cfg[CONFIG_SYS_FSL_USDHC_NUM] = { > {USDHC3_BASE_ADDR}, > @@ -319,43 +326,6 @@ int board_mmc_getcd(struct mmc *mmc) > > int board_mmc_init(bd_t *bis) > { > -#ifndef CONFIG_SPL_BUILD > - s32 status = 0; > - u32 index = 0; > - > - usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK); > - usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK); > - usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK); > - > - usdhc_cfg[0].max_bus_width = 8; > - usdhc_cfg[1].max_bus_width = 8; > - usdhc_cfg[2].max_bus_width = 4; > - > - for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) { > - switch (index) { > - case 0: > - imx_iomux_v3_setup_multiple_pads( > - usdhc3_pads, ARRAY_SIZE(usdhc3_pads)); > - break; > - case 1: > - imx_iomux_v3_setup_multiple_pads( > - usdhc1_pads, ARRAY_SIZE(usdhc1_pads)); > - break; > - case 2: > - imx_iomux_v3_setup_multiple_pads( > - usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); > - break; > - default: > - printf("Warning: you configured more USDHC controllers (%d) then supported by the board (%d)\n", > - index + 1, CONFIG_SYS_FSL_USDHC_NUM); > - return status; > - } > - > - status |= fsl_esdhc_initialize(bis, &usdhc_cfg[index]); > - } > - > - return status; > -#else /* CONFIG_SPL_BUILD */ > struct src *psrc = (struct src *)SRC_BASE_ADDR; > unsigned reg = readl(&psrc->sbmr1) >> 11; > /* > @@ -394,9 +364,8 @@ int board_mmc_init(bd_t *bis) > } > > return fsl_esdhc_initialize(bis, &usdhc_cfg[0]); > -#endif /* CONFIG_SPL_BUILD */ > } > -#endif /* CONFIG_FSL_ESDHC */ > +#endif /* CONFIG_FSL_ESDHC & CONFIG_SPL_BUILD */ > > int board_phy_config(struct phy_device *phydev) > { > @@ -1162,3 +1131,52 @@ U_BOOT_DEVICE(mxc_serial) = { > .name = "serial_mxc", > .platdata = &mxc_serial_plat, > }; > + > +#if CONFIG_IS_ENABLED(AHCI) > +static int sata_imx_probe(struct udevice *dev) > +{ > + int i, err; > + > + for (i = 0; i < APALIS_IMX6_SATA_INIT_RETRIES; i++) { > + err = setup_sata(); > + if (err) { > + printf("SATA setup failed: %d\n", err); > + return err; > + } > + > + udelay(100); > + > + err = dwc_ahsata_probe(dev); > + if (!err) > + break; > + > + /* There is no device on the SATA port */ > + if (sata_dm_port_status(0, 0) == 0) > + break; > + > + /* There's a device, but link not established. Retry */ > + device_remove(dev, DM_REMOVE_NORMAL); > + } > + > + return 0; > +} > + > +struct ahci_ops sata_imx_ops = { > + .port_status = dwc_ahsata_port_status, > + .reset = dwc_ahsata_bus_reset, > + .scan = dwc_ahsata_scan, > +}; > + > +static const struct udevice_id sata_imx_ids[] = { > + { .compatible = "fsl,imx6q-ahci" }, > + { } > +}; > + > +U_BOOT_DRIVER(sata_imx) = { > + .name = "dwc_ahci", > + .id = UCLASS_AHCI, > + .of_match = sata_imx_ids, > + .ops = &sata_imx_ops, > + .probe = sata_imx_probe, > +}; > +#endif /* AHCI */ > diff --git a/configs/apalis_imx6_defconfig b/configs/apalis_imx6_defconfig > index 7e973ded74..510161ad32 100644 > --- a/configs/apalis_imx6_defconfig > +++ b/configs/apalis_imx6_defconfig > @@ -9,6 +9,7 @@ CONFIG_SPL_MMC_SUPPORT=y > CONFIG_SPL_SERIAL_SUPPORT=y > CONFIG_SPL=y > CONFIG_CMD_HDMIDETECT=y > +CONFIG_AHCI=y > CONFIG_DISTRO_DEFAULTS=y > CONFIG_NR_DRAM_BANKS=1 > CONFIG_FIT=y > @@ -55,6 +56,7 @@ CONFIG_DWC_AHSATA=y > CONFIG_DFU_MMC=y > CONFIG_DM_GPIO=y > CONFIG_DM_I2C=y > +CONFIG_DM_MMC=y > CONFIG_FSL_ESDHC=y > CONFIG_PHYLIB=y > CONFIG_PHY_MICREL=y > @@ -67,6 +69,7 @@ CONFIG_DM_PMIC_PFUZE100=y > CONFIG_DM_REGULATOR=y > CONFIG_DM_REGULATOR_PFUZE100=y > CONFIG_DM_REGULATOR_FIXED=y > +CONFIG_DM_SCSI=y > CONFIG_IMX_THERMAL=y > CONFIG_USB=y > CONFIG_USB_KEYBOARD=y > diff --git a/include/configs/apalis_imx6.h b/include/configs/apalis_imx6.h > index 5ab009c8f3..6b20d1e104 100644 > --- a/include/configs/apalis_imx6.h > +++ b/include/configs/apalis_imx6.h > @@ -57,9 +57,6 @@ > * SATA Configs > */ > #ifdef CONFIG_CMD_SATA > -#define CONFIG_SYS_SATA_MAX_DEVICE 1 > -#define CONFIG_DWC_AHSATA_PORT_ID 0 > -#define CONFIG_DWC_AHSATA_BASE_ADDR SATA_ARB_BASE_ADDR > #define CONFIG_LBA48 > #endif >