From patchwork Thu Jun 2 01:45:00 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Zhao X-Patchwork-Id: 628932 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 3rKr222mxZz9t7r for ; Thu, 2 Jun 2016 11:56:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752436AbcFBB42 (ORCPT ); Wed, 1 Jun 2016 21:56:28 -0400 Received: from mail-bn1bon0070.outbound.protection.outlook.com ([157.56.111.70]:25312 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752347AbcFBB4Z (ORCPT ); Wed, 1 Jun 2016 21:56:25 -0400 Received: from BN3PR0301CA0001.namprd03.prod.outlook.com (10.160.180.139) by BY2PR03MB379.namprd03.prod.outlook.com (10.242.237.21) with Microsoft SMTP Server (TLS) id 15.1.492.11; Thu, 2 Jun 2016 01:56:22 +0000 Received: from BY2FFO11FD047.protection.gbl (2a01:111:f400:7c0c::102) by BN3PR0301CA0001.outlook.office365.com (2a01:111:e400:4000::11) with Microsoft SMTP Server (TLS) id 15.1.501.7 via Frontend Transport; Thu, 2 Jun 2016 01:56:22 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) 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.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BY2FFO11FD047.mail.protection.outlook.com (10.1.15.175) with Microsoft SMTP Server (TLS) id 15.1.497.8 via Frontend Transport; Thu, 2 Jun 2016 01:56:21 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u521tBXc021155; Wed, 1 Jun 2016 18:56:19 -0700 From: Zhao Qiang To: CC: , , , , Zhao Qiang Subject: [PATCH v2 4/5] fsl/qe: Add QE TDM lib Date: Thu, 2 Jun 2016 09:45:00 +0800 Message-ID: <1464831901-15913-4-git-send-email-qiang.zhao@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1464831901-15913-1-git-send-email-qiang.zhao@nxp.com> References: <1464831901-15913-1-git-send-email-qiang.zhao@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131093061816834740; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(50944005)(189002)(199003)(9170700003)(77096005)(2906002)(106466001)(4326007)(189998001)(86362001)(575784001)(11100500001)(2950100001)(229853001)(2351001)(8666004)(8936002)(48376002)(81166006)(19580405001)(19580395003)(36756003)(104016004)(92566002)(47776003)(87936001)(50986999)(5003940100001)(6806005)(110136002)(50226002)(50466002)(5008740100001)(76176999)(105606002)(33646002)(586003)(8676002)(85426001)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR03MB379; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD047; 1:BWN58xsGJP89QD2wiR358hCm5xwu8DFf6kz+wVZdKtfF8A3MohDDAyiAi7m+2f9m+eqH5qE1hh5yBmy+6zX7YD3Hm0TiNHDOexwQooF1HiXL08yVCZMplT3135alIyMKtJIjyhggHX2GZkFvSuxrw2xHQ3yx+EIu+myiheRDoloLnpG9OA01lcZAo0/93UFm5XItUK5uwah3x8xRQQzDwDuUGfLhdHV/g9BQyE9qtWSoHL7gxtqHVqG18kJZOWUP+TpL6/dUoLULW0mQpSlvhKrztvK766d/498p7erCrREqfOiG/GDZjiGdxOcNxHYvqUD3elNc5MLZlQzB7jKSEF74sisKXlpKDgngbAjqYVQVq/ALue7v71LrdJ7iw+OLG4MZ0IGgAquF4dMJ/q2EPDp/m1cgpXGVnmZ8XrO5vOhppm6cP4ZDFkBwQLA9TDOQabR5NZKbzUeNRUhQYwJH6yIG0M5UDQwnqTlvYt34FAgPO+TwszJe5A19VRVzxtTgcwhL2J+3NABGXRiJbyTIhmz+lqtPRfP2FPR6ABLWL2g72/U+xYJpd5DjTGyLhGIZT/FpNXckxffI1sCvOZLjFCippnFIt9wu9QfmUiqi6PsLj6pwxWaJNLk0Idf+M975R/7JJRrW/HB8GKuWW5eEQbqE04zUPO9lyxfOzdsBk3LaUZ1WcyL+wdKiLdi3JXdS MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 26671ee2-3c20-4d46-f955-08d38a891890 X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB379; 2:HZl9twzYLDpQqsnuo2E6KyybXKeG3c44nbRYdeBBPt7oMZW7VSRCHWI6gfz2nbJQRGcgVHDXhhi5bQGho5qNY8Pjdt1v2ElEcbMoIRqfyoVyOfm4z1YQOoOjvD7MRTitSkB2vsE7tu8guLSRUBM2Kf4zHZVCZBHI4gjLAfMLg9KyHNZkLWlsAFv+kQ4Ug9vN; 3:JhcV6XB+2AI7EGIGDYU/88G6GKPKLmdNeOH5cftwZmuDNYoHt+1v6HM1tLXH+Sjx4s08+fjExUQtzgA95HAbcXQTJ+euhqnubcdX+prtd0qgGIILhUEI3wam7pINbnAtrzO+RTmzvuyYVYuJUQ7g9C379DB29lq0yIogdJg8D11G/WhluxnPmSbSKtydyJ0gKKBezv1N1CKvvTz+/VrAAEBLk97CBeauuQyv++CQYCU=; 25:H3t1aT8dOGZaI7mSHCzQQ+3BZPNrvLrXweZP1WXwNazpwYSP6SPP1J40isE8GfQeYZG3vJVvkK1P44P1bjIisc/jg6eU0ncQHq9TAWagiO/pNTvzMvlaRW9wLBdvFP6YJg55Qd0h3h8ykldCjAGd0/kUMMftYggCXyyIk1pij/ZcL3AKmS80UAJ1GXITana+aPQCW9oxph0XjPgrileZaW4JKJ46yIBw8gf1iHi54/26xoh8I03/s+eygKiP9vsPdNRtJRwQwbgLJwMy85nPdMcm2AA1FWaOqBHiWetSyeV8pLxUuttLWUEup53wj/5mj/5EM3lG1DNSi1x3jkzFHYF85vSi/4RLMSsUDjuuWdoQkxlfiAv/k0SsKoBhc9T4yNjml59Z1hyosKPCVpWJgfr9sT31CZsZTKaWcQiC9bQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB379; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(13024025)(13023025)(13017025)(13018025)(5005006)(13015025)(10201501046)(3002001)(6055026); SRVR:BY2PR03MB379; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR03MB379; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB379; 4:pQhpXX6dM4Ou/z4s0O3Cf3/RcuKkXfZlx3vQaQnMuBQB1qiTVDe6Uxu7/L1y0KwOLflf0zw+krrimruJzu8ihH9/OCuth+adp3CdBYKZiMw+CIAMUl8sPnlwVGIGpVuTL5lmcY3vfNm09GARDXZvTj8Rg6B1DBSM9kh8MSsoE0IqRBNzsdIqZpertAIXpGA806bf4qZTXQBG50/INO8e2rnhd9ohNR4d2ft8az6xpbSJsN6gDhOYqbtlf+DSgVUHvymRXNEXja0fGyHmFwpmw1TInh+rZAi4/fr47p830+wzfO88oKDJeAXNRaVYSl5DTgcKvpFAEGKL35Jt1apT7aa3coPNbxW7FFRI20xLixbGCPjaARQonk6ryNg3Nmy1dUypKtVR/Zc6QZTOOK4avawsIZhASLI69ADFiRkrshoi/qJlyzhEv92rTNj9a7YsHy7c6AFDlw4nA5J957ys4QC2ApVQYMAYOum98tLoM4YXUAlh1AdsNa293GbWn9xk8WoNsTmEJaOaQr9WeKXf1A== X-Forefront-PRVS: 0961DF5286 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR03MB379; 23:+qkH7TXhSnj2j55DDKvL/Gni3/RqsiRc5y7jsqfX8A?= =?us-ascii?Q?t5xAUJ4lTbFwE8pfOYWHjxij/8WwjzOfxhnvDPRuJAurGZLBy5QcmYOmecF2?= =?us-ascii?Q?Hdoq2zHXIB0kzAKnLuDdVn+c1x22Od4Ipl3b9voC8+jLFo7ZJketMfuy6i9U?= =?us-ascii?Q?besLqgyZa43QGO7JcJB6gBTepDV6YMHcwupEbE6a+SK6YYyUGXsP40wvaiHH?= =?us-ascii?Q?Z04HV5foMWDlXn7nn1+PKgzDnQfSH1+HhsremmPf4fW6d0ot4zJNtKTn7nY9?= =?us-ascii?Q?M23VlEl6tUwsVisQKqqqZ6/1Dvx9KqA5pVFQuLZ4Mp1LHgfa+fc9bwjpQoh4?= =?us-ascii?Q?8Dmj0HH4WdOQOiuKYI1p+q5UcJT08ynjU75W029selEY7KtVk6BaMJSMC3Sf?= =?us-ascii?Q?Mrpbi8zVnDtF+dAh3MBKmjHDja5ct35f2Q51ksVxvi7CNa5kdE2OF23hbmGy?= =?us-ascii?Q?BF+M4GAYPot3ED5HxYYdKpN+dpBbhhChwjEBDB9vQoNAmtydFQ2wnQfwAojg?= =?us-ascii?Q?8yrvkjGnuvFJgBokO5Acspz0pqF6XvGczoQXP6LxHsuOQ3xaET9uaZAFbOj5?= =?us-ascii?Q?HkoXpAfBQJcGREnFrI+XiroZlzvoqj54z+Uri4WLE+B4yG7Iy34tOOp++X1r?= =?us-ascii?Q?Vwzc1QLdgZLLd7C6+YqEJH6yJeq0MQAnAE1GUTS9bAYthvknk5ByN/eIMDV6?= =?us-ascii?Q?gzRpGk8oSQJ7h+LHokOjKaZGks+GQuXjBiBfVsSnKr/1OpN5jlEtp2tcsB1D?= =?us-ascii?Q?EJYZhosTAR2yDstxLZ8tE3D1Em1ej0/4YIIYWY7F0hlR6uvxjLYMnhOXNk5I?= =?us-ascii?Q?gqnmAqXAWLKo4/LljPTlO9s/cOPM0/Nbc2f1S9wpeyHNUPERCNZe4j1NzMhd?= =?us-ascii?Q?TbHTEDsklqOjB61NYYQfDyOmIgAzK89R8GVo3jdZwemW2LCjhtqrS9HM5e6/?= =?us-ascii?Q?faA1ox9OYDsTDuiugu5vb9ZNR8O5XTVJS7XLguoTu+MayINNxwxTDoc/F/0t?= =?us-ascii?Q?y+tcQ/SoYMtPzj8O0JA5bj8sV8yPqg7KD4VnlBETaysYlfgdWfVP7NlJd9iT?= =?us-ascii?Q?mUNBHJK9+4Nev1iq7449w2KTtkzdQyR48KMpLe+cRYFo1X8ZpRoMISWMB8c1?= =?us-ascii?Q?Shg+7s2uHNGSZhpxOFcpIZrOW6JgQ1?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB379; 5:uj3hKJyp4uS9v507VfEBYV2WX0gA+J6ihqKNklBKFY6iifl7CjlL+mGkD7RVs82rtziS52ElzMPcVw9p70PyySC1xikTIbp2HYY7VI5DcK3CDn1vg160Lb0Qhi16Y30F00haEjTcncUC15Bp5ohMXDP0IhDZRPp0FAVqrMgmwrU=; 24:3vvR+yMDwAvrRCEnwBsFYINK8xqAymClvUgOLB/afsDuiED/FARHbH9TSphGR2QLl/UfTlLJ+pOue+w+IUYjyqU3l3gIpFyS6Ok4N/Z8klw=; 7:jj9kAL8XQyRiN/ps+ZPcZhFoSd+7+kZDwvG0kdMPy2v16KGYM4onZgjE4XOD/86VJG4YfDpxrihRo5PdKjejq6gJpjK+HfJx0eJ941JVUlEt6BLjWSqdqC8g0fxkKRVeYWCTlWtLen+sNQ3FUIcxu1ZqSnvisSNis8NkBd5qZDbKvT9nFXC6nXKqN46Ujaeu SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2016 01:56:21.5586 (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.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB379 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org QE has module to support TDM, some other protocols supported by QE are based on TDM. add a qe-tdm lib, this lib provides functions to the protocols using TDM to configurate QE-TDM. Signed-off-by: Zhao Qiang --- Changes for v2: - delete dead code - use strcmp instead of strcasecmp - use of_find_compatible_node instead of of_find_by_name - use devm_ioremap_resource - rename init_si to ucc_tdm_init - rename of_parse_tdm to ucc_of_parse_tdm - return err when there is not t1 or e1 drivers/soc/fsl/qe/Kconfig | 6 +- drivers/soc/fsl/qe/Makefile | 1 + drivers/soc/fsl/qe/qe_tdm.c | 276 ++++++++++++++++++++++++++++++++++++++++++ include/soc/fsl/qe/immap_qe.h | 5 +- include/soc/fsl/qe/qe_tdm.h | 94 ++++++++++++++ 5 files changed, 377 insertions(+), 5 deletions(-) create mode 100644 drivers/soc/fsl/qe/qe_tdm.c create mode 100644 include/soc/fsl/qe/qe_tdm.h diff --git a/drivers/soc/fsl/qe/Kconfig b/drivers/soc/fsl/qe/Kconfig index 20978f2..73a2e08 100644 --- a/drivers/soc/fsl/qe/Kconfig +++ b/drivers/soc/fsl/qe/Kconfig @@ -22,7 +22,7 @@ config UCC_SLOW config UCC_FAST bool - default y if UCC_GETH + default y if UCC_GETH || QE_TDM help This option provides qe_lib support to UCC fast protocols: HDLC, Ethernet, ATM, transparent @@ -31,6 +31,10 @@ config UCC bool default y if UCC_FAST || UCC_SLOW +config QE_TDM + bool + default y if FSL_UCC_HDLC + config QE_USB bool default y if USB_FSL_QE diff --git a/drivers/soc/fsl/qe/Makefile b/drivers/soc/fsl/qe/Makefile index ffac541..2031d38 100644 --- a/drivers/soc/fsl/qe/Makefile +++ b/drivers/soc/fsl/qe/Makefile @@ -6,5 +6,6 @@ obj-$(CONFIG_CPM) += qe_common.o obj-$(CONFIG_UCC) += ucc.o obj-$(CONFIG_UCC_SLOW) += ucc_slow.o obj-$(CONFIG_UCC_FAST) += ucc_fast.o +obj-$(CONFIG_QE_TDM) += qe_tdm.o obj-$(CONFIG_QE_USB) += usb.o obj-$(CONFIG_QE_GPIO) += gpio.o diff --git a/drivers/soc/fsl/qe/qe_tdm.c b/drivers/soc/fsl/qe/qe_tdm.c new file mode 100644 index 0000000..5e48b14 --- /dev/null +++ b/drivers/soc/fsl/qe/qe_tdm.c @@ -0,0 +1,276 @@ +/* + * Copyright (C) 2015 Freescale Semiconductor, Inc. All rights reserved. + * + * Authors: Zhao Qiang + * + * Description: + * QE TDM API Set - TDM specific routines implementations. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ +#include +#include +#include +#include +#include +#include + +static int set_tdm_framer(const char *tdm_framer_type) +{ + if (strcmp(tdm_framer_type, "e1") == 0) + return TDM_FRAMER_E1; + else if (strcmp(tdm_framer_type, "t1") == 0) + return TDM_FRAMER_T1; + else + return -EINVAL; +} + +static void set_si_param(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) +{ + struct si_mode_info *si_info = &ut_info->si_info; + + if (utdm->tdm_mode == TDM_INTERNAL_LOOPBACK) { + si_info->simr_crt = 1; + si_info->simr_rfsd = 0; + } +} + +int ucc_of_parse_tdm(struct device_node *np, struct ucc_tdm *utdm, + struct ucc_tdm_info *ut_info) +{ + const char *sprop; + int ret = 0; + u32 val; + struct resource *res; + struct device_node *np2; + static int siram_init_flag; + struct platform_device *pdev; + + sprop = of_get_property(np, "fsl,rx-sync-clock", NULL); + if (sprop) { + ut_info->uf_info.rx_sync = qe_clock_source(sprop); + if ((ut_info->uf_info.rx_sync < QE_CLK_NONE) || + (ut_info->uf_info.rx_sync > QE_RSYNC_PIN)) { + pr_err("QE-TDM: Invalid rx-sync-clock property\n"); + return -EINVAL; + } + } else { + pr_err("QE-TDM: Invalid rx-sync-clock property\n"); + return -EINVAL; + } + + sprop = of_get_property(np, "fsl,tx-sync-clock", NULL); + if (sprop) { + ut_info->uf_info.tx_sync = qe_clock_source(sprop); + if ((ut_info->uf_info.tx_sync < QE_CLK_NONE) || + (ut_info->uf_info.tx_sync > QE_TSYNC_PIN)) { + pr_err("QE-TDM: Invalid tx-sync-clock property\n"); + return -EINVAL; + } + } else { + pr_err("QE-TDM: Invalid tx-sync-clock property\n"); + return -EINVAL; + } + + ret = of_property_read_u32_index(np, "fsl,tx-timeslot-mask", 0, &val); + if (ret) { + pr_err("QE-TDM: Invalid tx-timeslot-mask property\n"); + return -EINVAL; + } + utdm->tx_ts_mask = val; + + ret = of_property_read_u32_index(np, "fsl,rx-timeslot-mask", 0, &val); + if (ret) { + ret = -EINVAL; + pr_err("QE-TDM: Invalid rx-timeslot-mask property\n"); + return ret; + } + utdm->rx_ts_mask = val; + + ret = of_property_read_u32_index(np, "fsl,tdm-id", 0, &val); + if (ret) { + ret = -EINVAL; + pr_err("QE-TDM: No fsl,tdm-id property for this UCC\n"); + return ret; + } + utdm->tdm_port = val; + ut_info->uf_info.tdm_num = utdm->tdm_port; + + if (of_get_property(np, "fsl,tdm-internal-loopback", NULL)) + utdm->tdm_mode = TDM_INTERNAL_LOOPBACK; + else + utdm->tdm_mode = TDM_NORMAL; + + sprop = of_get_property(np, "fsl,tdm-framer-type", NULL); + if (!sprop) { + ret = -EINVAL; + pr_err("QE-TDM: No tdm-framer-type property for UCC\n"); + return ret; + } + ret = set_tdm_framer(sprop); + if (ret < 0) + return -EINVAL; + utdm->tdm_framer_type = ret; + + ret = of_property_read_u32_index(np, "fsl,siram-entry-id", 0, &val); + if (ret) { + ret = -EINVAL; + pr_err("QE-TDM: No siram entry id for UCC\n"); + return ret; + } + utdm->siram_entry_id = val; + + set_si_param(utdm, ut_info); + + np2 = of_find_compatible_node(NULL, NULL, "fsl,t1040-qe-si"); + if (!np2) + return -EINVAL; + + pdev = of_find_device_by_node(np2); + if (!pdev) { + pr_err("%s: failed to lookup pdev\n", np2->name); + of_node_put(np2); + return -EINVAL; + } + + of_node_put(np2); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + utdm->si_regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(utdm->si_regs)) { + ret = PTR_ERR(utdm->si_regs); + goto err_miss_siram_property; + } + + np2 = of_find_compatible_node(NULL, NULL, "fsl,t1040-qe-siram"); + if (!np2) { + ret = -EINVAL; + goto err_miss_siram_property; + } + + pdev = of_find_device_by_node(np2); + if (!pdev) { + ret = -EINVAL; + pr_err("%s: failed to lookup pdev\n", np2->name); + of_node_put(np2); + goto err_miss_siram_property; + } + + of_node_put(np2); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + utdm->siram = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(utdm->siram)) { + ret = PTR_ERR(utdm->siram); + goto err_miss_siram_property; + } + + if (siram_init_flag == 0) { + memset_io(utdm->siram, 0, res->end - res->start + 1); + siram_init_flag = 1; + } + + return ret; + +err_miss_siram_property: + devm_iounmap(&pdev->dev, utdm->si_regs); + return ret; +} + +void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info) +{ + struct si1 __iomem *si_regs; + u16 __iomem *siram; + u16 siram_entry_valid; + u16 siram_entry_closed; + u16 ucc_num; + u8 csel; + u16 sixmr; + u16 tdm_port; + u32 siram_entry_id; + u32 mask; + int i; + + si_regs = utdm->si_regs; + siram = utdm->siram; + ucc_num = ut_info->uf_info.ucc_num; + tdm_port = utdm->tdm_port; + siram_entry_id = utdm->siram_entry_id; + + if (utdm->tdm_framer_type == TDM_FRAMER_T1) + utdm->num_of_ts = 24; + if (utdm->tdm_framer_type == TDM_FRAMER_E1) + utdm->num_of_ts = 32; + + /* set siram table */ + csel = (ucc_num < 4) ? ucc_num + 9 : ucc_num - 3; + + siram_entry_valid = SIR_CSEL(csel) | SIR_BYTE | SIR_CNT(0); + siram_entry_closed = SIR_IDLE | SIR_BYTE | SIR_CNT(0); + + for (i = 0; i < utdm->num_of_ts; i++) { + mask = 0x01 << i; + + if (utdm->tx_ts_mask & mask) + iowrite16be(siram_entry_valid, + &siram[siram_entry_id * 32 + i]); + else + iowrite16be(siram_entry_closed, + &siram[siram_entry_id * 32 + i]); + + if (utdm->rx_ts_mask & mask) + iowrite16be(siram_entry_valid, + &siram[siram_entry_id * 32 + 0x200 + i]); + else + iowrite16be(siram_entry_closed, + &siram[siram_entry_id * 32 + 0x200 + i]); + } + + setbits16(&siram[(siram_entry_id * 32) + (utdm->num_of_ts - 1)], + SIR_LAST); + setbits16(&siram[(siram_entry_id * 32) + 0x200 + (utdm->num_of_ts - 1)], + SIR_LAST); + + /* Set SIxMR register */ + sixmr = SIMR_SAD(siram_entry_id); + + sixmr &= ~SIMR_SDM_MASK; + + if (utdm->tdm_mode == TDM_INTERNAL_LOOPBACK) + sixmr |= SIMR_SDM_INTERNAL_LOOPBACK; + else + sixmr |= SIMR_SDM_NORMAL; + + sixmr |= SIMR_RFSD(ut_info->si_info.simr_rfsd) | + SIMR_TFSD(ut_info->si_info.simr_tfsd); + + if (ut_info->si_info.simr_crt) + sixmr |= SIMR_CRT; + if (ut_info->si_info.simr_sl) + sixmr |= SIMR_SL; + if (ut_info->si_info.simr_ce) + sixmr |= SIMR_CE; + if (ut_info->si_info.simr_fe) + sixmr |= SIMR_FE; + if (ut_info->si_info.simr_gm) + sixmr |= SIMR_GM; + + switch (tdm_port) { + case 0: + iowrite16be(sixmr, &si_regs->sixmr1[0]); + break; + case 1: + iowrite16be(sixmr, &si_regs->sixmr1[1]); + break; + case 2: + iowrite16be(sixmr, &si_regs->sixmr1[2]); + break; + case 3: + iowrite16be(sixmr, &si_regs->sixmr1[3]); + break; + default: + pr_err("QE-TDM: can not find tdm sixmr reg\n"); + break; + } +} diff --git a/include/soc/fsl/qe/immap_qe.h b/include/soc/fsl/qe/immap_qe.h index bedbff8..c76ef30 100644 --- a/include/soc/fsl/qe/immap_qe.h +++ b/include/soc/fsl/qe/immap_qe.h @@ -159,10 +159,7 @@ struct spi { /* SI */ struct si1 { - __be16 siamr1; /* SI1 TDMA mode register */ - __be16 sibmr1; /* SI1 TDMB mode register */ - __be16 sicmr1; /* SI1 TDMC mode register */ - __be16 sidmr1; /* SI1 TDMD mode register */ + __be16 sixmr1[4]; /* SI1 TDMx (x = A B C D) mode register */ u8 siglmr1_h; /* SI1 global mode register high */ u8 res0[0x1]; u8 sicmdr1_h; /* SI1 command register high */ diff --git a/include/soc/fsl/qe/qe_tdm.h b/include/soc/fsl/qe/qe_tdm.h new file mode 100644 index 0000000..4c91498 --- /dev/null +++ b/include/soc/fsl/qe/qe_tdm.h @@ -0,0 +1,94 @@ +/* + * Internal header file for QE TDM mode routines. + * + * Copyright (C) 2016 Freescale Semiconductor, Inc. All rights reserved. + * + * Authors: Zhao Qiang + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version + */ + +#ifndef CONFIG_QE_TDM_H +#define CONFIG_QE_TDM_H + +#include +#include + +#include +#include + +#include +#include + +/* SI RAM entries */ +#define SIR_LAST 0x0001 +#define SIR_BYTE 0x0002 +#define SIR_CNT(x) ((x) << 2) +#define SIR_CSEL(x) ((x) << 5) +#define SIR_SGS 0x0200 +#define SIR_SWTR 0x4000 +#define SIR_MCC 0x8000 +#define SIR_IDLE 0 + +/* SIxMR fields */ +#define SIMR_SAD(x) ((x) << 12) +#define SIMR_SDM_NORMAL 0x0000 +#define SIMR_SDM_INTERNAL_LOOPBACK 0x0800 +#define SIMR_SDM_MASK 0x0c00 +#define SIMR_CRT 0x0040 +#define SIMR_SL 0x0020 +#define SIMR_CE 0x0010 +#define SIMR_FE 0x0008 +#define SIMR_GM 0x0004 +#define SIMR_TFSD(n) (n) +#define SIMR_RFSD(n) ((n) << 8) + +enum tdm_ts_t { + TDM_TX_TS, + TDM_RX_TS +}; + +enum tdm_framer_t { + TDM_FRAMER_T1, + TDM_FRAMER_E1 +}; + +enum tdm_mode_t { + TDM_INTERNAL_LOOPBACK, + TDM_NORMAL +}; + +struct si_mode_info { + u8 simr_rfsd; + u8 simr_tfsd; + u8 simr_crt; + u8 simr_sl; + u8 simr_ce; + u8 simr_fe; + u8 simr_gm; +}; + +struct ucc_tdm_info { + struct ucc_fast_info uf_info; + struct si_mode_info si_info; +}; + +struct ucc_tdm { + u16 tdm_port; /* port for this tdm:TDMA,TDMB */ + u32 siram_entry_id; + u16 __iomem *siram; + struct si1 __iomem *si_regs; + enum tdm_framer_t tdm_framer_type; + enum tdm_mode_t tdm_mode; + u8 num_of_ts; /* the number of timeslots in this tdm frame */ + u32 tx_ts_mask; /* tx time slot mask */ + u32 rx_ts_mask; /* rx time slot mask */ +}; + +int ucc_of_parse_tdm(struct device_node *np, struct ucc_tdm *utdm, + struct ucc_tdm_info *ut_info); +void ucc_tdm_init(struct ucc_tdm *utdm, struct ucc_tdm_info *ut_info); +#endif