[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