]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
phy: renesas: rcar-gen3-usb2: add is_otg_channel to use "role" sysfs
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Fri, 21 Sep 2018 11:53:24 +0000 (20:53 +0900)
committerKishon Vijay Abraham I <kishon@ti.com>
Tue, 25 Sep 2018 10:40:12 +0000 (16:10 +0530)
Even if a board doesn't have otg pins connection, this hardware can
change the role by a register setting. So, this patch adds
"is_otg_channel" for it.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/renesas/phy-rcar-gen3-usb2.c

index 3f2efe55940c6227be3e0b78fe5e14aaf2c71e27..d0f412c25981e7bba5f46738e426e809199bc64e 100644 (file)
@@ -86,9 +86,21 @@ struct rcar_gen3_chan {
        struct work_struct work;
        enum usb_dr_mode dr_mode;
        bool extcon_host;
+       bool is_otg_channel;
        bool uses_otg_pins;
 };
 
+/*
+ * Combination about is_otg_channel and uses_otg_pins:
+ *
+ * Parameters                          || Behaviors
+ * is_otg_channel      | uses_otg_pins || irqs         | role sysfs
+ * ---------------------+---------------++--------------+------------
+ * true                        | true          || enabled      | enabled
+ * true                 | false                || disabled     | enabled
+ * false                | any          || disabled     | disabled
+ */
+
 static void rcar_gen3_phy_usb2_work(struct work_struct *work)
 {
        struct rcar_gen3_chan *ch = container_of(work, struct rcar_gen3_chan,
@@ -244,7 +256,7 @@ static ssize_t role_store(struct device *dev, struct device_attribute *attr,
        bool is_b_device;
        enum phy_mode cur_mode, new_mode;
 
-       if (!ch->uses_otg_pins || !ch->phy->init_count)
+       if (!ch->is_otg_channel || !ch->phy->init_count)
                return -EIO;
 
        if (!strncmp(buf, "host", strlen("host")))
@@ -282,7 +294,7 @@ static ssize_t role_show(struct device *dev, struct device_attribute *attr,
 {
        struct rcar_gen3_chan *ch = dev_get_drvdata(dev);
 
-       if (!ch->uses_otg_pins || !ch->phy->init_count)
+       if (!ch->is_otg_channel || !ch->phy->init_count)
                return -EIO;
 
        return sprintf(buf, "%s\n", rcar_gen3_is_host(ch) ? "host" :
@@ -320,7 +332,7 @@ static int rcar_gen3_phy_usb2_init(struct phy *p)
        writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
 
        /* Initialize otg part */
-       if (channel->uses_otg_pins)
+       if (channel->is_otg_channel)
                rcar_gen3_init_otg(channel);
 
        return 0;
@@ -444,6 +456,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
        if (channel->dr_mode != USB_DR_MODE_UNKNOWN) {
                int ret;
 
+               channel->is_otg_channel = true;
                channel->uses_otg_pins = !of_property_read_bool(dev->of_node,
                                                        "renesas,no-otg-pins");
                channel->extcon = devm_extcon_dev_allocate(dev,
@@ -487,7 +500,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
                dev_err(dev, "Failed to register PHY provider\n");
                ret = PTR_ERR(provider);
                goto error;
-       } else if (channel->uses_otg_pins) {
+       } else if (channel->is_otg_channel) {
                int ret;
 
                ret = device_create_file(dev, &dev_attr_role);
@@ -507,7 +520,7 @@ static int rcar_gen3_phy_usb2_remove(struct platform_device *pdev)
 {
        struct rcar_gen3_chan *channel = platform_get_drvdata(pdev);
 
-       if (channel->uses_otg_pins)
+       if (channel->is_otg_channel)
                device_remove_file(&pdev->dev, &dev_attr_role);
 
        pm_runtime_disable(&pdev->dev);