mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
phy: renesas: rcar-gen3-usb2: store drvdata pointer in channel
Store the SoC-specific driver data pointer (struct rcar_gen3_phy_drv_data) directly in struct rcar_gen3_chan instead of copying individual flags into separate channel members. Obtain the drvdata with of_device_get_match_data() in probe and assign it to channel->phy_data. Update all call sites to reference `channel->phy_data->*` for SoC-specific behaviour (for example no_adp_ctrl and utmi_ctrl). Remove the redundant soc_no_adp_ctrl and utmi_ctrl fields from struct rcar_gen3_chan. This simplifies the probe path, reduces duplication, and makes it easier to extend the driver with additional platform-specific fields in the future. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Link: https://lore.kernel.org/r/20250808215209.3692744-3-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
ab9c8aeb2d
commit
f75806d263
|
|
@ -122,6 +122,7 @@ struct rcar_gen3_phy {
|
|||
struct rcar_gen3_chan {
|
||||
void __iomem *base;
|
||||
struct device *dev; /* platform_device's device */
|
||||
const struct rcar_gen3_phy_drv_data *phy_data;
|
||||
struct extcon_dev *extcon;
|
||||
struct rcar_gen3_phy rphys[NUM_OF_PHYS];
|
||||
struct regulator *vbus;
|
||||
|
|
@ -133,8 +134,6 @@ struct rcar_gen3_chan {
|
|||
bool extcon_host;
|
||||
bool is_otg_channel;
|
||||
bool uses_otg_pins;
|
||||
bool soc_no_adp_ctrl;
|
||||
bool utmi_ctrl;
|
||||
};
|
||||
|
||||
struct rcar_gen3_phy_drv_data {
|
||||
|
|
@ -204,7 +203,7 @@ static void rcar_gen3_enable_vbus_ctrl(struct rcar_gen3_chan *ch, int vbus)
|
|||
u32 val;
|
||||
|
||||
dev_vdbg(ch->dev, "%s: %08x, %d\n", __func__, val, vbus);
|
||||
if (ch->soc_no_adp_ctrl) {
|
||||
if (ch->phy_data->no_adp_ctrl) {
|
||||
if (ch->vbus)
|
||||
regulator_hardware_enable(ch->vbus, vbus);
|
||||
|
||||
|
|
@ -290,7 +289,7 @@ static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch)
|
|||
if (!ch->uses_otg_pins)
|
||||
return (ch->dr_mode == USB_DR_MODE_HOST) ? false : true;
|
||||
|
||||
if (ch->soc_no_adp_ctrl)
|
||||
if (ch->phy_data->no_adp_ctrl)
|
||||
return !!(readl(ch->base + USB2_LINECTRL1) & USB2_LINECTRL1_USB2_IDMON);
|
||||
|
||||
return !!(readl(ch->base + USB2_ADPCTRL) & USB2_ADPCTRL_IDDIG);
|
||||
|
|
@ -421,7 +420,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
|
|||
USB2_LINECTRL1_DMRPD_EN | USB2_LINECTRL1_DM_RPD;
|
||||
writel(val, usb2_base + USB2_LINECTRL1);
|
||||
|
||||
if (!ch->soc_no_adp_ctrl) {
|
||||
if (!ch->phy_data->no_adp_ctrl) {
|
||||
val = readl(usb2_base + USB2_VBCTRL);
|
||||
val &= ~USB2_VBCTRL_OCCLREN;
|
||||
writel(val | USB2_VBCTRL_DRVVBUSSEL, usb2_base + USB2_VBCTRL);
|
||||
|
|
@ -487,7 +486,7 @@ static int rcar_gen3_phy_usb2_init(struct phy *p)
|
|||
if (rphy->int_enable_bits)
|
||||
rcar_gen3_init_otg(channel);
|
||||
|
||||
if (channel->utmi_ctrl) {
|
||||
if (channel->phy_data->utmi_ctrl) {
|
||||
val = readl(usb2_base + USB2_REGEN_CG_CTRL) | USB2_REGEN_CG_CTRL_UPHY_WEN;
|
||||
writel(val, usb2_base + USB2_REGEN_CG_CTRL);
|
||||
|
||||
|
|
@ -730,7 +729,6 @@ static int rcar_gen3_phy_usb2_init_bus(struct rcar_gen3_chan *channel)
|
|||
|
||||
static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct rcar_gen3_phy_drv_data *phy_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct rcar_gen3_chan *channel;
|
||||
struct phy_provider *provider;
|
||||
|
|
@ -773,8 +771,8 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
|||
*/
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
phy_data = of_device_get_match_data(dev);
|
||||
if (!phy_data) {
|
||||
channel->phy_data = of_device_get_match_data(dev);
|
||||
if (!channel->phy_data) {
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -782,22 +780,19 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, channel);
|
||||
channel->dev = dev;
|
||||
|
||||
if (phy_data->init_bus) {
|
||||
if (channel->phy_data->init_bus) {
|
||||
ret = rcar_gen3_phy_usb2_init_bus(channel);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
channel->soc_no_adp_ctrl = phy_data->no_adp_ctrl;
|
||||
if (phy_data->no_adp_ctrl)
|
||||
if (channel->phy_data->no_adp_ctrl)
|
||||
channel->obint_enable_bits = USB2_OBINT_IDCHG_EN;
|
||||
|
||||
channel->utmi_ctrl = phy_data->utmi_ctrl;
|
||||
|
||||
spin_lock_init(&channel->lock);
|
||||
for (i = 0; i < NUM_OF_PHYS; i++) {
|
||||
channel->rphys[i].phy = devm_phy_create(dev, NULL,
|
||||
phy_data->phy_usb2_ops);
|
||||
channel->phy_data->phy_usb2_ops);
|
||||
if (IS_ERR(channel->rphys[i].phy)) {
|
||||
dev_err(dev, "Failed to create USB2 PHY\n");
|
||||
ret = PTR_ERR(channel->rphys[i].phy);
|
||||
|
|
@ -808,7 +803,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
|||
phy_set_drvdata(channel->rphys[i].phy, &channel->rphys[i]);
|
||||
}
|
||||
|
||||
if (channel->soc_no_adp_ctrl && channel->is_otg_channel)
|
||||
if (channel->phy_data->no_adp_ctrl && channel->is_otg_channel)
|
||||
channel->vbus = devm_regulator_get_exclusive(dev, "vbus");
|
||||
else
|
||||
channel->vbus = devm_regulator_get_optional(dev, "vbus");
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user