[PATCH V2 1/2] net: ravb: Add tx/rx delay flag checks and support for rgmii-rxid

Marek Vasut marex at denx.de
Fri Feb 25 21:43:17 CET 2022


On 2/25/22 21:10, Adam Ford wrote:
> On Fri, Feb 25, 2022 at 2:08 PM Marek Vasut <marex at denx.de> wrote:
>>
>> On 2/25/22 19:29, Adam Ford wrote:
>>> Some boards like the Beacon RZ/G2 SOM use either flags for
>>> tx-internal-delay-ps, rx-internal-delay-ps or rgmii-rxid.
>>>
>>> In Linux the APSR_RDM flag is set when either rx-internal-delay-ps
>>> is set or the mode is rgmii-rxid, and the APSR_TDM is set when
>>> tx-internal-delay-ps is found or rgmii-txid is set, and both
>>> are set if rgmii-id is set.
>>>
>>> The ravb driver in U-Boot driver was missing rgmii-rxid support,
>>> so add that support in a similar fashion to what is done in Linux.
>>>
>>> Signed-off-by: Adam Ford <aford173 at gmail.com>
>>> ---
>>> V2:  Add boolean for explit delays which skips the rgmii mode check
>>>        if explicit delays are set.  This more closely matches the
>>>        behavior in Linux.  Also add the same comments for the delays
>>>        to match the comments found in Linux.
>>>
>>> diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c
>>> index 1d1118c341..7bc8c84aaa 100644
>>> --- a/drivers/net/ravb.c
>>> +++ b/drivers/net/ravb.c
>>> @@ -52,6 +52,7 @@
>>>    #define CSR_OPS                     0x0000000F
>>>    #define CSR_OPS_CONFIG              BIT(1)
>>>
>>> +#define APSR_RDM             BIT(13)
>>>    #define APSR_TDM            BIT(14)
>>>
>>>    #define TCCR_TSRQ0          BIT(0)
>>> @@ -376,6 +377,9 @@ static int ravb_dmac_init(struct udevice *dev)
>>>        struct ravb_priv *eth = dev_get_priv(dev);
>>>        struct eth_pdata *pdata = dev_get_plat(dev);
>>>        int ret = 0;
>>> +     int mode = 0;
>>> +     unsigned int delay;
>>> +     bool explicit_delay = false;
>>>
>>>        /* Set CONFIG mode */
>>>        ret = ravb_reset(dev);
>>> @@ -402,9 +406,33 @@ static int ravb_dmac_init(struct udevice *dev)
>>>            (rmobile_get_cpu_type() == RMOBILE_CPU_TYPE_R8A77995))
>>>                return 0;
>>>
>>> -     if ((pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_ID) ||
>>> -         (pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID))
>>> -             writel(APSR_TDM, eth->iobase + RAVB_REG_APSR);
>>> +     if (!dev_read_u32(dev, "tx-internal-delay-ps", &delay)) {
>>> +             /* Valid values are 0 and 2000, according to DT bindings */
>>> +             if (delay) {
>>> +                     mode |= APSR_TDM;
>>> +                     explicit_delay = true;
>>> +             }
>>> +     }
>>> +
>>> +     if (!dev_read_u32(dev, "rx-internal-delay-ps", &delay)) {
>>> +             /* Valid values are 0 and 1800, according to DT bindings */
>>> +             if (delay) {
>>> +                     mode |= APSR_RDM;
>>> +                     explicit_delay = true;
>>> +             }
>>> +     }
>>
>> Any reason to reverse those two tests compared to Linux ?
>> Linux does rx test before tx test, and keeps the tests sorted
>> alphabetically.
> 
> It wasn't intentional.  I can swap them.

V3 is now applied and in CI.


More information about the U-Boot mailing list