};
struct rtmdio_ctrl {
+ struct mutex lock;
struct regmap *map;
const struct rtmdio_config *cfg;
struct rtmdio_port port[RTMDIO_MAX_PHY];
if (addr >= ctrl->cfg->num_phys)
return -ENODEV;
+ guard(mutex)(&ctrl->lock);
err = (*ctrl->cfg->read_mmd_phy)(bus, addr, devnum, regnum, &val);
pr_debug("rd_MMD(adr=%d, dev=%d, reg=%d) = %d, err = %d\n",
addr, devnum, regnum, val, err);
+
return err ? err : val;
}
if (addr >= ctrl->cfg->num_phys)
return -ENODEV;
+ guard(mutex)(&ctrl->lock);
if (regnum == RTMDIO_PAGE_SELECT && ctrl->port[addr].page != ctrl->cfg->raw_page)
return ctrl->port[addr].page;
err = (*ctrl->cfg->read_phy)(bus, addr, ctrl->port[addr].page, regnum, &val);
pr_debug("rd_PHY(adr=%d, pag=%d, reg=%d) = %d, err = %d\n",
addr, ctrl->port[addr].page, regnum, val, err);
+
return err ? err : val;
}
if (addr >= ctrl->cfg->num_phys)
return -ENODEV;
+ guard(mutex)(&ctrl->lock);
err = (*ctrl->cfg->write_mmd_phy)(bus, addr, devnum, regnum, val);
pr_debug("wr_MMD(adr=%d, dev=%d, reg=%d, val=%d) err = %d\n",
addr, devnum, regnum, val, err);
+
return err;
}
if (addr >= ctrl->cfg->num_phys)
return -ENODEV;
+ guard(mutex)(&ctrl->lock);
page = ctrl->port[addr].page;
if (regnum == RTMDIO_PAGE_SELECT)
}
ctrl->port[addr].raw = false;
+
return 0;
}
if (!ctrl)
return -ENOMEM;
+ ret = devm_mutex_init(dev, &ctrl->lock);
+ if (ret)
+ return ret;
+
platform_set_drvdata(pdev, ctrl);
ctrl->cfg = (const struct rtmdio_config *)device_get_match_data(dev);
ctrl->map = syscon_node_to_regmap(pdev->dev.of_node->parent);