lkml.org 
[lkml]   [2019]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 3/4] net: phy: realtek: Add helpers for accessing RTL8211x extension pages
    Date
    Some RTL8211x PHYs have extension pages, which can be accessed
    after selecting a page through a custom method. Add a function to
    modify bits in a register of an extension page and a helper for
    selecting an ext page. Use rtl8211x_modify_ext_paged() in
    rtl8211e_config_init() instead of doing things 'manually'.

    Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
    ---
    Changes in v6:
    - none

    Changes in v5:
    - renamed 'rtl8211e_<action>_ext_page' to 'rtl8211x_<action>_ext_page'
    - updated commit message

    Changes in v4:
    - don't add constant RTL8211E_EXT_PAGE, it's only used once,
    use a literal instead
    - pass 'oldpage' to phy_restore_page() in rtl8211e_select_ext_page(),
    not 'page'
    - return 'oldpage' in rtl8211e_select_ext_page()
    - use __phy_modify() in rtl8211e_modify_ext_paged() instead of
    reimplementing __phy_modify_changed()
    - in rtl8211e_modify_ext_paged() return directly when
    rtl8211e_select_ext_page() fails

    Changes in v3:
    - use the new function in rtl8211e_config_init() instead of
    doing things 'manually'
    - use existing RTL8211E_EXT_PAGE instead of adding a new define
    - updated commit message

    Changes in v2:
    - use phy_select_page() and phy_restore_page(), get rid of
    rtl8211e_restore_page()
    - s/rtl821e_select_ext_page/rtl8211e_select_ext_page/
    - updated commit message
    ---
    drivers/net/phy/realtek.c | 47 +++++++++++++++++++++++++++------------
    1 file changed, 33 insertions(+), 14 deletions(-)

    diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
    index a669945eb829..a5b3708dc4d8 100644
    --- a/drivers/net/phy/realtek.c
    +++ b/drivers/net/phy/realtek.c
    @@ -53,6 +53,36 @@ static int rtl821x_write_page(struct phy_device *phydev, int page)
    return __phy_write(phydev, RTL821x_PAGE_SELECT, page);
    }

    +static int rtl8211x_select_ext_page(struct phy_device *phydev, int page)
    +{
    + int ret, oldpage;
    +
    + oldpage = phy_select_page(phydev, 7);
    + if (oldpage < 0)
    + return oldpage;
    +
    + ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, page);
    + if (ret)
    + return phy_restore_page(phydev, oldpage, ret);
    +
    + return oldpage;
    +}
    +
    +static int rtl8211x_modify_ext_paged(struct phy_device *phydev, int page,
    + u32 regnum, u16 mask, u16 set)
    +{
    + int ret = 0;
    + int oldpage;
    +
    + oldpage = rtl8211x_select_ext_page(phydev, page);
    + if (oldpage < 0)
    + return oldpage;
    +
    + ret = __phy_modify(phydev, regnum, mask, set);
    +
    + return phy_restore_page(phydev, oldpage, ret);
    +}
    +
    static int rtl8201_ack_interrupt(struct phy_device *phydev)
    {
    int err;
    @@ -184,7 +214,6 @@ static int rtl8211f_config_init(struct phy_device *phydev)

    static int rtl8211e_config_init(struct phy_device *phydev)
    {
    - int ret = 0, oldpage;
    u16 val;

    /* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
    @@ -213,19 +242,9 @@ static int rtl8211e_config_init(struct phy_device *phydev)
    * 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
    * for details).
    */
    - oldpage = phy_select_page(phydev, 0x7);
    - if (oldpage < 0)
    - goto err_restore_page;
    -
    - ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
    - if (ret)
    - goto err_restore_page;
    -
    - ret = __phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
    - val);
    -
    -err_restore_page:
    - return phy_restore_page(phydev, oldpage, ret);
    + return rtl8211x_modify_ext_paged(phydev, 0xa4, 0x1c,
    + RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
    + val);
    }

    static int rtl8211b_suspend(struct phy_device *phydev)
    --
    2.23.0.rc1.153.gdeed80330f-goog
    \
     
     \ /
      Last update: 2019-08-13 21:12    [W:2.978 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site