[U-Boot] [PATCH v1 07/19] phy: marvell: a3700: Access USB3 register indirectly on lane 2
Stefan Roese
sr at denx.de
Wed Mar 21 09:00:58 UTC 2018
On 07.03.2018 22:52, Marek BehĂșn wrote:
> When USB3 is on comphy lane 2 on the Armada 37xx, the registers
> have to be accessed indirectly via SATA indirect access.
>
> Signed-off-by: Marek Behun <marek.behun at nic.cz>
Could you please describe, which problem this patch fixes? Is this
on an already available A37xx board or a new one?
Please find more comments below...
> ---
> drivers/phy/marvell/comphy_a3700.c | 111 +++++++++++++++++++++++++------------
> drivers/phy/marvell/comphy_a3700.h | 1 +
> 2 files changed, 78 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/phy/marvell/comphy_a3700.c b/drivers/phy/marvell/comphy_a3700.c
> index 81d24a5b61..b5f2013bbb 100644
> --- a/drivers/phy/marvell/comphy_a3700.c
> +++ b/drivers/phy/marvell/comphy_a3700.c
> @@ -133,7 +133,7 @@ static u32 comphy_poll_reg(void *addr, u32 val, u32 mask, u8 op_type)
> */
> static int comphy_pcie_power_up(u32 speed, u32 invert)
> {
> - int ret;
> + int ret;
>
> debug_enter();
>
> @@ -300,17 +300,50 @@ static int comphy_sata_power_up(void)
> return ret;
> }
>
> +/*
> + * usb3_reg_set16_indirect
> + *
> + * return: void
> + */
> +static void usb3_reg_set16_indirect(u32 reg, u16 data, u16 mask)
> +{
> + reg_set_indirect(USB3PHY_LANE2_REG_BASE_OFFSET + reg, data, mask);
> +}
> +
> +/*
> + * usb3_reg_set16_direct
> + *
> + * return: void
> + */
> +static void usb3_reg_set16_direct(u32 reg, u16 data, u16 mask)
> +{
> + reg_set16(PHY_ADDR(USB3, reg), data, mask);
> +}
> +
> /*
> * comphy_usb3_power_up
> *
> * return: 1 if PLL locked (OK), 0 otherwise (FAIL)
> */
> -static int comphy_usb3_power_up(u32 type, u32 speed, u32 invert)
> +static int comphy_usb3_power_up(u32 lane, u32 type, u32 speed, u32 invert)
> {
> - int ret;
> + int ret;
> + void (*usb3_reg_set16)(u32, u16, u16);
Wouldn't it be cleared / easier to read, if you would encapsulate the
Hmmm. This does not seem to be needed here, right?
static void usb3_reg_set16_direct(u32 reg, u16 data, u16 mask, int lane)
{
if (lane
reg_set16(PHY_ADDR(USB3, reg), data, mask);
}
>
> debug_enter();
>
> + /*
> + * When Lane 2 PHY is for USB3, access the PHY registers
> + * through indirect Address and Data registers INDIR_ACC_PHY_ADDR
> + * (RD00E0178h [31:0]) and INDIR_ACC_PHY_DATA (RD00E017Ch [31:0])
> + * within the SATA Host Controller registers, Lane 2 base register
> + * offset is 0x200
> + */
> + if (lane == 2)
> + usb3_reg_set16 = usb3_reg_set16_indirect;
> + else
> + usb3_reg_set16 = usb3_reg_set16_direct;
> +
Wouldn't it be cleared / easier to read, if you would encapsulate the
lane -> function usage in the itself? Something like this:
static void usb3_reg_set16(u32 reg, u16 data, u16 mask, int lane)
{
if (lane == 2)
reg_set_indirect(USB3PHY_LANE2_REG_BASE_OFFSET + reg, data, mask);
else
reg_set16(PHY_ADDR(USB3, reg), data, mask);
}
What do you think?
Thanks,
Stefan
More information about the U-Boot
mailing list