From patchwork Wed Mar 30 08:50:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Zhao X-Patchwork-Id: 603288 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qZhpb5JSQz9sBg for ; Wed, 30 Mar 2016 20:16:23 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932794AbcC3JQU (ORCPT ); Wed, 30 Mar 2016 05:16:20 -0400 Received: from mail-bl2on0074.outbound.protection.outlook.com ([65.55.169.74]:42976 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932510AbcC3JQQ (ORCPT ); Wed, 30 Mar 2016 05:16:16 -0400 Received: from BN3PR0301CA0040.namprd03.prod.outlook.com (10.160.180.178) by CY1PR0301MB0713.namprd03.prod.outlook.com (10.160.159.143) with Microsoft SMTP Server (TLS) id 15.1.443.12; Wed, 30 Mar 2016 09:00:10 +0000 Received: from BN1BFFO11FD056.protection.gbl (2a01:111:f400:7c10::1:118) by BN3PR0301CA0040.outlook.office365.com (2a01:111:e400:4000::50) with Microsoft SMTP Server (TLS) id 15.1.447.15 via Frontend Transport; Wed, 30 Mar 2016 09:00:09 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=none action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1BFFO11FD056.mail.protection.outlook.com (10.58.145.11) with Microsoft SMTP Server (TLS) id 15.1.443.6 via Frontend Transport; Wed, 30 Mar 2016 09:00:09 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u2U8xxwJ009345; Wed, 30 Mar 2016 02:00:05 -0700 From: Zhao Qiang To: CC: , , , , , , , Zhao Qiang Subject: [PATCH 2/5] fsl/qe: setup clock source for TDM mode Date: Wed, 30 Mar 2016 16:50:27 +0800 Message-ID: <1459327830-19829-2-git-send-email-qiang.zhao@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1459327830-19829-1-git-send-email-qiang.zhao@nxp.com> References: <1459327830-19829-1-git-send-email-qiang.zhao@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131038020099413186; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(229853001)(105606002)(36756003)(81166005)(1096002)(92566002)(5008740100001)(5003940100001)(47776003)(11100500001)(87936001)(19580405001)(50466002)(86362001)(50986999)(1220700001)(19580395003)(85426001)(2351001)(106466001)(50226001)(6806005)(104016004)(76176999)(189998001)(2906002)(48376002)(4326007)(77096005)(33646002)(110136002)(586003)(2950100001)(7059030)(473944003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB0713; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD056; 1:GIXHtrNkZyPwysTGXew9WtAnu/iVOVBuw6N23Pe40VOKHfDWTQyVGYJFjS7xFmb/HLyHv+iQpZKKJxnoBfFfXlAOU38kPg8LIqVOLYc5EfcINacMMHV9IMF10LfHgAP8GdjBRZVt5kSx9pgEukfRgqu0IXl5/XWkGSgL+KagwZdThk4Y+QxWB81VYgB+VI6MMZTN7lBGeC6t0zFuaXSC+s5gfFiQMP3YDG6y9LcowQ20uFRBnx2a9DELs0N0tJPMbgmV+hMBOmM1TZkFm/wrrtpiflHK3pL7LsYBr/ayZOb8jM3/pOY9Tvx0WBKJmk6pVYGVydTLBhUeFxFfCqJankcoFbvaNmgNVORzQvZD7pDpAuaKROrYHepUQELBjbs+Ec/uI4X/1wnIwpoJBnUI92Q8jjGd094PXrXB8zfPDMOA+leNzAtvfYut/cL7Zq+m9ZWfbZsxYgxwYxjGZK82iFvCIDoTxatjKgen2EoQ1HFfEixkVCHSNj0XKdRltOT177OeiRk3Uxxn+NBLfap0TOeDphSKOTWcRcC6ClimibWhzw6UHuMDoTiNdDtUJAD3MNbsdpy8ksS49E6eziL5bk0OzgmmBRgK1FpVG/KUGagbzPMvK51RYdldl3wmDzfK MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: ec15cb77-fcdf-4bc8-3365-08d35879b28d X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB0713; 2:teTXWDIJGE8kGUB8sNSZ2YHQ+bHgrEAFlt9C/h4HfGdcvYUo5FvT60pttMNi4AAk5t1qXP3f2eixArvSfaGJFYn1aM4TzVsnbDVwxCmlm8J4OHJAiscG7Cj1AmypEQcPnxBFU6iwpiPvw+V1aQS5cH2OAoqFy+9Wa+zuleRUBVyBsggcZqIQvDNYbhaV64Jj; 3:zXGh9xbTWm+XdJwhftLQOilNNux5sszQ37e1EkISQNr5etqcCXKlJv0XaqYoMuf+mzfDD0dPLIQaaBt1V4Vf8vVaT/8p/Nma76+AS+sZMJqKJAmJfIyP5LyOwDHAa/ZbqEqVBjUgOMa2oJWGGSk1r2mLo4NEJK7huGenjCjXuYODxYA5DFeYSV2GToner3jYthqf/KQmq6gsCAqOvbMq86NjuLlthzE9joZxCp71p2Q=; 25:jSHKxv3m8OANRnoNgjJDEpb0XIlZ4NvH1tA7PfgiS4avSqIiHC+oD6o0UU/JH1Q4chMf0Xg7hAyTeGPWZIepROoDaJz5ObKGYbh4bBFYMdClDRYVYi0e/dfNlplp8GHkjP7SWyKmgn4r2rHt19JlxsjHb8scGG846oMAvtqlWVDDFtgYkwRD23nJU1+DKYuIEp0/5uD0OIDWvrkkyGAWt6KjFE37PfK6Uwn27qBIwiTqnZk8wwDkWzr7UyQeZRDZWnl+S/zTsI0ktjB44RHgC3gsEFICh4dWgb8W5Hgi+H0NHg8H7W2g1EB3Su6vFHgrVPr3M+Sy6LsCiLrO2aZ6q9egpqhRm9roLo8iNyI2GW0= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0713; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13015025)(5005006)(13023025)(13018025)(13024025)(8121501046)(13017025)(3002001)(10201501046); SRVR:CY1PR0301MB0713; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR0301MB0713; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB0713; 4:dzCNCFhpUR65R/xcy8LeMeLXrTAP7l6wzRj3STjfjFp04tm3+u26Wh/BzArIoM1koKF0bXA7MEHla6vFrfTDc9SnAaMbhjCTCWSfSI0OUCA/UO/k97CPQpBDnPOcQnrrKsJN3soz69Rry12nRPGmaOrGKtYfy+HuRu16e2knn5vRFQJaZ0XcofrQ84JJxgcqG5f5iZrjfLjDW8sc2uulS2wHqHh3GUzkW44RzO+rfTi8PelL/T8da6OFXdL5r7UuPkD3mFS99JoS293HZLpRJnf6/Ltnbd7nYGIOLuNZxh7iyvzXzwM/IiehFuiorYNuNfd9TEkip1UlyS3dLIwQ00D/l736AUUhFsaSUORYgvuSfeY3pI/r67byU0UJEidzfwwMdfcTbWdUI3jrfvqijkaOiyCovnOIETQu5MEpkaekqQEdohTRcNp3V1Y8cuDaL+vu1EV/6WzcUACrAlQnAA== X-Forefront-PRVS: 08978A8F5C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB0713; 23:6AP6TYuOYIzKEnqT5OM381bfnyCMjp4kMI+HMJ3?= =?us-ascii?Q?WBlvZ3JSpaXQtGhUowh7e6Ra83FAC9+HHSpvjJ2NZt+n0aR+Xg9cuGhRBsTZ?= =?us-ascii?Q?IuyveaKBrQsmKcT8U4/jOSPe6SVHUUKMFAt1Q+vqsEVE+W61IMq2lQHHvmMC?= =?us-ascii?Q?qqvA16W/2TFJCdSaQFNfnF86A2is22Td4R2yndYk5plDX1O2Mkim3G0uWwJ3?= =?us-ascii?Q?x/k9jqeCGeFRziT9mnlwsjIFjzcZ5Fi3nUVoRUPC3OAG79KjUvUWGJrBV74v?= =?us-ascii?Q?wnEUT9LONufMl1qOzDz0Lt+IE34T+VynaxetWBkx+ljB6lqG73n4gRwE/RDu?= =?us-ascii?Q?Zpy/ogJzIkT220tz7cDLhJ07ac2v1aiKykAh6Q8lwa1klH2hJLTKp22s4Tq2?= =?us-ascii?Q?s4/uZcu0GjXZhqItlT+t0bQ58NADgcsUP8dQFpbLfVNn4zzwFc7/vQihUkF6?= =?us-ascii?Q?FPvopYae/TcAzSmQzmcbkYjFn+3J6jkgo3k2L/LIYtmjaKmFG9fbONgdzVSU?= =?us-ascii?Q?y5YYfqTO90tjdhwqhNfNDd7flp2hXIvZez89vKGpqjK5JjZz50xslYvSuyRb?= =?us-ascii?Q?7tJc8t9RTjb3Bl/3KzAI5LWumvSmCdmz2AqbmRxs/ISlDdUr9ATUl1oIP+61?= =?us-ascii?Q?mx59zkMoNkcfnIsvYqH0GcpVJxQpyh+A+pjoW3oqhjK+7Y4gSRhntKz7917R?= =?us-ascii?Q?gZFJMitddrbvhqc6hOd/wrstBcAd+VHTQJG8CtHkOBM6Uf8r/LHGJ8Ds18lI?= =?us-ascii?Q?5IoeC64Wu7eod/klab7k7mq6+s99B68iS2YrKI/4zUNeOJDwn3ykyEPGTRuA?= =?us-ascii?Q?z2fRJ4LKLx//YvLYsmLvR4yPhep3Pm7zfO5OAmY0fJdNbyfpfPg6yHDE8Vyy?= =?us-ascii?Q?eViQ++nB5vWFueP1rci9ef6tHTDvgbg9kKADmSHuCo64JXyDSI/4ZRxclehC?= =?us-ascii?Q?ZtWrcO1touNKobbAXzeqPxOQwerWNq5qo22cVrwnDynBByP2FBwwUMydmIaE?= =?us-ascii?Q?B0gsFPd/QPQ/PNpF5Ynmri327UeT03vHUBKG5ZX1FsZGxryIlWL80V5Gjj7A?= =?us-ascii?Q?BLDuA1lygz80w2sdKgSkxfRPyNx3V8Qi+e+ZPyG49DyscNE2brg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB0713; 5:tBNBI5W2TcMnnK7YB7qDpX6F8yNviCwgIDKUmYKXht8UIx0yucHjX+Goxi+ZdyqYmrzSUQ2LZHFkP1WDwSCx2l6KTwgFvtyLAeRl+2+ZdBQ8o6WwFfCvpLKPY/jPEhfEyGImCVcSsNUJjut9OBe/RfCbiFV9mVPhPe6IDQO9tuM=; 24:E8+PRgzWicx7mASlY55n8FI94XZVi0SMnqnW7Q/gVBNBuvmmHMwvD+iT1GkZmsLm6BscvTbdwHrLbjI4lJFXSQKFioiP31097AKnDfUE6Ao= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2016 09:00:09.7385 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB0713 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add tdm clock configuration in both qe clock system and ucc fast controller. Signed-off-by: Zhao Qiang --- drivers/soc/fsl/qe/ucc.c | 450 ++++++++++++++++++++++++++++++++++++++++++ drivers/soc/fsl/qe/ucc_fast.c | 36 ++++ include/soc/fsl/qe/qe.h | 16 ++ include/soc/fsl/qe/ucc.h | 4 + include/soc/fsl/qe/ucc_fast.h | 1 + 5 files changed, 507 insertions(+) diff --git a/drivers/soc/fsl/qe/ucc.c b/drivers/soc/fsl/qe/ucc.c index b59d335..5e1a850 100644 --- a/drivers/soc/fsl/qe/ucc.c +++ b/drivers/soc/fsl/qe/ucc.c @@ -25,6 +25,12 @@ #include #include +#define UCC_TDM_NUM 8 +#define RX_SYNC_SHIFT_BASE 30 +#define TX_SYNC_SHIFT_BASE 14 +#define RX_CLK_SHIFT_BASE 28 +#define TX_CLK_SHIFT_BASE 12 + int ucc_set_qe_mux_mii_mng(unsigned int ucc_num) { unsigned long flags; @@ -210,3 +216,447 @@ int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock, return 0; } + +static int ucc_get_tdm_common_clk(u32 tdm_num, enum qe_clock clock) +{ + int clock_bits = -EINVAL; + + /* + * for TDM[0, 1, 2, 3], TX and RX use common + * clock source BRG3,4 and CLK1,2 + * for TDM[4, 5, 6, 7], TX and RX use common + * clock source BRG12,13 and CLK23,24 + */ + switch (tdm_num) { + case 0: + case 1: + case 2: + case 3: + switch (clock) { + case QE_BRG3: + clock_bits = 1; + break; + case QE_BRG4: + clock_bits = 2; + break; + case QE_CLK1: + clock_bits = 4; + break; + case QE_CLK2: + clock_bits = 5; + break; + default: + break; + } + break; + case 4: + case 5: + case 6: + case 7: + switch (clock) { + case QE_BRG12: + clock_bits = 1; + break; + case QE_BRG13: + clock_bits = 2; + break; + case QE_CLK23: + clock_bits = 4; + break; + case QE_CLK24: + clock_bits = 5; + break; + default: + break; + } + break; + default: + break; + } + + return clock_bits; +} + +static int ucc_get_tdm_rx_clk(u32 tdm_num, enum qe_clock clock) +{ + int clock_bits = -EINVAL; + + switch (tdm_num) { + case 0: + switch (clock) { + case QE_CLK3: + clock_bits = 6; + break; + case QE_CLK8: + clock_bits = 7; + break; + default: + break; + } + break; + case 1: + switch (clock) { + case QE_CLK5: + clock_bits = 6; + break; + case QE_CLK10: + clock_bits = 7; + break; + default: + break; + } + break; + case 2: + switch (clock) { + case QE_CLK7: + clock_bits = 6; + break; + case QE_CLK12: + clock_bits = 7; + break; + default: + break; + } + break; + case 3: + switch (clock) { + case QE_CLK9: + clock_bits = 6; + break; + case QE_CLK14: + clock_bits = 7; + break; + default: + break; + } + break; + case 4: + switch (clock) { + case QE_CLK11: + clock_bits = 6; + break; + case QE_CLK16: + clock_bits = 7; + break; + default: + break; + } + break; + case 5: + switch (clock) { + case QE_CLK13: + clock_bits = 6; + break; + case QE_CLK18: + clock_bits = 7; + break; + default: + break; + } + break; + case 6: + switch (clock) { + case QE_CLK15: + clock_bits = 6; + break; + case QE_CLK20: + clock_bits = 7; + break; + default: + break; + } + break; + case 7: + switch (clock) { + case QE_CLK17: + clock_bits = 6; + break; + case QE_CLK22: + clock_bits = 7; + break; + default: + break; + } + break; + } + + return clock_bits; +} + +static int ucc_get_tdm_tx_clk(u32 tdm_num, enum qe_clock clock) +{ + int clock_bits = -EINVAL; + + switch (tdm_num) { + case 0: + switch (clock) { + case QE_CLK4: + clock_bits = 6; + break; + case QE_CLK9: + clock_bits = 7; + break; + default: + break; + } + break; + case 1: + switch (clock) { + case QE_CLK6: + clock_bits = 6; + break; + case QE_CLK11: + clock_bits = 7; + break; + default: + break; + } + break; + case 2: + switch (clock) { + case QE_CLK8: + clock_bits = 6; + break; + case QE_CLK13: + clock_bits = 7; + break; + default: + break; + } + break; + case 3: + switch (clock) { + case QE_CLK10: + clock_bits = 6; + break; + case QE_CLK15: + clock_bits = 7; + break; + default: + break; + } + break; + case 4: + switch (clock) { + case QE_CLK12: + clock_bits = 6; + break; + case QE_CLK17: + clock_bits = 7; + break; + default: + break; + } + break; + case 5: + switch (clock) { + case QE_CLK14: + clock_bits = 6; + break; + case QE_CLK19: + clock_bits = 7; + break; + default: + break; + } + break; + case 6: + switch (clock) { + case QE_CLK16: + clock_bits = 6; + break; + case QE_CLK21: + clock_bits = 7; + break; + default: + break; + } + break; + case 7: + switch (clock) { + case QE_CLK18: + clock_bits = 6; + break; + case QE_CLK3: + clock_bits = 7; + break; + default: + break; + } + break; + } + + return clock_bits; +} + +/* tdm_num: TDM A-H port num is 0-7 */ +static int ucc_get_tdm_rxtx_clk(enum comm_dir mode, u32 tdm_num, + enum qe_clock clock) +{ + int clock_bits; + + clock_bits = ucc_get_tdm_common_clk(tdm_num, clock); + if (clock_bits > 0) + return clock_bits; + if (mode == COMM_DIR_RX) + clock_bits = ucc_get_tdm_rx_clk(tdm_num, clock); + if (mode == COMM_DIR_TX) + clock_bits = ucc_get_tdm_tx_clk(tdm_num, clock); + return clock_bits; +} + +static u32 ucc_get_tdm_clk_shift(enum comm_dir mode, u32 tdm_num) +{ + u32 shift; + + shift = (mode == COMM_DIR_RX) ? RX_CLK_SHIFT_BASE : TX_CLK_SHIFT_BASE; + if (tdm_num < 4) + shift -= tdm_num * 4; + else + shift -= (tdm_num - 4) * 4; + + return shift; +} + +int ucc_set_tdm_rxtx_clk(u32 tdm_num, enum qe_clock clock, + enum comm_dir mode) +{ + int clock_bits; + u32 shift; + struct qe_mux __iomem *qe_mux_reg; + __be32 __iomem *cmxs1cr; + + qe_mux_reg = &qe_immr->qmx; + + if (tdm_num > 7 || tdm_num < 0) + return -EINVAL; + + /* The communications direction must be RX or TX */ + if (mode != COMM_DIR_RX && mode != COMM_DIR_TX) + return -EINVAL; + + clock_bits = ucc_get_tdm_rxtx_clk(mode, tdm_num, clock); + if (clock_bits < 0) + return -EINVAL; + + shift = ucc_get_tdm_clk_shift(mode, tdm_num); + + cmxs1cr = (tdm_num < 4) ? &qe_mux_reg->cmxsi1cr_l : + &qe_mux_reg->cmxsi1cr_h; + + qe_clrsetbits32(cmxs1cr, QE_CMXUCR_TX_CLK_SRC_MASK << shift, + clock_bits << shift); + + return 0; +} + +static int ucc_get_tdm_sync_source(u32 tdm_num, enum qe_clock clock, + enum comm_dir mode) +{ + int source = -EINVAL; + + if (mode == COMM_DIR_RX && clock == QE_RSYNC_PIN) { + source = 0; + return source; + } + if (mode == COMM_DIR_TX && clock == QE_TSYNC_PIN) { + source = 0; + return source; + } + + switch (tdm_num) { + case 0: + case 1: + switch (clock) { + case QE_BRG9: + source = 1; + break; + case QE_BRG10: + source = 2; + break; + default: + break; + } + break; + case 2: + case 3: + switch (clock) { + case QE_BRG9: + source = 1; + break; + case QE_BRG11: + source = 2; + break; + default: + break; + } + break; + case 4: + case 5: + switch (clock) { + case QE_BRG13: + source = 1; + break; + case QE_BRG14: + source = 2; + break; + default: + break; + } + break; + case 6: + case 7: + switch (clock) { + case QE_BRG13: + source = 1; + break; + case QE_BRG15: + source = 2; + break; + default: + break; + } + break; + } + + return source; +} + +static u32 ucc_get_tdm_sync_shift(enum comm_dir mode, u32 tdm_num) +{ + u32 shift; + + shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : RX_SYNC_SHIFT_BASE; + shift -= tdm_num * 2; + + return shift; +} + +int ucc_set_tdm_rxtx_sync(u32 tdm_num, enum qe_clock clock, + enum comm_dir mode) +{ + int source; + u32 shift; + struct qe_mux *qe_mux_reg; + + qe_mux_reg = &qe_immr->qmx; + + if (tdm_num >= UCC_TDM_NUM) + return -EINVAL; + + /* The communications direction must be RX or TX */ + if (mode != COMM_DIR_RX && mode != COMM_DIR_TX) + return -EINVAL; + + source = ucc_get_tdm_sync_source(tdm_num, clock, mode); + if (source < 0) + return -EINVAL; + + shift = ucc_get_tdm_sync_shift(mode, tdm_num); + + qe_clrsetbits32(&qe_mux_reg->cmxsi1syr, + QE_CMXUCR_TX_CLK_SRC_MASK << shift, + source << shift); + + return 0; +} diff --git a/drivers/soc/fsl/qe/ucc_fast.c b/drivers/soc/fsl/qe/ucc_fast.c index a768931..83d8d16 100644 --- a/drivers/soc/fsl/qe/ucc_fast.c +++ b/drivers/soc/fsl/qe/ucc_fast.c @@ -327,6 +327,42 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc ucc_fast_free(uccf); return -EINVAL; } + } else { + /* tdm Rx clock routing */ + if ((uf_info->rx_clock != QE_CLK_NONE) && + ucc_set_tdm_rxtx_clk(uf_info->tdm_num, uf_info->rx_clock, + COMM_DIR_RX)) { + pr_err("%s: illegal value for RX clock", __func__); + ucc_fast_free(uccf); + return -EINVAL; + } + + /* tdm Tx clock routing */ + if ((uf_info->tx_clock != QE_CLK_NONE) && + ucc_set_tdm_rxtx_clk(uf_info->tdm_num, uf_info->tx_clock, + COMM_DIR_TX)) { + pr_err("%s: illegal value for TX clock", __func__); + ucc_fast_free(uccf); + return -EINVAL; + } + + /* tdm Rx sync clock routing */ + if ((uf_info->rx_sync != QE_CLK_NONE) && + ucc_set_tdm_rxtx_sync(uf_info->tdm_num, uf_info->rx_sync, + COMM_DIR_RX)) { + pr_err("%s: illegal value for RX clock", __func__); + ucc_fast_free(uccf); + return -EINVAL; + } + + /* tdm Tx sync clock routing */ + if ((uf_info->tx_sync != QE_CLK_NONE) && + ucc_set_tdm_rxtx_sync(uf_info->tdm_num, uf_info->tx_sync, + COMM_DIR_TX)) { + pr_err("%s: illegal value for TX clock", __func__); + ucc_fast_free(uccf); + return -EINVAL; + } } /* Set interrupt mask register at UCC level. */ diff --git a/include/soc/fsl/qe/qe.h b/include/soc/fsl/qe/qe.h index f918745..c3b1dc8 100644 --- a/include/soc/fsl/qe/qe.h +++ b/include/soc/fsl/qe/qe.h @@ -244,6 +244,22 @@ static inline int qe_alive_during_sleep(void) #define qe_muram_addr cpm_muram_addr #define qe_muram_offset cpm_muram_offset +#define qe_setbits32(_addr, _v) iowrite32be(ioread32be(_addr) | (_v), (_addr)) +#define qe_clrbits32(_addr, _v) iowrite32be(ioread32be(_addr) & ~(_v), (_addr)) + +#define qe_setbits16(_addr, _v) iowrite16be(ioread16be(_addr) | (_v), (_addr)) +#define qe_clrbits16(_addr, _v) iowrite16be(ioread16be(_addr) & ~(_v), (_addr)) + +#define qe_setbits8(_addr, _v) iowrite8(ioread8(_addr) | (_v), (_addr)) +#define qe_clrbits8(_addr, _v) iowrite8(ioread8(_addr) & ~(_v), (_addr)) + +#define qe_clrsetbits32(addr, clear, set) \ + iowrite32be((ioread32be(addr) & ~(clear)) | (set), (addr)) +#define qe_clrsetbits16(addr, clear, set) \ + iowrite16be((ioread16be(addr) & ~(clear)) | (set), (addr)) +#define qe_clrsetbits8(addr, clear, set) \ + iowrite8((ioread8(addr) & ~(clear)) | (set), (addr)) + /* Structure that defines QE firmware binary files. * * See Documentation/powerpc/qe_firmware.txt for a description of these diff --git a/include/soc/fsl/qe/ucc.h b/include/soc/fsl/qe/ucc.h index 894f14c..6bbbb59 100644 --- a/include/soc/fsl/qe/ucc.h +++ b/include/soc/fsl/qe/ucc.h @@ -41,6 +41,10 @@ int ucc_set_qe_mux_mii_mng(unsigned int ucc_num); int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock, enum comm_dir mode); +int ucc_set_tdm_rxtx_clk(unsigned int tdm_num, enum qe_clock clock, + enum comm_dir mode); +int ucc_set_tdm_rxtx_sync(unsigned int tdm_num, enum qe_clock clock, + enum comm_dir mode); int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask); diff --git a/include/soc/fsl/qe/ucc_fast.h b/include/soc/fsl/qe/ucc_fast.h index 31548b7..b2633b7 100644 --- a/include/soc/fsl/qe/ucc_fast.h +++ b/include/soc/fsl/qe/ucc_fast.h @@ -118,6 +118,7 @@ enum ucc_fast_transparent_tcrc { /* Fast UCC initialization structure */ struct ucc_fast_info { int ucc_num; + int tdm_num; enum qe_clock rx_clock; enum qe_clock tx_clock; enum qe_clock rx_sync;