From patchwork Mon Jun 27 01:30:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Zhao X-Patchwork-Id: 640771 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 3rdBVg4zWPz9t19 for ; Mon, 27 Jun 2016 11:41:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751695AbcF0BlG (ORCPT ); Sun, 26 Jun 2016 21:41:06 -0400 Received: from mail-bn1bon0064.outbound.protection.outlook.com ([157.56.111.64]:30237 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751555AbcF0BlD (ORCPT ); Sun, 26 Jun 2016 21:41:03 -0400 Received: from BN3PR0301CA0056.namprd03.prod.outlook.com (10.160.152.152) by CY1PR0301MB1530.namprd03.prod.outlook.com (10.162.165.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.523.12; Mon, 27 Jun 2016 01:40:58 +0000 Received: from BN1BFFO11FD022.protection.gbl (2a01:111:f400:7c10::1:150) by BN3PR0301CA0056.outlook.office365.com (2a01:111:e400:401e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.528.16 via Frontend Transport; Mon, 27 Jun 2016 01:40:58 +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=fail action=none header.from=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; 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 BN1BFFO11FD022.mail.protection.outlook.com (10.58.144.85) with Microsoft SMTP Server (TLS) id 15.1.523.9 via Frontend Transport; Mon, 27 Jun 2016 01:40:58 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u5R1esh3015616; Sun, 26 Jun 2016 18:40:55 -0700 From: Zhao Qiang To: CC: , , , , Zhao Qiang Subject: [PATCH v2] Maxim/driver: Add driver for maxim ds26522 Date: Mon, 27 Jun 2016 09:30:22 +0800 Message-ID: <1466991022-28544-1-git-send-email-qiang.zhao@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131114652586341136; (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)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(36756003)(69596002)(87936001)(356003)(48376002)(229853001)(106466001)(105606002)(7846002)(47776003)(2351001)(8666005)(77096005)(104016004)(6806005)(50986999)(50226002)(11100500001)(2906002)(97736004)(586003)(4326007)(68736007)(189998001)(5003940100001)(92566002)(110136002)(19580405001)(86362001)(575784001)(305945005)(19580395003)(50466002)(81166006)(81156014)(8676002)(85426001)(8936002)(33646002)(7059030)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB1530; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD022; 1:nghXjYS+OAQyZAd5WXSikVFSziJ5bBKchKMipx628FluK+ewHgN4cYd5jhgBO0E7O0ktB8thqBBqIWImmBYqMZMFG4ptG9+5ljKtoBjKajLF68U4oKH3XQOAt6Jnt7CmLJlFR5yU38FNcfo9LC03MQCCcHFQt+fqhjviKvZZ0VYM2ps5ovL9f4OJ+mJoqACM/0+8+srFefLuVUxLiKLGWDixDaCkghyu4VvZwpwgnXEnrX4/qbslMez0YNU6fiMhPJog5ddo6DoXgyArKiB0htCF4dG+mKK5rFA3XDSxVrmWTfar1xzU5YEjm7JpkeUytlJNJRpyDnd2HgnONQJSWYyMGUKcyCzxXImTXx32xd//28bS0DvTNDH35kKoIBxoMYG01oAcms+0JSIrW2zyXym310DpgV5BO2dpgn52NpQfP7vqByIdL6V8VAIQCpKZxifLkO5c+sjsVrExF4lI02bs+7C26nzHwb60so6k2nWb/RVfOF6tDXLNMUmPWCLYejkxk6nudFrqj5eLSSrh0iJbIl5JNcDw+n/lJDWB1w59TfAqKMHB1NvUlBzDfvNYMTYKSPnxIJd8BtDvx0YBEu/jEdzT94LFTdOWkCKiVpbslobFfVQZn5f7kyqFeISdEiJZroDAeo+3Pb3JC3VLqXp07iYk4ko2yVFBEFw5l273ri9lrV1RKu7LVLnn8JqSXyIOL2LkncelOOO79potEwSV03DGY1NFoS5zsXC6bSE= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: d29e52b7-c765-4b62-91b0-08d39e2c16b6 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1530; 2:Ahi8gbO01zuUzUfMR0ca0V9Rk11PL5InmBzaMTXCXMhMv5NtF/NDHqbeQS2W7xXqeqCwTz9Yr90+ACc0BExqpkdVz9P3yQhtyVYeN3QYkVC0iz0OD+xuT8mOeYGswlVjPF0MQMLU/fQyY6e9asm7XYQC0dwcxPDWau+VmEJUB5MJBf4Lv02N+VvkP1x70GWw; 3:C2Dsd1V6oQEkuU4nW0xlBvoMgDEOeX9yTL64RN2vt09HW07gVBj0onOVUUWnRXMgf/aykpv72y22Z/RcxaPkAurRy+plKFNrSE9oxy76r0yNfU8afzgxCtC2gOu1yDyKoMPzYMbXZKEcbePoi4HbCbKw7kdP1vvID+LjtgMYMimitg3k3VM2Mp9pTL+JGKpZXFO/bRDxYq/pVdJxolTCzOrf/36v/306CkQzBqqmxak=; 25:TWanxWES81PQcgJ1H5AzQbTqJM+cw2IW4qSKC1NRQHAPR2mVy5tuLVqOzzIWSAIh9/ECh3DGx9PI1WZo0kprwgrqJScgk7psOAuC7lgyfwxHkr2IANRlCAtOxnhvBt9Bd3UJRGz1BA9Oy7WdqIhTb2oo1Ob+IfcJHdWvpwhEsbz1XOHT35o8MTvCB4pdjXPFArrJ5CIAZv7CaVGW3B61SL+MQLd0YkgnZnM4bp+qF+knIg6+wpKmD+OVhVlZBAm9bGEp12Spnby9N+ObMWUvNJQH/OWRFnZk4GA+W3kP2mTAeWZtJZ+wxG6XMfzwQHqf0pwGhg0qn/jg4CDdApucN9DWB8KTacj6JojfoupZs/qYJSLnrh86J36XDw55CsDqPUuhIkQP5ceL3ufgX8/8/jZtWMVc0yGL7PZICEAIhpc= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1530; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13017025)(13015025)(13023025)(13018025)(13024025)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:CY1PR0301MB1530; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR0301MB1530; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1530; 4:Q2innUEXmW6E2GrKfEwQ+cIejBgzfJ8+r/sQblQgcjs7QPoo5p9HIyAC4P8leLgy6papKCKLm9DQ+A83frpq+OHxRRAu32EfGEal6m+Mm8ZstYZ9HwefNETfFEqXVEosq1OmQ3YHy+z/D1kYoWnSZLKUOyHhmAXtgadFppS0Nq+W2xLS/rA+rn6gvuMwekBHyU0A21KO23PDM8yFPDwbEV+T2+VDOZSW499DtFT3adVj/gPPU1X59QNJegFXBAh0JsQSUxQXwwRA9tlZMn898b3Jeq2SO9r6V2NCQmpzpDY4w8+Z0jHesifh/ePBvr9eI+LVf76TurM7W7ut56VdjhTiSAgDN9am4Jxb8diyxSgHN61qSFqj0vGniGCP62PbS7QXMD9B0AeiroGRpkYqxgzFr/BhC761DDeOXkMK0K/vrxQf7H+LjDJ8wgexDmBktlEBbpOBFQKcpoDvjicT/3TSp0gJZyiQtF2rX2rcRPLITXhV2rz6dcZu4PQmEF6bbUxHq35TETtN3NOInOqORnlGfLwa8bb6ND8GuKBxFNFjmOhss2umHpkfzf/KBOQf X-Forefront-PRVS: 09860C2161 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB1530; 23:/cz9IE9q1uWOhUnUaa1kQ+9sJUfhOCo0v/d47ev?= =?us-ascii?Q?jNcfS5bMvHUvCSULcjFjxICRthCP6t8S2N0ppz6ElVKhpyjyVEwpwMfCq3d9?= =?us-ascii?Q?s2y3n8WvrO5D+jXdLezxvJQRv/RihwEo6Pc7wCQ8ahn9F1GCjC+MYT7jX/nc?= =?us-ascii?Q?wNSKrgs+MSxnzuWplC9BbYKH314jKu+xWZexfkR8nqc27i6Hps80q1Pnt3mk?= =?us-ascii?Q?f1clXrGaMnKyAJcpFsAZY7evKq9FaIPlnquVskfwhaAjTGUgLv2OI5fE1INj?= =?us-ascii?Q?S6Yq9tHUZbREwiOELwHX/SdATjTSxuxV0wogyGrbY9xrd6jAOF5byLVuvpkZ?= =?us-ascii?Q?DnlPFpaK0jL4+7SeD2eXYhndzkf3H+z4cjdElaSgiPmwYpAowf56xt7lzDwe?= =?us-ascii?Q?2Tzp9kHHVv5m7g9nlDJAJ8Axl1jRVrEPyiyayPn5hHS5l8cinbDrBlOYtHRR?= =?us-ascii?Q?+qJjvxPAN1AmvHIBm3cjz82bqq3PbmHNTcDPeQmosVY7REkwMFjQGI4FWcgP?= =?us-ascii?Q?CqSH3wElT/NTP5qyWFaiVI3gjDV+Z8a73uwFpvhp9u1OkO6xB0y/TAzBor2s?= =?us-ascii?Q?IaUJsTHV8+S6tAUeR0iDoQBYu3C3ODpH9fwkunKsdcm3VQzSAGx8MkMsF+x5?= =?us-ascii?Q?sZae0aLNtrhob1lp17rYrt+I/xKxsuabQTE59ZaBOkt6fD92zWTC64jiOOrL?= =?us-ascii?Q?3kQOB+ElYj0edljvF9cy0mopOHUErGYs1xRLdzLFnOezh1fRIihfLxTxW2LR?= =?us-ascii?Q?utoib+YkQo7bdeo6xlBMl91YhfOj5tVzWZjwEmWvkWDFaw4e2V79gkqmJRHg?= =?us-ascii?Q?G6HllP65MxFCV9Muvy3yhlec2Ruoa0MSbfEjGe8zTtgNkjsleHjbW31xkDeC?= =?us-ascii?Q?j5McvCq8G+I9iMP7ALS4Zh3tuzH9Ew5fkutx0Xf1XKuT/EbvJBnu0Pijy4Bw?= =?us-ascii?Q?NZrst1TiVDXbnmg/wtllDBfOYHZG/OXkB1p+43Dh9BqL+/UWicaFIGh93AG3?= =?us-ascii?Q?X1+kRf8nEjR1HHCJizIUBQ2cJllSbRE6CjPOfyMwtStaAJ3/5HjaRqWcwank?= =?us-ascii?Q?C5mOQ7OFojxvLddAuA0NFIDkLr8pTbyXhsW5kl2H5hAoBwRYuIT89HbciXwA?= =?us-ascii?Q?gY9t1L7ayAX2vl7u1HQTCH4obu6DHR/DPusTnQxWqm+y+JmljDAkp/Q=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1530; 6:IDksb7MebYOzzjC5OCJgek4wSfNBMO+A3z8w2Cc7q4Kn/i/E8r/3ib00h9VZj3YvbifsoIrh+ilAcky/9Qh2dV2CmGKKc3zA8NTrXUNGTkMzQZ9Z702FylFX/a7Q7pTr68C0BYlvREc78YgfkOi5HD7ndIg8aYiZjOFDIOzl1aUnFbJnPDw0JZt24LNCSDx6dWPvxC+q5Y7FBC78k9n/vGWuUMf+cAL9HlNq30I1tg+PjtqO4+Yep8O+BT5WlutblQXUy5T1XGUCy1dSN/pswpr0uSFvir1P+bfnuUgp9kH90ZXW82y0pXxsp/mmhziS; 5:UpQ4MeVMKAHdsxZdkSAH6nlTVoE2FXt6gutVpfMw+gnB7LT9NFveCQ9JOy9RHOrYUPzeq9DU1YtlVEE25+WM9LZNuQ0Wl9FaSnalT5l1ex4+4rU2bK7fnz9avLwmBALdBsjbuRnBjI6Z5DS4Ryc2N/gWqKdWf+um6CVmf64i47c=; 24:hCLdZ4OexY/Ss9Fliqt57c9DmW7vJXK0+5NO5KrrgFErnaXukC+Az71xvJ8jTqGdb7ybI5n1Dg6YgwnSc7BRGYkiqy5l4cftS5EEeVKubjE=; 7:hxxN24kc2tfrrJV6tDCn8yXLteTPM+XEyaxomeEAgwbaQDbAmoNOjpjKz7548CupcSFY2oiVwS8VFAwiCQvPss4oHW4ct+UHr8BA9Blp8lT7p7oy3+wH21v/XkZVytPTZle0i+Oc8tAM6FQ4ckT3L9+4juBrWknw43jCVHvCT/JC4+10hMBgzAEa6DpXVCjf+2KvVmHCNg0fVT6Uyz8yLUi1T45E8uKDlAUXucysCRU5tofrm8bnvuwSPN+b9biwu9rcmONdiGwlSE1a26nWzg== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2016 01:40:58.3845 (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: CY1PR0301MB1530 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Zhao Qiang --- Changes for v2: - remove MODULE_DESCRIPTION of driver - add dependence on 'FSL_SOC || ARCH_MXC || ARCH_LAYERSCAPE" drivers/net/wan/Kconfig | 11 ++ drivers/net/wan/Makefile | 1 + drivers/net/wan/slic_ds26522.c | 255 +++++++++++++++++++++++++++++++++++++++++ drivers/net/wan/slic_ds26522.h | 134 ++++++++++++++++++++++ 4 files changed, 401 insertions(+) create mode 100644 drivers/net/wan/slic_ds26522.c create mode 100644 drivers/net/wan/slic_ds26522.h diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 9e314b7..33ab334 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig @@ -291,6 +291,17 @@ config FSL_UCC_HDLC To compile this driver as a module, choose M here: the module will be called fsl_ucc_hdlc. +config SLIC_DS26522 + tristate "Slic Maxim ds26522 card support" + depends on SPI + depends on FSL_SOC || ARCH_MXC || ARCH_LAYERSCAPE + help + This module initializes and configures the slic maxim card + in T1 or E1 mode. + + To compile this driver as a module, choose M here: the + module will be called slic_ds26522. + config DSCC4_PCISYNC bool "Etinc PCISYNC features" depends on DSCC4 diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index 25fec40..73c2326 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile @@ -33,6 +33,7 @@ obj-$(CONFIG_PCI200SYN) += pci200syn.o obj-$(CONFIG_PC300TOO) += pc300too.o obj-$(CONFIG_IXP4XX_HSS) += ixp4xx_hss.o obj-$(CONFIG_FSL_UCC_HDLC) += fsl_ucc_hdlc.o +obj-$(CONFIG_SLIC_DS26522) += slic_ds26522.o clean-files := wanxlfw.inc $(obj)/wanxl.o: $(obj)/wanxlfw.inc diff --git a/drivers/net/wan/slic_ds26522.c b/drivers/net/wan/slic_ds26522.c new file mode 100644 index 0000000..d06a887 --- /dev/null +++ b/drivers/net/wan/slic_ds26522.c @@ -0,0 +1,255 @@ +/* + * drivers/net/wan/slic_ds26522.c + * + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * + * Author: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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "slic_ds26522.h" + +#define DRV_NAME "ds26522" + +#define SLIC_TRANS_LEN 1 +#define SLIC_TWO_LEN 2 +#define SLIC_THREE_LEN 3 + +static struct spi_device *g_spi; + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Zhao Qiang"); + +/* the read/write format of address is + * w/r|A13|A12|A11|A10|A9|A8|A7|A6|A5|A4|A3|A2|A1|A0|x + */ +static void slic_write(struct spi_device *spi, u16 addr, + u8 data) +{ + u8 temp[3]; + + addr = bitrev16(addr) >> 1; + data = bitrev8(data); + temp[0] = (u8)((addr >> 8) & 0x7f); + temp[1] = (u8)(addr & 0xfe); + temp[2] = data; + + /* write spi addr and value */ + spi_write(spi, &temp[0], SLIC_THREE_LEN); +} + +static u8 slic_read(struct spi_device *spi, u16 addr) +{ + u8 temp[2]; + u8 data; + + addr = bitrev16(addr) >> 1; + temp[0] = (u8)(((addr >> 8) & 0x7f) | 0x80); + temp[1] = (u8)(addr & 0xfe); + + spi_write_then_read(spi, &temp[0], SLIC_TWO_LEN, &data, + SLIC_TRANS_LEN); + + data = bitrev8(data); + return data; +} + +static bool get_slic_product_code(struct spi_device *spi) +{ + u8 device_id; + + device_id = slic_read(spi, DS26522_IDR_ADDR); + if ((device_id & 0xf8) == 0x68) + return true; + else + return false; +} + +static void ds26522_e1_spec_config(struct spi_device *spi) +{ + /* Receive E1 Mode, Framer Disabled */ + slic_write(spi, DS26522_RMMR_ADDR, DS26522_RMMR_E1); + + /* Transmit E1 Mode, Framer Disable */ + slic_write(spi, DS26522_TMMR_ADDR, DS26522_TMMR_E1); + + /* Receive E1 Mode Framer Enable */ + slic_write(spi, DS26522_RMMR_ADDR, + slic_read(spi, DS26522_RMMR_ADDR) | DS26522_RMMR_FRM_EN); + + /* Transmit E1 Mode Framer Enable */ + slic_write(spi, DS26522_TMMR_ADDR, + slic_read(spi, DS26522_TMMR_ADDR) | DS26522_TMMR_FRM_EN); + + /* RCR1, receive E1 B8zs & ESF */ + slic_write(spi, DS26522_RCR1_ADDR, + DS26522_RCR1_E1_HDB3 | DS26522_RCR1_E1_CCS); + + /* RSYSCLK=2.048MHz, RSYNC-Output */ + slic_write(spi, DS26522_RIOCR_ADDR, + DS26522_RIOCR_2048KHZ | DS26522_RIOCR_RSIO_OUT); + + /* TCR1 Transmit E1 b8zs */ + slic_write(spi, DS26522_TCR1_ADDR, DS26522_TCR1_TB8ZS); + + /* TSYSCLK=2.048MHz, TSYNC-Output */ + slic_write(spi, DS26522_TIOCR_ADDR, + DS26522_TIOCR_2048KHZ | DS26522_TIOCR_TSIO_OUT); + + /* Set E1TAF */ + slic_write(spi, DS26522_E1TAF_ADDR, DS26522_E1TAF_DEFAULT); + + /* Set E1TNAF register */ + slic_write(spi, DS26522_E1TNAF_ADDR, DS26522_E1TNAF_DEFAULT); + + /* Receive E1 Mode Framer Enable & init Done */ + slic_write(spi, DS26522_RMMR_ADDR, slic_read(spi, DS26522_RMMR_ADDR) | + DS26522_RMMR_INIT_DONE); + + /* Transmit E1 Mode Framer Enable & init Done */ + slic_write(spi, DS26522_TMMR_ADDR, slic_read(spi, DS26522_TMMR_ADDR) | + DS26522_TMMR_INIT_DONE); + + /* Configure LIU E1 mode */ + slic_write(spi, DS26522_LTRCR_ADDR, DS26522_LTRCR_E1); + + /* E1 Mode default 75 ohm w/Transmit Impedance Matlinking */ + slic_write(spi, DS26522_LTITSR_ADDR, + DS26522_LTITSR_TLIS_75OHM | DS26522_LTITSR_LBOS_75OHM); + + /* E1 Mode default 75 ohm Long Haul w/Receive Impedance Matlinking */ + slic_write(spi, DS26522_LRISMR_ADDR, + DS26522_LRISMR_75OHM | DS26522_LRISMR_MAX); + + /* Enable Transmit output */ + slic_write(spi, DS26522_LMCR_ADDR, DS26522_LMCR_TE); +} + +static int slic_ds26522_init_configure(struct spi_device *spi) +{ + u16 addr; + + /* set clock */ + slic_write(spi, DS26522_GTCCR_ADDR, DS26522_GTCCR_BPREFSEL_REFCLKIN | + DS26522_GTCCR_BFREQSEL_2048KHZ | + DS26522_GTCCR_FREQSEL_2048KHZ); + slic_write(spi, DS26522_GTCR2_ADDR, DS26522_GTCR2_TSSYNCOUT); + slic_write(spi, DS26522_GFCR_ADDR, DS26522_GFCR_BPCLK_2048KHZ); + + /* set gtcr */ + slic_write(spi, DS26522_GTCR1_ADDR, DS26522_GTCR1); + + /* Global LIU Software Reset Register */ + slic_write(spi, DS26522_GLSRR_ADDR, DS26522_GLSRR_RESET); + + /* Global Framer and BERT Software Reset Register */ + slic_write(spi, DS26522_GFSRR_ADDR, DS26522_GFSRR_RESET); + + usleep_range(100, 120); + + slic_write(spi, DS26522_GLSRR_ADDR, DS26522_GLSRR_NORMAL); + slic_write(spi, DS26522_GFSRR_ADDR, DS26522_GFSRR_NORMAL); + + /* Perform RX/TX SRESET,Reset receiver */ + slic_write(spi, DS26522_RMMR_ADDR, DS26522_RMMR_SFTRST); + + /* Reset tranceiver */ + slic_write(spi, DS26522_TMMR_ADDR, DS26522_TMMR_SFTRST); + + usleep_range(100, 120); + + /* Zero all Framer Registers */ + for (addr = DS26522_RF_ADDR_START; addr <= DS26522_RF_ADDR_END; + addr++) + slic_write(spi, addr, 0); + + for (addr = DS26522_TF_ADDR_START; addr <= DS26522_TF_ADDR_END; + addr++) + slic_write(spi, addr, 0); + + for (addr = DS26522_LIU_ADDR_START; addr <= DS26522_LIU_ADDR_END; + addr++) + slic_write(spi, addr, 0); + + for (addr = DS26522_BERT_ADDR_START; addr <= DS26522_BERT_ADDR_END; + addr++) + slic_write(spi, addr, 0); + + /* setup ds26522 for E1 specification */ + ds26522_e1_spec_config(spi); + + slic_write(spi, DS26522_GTCR1_ADDR, 0x00); + + return 0; +} + +static int slic_ds26522_remove(struct spi_device *spi) +{ + pr_info("DS26522 module uninstalled\n"); + return 0; +} + +static int slic_ds26522_probe(struct spi_device *spi) +{ + int ret = 0; + + g_spi = spi; + spi->bits_per_word = 8; + + if (!get_slic_product_code(spi)) + return ret; + + ret = slic_ds26522_init_configure(spi); + if (ret == 0) + pr_info("DS26522 cs%d configurated\n", spi->chip_select); + + return ret; +} + +static const struct of_device_id slic_ds26522_match[] = { + { + .compatible = "maxim,ds26522", + }, + {}, +}; + +static struct spi_driver slic_ds26522_driver = { + .driver = { + .name = "ds26522", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + .of_match_table = slic_ds26522_match, + }, + .probe = slic_ds26522_probe, + .remove = slic_ds26522_remove, +}; + +static int __init slic_ds26522_init(void) +{ + return spi_register_driver(&slic_ds26522_driver); +} + +static void __exit slic_ds26522_exit(void) +{ + spi_unregister_driver(&slic_ds26522_driver); +} + +module_init(slic_ds26522_init); +module_exit(slic_ds26522_exit); diff --git a/drivers/net/wan/slic_ds26522.h b/drivers/net/wan/slic_ds26522.h new file mode 100644 index 0000000..22aa0ec --- /dev/null +++ b/drivers/net/wan/slic_ds26522.h @@ -0,0 +1,134 @@ +/* + * drivers/tdm/line_ctrl/slic_ds26522.h + * + * Copyright 2016 Freescale Semiconductor, Inc. + * + * Author: 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. + */ + +#define DS26522_RF_ADDR_START 0x00 +#define DS26522_RF_ADDR_END 0xef +#define DS26522_GLB_ADDR_START 0xf0 +#define DS26522_GLB_ADDR_END 0xff +#define DS26522_TF_ADDR_START 0x100 +#define DS26522_TF_ADDR_END 0x1ef +#define DS26522_LIU_ADDR_START 0x1000 +#define DS26522_LIU_ADDR_END 0x101f +#define DS26522_TEST_ADDR_START 0x1008 +#define DS26522_TEST_ADDR_END 0x101f +#define DS26522_BERT_ADDR_START 0x1100 +#define DS26522_BERT_ADDR_END 0x110f + +#define DS26522_RMMR_ADDR 0x80 +#define DS26522_RCR1_ADDR 0x81 +#define DS26522_RCR3_ADDR 0x83 +#define DS26522_RIOCR_ADDR 0x84 + +#define DS26522_GTCR1_ADDR 0xf0 +#define DS26522_GFCR_ADDR 0xf1 +#define DS26522_GTCR2_ADDR 0xf2 +#define DS26522_GTCCR_ADDR 0xf3 +#define DS26522_GLSRR_ADDR 0xf5 +#define DS26522_GFSRR_ADDR 0xf6 +#define DS26522_IDR_ADDR 0xf8 + +#define DS26522_E1TAF_ADDR 0x164 +#define DS26522_E1TNAF_ADDR 0x165 +#define DS26522_TMMR_ADDR 0x180 +#define DS26522_TCR1_ADDR 0x181 +#define DS26522_TIOCR_ADDR 0x184 + +#define DS26522_LTRCR_ADDR 0x1000 +#define DS26522_LTITSR_ADDR 0x1001 +#define DS26522_LMCR_ADDR 0x1002 +#define DS26522_LRISMR_ADDR 0x1007 + +#define MAX_NUM_OF_CHANNELS 8 +#define PQ_MDS_8E1T1_BRD_REV 0x00 +#define PQ_MDS_8E1T1_PLD_REV 0x00 + +#define DS26522_GTCCR_BPREFSEL_REFCLKIN 0xa0 +#define DS26522_GTCCR_BFREQSEL_1544KHZ 0x08 +#define DS26522_GTCCR_FREQSEL_1544KHZ 0x04 +#define DS26522_GTCCR_BFREQSEL_2048KHZ 0x00 +#define DS26522_GTCCR_FREQSEL_2048KHZ 0x00 + +#define DS26522_GFCR_BPCLK_2048KHZ 0x00 + +#define DS26522_GTCR2_TSSYNCOUT 0x02 +#define DS26522_GTCR1 0x00 + +#define DS26522_GFSRR_RESET 0x01 +#define DS26522_GFSRR_NORMAL 0x00 + +#define DS26522_GLSRR_RESET 0x01 +#define DS26522_GLSRR_NORMAL 0x00 + +#define DS26522_RMMR_SFTRST 0x02 +#define DS26522_RMMR_FRM_EN 0x80 +#define DS26522_RMMR_INIT_DONE 0x40 +#define DS26522_RMMR_T1 0x00 +#define DS26522_RMMR_E1 0x01 + +#define DS26522_E1TAF_DEFAULT 0x1b +#define DS26522_E1TNAF_DEFAULT 0x40 + +#define DS26522_TMMR_SFTRST 0x02 +#define DS26522_TMMR_FRM_EN 0x80 +#define DS26522_TMMR_INIT_DONE 0x40 +#define DS26522_TMMR_T1 0x00 +#define DS26522_TMMR_E1 0x01 + +#define DS26522_RCR1_T1_SYNCT 0x80 +#define DS26522_RCR1_T1_RB8ZS 0x40 +#define DS26522_RCR1_T1_SYNCC 0x08 + +#define DS26522_RCR1_E1_HDB3 0x40 +#define DS26522_RCR1_E1_CCS 0x20 + +#define DS26522_RIOCR_1544KHZ 0x00 +#define DS26522_RIOCR_2048KHZ 0x10 +#define DS26522_RIOCR_RSIO_OUT 0x00 + +#define DS26522_RCR3_FLB 0x01 + +#define DS26522_TIOCR_1544KHZ 0x00 +#define DS26522_TIOCR_2048KHZ 0x10 +#define DS26522_TIOCR_TSIO_OUT 0x04 + +#define DS26522_TCR1_TB8ZS 0x04 + +#define DS26522_LTRCR_T1 0x02 +#define DS26522_LTRCR_E1 0x00 + +#define DS26522_LTITSR_TLIS_75OHM 0x00 +#define DS26522_LTITSR_LBOS_75OHM 0x00 +#define DS26522_LTITSR_TLIS_100OHM 0x10 +#define DS26522_LTITSR_TLIS_0DB_CSU 0x00 + +#define DS26522_LRISMR_75OHM 0x00 +#define DS26522_LRISMR_100OHM 0x10 +#define DS26522_LRISMR_MAX 0x03 + +#define DS26522_LMCR_TE 0x01 + +enum line_rate { + LINE_RATE_T1, /* T1 line rate (1.544 Mbps) */ + LINE_RATE_E1 /* E1 line rate (2.048 Mbps) */ +}; + +enum tdm_trans_mode { + NORMAL = 0, + FRAMER_LB +}; + +enum card_support_type { + LM_CARD = 0, + DS26522_CARD, + NO_CARD +};