[PATCH 8/9] arm: mvebu: axp: ddr: Switch to using DM I2C API
Stefan Roese
sr at denx.de
Sat Dec 18 14:44:47 CET 2021
On 11/18/21 09:19, Stefan Roese wrote:
> No functional change intended. This patch switches from the legacy I2C
> API to the DM I2C API, so that this code can be used with DM I2C
> enabled.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
Applied to u-boot-marvell/next
Thanks,
Stefan
> ---
> drivers/ddr/marvell/axp/ddr3_init.c | 16 +++++++++++-----
> drivers/ddr/marvell/axp/ddr3_init.h | 2 +-
> drivers/ddr/marvell/axp/ddr3_spd.c | 16 ++++++++++++++--
> 3 files changed, 26 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/ddr/marvell/axp/ddr3_init.c b/drivers/ddr/marvell/axp/ddr3_init.c
> index c5aa1ac18f51..a9dcb74cecb7 100644
> --- a/drivers/ddr/marvell/axp/ddr3_init.c
> +++ b/drivers/ddr/marvell/axp/ddr3_init.c
> @@ -361,12 +361,18 @@ static u32 ddr3_init_main(void)
> __maybe_unused u32 ddr_width = BUS_WIDTH;
> __maybe_unused int status;
> __maybe_unused u32 win_backup[16];
> + __maybe_unused struct udevice *udev;
> + __maybe_unused int ret;
>
> /* SoC/Board special Initializtions */
> fab_opt = ddr3_get_fab_opt();
>
> #ifdef CONFIG_SPD_EEPROM
> - i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> + ret = i2c_get_chip_for_busnum(0, BUS_WIDTH_ECC_TWSI_ADDR, 1, &udev);
> + if (ret) {
> + printf("Cannot find SPD EEPROM\n");
> + return MV_DDR3_TRAINING_ERR_BAD_DIMM_SETUP;
> + }
> #endif
>
> ddr3_print_version();
> @@ -438,7 +444,7 @@ static u32 ddr3_init_main(void)
>
> #if defined(ECC_SUPPORT) && defined(AUTO_DETECTION_SUPPORT)
> ecc = 0;
> - if (ddr3_check_config(BUS_WIDTH_ECC_TWSI_ADDR, CONFIG_ECC))
> + if (ddr3_check_config(udev, CONFIG_ECC))
> ecc = 1;
> #endif
>
> @@ -483,7 +489,7 @@ static u32 ddr3_init_main(void)
> * Dynamically Set 32Bit and ECC for AXP (Relevant only for
> * Marvell DB boards)
> */
> - if (ddr3_check_config(BUS_WIDTH_ECC_TWSI_ADDR, CONFIG_BUS_WIDTH)) {
> + if (ddr3_check_config(udev, CONFIG_BUS_WIDTH)) {
> ddr_width = 32;
> DEBUG_INIT_S("DDR3 Training Sequence - DRAM bus width 32Bit\n");
> }
> @@ -904,7 +910,7 @@ void ddr3_static_mc_init(void)
> * Notes: Only Available for ArmadaXP/Armada 370 DB boards
> * Returns: None.
> */
> -int ddr3_check_config(u32 twsi_addr, MV_CONFIG_TYPE config_type)
> +int ddr3_check_config(struct udevice *udev, MV_CONFIG_TYPE config_type)
> {
> #ifdef AUTO_DETECTION_SUPPORT
> u8 data = 0;
> @@ -916,7 +922,7 @@ int ddr3_check_config(u32 twsi_addr, MV_CONFIG_TYPE config_type)
> else
> offset = 0;
>
> - ret = i2c_read(twsi_addr, offset, 1, (u8 *)&data, 1);
> + ret = dm_i2c_read(udev, offset, &data, 1);
> if (!ret) {
> switch (config_type) {
> case CONFIG_ECC:
> diff --git a/drivers/ddr/marvell/axp/ddr3_init.h b/drivers/ddr/marvell/axp/ddr3_init.h
> index 9a21886ac3e7..a26bd2a120e9 100644
> --- a/drivers/ddr/marvell/axp/ddr3_init.h
> +++ b/drivers/ddr/marvell/axp/ddr3_init.h
> @@ -101,7 +101,7 @@ void fix_pll_val(u8 target_fab);
> u32 ddr3_get_fab_opt(void);
> u32 ddr3_get_cpu_freq(void);
> u32 ddr3_get_vco_freq(void);
> -int ddr3_check_config(u32 addr, MV_CONFIG_TYPE config_type);
> +int ddr3_check_config(struct udevice *udev, MV_CONFIG_TYPE config_type);
> u32 ddr3_get_static_mc_value(u32 reg_addr, u32 offset1, u32 mask1, u32 offset2,
> u32 mask2);
> u32 ddr3_cl_to_valid_cl(u32 cl);
> diff --git a/drivers/ddr/marvell/axp/ddr3_spd.c b/drivers/ddr/marvell/axp/ddr3_spd.c
> index dd772e63ab19..4763403c1278 100644
> --- a/drivers/ddr/marvell/axp/ddr3_spd.c
> +++ b/drivers/ddr/marvell/axp/ddr3_spd.c
> @@ -209,13 +209,19 @@ static u32 ddr3_get_dimm_num(u32 *dimm_addr)
> /* Read the dimm eeprom */
> for (dimm_cur_addr = MAX_DIMM_ADDR; dimm_cur_addr > MIN_DIMM_ADDR;
> dimm_cur_addr--) {
> + struct udevice *udev;
> +
> data[SPD_DEV_TYPE_BYTE] = 0;
>
> /* Far-End DIMM must be connected */
> if ((dimm_num == 0) && (dimm_cur_addr < FAR_END_DIMM_ADDR))
> return 0;
>
> - ret = i2c_read(dimm_cur_addr, 0, 1, (uchar *)data, 3);
> + ret = i2c_get_chip_for_busnum(0, dimm_cur_addr, 1, &udev);
> + if (ret)
> + continue;
> +
> + ret = dm_i2c_read(udev, 0, data, 3);
> if (!ret) {
> if (data[SPD_DEV_TYPE_BYTE] == SPD_MEM_TYPE_DDR3) {
> dimm_addr[dimm_num] = dimm_cur_addr;
> @@ -245,9 +251,15 @@ int ddr3_spd_init(MV_DIMM_INFO *info, u32 dimm_addr, u32 dimm_width)
> __maybe_unused u8 vendor_high, vendor_low;
>
> if (dimm_addr != 0) {
> + struct udevice *udev;
> +
> memset(spd_data, 0, SPD_SIZE * sizeof(u8));
>
> - ret = i2c_read(dimm_addr, 0, 1, (uchar *)spd_data, SPD_SIZE);
> + ret = i2c_get_chip_for_busnum(0, dimm_addr, 1, &udev);
> + if (ret)
> + return MV_DDR3_TRAINING_ERR_TWSI_FAIL;
> +
> + ret = dm_i2c_read(udev, 0, spd_data, SPD_SIZE);
> if (ret)
> return MV_DDR3_TRAINING_ERR_TWSI_FAIL;
> }
>
Viele Grüße,
Stefan Roese
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list