Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752312AbcKLXs3 (ORCPT ); Sat, 12 Nov 2016 18:48:29 -0500 Received: from mail-co1nam03on0049.outbound.protection.outlook.com ([104.47.40.49]:54592 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750776AbcKLXs1 (ORCPT ); Sat, 12 Nov 2016 18:48:27 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=alex.g@adaptrum.com; From: Alexandru Gagniuc To: CC: , , , Alexandru Gagniuc Subject: [PATCH] net/phy/vitesse: Configure RGMII skew on VSC8601, if needed Date: Sat, 12 Nov 2016 15:32:13 -0800 Message-ID: <1478993533-1936-1-git-send-email-alex.g@adaptrum.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [2601:647:4080:2997:5f3d:4008:dc17:d4f9] X-ClientProxiedBy: BN6PR20CA0014.namprd20.prod.outlook.com (10.173.158.152) To BY1PR0401MB1175.namprd04.prod.outlook.com (10.160.194.149) X-Microsoft-Exchange-Diagnostics: 1;BY1PR0401MB1175;2:8xggiVmjooST2felcCbI4Z8xzWmDCf8vk7NAewK9Z5Hoe79SwiQrAZ1yEsq2QyKALvR+DPPYAlLdXzGtWuKRSY7y08+h9bEMtBIAFDQH/VHpT1k4tsiu5CzYW6eCN31Sbb/A9ie4/fMzN0ygn/0KUHBYiDp+8UarTNNzNMar1GE=;3:5EwIKmqNcNQwL52IJg7B/wRpxKyLb3lcSnLKYdgLewaR1+pskcga9ZwU6AKtEEO90QmPCKzEsUprcH4vSnObRK4OH8ffbQ04kEf4zfOS350+nxirVifqS65lWNx/FZSLHp9fwaBcc+dGNZ/bUA/sUWIgBGDemM1vK4F3LlOMfpM=;25:UzJKNMttzXKsCJD+5U8pOTIXqu5jpoimYmQxxe2AxL8mB4wh7miYFvMTbjwl8ROkheCxz3sA7u8YDvDGIz+CB2rPXDtlL6SmtdoXtD7M6PPH1uHYaOS40s7qbxal7ee7rdV+Golj1ve/JwjsIUJeKpGMZX2XnI08IvZO6hu8Mvc04Mbq50y99SKeF1pL+vxwT7PFxBiO2PGi/7rX+QwRZgGrOmxtuJNqt21Cgvfpu6eJKgDALt7Y71wk9dmBbXXgUS1DOcjaBUYklIMOR17zROynoQSkWz344rzhzuGJ5VBAMTbxuEFtCjQ+BPP5xo0Y3PaWGNMjkppciNSEmF2uDJqBNZ/YrTLPB0mJFE4hb/yaMivKKgq86Yt/3uzjpT4vdO+b5jV/gs2WUkNkTNBCfJ/iYxJgQ6xW2sHCV1MOky8b5Ug3WEknfop2rkslZnML X-MS-Office365-Filtering-Correlation-Id: a74e45bb-2323-4174-796f-08d40b54340a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BY1PR0401MB1175; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0401MB1175;31:Z/JI8+qbzoQK47ciBamKa6cSzsCsgrL5uehJQd2v+Gq1+yiJtJUxj4EWOzyvRLFKaHn39TZ6n76/4hAYJDRfo8iGSyTQyjA6DByB1KSthtwq698zx0GWjdvGDem3N25huNiEssrNCo8BTeb2LB96ZtHrrS10bmm03OLbDFapE5q69PyLkWdiblZam6jbENYXGD2E9TEwH9TGl2Z2fVPNF4Wk+v1W/k01ZI6W0Tbaa+sK/9b85+1OnFkwfBZcUDBo;4:G95XtA+hRyRHA9+wnbJ/YzbEqYK4XP1gf4AYc9VC8jD7fwkLKEGc6+/24TxK5ShIr2BSTTn4I6areoxSjys/KmZu9xvOLuxdDbXOA3uGI2zZfAgVyOWBGOYmNJYZUXgRPh1ZRF49vKJ6O0gQAjnplLXSa9htzedT7Q6S5wJ+/JLwEzQqyGD8oHDfgFgNn8KY6Dm/LGIASkbRTYnB0IWCewCviJpF2cNAN+ZlIe8YZqp3JXcKa+GSSs7DTmJQkBB4pfP3suuA0ZIroG2tvHMXFrLbCYkZNb3Yx4cl4DRgCMPjIkugrQumnc3kHbsWdiXLpRlzqMtx1QsRmEleyvYaTVzmSHoFJjswXEFpf8BQngErCRFbKx86UU2/CqGPkTqDzzuKsHmyFqGbuB/fPgdbd62qr4idtd78hgQVQXaFlYQD0YHKEelklinWSos3SPbr X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6043046)(6042046);SRVR:BY1PR0401MB1175;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0401MB1175; X-Forefront-PRVS: 01244308DF X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(199003)(189002)(81156014)(81166006)(305945005)(50986999)(101416001)(4001430100002)(107886002)(97736004)(4326007)(5003940100001)(2906002)(33646002)(7736002)(36756003)(7846002)(8676002)(48376002)(50466002)(105586002)(5660300001)(77096005)(50226002)(68736007)(106356001)(586003)(110136003)(86362001)(47776003)(6666003)(189998001)(21086003)(42186005)(2351001)(6916009)(92566002)(6116002)(69596002);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR0401MB1175;H:nuke-mobile.lan;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY1PR0401MB1175;23:VcQCR36gQA3b4+31XJ+n6yPec24wpsfDOw+CZhG?= =?us-ascii?Q?oDu3ppda9rF/w3vHoI8YlWuqFsb/mU5X+vqD2HSw1+KZsjkQ7pIwGwjOLYql?= =?us-ascii?Q?U7RP2oEh853waJxAS9c+dgseNItS6lNP9Gwe6wfuvGvb+oKH1/iEmZhwk8TD?= =?us-ascii?Q?bm1KFWxiHR7lLPoi3yQMr+qNLrMOAyOHWVYw4Mexs78tGM+VtNcQ26XIu5qf?= =?us-ascii?Q?aIuNt14YsDqvzjmtBAFigQ3UVWZxkGHh5EAUbFmQ9Iyjorj+/f95YuHCuIMp?= =?us-ascii?Q?fBa9PgJTtACeCq7Se7frgPSchO/LwTw9eLvhvPmDlkshocl2vE5JwtQ0qUrZ?= =?us-ascii?Q?IMYkUtVQlabteHkmkciuXSymdp4keBS5W4IUgCM8Xl//4N4KBjE/t4fAi2fC?= =?us-ascii?Q?z3965oluS6P8qbT94IUEQH4t1EKyRM9xWlmYUpROQ5vZ0LhaAtQ9C8IKFmc1?= =?us-ascii?Q?gxa8zuqVFfmNJn+YNqjuD4h+GUrbyck7ogqnDSI3T9v0INqRoi7dBqG32yPd?= =?us-ascii?Q?ai8xCOjRq+UH0jlh99IrIk/s1uxdDOiQ1gFr90tqDoFTXViBZekLhnIWh5fj?= =?us-ascii?Q?H6MDQZnywOx8sz78CzUDjuY9nrFAXH4RNTOpny9RuQMxWGZPZzHE817eBXvd?= =?us-ascii?Q?O4rvzZUs2uOPoIHinkZZ9tQyURfhzI1cleK1V26DR8qctPCx5Gp75GvBeBQR?= =?us-ascii?Q?eLgM1vBNAvSSVyDgSNj5yLnbHeLdvsqE9V+5A3/QY+A42MyCZ437a4g26Ns5?= =?us-ascii?Q?b9WOza0/PPzzO7yxXHUwM4LqeTh0R2PJsaDHXT+gEpzBvk2CorYkiYVvAKJb?= =?us-ascii?Q?lL5whooznjTT0N1MqmEHtmj6ylaW67a0dygOOpa/sjxy9pm0Tl0BldrDH7K3?= =?us-ascii?Q?/4edxlUsQc1a4OWkZQvDrj4kJL4CYRIphx4o23FcWHBkjxachymd8WpFIgiO?= =?us-ascii?Q?5Bwe4oCKl0qoDPpzURdr+tviDwxU2sorPbtJG3Q+scu7JQiAPc53AEp+wpPY?= =?us-ascii?Q?oGEafg98G6JE9lyjb7BJVgg1bYxYdT1D3MswRRFAeMUdhcg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0401MB1175;6:yG77KmqCJgyPFxYW4jxy38dUIZuo7v95ahl+UpDQOTamXeouse0ozU5APkSyesLYdyhTtwpk3Ndu1l9qhH/UqnhTF+upoEq9o7YsAjwBnLeBqvN2fUjzKm+lkhvGJ53UxSJMQAUA8oiais1USi0bjrk5XzFXfhxevTIV2tTO41aQ5+wgO3xdKxQNleZZbSzMcK+kd6T11WcH04z0G496+F4IZGZwyGeAcvU2jTl6a1/V8e//KtqE0whn1fTNLwXJrEkD2fC//sehJ7v1sLm4DAsbRjwS0CJX8JL8XHWe957bjb2xRP2LYDZ0LTQIelVyn+DAdRinUCQ8SAUAnQI4EQ==;5:+LIMCg5drr4pj6CbsUvXZ3JeYxNBUmvDuQm2mBwxf7LPcsuoYLiNr99ywUSNDnxBgPGfhAgjh7W2zJNqHBRANFw4X1VPH6KqodjStAy7cs72NE+pmZv7XzV9w7AFHOTab5Hcl+QptPHlul9rLZur+xh7YUTYGtchBUsevuSSHTI=;24:0FibF2qBM2f5QxnWZ2m8tWji0PLH+48K6UxFsi/jz39fQxuJmGy0AFtCmJ1BYlYuOukf4xbrcuHdjH+7E8aA5jcoCQUCur26dnqTdxZ/CT4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY1PR0401MB1175;7:g60w48yoZ3uZyheF8o//7l2qbNmqjYJkHLDG+5+euXzcDFjmyCn2lDVxaQZayxucMsh7IDR7uoVW24ofN+MI48zs7ITQnYtr8ebLyUmOFVonjfpo/anV1nm4wRywzrjCB6ntID7pbtcIC4qLtdiEOv/MaX34nR7MjnTpOx9pErvpwEBD9YxBpCx9vhjwMLC/1ZuArLjvykAn0f4Yx8/n/JBCzdegRNDGQ+VqHAT96HcmL3gaPOTHq/uYvyXgE1nAYTlWbVNn3NeBLPatjeJ34gN7tVYJwMMlN+ujYe05g0XjW7P8gu+egTrP3FHSK9dU1XZBJ6uY6P9Lrr1SqfTtYICq5pyRtOhN9R7DxE8oE0k= X-OriginatorOrg: adaptrum.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Nov 2016 23:32:42.9951 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0401MB1175 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2135 Lines: 71 With RGMII, we need a 1.5 to 2ns skew between clock and data lines. The VSC8601 can handle this internally. While the VSC8601 can set more fine-grained delays, the standard skew settings work out of the box. The same heuristic is used to determine when this skew should be enabled as in vsc824x_config_init(). Tested on custom board with AM3352 SOC and VSC801 PHY. Signed-off-by: Alexandru Gagniuc --- drivers/net/phy/vitesse.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c index 2e37eb3..7923831 100644 --- a/drivers/net/phy/vitesse.c +++ b/drivers/net/phy/vitesse.c @@ -62,6 +62,10 @@ /* Vitesse Extended Page Access Register */ #define MII_VSC82X4_EXT_PAGE_ACCESS 0x1f +/* Vitesse VSC8601 Extended PHY Control Register 1 */ +#define MII_VSC8601_EPHY_CTL 0x17 +#define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8) + #define PHY_ID_VSC8234 0x000fc620 #define PHY_ID_VSC8244 0x000fc6c0 #define PHY_ID_VSC8514 0x00070670 @@ -111,6 +115,31 @@ static int vsc824x_config_init(struct phy_device *phydev) return err; } +static int vsc8601_add_skew(struct phy_device *phydev) +{ + int ret; + + ret = phy_read(phydev, MII_VSC8601_EPHY_CTL); + if (ret < 0) + return ret; + + ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW; + return phy_write(phydev, MII_VSC8601_EPHY_CTL, ret); +} + +static int vsc8601_config_init(struct phy_device *phydev) +{ + int ret = 0; + + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) + ret = vsc8601_add_skew(phydev); + + if (ret < 0) + return ret; + + return genphy_config_init(phydev); +} + static int vsc824x_ack_interrupt(struct phy_device *phydev) { int err = 0; @@ -275,7 +304,7 @@ static struct phy_driver vsc82xx_driver[] = { .phy_id_mask = 0x000ffff0, .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, - .config_init = &genphy_config_init, + .config_init = &vsc8601_config_init, .config_aneg = &genphy_config_aneg, .read_status = &genphy_read_status, .ack_interrupt = &vsc824x_ack_interrupt, -- 2.7.4