Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751440AbdHaIz1 (ORCPT ); Thu, 31 Aug 2017 04:55:27 -0400 Received: from relmlor2.renesas.com ([210.160.252.172]:11595 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751074AbdHaIzY (ORCPT ); Thu, 31 Aug 2017 04:55:24 -0400 X-IronPort-AV: E=Sophos;i="5.41,451,1498489200"; d="scan'208";a="256474199" Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=<>; From: Yoshihiro Shimoda To: kishon@ti.com Cc: linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Yoshihiro Shimoda Subject: [PATCH v2 2/4] phy: rcar-gen3-usb2: split the two meaning of "has_otg" Date: Thu, 31 Aug 2017 17:32:45 +0900 Message-Id: <1504168367-29464-3-git-send-email-yoshihiro.shimoda.uh@renesas.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1504168367-29464-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> References: <1504168367-29464-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [211.11.155.138] X-ClientProxiedBy: KAWPR01CA0083.jpnprd01.prod.outlook.com (2603:1096:402:c::19) To SG2PR06MB0982.apcprd06.prod.outlook.com (2a01:111:e400:5213::24) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d02f7d28-0c74-4642-a56d-08d4f04b58f1 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:SG2PR06MB0982; X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0982;3:YVQowoIAZf/KoP58Vb6xa/iTiDImHL2qyfcRvT5higyO3DfW5csyLqSGuFBTunFTSrksrROgQji76e9leQktooeE5JZjOF3HG60d512kowksndSY9Spv43eQJ0DaVUBcN9FZuGpUM2TLgSKVpEiMFTiLHoPKUq6qEWAJP5li+TnIOr007m1B2ImnJUQoK1Ul008gQxcUy8WBu7LIdELN3Y8pEis8LKy3BI1cgGaSwNesWAtrabjP1QFqitf+ucvz;25:aPIyS0w9QsGVtzKEJMs3hoEC8wmZVJDMSQp/ZuIkH4URO9EFoa3o7jWPlzEhFfJHmvChG4CK8iwN39oQ+i7i8YH6Eg3NderlIwqPUc3OiBhuSSVfgU5ye638iv0G4z3AMkFUrHgUNvSMp6N/Al2iKne4hvqHjwQUhlYbh8AKo0shXrdI3B8w9EFcCxfDVRj0zyM43gh6h9M45CKSfR+iGQxsOFDt3AXm6vZAVFJn8R1/CMeX/VFwV+7KaI73UBcPrTrBF2VemThqDZ0Ig1oO+5cdTNKJ0jt3gjJ8ctaJSIIXNQtTPzqk6/uBu46tENS70ZcdVnGM+NHl/v57eyYTlQ==;31:TpPdFfBd6MnJ7c2ldZAdhSOFDAQQuUQY9XytkkU3FUJyid9vghvHG0aIfd2Hk1uGoJVt4/sWV1doDrxYexR9xhPjWb14V0IMCzv4MSDvUj/jm75vmZz7eJn+AyWcRamm8qj0sCfMqnvwDyqkCqP2XtcgdRQhWM/SqKG7xsCFOe4CmCsvVyyRNQxiwEa3F+x22Ps3y6o5wCTN0e2bgjOOb7YCWcHw6dwz9hYpIZjv7+U= X-MS-TrafficTypeDiagnostic: SG2PR06MB0982: X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0982;20:cdT2Uy/smCtG0BuVXPKJu4IfOC7mDyiT024qyCoIaFu9J8Cj9CR4yKAFenWbbTMS4Qcob2b5m97iiJFJZ3LFealYiE3wQkiccAYLCCXsovskDbGI1gosdMT9EJOjyU0vmhN2aw/0yIOkK1ezBpcLtsK+5/FJXmt/YxClrPYhCRi1smrBi6num3dOtuqfdN4dzLLhIU2UBs4CmKfz0BC2qrmKPZhetp6+Ap2D8LOvuSW+SafTBre9UyZIc/rO3WAkeD/0hAeo6WFO2oIPgmmVrAElnAMEkmI2C1NTxAppQmM68bLaafOfGn8AnQAu8eizQWrIKM2hcQsEemg75+odOJXr8I6cZQvvHDlLLM35lSsR0W3CeYE/ZAKpjeAcC5aRl/Ni0HmnoQiwDYXaO1NsOwRixras75AvMgI3kFL2eLoy+2YhEgTDc1P75PfitMtVP+3m/xk8Js258yAEJng+E33piXAR7P14ZIZ4Jq4gChmEtJgnAsaGrJEr6G1xsWul;4:6yfqGarlI2+xnl35S9YaAPAc0AyG9+I1lCTQixlk+ro/m8lsE5HgjDTMYfiSKdRz25kbm2o1oxFj64gDw2xxSF3c8vv5i7zbQjFYsCTKFrC6HsyKanW+oatsyzwxNxQQ0eRbXo8KGkFIc/PMI1bq+DY3W1LFIQ7J6tuin2A7qIJGz21U54wGV5CuyQeOeqj4HE0ndcLzcJjFlad/JgZjDdW6Tg1Aw0g75v49QKFLKLLK/KZ7t0nZ/g4tE2B0y0yy X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(10201501046)(93006095)(3002001)(6055026)(6041248)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061750153)(20161123562025)(20161123564025)(20161123555025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SG2PR06MB0982;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SG2PR06MB0982; X-Forefront-PRVS: 04163EF38A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(7370300001)(4630300001)(6069001)(6009001)(39860400002)(189002)(199003)(33646002)(6506006)(101416001)(230783001)(5660300001)(48376002)(6486002)(66066001)(6916009)(2906002)(36756003)(68736007)(47776003)(42882006)(97736004)(6666003)(50466002)(25786009)(42186005)(8676002)(81156014)(76176999)(81166006)(105586002)(106356001)(4326008)(107886003)(110136004)(50226002)(6512007)(2950100002)(189998001)(3846002)(5003940100001)(305945005)(2351001)(2361001)(7736002)(6116002)(50986999)(498600001)(7350300001)(78352004)(53936002)(3720700003);DIR:OUT;SFP:1102;SCL:1;SRVR:SG2PR06MB0982;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:0;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SG2PR06MB0982;23:SlpP5tUqOUSru5g54xCBQk6zGg302ai/IGMkofpgS?= =?us-ascii?Q?0cYcj472W7e6lucGiMCG1GlRw5LxgdxaKN7gK5RjH+ZaD/IjWUBiHt9T4ImN?= =?us-ascii?Q?uDY0K9IrSWsSivv1ACflMxN7Gd1YC6ZalTcFjOGvV/rfQd8SpVN+mwgVyXu8?= =?us-ascii?Q?LhgVzht7S4F4nJnlJD77+yvQUrZK79qV2DPiULEr4XlGFkg0baMYCeaRvDDh?= =?us-ascii?Q?4i4pwZynmPlHFthE8BizSPx9mmxuCAzIJCRhhRfGapSWaI3fvT9qidNLNxdf?= =?us-ascii?Q?slGYJRD0yjcysQ0TfQwX2NGwn69Wy5hLSNcY+DXQSp5umfxRwau41t6QRr6f?= =?us-ascii?Q?gykd9q8Bj8OPLiU50V3D0OLdnM1vskKA7zl1yh5xZd6VzQVISK6N2gjiZS/n?= =?us-ascii?Q?oQoAtjT+nqwHSFo8zJcN8+7+pHi/xyPxFkvaTZ+mrwEpxHICztxbxCZfl+tJ?= =?us-ascii?Q?xseIZups7EqAe2OSNJvi46lw8DBO8fhcWhng4wrSSXcvSwVSQvicqorASHax?= =?us-ascii?Q?bo/IsKg5+3lDwW8rpvwy6m7QZT86mqTtIWWYYyIWHB0s/eHYsA05/T83RqU1?= =?us-ascii?Q?Q+I/sU6kLR/zMWA++f78Uh/QowLy0vFJ15OcxdissyRggkM+HCuTRdySVhvU?= =?us-ascii?Q?ix/8254NSf8Ul2GnrlvVYkua6fIgjsPic36ifFBpG2y6ww+LY+5sQkVTguou?= =?us-ascii?Q?3ok9CXrpStsRrEJNhr8fCPDqAZkNwqo2Sb0f5CS5lgCJ6NOs3RBju+HYQLAs?= =?us-ascii?Q?qyutxOlr9tCuOSm0JiT2S9/t2+Ag6xHhPFsfGMiATvun8Y0xu/nAZ5bi77hP?= =?us-ascii?Q?9PK+ykCVnhAPKHRK86gvFo9yOoZWofaDC5BoiMk2VkJCGWkV1zQD9AjOrCCJ?= =?us-ascii?Q?8W1cEYQdEksTkVE5Y/1TrTwP+kkjqPIYUh0mYx8PJn8zU5+WUiKZn5YsallS?= =?us-ascii?Q?EVdR+bi5ZF6JhNIxa6NlOGNBL+QFJ9DEam4qNK8BFSdw9vTdRnTCHxku2yOp?= =?us-ascii?Q?hhjk8FRJXZkAhh/x5m1mWenY28t/5ciLpKpHfQpcRfq9AK5bo5tvkdCApb2A?= =?us-ascii?Q?EHiKJaAlkIdzZ9GADDH0vESceW9CwUpS6PrRT6JkRbBqWfs8ttXfWElN1z1I?= =?us-ascii?Q?zF5WEVzgFB9jK++5Larc7YS9LrzwAf/dRrG4m516WfoJstZQZmlcwiN0AxnL?= =?us-ascii?Q?XqDVaOfg/mdhMfdjyOzAXiXaXqdrfsxvSyAoyAaZHyDkhMXiNDmhYTM7v790?= =?us-ascii?Q?m/CFV4o5cmvAaZeGGk=3D?= X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0982;6:EuBfqRyG2CWlOHxQ5Jg3k04zJLpe/CznEqpKAubmKXNVbXi2vwdtDNXSeQQvXL8RQVYqJpDIXjy9pXT0wuzAGRR6x0umKZRC1XouB/OKxCR9AW5qokSwu0nZK2O+QXwW73j9v5LMPfaNZQJ19v33Lu3WbFB7CoFtwrT49UV3ATrISev65pAfXHPrmCZ2fuhh1YolR0HBpsW2WkLpU3iTzaCPdVepRpEeYSx7E0fz+o///VmSAAhWvIFiMA5GMiicmQDHSD/5hmk/WaLTGZPxD1HoOIVZ2UHdlufF9rCdXL3S/NUz9PsJHIbzIY8+DNrnE6sUpSFgxy63l/obbYUMmg==;5:GGHuC43itM7ZMD4rPc81kHoGaWOiZ0K8TJRdRJPX7ef1SBRQL+hoPvT/Okx4Rk+hG+/eU6yGTEj/x/yKAe4Vd1P/9sB3juwsLl9GcgvSjtO4QaoyRfJGZd5cLFBHmiECx01+wA8Co6pXMmOp0dhL9w==;24:Ud/H9XdttNoyMFic25zTbEQ5YOCODB4GGVkTb9bJhEPRrQEWCsCdDWqLZKEPQLWPm5o0GwY7K5isVDMc/w6PuE/5ogzh1h/Vs5dhbQezV8w=;7:ktv7bLu18NikxJsIN4PCP91LINAaYGyfYApoKnvrQ+0XJoog7TWdfRUb2gv/YWkfWCke5UyrwQAIByXC2IvwSrGCvGaseUbCWgJQFZ2fT4zmFUfToF+1Ac7YcKxrqFiALgHErguPetZ+RD7R4lUFAz+mzkqTiV4ocRyNh+Iam+oqIRyT4Tc8c0j/Pn/8W0z+R5HcW+pubzTJufTcArNsbJHiwhtjbQbzFDauJHW7bUA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0982;20:gh3FirvjNA7yxra2e7XMJvbjKN5xVdALG7T7i9AL3l7tlWzXL+70UqJtrzxiKAvaM09Um8rZSFtMSe20p+v9/GRE4FBZeFgWGRzepWkaaf2RNFb8506l9/GqVGXfAVVC3ylKg79OoSDwZdHgqbHo91LL7l44EA7c65NIp4dxpog= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2017 08:36:16.6683 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR06MB0982 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4391 Lines: 141 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. Signed-off-by: Yoshihiro Shimoda --- 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) { - 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; + else + return -EINVAL; + + if (ch->has_otg) + ret = rcar_gen3_otg_change_role(ch, new_mode_is_host); + + 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; channel->extcon = devm_extcon_dev_allocate(dev, rcar_gen3_phy_cable); if (IS_ERR(channel->extcon)) @@ -468,7 +491,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->has_otg) { + } else if (channel->can_role_swap) { int ret; ret = device_create_file(dev, &dev_attr_role); @@ -488,7 +511,7 @@ static int rcar_gen3_phy_usb2_remove(struct platform_device *pdev) { struct rcar_gen3_chan *channel = platform_get_drvdata(pdev); - if (channel->has_otg) + if (channel->can_role_swap) device_remove_file(&pdev->dev, &dev_attr_role); pm_runtime_disable(&pdev->dev); -- 1.9.1