Hi, Thank you for the comment! I will submit v4 patch soon. But, I wrote some comments below. > From: Kishon Vijay Abraham I, Sent: Monday, October 9, 2017 7:07 PM > > Hi, > > On Friday 01 September 2017 08:11 AM, Yoshihiro Shimoda wrote: > > The has_otg on previous code has the two meaning: > > - The channel has dedicated otg pins (ID, VBUS). > > - The channel can swap the role via sysfs. > > > > However, some SoCs (e.g. R-Car D3) doesn't have such dedicated pins, > > but the SoCs can swap the role. So, this patch split the two meaning > > of has_otg as "has dedicated otg pins" and adds a new value > > "can_role_swap". For now, the behavior is the same as before. > > Might not be directly related to $patch, but in general certain cleanups can be > done.. > > > > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx> > > --- > > drivers/phy/renesas/phy-rcar-gen3-usb2.c | 61 ++++++++++++++++++++++---------- > > 1 file changed, 42 insertions(+), 19 deletions(-) > > > > diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c > > index e00e99a..4ea9902 100644 > > --- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c > > +++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c > > @@ -87,7 +87,8 @@ struct rcar_gen3_chan { > > struct regulator *vbus; > > struct work_struct work; > > bool extcon_host; > > - bool has_otg; > > + bool has_otg; /* has dedicated pins (ID, VBUS) */ > > + bool can_role_swap; > > }; > > > > static void rcar_gen3_phy_usb2_work(struct work_struct *work) > > @@ -219,14 +220,10 @@ static bool rcar_gen3_is_host(struct rcar_gen3_chan *ch) > > return !(readl(ch->base + USB2_COMMCTRL) & USB2_COMMCTRL_OTG_PERI); > > } > > > > -static ssize_t role_store(struct device *dev, struct device_attribute *attr, > > - const char *buf, size_t count) > > +static ssize_t rcar_gen3_otg_change_role(struct rcar_gen3_chan *ch, > > + bool new_mode_is_host) > > replace new_mode_is_host with enum mode. I got it. I will replace it in v4 patch. > > { > > - struct rcar_gen3_chan *ch = dev_get_drvdata(dev); > > - bool is_b_device, is_host, new_mode_is_host; > > - > > - if (!ch->has_otg || !ch->phy->init_count) > > - return -EIO; > > + bool is_b_device, is_host; > > > > /* > > * is_b_device: true is B-Device. false is A-Device. > > @@ -234,12 +231,6 @@ static ssize_t role_store(struct device *dev, struct device_attribute *attr, > > */ > > is_b_device = rcar_gen3_check_id(ch); > > is_host = rcar_gen3_is_host(ch); > > - if (!strncmp(buf, "host", strlen("host"))) > > - new_mode_is_host = true; > > - else if (!strncmp(buf, "peripheral", strlen("peripheral"))) > > - new_mode_is_host = false; > > - else > > - return -EINVAL; > > > > /* If current and new mode is the same, this returns the error */ > > if (is_host == new_mode_is_host) > > @@ -257,6 +248,32 @@ static ssize_t role_store(struct device *dev, struct device_attribute *attr, > > rcar_gen3_init_for_peri(ch); > > } > > > > + return 0; > > +} > > + > > +static ssize_t role_store(struct device *dev, struct device_attribute *attr, > > + const char *buf, size_t count) > > +{ > > + struct rcar_gen3_chan *ch = dev_get_drvdata(dev); > > + bool new_mode_is_host; > > + ssize_t ret = -EIO; > > + > > + if (!ch->phy->init_count) > > + return -EIO; > > + > > + if (!strncmp(buf, "host", strlen("host"))) > > + new_mode_is_host = true; > > + else if (!strncmp(buf, "peripheral", strlen("peripheral"))) > > + new_mode_is_host = false; > > set the enum mode here. I will set it in v4 patch. > > + else > > + return -EINVAL; > > + > > + if (ch->has_otg) > > + ret = rcar_gen3_otg_change_role(ch, new_mode_is_host); > > Aren't you using sysfs to change the role here? Oops! The patch set doesn't take care about a case of "can_role_swap = true" and "has_otg = false". So, I will remove the "can_role_swap" parameter in v4 patch. > > + > > + if (ret < 0) > > + return ret; > > + > > return count; > > } > > > > @@ -264,12 +281,17 @@ static ssize_t role_show(struct device *dev, struct device_attribute *attr, > > char *buf) > > { > > struct rcar_gen3_chan *ch = dev_get_drvdata(dev); > > + bool is_host; > > > > - if (!ch->has_otg || !ch->phy->init_count) > > + if (!ch->phy->init_count) > > return -EIO; > > > > - return sprintf(buf, "%s\n", rcar_gen3_is_host(ch) ? "host" : > > - "peripheral"); > > + if (ch->has_otg) > > + is_host = rcar_gen3_is_host(ch); > > + else > > + return -EIO; > > + > > + return sprintf(buf, "%s\n", is_host ? "host" : "peripheral"); > > } > > static DEVICE_ATTR_RW(role); > > > > @@ -427,6 +449,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) > > int ret; > > > > channel->has_otg = true; > > + channel->can_role_swap = true; > > Can both has_otg and can_role_swap be true? Yes. But, in v4 patch will not have the "can_role_swap". Best regards, Yoshihiro Shimoda > Thanks > Kishon