[PATCH u-boot 4/4] eth/r8152: support RTL8153B/RTL8154B

Marek Vasut marex at denx.de
Tue Jun 9 16:27:28 CEST 2020


On 6/9/20 10:53 AM, Hayes Wang wrote:
> This is used to support RTL8153B and RTL8154B.

[...]

> +		ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT,
> +			       ocp_data);
> +		break;
> +
> +	case RTL_VER_08:
> +	case RTL_VER_09:
> +		/* The RTL8153B uses USB_RX_EXTRA_AGGR_TMR for rx timeout
> +		 * primarily. For USB_RX_EARLY_TIMEOUT, we fix it to 1264ns.
> +		 */
> +		ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT,
> +			       1264 / 8);

Can you add some macro for this 1264 magic value ?

> +		ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EXTRA_AGGR_TMR,
> +			       ocp_data);
> +		break;
> +
> +	default:
> +		debug("** %s Invalid Device\n", __func__);
> +		break;
> +	}
>  }

[...]

> +static void r8153b_hw_phy_cfg(struct r8152 *tp)
> +{
> +	u32 ocp_data;
> +	u16 data;
> +
> +	data = r8152_mdio_read(tp, MII_BMCR);
> +	if (data & BMCR_PDOWN) {
> +		data &= ~BMCR_PDOWN;
> +		r8152_mdio_write(tp, MII_BMCR, data);
> +	}
> +
> +	/* U1/U2/L1 idle timer. 500 us */
> +	ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500);
> +
> +	r8153b_firmware(tp);
> +
> +	data = sram_read(tp, SRAM_GREEN_CFG);
> +	data |= R_TUNE_EN;
> +	sram_write(tp, SRAM_GREEN_CFG, data);
> +	data = ocp_reg_read(tp, OCP_NCTL_CFG);
> +	data |= PGA_RETURN_EN;
> +	ocp_reg_write(tp, OCP_NCTL_CFG, data);
> +
> +	/* ADC Bias Calibration:
> +	 * read efuse offset 0x7d to get a 17-bit data. Remove the dummy/fake
> +	 * bit (bit3) to rebuild the real 16-bit data. Write the data to the
> +	 * ADC ioffset.
> +	 */
> +	ocp_data = r8152_efuse_read(tp, 0x7d);
> +	data = (u16)(((ocp_data & 0x1fff0) >> 1) | (ocp_data & 0x7));

Are these type casts really needed ?

[...]

>  static void rtl_clear_bp(struct r8152 *tp, u16 type)
>  {
>  	switch (tp->version) {
> @@ -742,7 +863,23 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type)
>  	case RTL_VER_06:
>  		ocp_write_byte(tp, type, PLA_BP_EN, 0);
>  		break;
> +	case RTL_VER_08:
> +	case RTL_VER_09:
>  	default:
> +		if (type == MCU_TYPE_USB) {
> +			ocp_write_byte(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
> +
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_10, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_11, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_12, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_13, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_14, 0);
> +			ocp_write_word(tp, MCU_TYPE_USB, USB_BP_15, 0);

Can those registers be written in bulk ?

> +		} else {
> +			ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
> +		}
>  		break;
>  	}
>  
> @@ -1027,3 +1164,42 @@ void r8153_firmware(struct r8152 *tp)
>  		ocp_write_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, ocp_data);
>  	}
>  }
> +
> +void r8153b_firmware(struct r8152 *tp)
> +{
> +	int i;
> +
> +	if (tp->version == RTL_VER_09) {

Invert the condition and reduce indent.

if (tp->version != RTL_VER_09)
 return;

...
> +		u32 ocp_data;
> +
> +		rtl_clear_bp(tp, MCU_TYPE_USB);

[...]


More information about the U-Boot mailing list