Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751516AbdIACpE (ORCPT ); Thu, 31 Aug 2017 22:45:04 -0400 Received: from relmlor3.renesas.com ([210.160.252.173]:7082 "EHLO relmlie2.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751393AbdIACo6 (ORCPT ); Thu, 31 Aug 2017 22:44:58 -0400 X-IronPort-AV: E=Sophos;i="5.41,456,1498489200"; d="scan'208";a="256586961" 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 v3 2/4] phy: rcar-gen3-usb2: split the two meaning of "has_otg" Date: Fri, 1 Sep 2017 11:41:23 +0900 Message-Id: <1504233685-17947-3-git-send-email-yoshihiro.shimoda.uh@renesas.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1504233685-17947-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> References: <1504233685-17947-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: SG2PR01CA0091.apcprd01.prod.exchangelabs.com (2603:1096:3:15::17) To SG2PR06MB0984.apcprd06.prod.outlook.com (2a01:111:e400:5213::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4e4a51d1-e563-422e-a162-08d4f0e36cc0 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(48565401081)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:SG2PR06MB0984; X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0984;3:+QofCWD1o4iTYhn/ZK6yY5ivwpsw/GqDzXK19HrIBv0VklxlEiz960RuBX3EN92FtIR7dUH3X+6j3HBH6ocXGY00VeaAlYIJRr2rZN4NGqaDKWkmVYTTTgN2H8bo8+vT6eyZBuho2O56lvXfDRo20MlyUACvsUFpdYgk0KR3pRlA+0LzSQvLeJpPuaK6GKzprOu+qfuw1qG24nPvP7FUPo1gBcuIXrNnusOyyJs/EmrThhkmvesICs0qtQ9EsXcq;25:ITZSxS2G6Ne8GY0xAZbuSANaJDM1Guls9+4UJsK0ZyZChXCywOeDMSDborQFe4olz0jjhVGXl8nvNWNChhrkHbRAFgSscizrNXqgud80YYefV7X7OikQ3kG0RAWhJdpOlkY/R8WdL9nPV/UTme7iC30pYipi+NbH/cwupMJnztQT5wF1oXccMiFlUkPBbYl9ZPUwtuXfctb50CHqWEucTeaBHbkU2J8uqNzt548m7rrsX9cWt4Mgxcd4y0CNZfbz5r8YZwznKlVT65N8golRwL+JKbL527SpRTfyz5EckD3yEjIZ4bxHhA+6iA/P6qri8Ldq+t+Qusm5B8lNwnkLDw==;31:LeEknocytj8d2e97ky8eLYCbeqxlJQ+sqW87GPOFu0sX2BoHHPp4e9MXsiaek+1FxCtsoH0eK8yGxb8vsuHKVFcc6UT5lICa5dKGsL++RGy+w9m+gWFQ+L8OcRF2g5R5C1lO1tDolp9j23LriWRxAYoEFYyVgW3qhgaPYtBDf/pTCWQObQU0/iYYM3N5ioNem5svyBc96xjTtqBZhQYizkOe3Q7wXNwpKf15ez94DoY= X-MS-TrafficTypeDiagnostic: SG2PR06MB0984: X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0984;20:2Bn11ZFxK/vRtmd4kl0b1dzSOYRiUYIgj78QOc+ffFaD9GT7Ib4Ydm5vF7QC6hCzX4+V3pUiKcaJ5li4c5kcTbCMU/VSpVM6ZF/kYCU6b/KN4AfIzszkdsBTtMdeN2mvqBTtm46AJVOV3/RaX4jJ3WrvoUbqMIxi4hpCScxG5Jcz1H2qsrlKXzPRK/BGhxZauiGrZWSTOY44m0Uahqu/HeLlNNIDckHyXZyVkxDankCy4byK9GJoH+sCPQHUAq1SPgfQyoqFKUdbP3f5VlOBiAqaRab/KFzLRHVun3yLN+Ynpxiw6qfVFFZaN0788tWzBND07EGSagu4xq6y2BEGlCSXIaj7SNkQ5quXUzD0S72qV3j0Ve+d/+ApImfmYbRpKRn4heTIsBNM26oeuxSQwcr+GM+jGDwzCRsmwkyu2UiwHkG/7PzoHKU673aRxlaEjn8ZwEwTm852SzbkgeLqOfC6jNAkoXS2bct/hiWJ5flymWj0MzATwLBhw9PWz3ee;4:DzogTJWHqDWGEZb/urjN+r4QYyZFm0+SfaHzp5HCdJV9vEjqKW/tQyRx2GPw4owC65KA3nQSR2+b9Bz/dbOI43bydJ/7Vp7OOkslZTIYh382+ZSSOF3wBHKck+JckBo/fKzwp69GxFswXdV4Q9z37fqj55Gp3GEyYW2gIpmIj8W7ybjv8mybsPbHFInhWHrMyWUYlFopY5Kl8cKlwHGnlnS+6OqaW3NdrYl1YYRv7fmDQIHv6B6CuERlhVF2+1wN 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)(93006095)(3002001)(100000703101)(100105400095)(10201501046)(6055026)(6041248)(20161123562025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061750153)(20161123560025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SG2PR06MB0984;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SG2PR06MB0984; X-Forefront-PRVS: 0417A3FFD2 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(7370300001)(4630300001)(6009001)(6069001)(39860400002)(199003)(189002)(2950100002)(42882006)(66066001)(2361001)(6916009)(6666003)(105586002)(2906002)(101416001)(6512007)(5660300001)(68736007)(47776003)(107886003)(33646002)(110136004)(50466002)(106356001)(48376002)(498600001)(8676002)(6506006)(2351001)(36756003)(6486002)(4326008)(53936002)(50226002)(3846002)(97736004)(7736002)(230783001)(5003940100001)(42186005)(6116002)(25786009)(81166006)(81156014)(189998001)(305945005)(7350300001)(78352004)(76176999)(50986999)(3720700003);DIR:OUT;SFP:1102;SCL:1;SRVR:SG2PR06MB0984;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:0;MX:0;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SG2PR06MB0984;23:DRcKD6/c7r4Uy3M5Z+Qi080lperg24AeiiyeufC3k?= =?us-ascii?Q?at8JUUKTayjVBKEHoEtrV8rf+56FCT2EPVBHvWfRlCGHd+/YyGNuJtzrKZjv?= =?us-ascii?Q?fRoWyDYCeAzgM2r8A2Qtqc953zKcoqxpuOPBu/M4nzzekomt8TCPySHEzdo6?= =?us-ascii?Q?mkVhSvOy102YrrbtSLgk0JtNImAVYt2pOdJYhtPnCVEkIlMBCEKsefmbLAiQ?= =?us-ascii?Q?Qb8d/OsWBo0jjGE9Wkun0iOiSVerOgrT15Pt0HtBbPV8lDt9kKnxa2yd/Obf?= =?us-ascii?Q?VmMvhpjyM1RijvuQtU5nuQSuOrcba17WYk/XhX46YucNeKkKcLCWQKdu6Wsn?= =?us-ascii?Q?B7lRzYAD10uGzZ48k6QqnG0xEYDqYILTP+sWNu27Ia3yCSDDFhJmLDb7FVs+?= =?us-ascii?Q?Ly1a1n/6fkfFXymwdABUhN8xXmqEaD0Xn6xZE9QQofseRNBQNxTTKA3IQQ4s?= =?us-ascii?Q?mIb1rzB7CXlaLf/B81SUWNsIsdzn+du2LJ7oSyaPCIf83Pwd4T8Ho+iK4fpR?= =?us-ascii?Q?9XwftfVymr13Ku71v5LK0zUaj3Ek9NdaiMK/mWHd9Gcnm5QXnbmeZn78SqPD?= =?us-ascii?Q?iOGRK/jrxedU11A+yiO2ttXmG8LykeoxH0iIUcAGu3bmC2Mxr2l3Hz2Z/NbV?= =?us-ascii?Q?MeIkI7nbi9nUqO4ieaAeri+lg4wfKj90qCkzvrbGeoXv0zKFbOJxzkSOUd2M?= =?us-ascii?Q?cxcd2ZfUOiVbmIGMd6vI6dAFwNcR1mUo/vAwpXDj1oFqthnfGoAEEsSd+lvk?= =?us-ascii?Q?jqKq8Tjl9Q9Tb9enum5r1X+hGQkB4h2MeTlAis17lbUstGihQ+C/tJ03bmcf?= =?us-ascii?Q?xjyZSr/kM9hFnDDjhYHQFn+2iKVbHd/JcSFBxuoFBY/mrMhzyypfidls4e6m?= =?us-ascii?Q?02I7ce9Wfewk13ATK0wkMecZFwJ6YVqH2GDcSXXXW10TCShyWpGjRbHMTWyU?= =?us-ascii?Q?Nd5OKgAAfIDUAStW3rkZc9/npNfHSpnBF9FhnjDWGoowrCCVojaKSVlFRab5?= =?us-ascii?Q?pdh/dviq/8ZCxlypI8rOHwGWhQfePnSK1PD4c1+FjanVDhgfaDXZfORCE3tu?= =?us-ascii?Q?IEzFuRoSVeSGMspvpME8nn0SxqZrkSiX8uyWtImX410Yk3at3ZtbzJV3bm4D?= =?us-ascii?Q?0ZdNQvH7hEjusuQRDFafz0O7dyNuOf5nmUmjMtm1/2gO2JFaoPDzFVPUeb7b?= =?us-ascii?Q?S7Xj3wR7oWd2v6NuRa8I2VdhCUv7sQBouUSwtn8ODk41ti1i/Bn0xuQEn7TN?= =?us-ascii?Q?QK0T6XxFtLkqyGzzYY=3D?= X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0984;6:2ZvsDslnOAZud36jH1gxHYawaX/bEU1nFrclbhN3sQI86C/w2R4nyPEJM5ZcBhoNL29OURSvxzQhVzU1V9KbvLfLaVrcPUJc2PJiqoPyq0HZ87DacovNsAxBpjOKq7ncwNqMQzx/VvXP3WpDkk+U9V10IcjZIXBpCuS3qPTI655Biy/UAVL0KZqx7lFuAJhxCpXsL7cLWmwDYpi+3taQ5o4zdByp+ypsqhiIQowr/p6VmpAYfoWJBFVft5V8kFW4ZDWhZqZ5KloCgGoAeRURygoAGbEaiw2K+FX60YkYQqy9SK2Sz6JTRDhcarIbnDnjmzxlOpTbwc1MSKsrK/PVaA==;5:MNZwIaZmIflF3rO83cvyf+wGDciNnsXRLW6BdmyG2jJjWJWM4UG4d8hG/RSwlVjPh+Zc+LiJyzTdpIsUErNLQHI3K9bnJJXv14umquY80Xmv/cUl3DFj8ozVxt3E2V/SHIhCol5ZKMcR12/Ov8e3FA==;24:epFF2tQ0kYTZle0W9v96n/iS1wOc/iN31j0sia1y6cCsw5U2v0sjRCTLo0cE9GcoxlbPjUUMrTitXJhfbvEjuVAv8xSXNbpEDLWO6nvT0OU=;7:zpHJ7b0kaEocLuINFw26Zv3TNML4p4R1cmphjbP2lY9z1iAbbv5hEo/aUktkQ0jyeefnZIWNABWE0SY5VVNLZYftYiuXre+NR3U92Xe9eGJzYroupt0KLAAY04/mrBt13QBGocslBC3jCbaF8tjmiOKcnEOlsQGOe4t+Zao81uNLGEQIr3aBCKKJg575xd1WTPaFLe0KxcKKW+JnzvhNK5AYXzPn/tXVi6SAeJAZbnc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SG2PR06MB0984;20:qFHhTsApib7+ucZE++QcrEEKA8GX4Vd39GOjR3opaW+11gQHrL8xF1UUYXWfeMuzRxUEIBoDsXcyJKASXYfLrLGGR4VR//hmCkZtbHvzWnsppRiTSROagCF3TCPBZNqoYBRl/Cn1Nfx53G5QvXapz7Zd5w+UDnd85U4Tczfc2lM= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2017 02:44:53.4044 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR06MB0984 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