Commit 5c13e075 authored by Egil Hjelmeland's avatar Egil Hjelmeland Committed by David S. Miller

net: dsa: lan9303: Introduce lan9303_read_wait

Simplify lan9303_indirect_phy_wait_for_completion()
and lan9303_switch_wait_for_completion() by using a new function
lan9303_read_wait()

Changes v1 -> v2:
 - param 'mask' type u32
 - removed param 'value' (will probably never be used)
 - add newline before return
Signed-off-by: default avatarEgil Hjelmeland <privat@egil-hjelmeland.no>
Reviewed-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f4d87ad2
...@@ -249,6 +249,29 @@ static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg) ...@@ -249,6 +249,29 @@ static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
return -EIO; return -EIO;
} }
/* Wait a while until mask & reg == value. Otherwise return timeout. */
static int lan9303_read_wait(struct lan9303 *chip, int offset, u32 mask)
{
int i;
for (i = 0; i < 25; i++) {
u32 reg;
int ret;
ret = lan9303_read(chip->regmap, offset, &reg);
if (ret) {
dev_err(chip->dev, "%s failed to read offset %d: %d\n",
__func__, offset, ret);
return ret;
}
if (!(reg & mask))
return 0;
usleep_range(1000, 2000);
}
return -ETIMEDOUT;
}
static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum) static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
{ {
int ret; int ret;
...@@ -274,22 +297,8 @@ static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val) ...@@ -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) static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip)
{ {
int ret, i; return lan9303_read_wait(chip, LAN9303_PMI_ACCESS,
u32 reg; LAN9303_PMI_ACCESS_MII_BUSY);
for (i = 0; i < 25; i++) {
ret = lan9303_read(chip->regmap, LAN9303_PMI_ACCESS, &reg);
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;
} }
static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum) static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum)
...@@ -366,22 +375,8 @@ EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops); ...@@ -366,22 +375,8 @@ EXPORT_SYMBOL_GPL(lan9303_indirect_phy_ops);
static int lan9303_switch_wait_for_completion(struct lan9303 *chip) static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
{ {
int ret, i; return lan9303_read_wait(chip, LAN9303_SWITCH_CSR_CMD,
u32 reg; LAN9303_SWITCH_CSR_CMD_BUSY);
for (i = 0; i < 25; i++) {
ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_CMD, &reg);
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;
} }
static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val) static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment