Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752580AbdLLU7t (ORCPT ); Tue, 12 Dec 2017 15:59:49 -0500 Received: from aibo.runbox.com ([91.220.196.211]:53844 "EHLO aibo.runbox.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752103AbdLLU7q (ORCPT ); Tue, 12 Dec 2017 15:59:46 -0500 Subject: Re: [PATCH net-next] net: dsa: lan9303: Introduce lan9303_read_wait To: Vivien Didelot , andrew@lunn.ch, f.fainelli@gmail.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org References: <20171212175331.22599-1-privat@egil-hjelmeland.no> <87o9n34y5j.fsf@weeman.i-did-not-set--mail-host-address--so-tickle-me> From: Egil Hjelmeland Message-ID: Date: Tue, 12 Dec 2017 21:59:41 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <87o9n34y5j.fsf@weeman.i-did-not-set--mail-host-address--so-tickle-me> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3694 Lines: 129 Hi Vivien. Den 12. des. 2017 19:08, skrev Vivien Didelot: > Hi Egil, > > Egil Hjelmeland writes: > >> Simplify lan9303_indirect_phy_wait_for_completion() >> and lan9303_switch_wait_for_completion() by using a new function >> lan9303_read_wait() >> >> Signed-off-by: Egil Hjelmeland >> --- >> drivers/net/dsa/lan9303-core.c | 59 +++++++++++++++++++----------------------- >> 1 file changed, 27 insertions(+), 32 deletions(-) >> >> diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c >> index c1b004fa64d9..96ccce0939d3 100644 >> --- a/drivers/net/dsa/lan9303-core.c >> +++ b/drivers/net/dsa/lan9303-core.c >> @@ -249,6 +249,29 @@ static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg) >> return -EIO; >> } >> >> +/* Wait a while until mask & reg == value. Otherwise return timeout. */ >> +static int lan9303_read_wait(struct lan9303 *chip, int offset, int mask, >> + char value) >> +{ >> + int i; >> + >> + for (i = 0; i < 25; i++) { >> + u32 reg; >> + int ret; >> + >> + ret = lan9303_read(chip->regmap, offset, ®); >> + if (ret) { >> + dev_err(chip->dev, "%s failed to read offset %d: %d\n", >> + __func__, offset, ret); >> + return ret; >> + } >> + if ((reg & mask) == value) >> + return 0; > > That is weird to mix int, u32 and char for mask checking. I suggest you > to use the u32 type as well for both mask and value. > Good catch. Will fix that. Same with lan9303_csr_reg_wait() then. > Looking at how lan9303_read_wait is called, the value argument doesn't > seem necessary. You can directly return 0 if (!(reg & mask)). > The idea was to make in more general usable, in case one need to wait for a bit to be set. But I don't have any example from the datasheet that needs it, so I could take "value" away. >> + usleep_range(1000, 2000); >> + } >> + return -ETIMEDOUT; > > A newline before the return statment would be appreciated. > Ok. >> +} >> + >> static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum) >> { >> int ret; >> @@ -274,22 +297,8 @@ static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val) >> >> static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip) >> { >> - int ret, i; >> - u32 reg; >> - >> - for (i = 0; i < 25; i++) { >> - ret = lan9303_read(chip->regmap, LAN9303_PMI_ACCESS, ®); >> - if (ret) { >> - dev_err(chip->dev, >> - "Failed to read pmi access status: %d\n", ret); >> - return ret; >> - } >> - if (!(reg & LAN9303_PMI_ACCESS_MII_BUSY)) >> - return 0; >> - usleep_range(1000, 2000); >> - } >> - >> - return -EIO; >> + return lan9303_read_wait(chip, LAN9303_PMI_ACCESS, >> + LAN9303_PMI_ACCESS_MII_BUSY, 0); >> } >> >> static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum) >> @@ -366,22 +375,8 @@ EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops); >> >> static int lan9303_switch_wait_for_completion(struct lan9303 *chip) >> { >> - int ret, i; >> - u32 reg; >> - >> - for (i = 0; i < 25; i++) { >> - ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_CMD, ®); >> - if (ret) { >> - dev_err(chip->dev, >> - "Failed to read csr command status: %d\n", ret); >> - return ret; >> - } >> - if (!(reg & LAN9303_SWITCH_CSR_CMD_BUSY)) >> - return 0; >> - usleep_range(1000, 2000); >> - } >> - >> - return -EIO; >> + return lan9303_read_wait(chip, LAN9303_SWITCH_CSR_CMD, >> + LAN9303_SWITCH_CSR_CMD_BUSY, 0); >> } >> >> static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val) > > > Thanks, > > Vivien > Thanks, Egil