struct rtmdio_config {
int num_phys;
int raw_page;
+ u32 cmd_fail;
+ u32 cmd_mask;
+ u32 cmd_reg;
int bus_map_base;
int port_map_base;
int (*read_mmd_phy)(struct mii_bus *bus, u32 pn, u32 devnum, u32 regnum, u32 *val);
return -ENOENT;
}
-static int rtmdio_run_cmd(struct mii_bus *bus, int cmd, int mask, int regnum, int fail)
+static int rtmdio_run_cmd(struct mii_bus *bus, int cmd)
{
struct rtmdio_ctrl *ctrl = rtmdio_ctrl_from_bus(bus);
int ret, val;
- ret = regmap_update_bits(ctrl->map, regnum, mask, cmd | RTMDIO_RUN);
- ret = regmap_read_poll_timeout(ctrl->map, regnum, val, !(val & RTMDIO_RUN), 20, 500000);
+ ret = regmap_update_bits(ctrl->map, ctrl->cfg->cmd_reg,
+ ctrl->cfg->cmd_mask, cmd | RTMDIO_RUN);
+ if (ret)
+ return ret;
+
+ ret = regmap_read_poll_timeout(ctrl->map, ctrl->cfg->cmd_reg,
+ val, !(val & RTMDIO_RUN), 20, 500000);
if (ret)
dev_warn_once(&bus->dev, "access timed out\n");
- else if (val & fail) {
+ else if (val & ctrl->cfg->cmd_fail) {
dev_warn_once(&bus->dev, "access failed\n");
ret = -EIO;
}
if (ret)
return ret;
- ret = rtmdio_run_cmd(bus, cmd, RTMDIO_838X_CMD_MASK,
- RTMDIO_838X_SMI_ACCESS_PHY_CTRL_1, RTMDIO_838X_CMD_FAIL);
+ ret = rtmdio_run_cmd(bus, cmd);
if (ret || !val)
return ret;
if (ret)
return ret;
- ret = rtmdio_run_cmd(bus, cmd, RTMDIO_839X_CMD_MASK,
- RTMDIO_839X_PHYREG_ACCESS_CTRL, RTMDIO_839X_CMD_FAIL);
+ ret = rtmdio_run_cmd(bus, cmd);
if (ret || !val)
return ret;
if (ret)
return ret;
- ret = rtmdio_run_cmd(bus, cmd, RTMDIO_930X_CMD_MASK,
- RTMDIO_930X_SMI_ACCESS_PHY_CTRL_1, RTMDIO_930X_CMD_FAIL);
+ ret = rtmdio_run_cmd(bus, cmd);
if (ret || !val)
return ret;
if (ret)
return ret;
- ret = rtmdio_run_cmd(bus, cmd, RTMDIO_931X_CMD_MASK,
- RTMDIO_931X_SMI_INDRT_ACCESS_CTRL_0, RTMDIO_931X_CMD_FAIL);
+ ret = rtmdio_run_cmd(bus, cmd);
if (ret || !val)
return ret;
static const struct rtmdio_config rtmdio_838x_cfg = {
.num_phys = 28,
.raw_page = 4095,
+ .cmd_fail = RTMDIO_838X_CMD_FAIL,
+ .cmd_mask = RTMDIO_838X_CMD_MASK,
+ .cmd_reg = RTMDIO_838X_SMI_ACCESS_PHY_CTRL_1,
.port_map_base = RTMDIO_838X_SMI_PORT0_5_ADDR_CTRL,
.read_mmd_phy = rtmdio_838x_read_mmd_phy,
.read_phy = rtmdio_838x_read_phy,
static const struct rtmdio_config rtmdio_839x_cfg = {
.num_phys = 52,
.raw_page = 8191,
+ .cmd_fail = RTMDIO_839X_CMD_FAIL,
+ .cmd_mask = RTMDIO_839X_CMD_MASK,
+ .cmd_reg = RTMDIO_839X_PHYREG_ACCESS_CTRL,
.read_mmd_phy = rtmdio_839x_read_mmd_phy,
.read_phy = rtmdio_839x_read_phy,
.setup_ctrl = rtmdio_839x_setup_ctrl,
static const struct rtmdio_config rtmdio_930x_cfg = {
.num_phys = 28,
.raw_page = 4095,
+ .cmd_fail = RTMDIO_930X_CMD_FAIL,
+ .cmd_mask = RTMDIO_930X_CMD_MASK,
+ .cmd_reg = RTMDIO_930X_SMI_ACCESS_PHY_CTRL_1,
.bus_map_base = RTMDIO_930X_SMI_PORT0_15_POLLING_SEL,
.port_map_base = RTMDIO_930X_SMI_PORT0_5_ADDR_CTRL,
.read_mmd_phy = rtmdio_930x_read_mmd_phy,
static const struct rtmdio_config rtmdio_931x_cfg = {
.num_phys = 56,
.raw_page = 8191,
+ .cmd_fail = RTMDIO_931X_CMD_FAIL,
+ .cmd_mask = RTMDIO_931X_CMD_MASK,
+ .cmd_reg = RTMDIO_931X_SMI_INDRT_ACCESS_CTRL_0,
.bus_map_base = RTMDIO_931X_SMI_PORT_POLLING_SEL,
.port_map_base = RTMDIO_931X_SMI_PORT_ADDR_CTRL,
.read_mmd_phy = rtmdio_931x_read_mmd_phy,