From patchwork Fri Oct 13 06:05:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yasunari.Takiguchi@sony.com X-Patchwork-Id: 10003481 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B897A60216 for ; Fri, 13 Oct 2017 06:02:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A97CD28FB4 for ; Fri, 13 Oct 2017 06:02:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9CDE228FB6; Fri, 13 Oct 2017 06:02:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 99BB728FB4 for ; Fri, 13 Oct 2017 06:02:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753397AbdJMGCn (ORCPT ); Fri, 13 Oct 2017 02:02:43 -0400 Received: from mail-dm3nam03on0139.outbound.protection.outlook.com ([104.47.41.139]:53768 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751503AbdJMGCk (ORCPT ); Fri, 13 Oct 2017 02:02:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Sony.onmicrosoft.com; s=selector1-Sony-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=pGAWwHbWq6k0Xq6hrfn9OOJnkREhhHrnR8ilsU+eKJ8=; b=LUhCgYlWUw99sciUXCXbi/d2MvRobRXhtMqKnTQ+Q0K8iZ12cJzgR4C2UKqiLAoxzWFFdKJ6R9IRucvCLiYf33vrx6O7NXQ1+N31jnxEs+K4UoQOR2Sa1K5NXMinQfgk2oqFOINvJU7Hlnjljug02ChYStxDUfdHsfoTvgHCEpc= Received: from BN6PR1301CA0006.namprd13.prod.outlook.com (10.174.84.147) by BY2PR13MB0455.namprd13.prod.outlook.com (10.163.114.29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.5; Fri, 13 Oct 2017 06:02:38 +0000 Received: from SN1NAM02FT035.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::207) by BN6PR1301CA0006.outlook.office365.com (2603:10b6:405:29::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.156.2 via Frontend Transport; Fri, 13 Oct 2017 06:02:37 +0000 Received-SPF: Pass (protection.outlook.com: domain of sony.com designates 117.103.190.43 as permitted sender) receiver=protection.outlook.com; client-ip=117.103.190.43; helo=jp.sony.com; Received: from jp.sony.com (117.103.190.43) by SN1NAM02FT035.mail.protection.outlook.com (10.152.72.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.20.77.10 via Frontend Transport; Fri, 13 Oct 2017 06:02:37 +0000 Received: from JPYOKXHT106.jp.sony.com (117.103.191.53) by JPYOKXEG103.jp.sony.com (117.103.190.43) with Microsoft SMTP Server (TLS) id 14.3.361.1; Fri, 13 Oct 2017 06:02:26 +0000 Received: from localhost.localdomain (43.25.41.74) by JPYOKXHT106.jp.sony.com (117.103.191.53) with Microsoft SMTP Server (TLS) id 14.3.361.1; Fri, 13 Oct 2017 06:02:26 +0000 From: To: , , CC: , , Yasunari Takiguchi , Masayuki Yamamoto , Hideki Nozawa , "Kota Yonezawa" , Toshihiko Matsumoto , Satoshi Watanabe Subject: [PATCH v4 04/12] [media] cxd2880: Add spi device IO routines Date: Fri, 13 Oct 2017 15:05:59 +0900 Message-ID: <20171013060559.21309-1-Yasunari.Takiguchi@sony.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20171013054635.20946-1-Yasunari.Takiguchi@sony.com> References: <20171013054635.20946-1-Yasunari.Takiguchi@sony.com> MIME-Version: 1.0 X-Originating-IP: [43.25.41.74] X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:117.103.190.43; IPV:NLI; CTRY:JP; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(39860400002)(376002)(346002)(2980300002)(438002)(189002)(199003)(86152003)(2950100002)(16586007)(48376002)(8676002)(2201001)(356003)(66066001)(50986999)(49486002)(6666003)(50466002)(478600001)(7736002)(5660300001)(72206003)(6306002)(76176999)(47776003)(2906002)(39060400002)(316002)(246002)(107886003)(7636002)(106002)(6116002)(305945005)(4326008)(2876002)(1076002)(54906003)(86362001)(575784001)(110136005)(3846002)(16526018)(36756003)(106466001)(50226002)(5003940100001)(189998001)(8936002)(2004002); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR13MB0455; H:jp.sony.com; FPR:; SPF:Pass; PTR:jpyokxeg103.jp.sony.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02FT035; 1:wrkYdMw94MdTfg+KjSk5J87w+0alJGX8/wYiOh9IjqyLLt4U8NUjq5rF/AeMPLWAPFybW0EKfHggeKve9z2czoZ4B6spfO1bS1XC1jXE5EM/C+nLnSymBpNTKMxoEnrZ X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 860dd77d-191c-45de-8e3f-08d512000166 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(8251501002)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:BY2PR13MB0455; X-Microsoft-Exchange-Diagnostics: 1; BY2PR13MB0455; 3:lM0r33pv/yL1e85xV8aWKKQ301w82J7S/3ddLDrbJznDbFpBWEzx+J5tF8iMUuxMobkoVr7U194WTyOV2K4/sBCmltTJAraBG8moyqgI3bliEx9AX7sJaPQHxUDw5exafy0TsPDRwpjFXP6bY+VX+NzFQqVXXLUDrZ55HYP+bKjUyEudPDR8u6+nBjyX4reTYwWvBT3IK+n3gY38tBWJtyjLiUMBE3L8hBZXp66F7wryFcoGL0ofPTxKTryb2ZLqrPQmbFxsQlPs/koFTzUGYg6r+nJX8xqyDFSFqxp0QKQui9Xy9vF6iXk7pRAR+BjgUmQ1OEZUlx4ze0O2X1DOKQ8LfArFgnNwXZ7UhHzr8Ac=; 25:UIGiYtR8d9OIxNyOqfFh3UZRUR85gykk1q7D5xPpKftEqG6vv+uIBdNaFc09yV2pnAu0RLDB9gRtIR9a3g7/vGwij/cJv/gjSn/eXA7wccXeghlSxKHmvuKtpi6KiNEN1/6RcZuY6zqykPWrJ2tqpGPmIQPMCyZ15roQTQuefCF+bI/q8bn+HKuiS6od9V3fU5nEt2DvdwTzCVYciuYKdWECcVqOeBvhQJUK7LjNoMvMjGZVRyMNB7Q2c6heY1byyaNPldVzpb3jaMTy/HAHPNkiV/lvQBqXt3/sSX8+BYeQl3rvhla6Y6kVaJ8sPm4aoVqBkXKnzVChtAFJfPchlg== X-MS-TrafficTypeDiagnostic: BY2PR13MB0455: X-Microsoft-Exchange-Diagnostics: 1; BY2PR13MB0455; 31:mV5hjS/zVE569R4pVLBo/e+0z7OBJObBK+Cuhjel4NxrCDp3GlQpZbfMEeerh+nFUXdTiT9ZKKMWBrL4JmOLAQgYfb8U7ZszuLP1XLbEGysN6OlFnpDaL+2JNZ0+22al9kJlJlARV0ZjVrmejErVxgeuI5LNQF2xv4Wf71vdzYXDzScbLn/cbrQIe/MHCo+Ld0aNC6y/nmAU9Ib5zj/R6ICUsQlSu63BGmZ5G7Qo9c0=; 20:gCR7NvmOrMrBLdw3OyYMfeLrU74qcIO4eyfN9NoBtPPkv9/qBOnOsVnxkvVE+hLOdmAqUiRGuwLfuY0Bb81N7QQhVY92y43+uWKpw87x6p/Ev783XCLUgbnWu75UPBx/s8o9i1L2GvceIevGqL5+WyY7HtxoZm+PtJmmOqhoBK496x+5uyUjbroDGlngnnY+QWLdVGOUC1rpO1eNJ3mnXytAwA5H+pX2PEnx+R/ldIvG11YdRWOM09lxjJ1lu8Nua5CsD5h4SYwTo3kYCrRcY/o4G5Eri6r4FVWGiEaWYhqCENPt4MRL4FHQMCeShgoqKT26YAzYJ2AjdlGhqVqzgGcxbVVtpgOceVEtSc9PmkQhLbe9FWCIU41Ng3stclUJfiuv76RxeRo4qxawMAGzEbB21p0nFHKS+6n+PD6es8wv28WeK6pyZ5eAKgykeEHKl1AKjUodVos9f/iria8eGeXxNEkKLwS9JzIVinABjFfMzzrV+Aki4+E/t7/80KYW X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(182409339516656)(22074186197030); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(93006095)(93004095)(10201501046)(3002001)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123560025)(20161123555025)(20161123564025)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BY2PR13MB0455; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BY2PR13MB0455; X-Microsoft-Exchange-Diagnostics: 1; BY2PR13MB0455; 4:p8LUARmyOlbJHADQlj6Gb02Ad8nJjp6g43CZmsAAgzP9Aj0TcCisAAGeSCq7FRlSxsNSgwsqFW5cmj00Sew6oQpRKwgvEVjI9XR+Lu4E+dR4ImipTZGr+7OXstwzNM2PiDqVElXumRPK/tB3sD78few3BKOqsew2JkLxvIfK6ISCsmxlnm0BBAZVFAp0xddevrnYHOehT2K9wJFFlQgGjGjgRW0pIumxqoLUTQ1StIiRvpUi5VFIAcZFaPAam0AQ6PoE5aHlMj+U2E+zkJU0AqeGLzFa7Hb8kY4Y7rjSD4TzYte2fAAMV5e64MfOVcxtqRsAEg/3JqXPXnbbQgkAsnTQI9/ylCVMiJFKCa3DFVgyHObXeeRbaI9dGdUZzw6Y X-Forefront-PRVS: 04599F3534 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR13MB0455; 23:gmAhTvhEEvNCyvy9kRIRykJJE+iGh4bO3PjJpcPj0?= =?us-ascii?Q?G78vg+Ai7Nn5gmECfr0HNIy45vg4u3SGdZOUAvEUqjp8f52+rPcYheJqQ/Fu?= =?us-ascii?Q?z1kGcPXvfuV88WxL62LiqvpcoihBVSZ+HwJ2syI8f7dIBCzeebssppSXE8zl?= =?us-ascii?Q?tu9lMU20VgYQlNecuBtxs30IeIvr8xr+a+xZeE3ORKziV5UYCNosbL9R/ZHy?= =?us-ascii?Q?q7zrh1hN0RiAKn4ZJU3QGM2pqWzN3fhCvzKHsmkPjKqUfY2StjsFH/W+BV0d?= =?us-ascii?Q?eWWGEu9YsJItS8fn9r0EhLVOzGs5Zx/W2nXGuK9Rc47nv/fe2eHkWry3/P0Q?= =?us-ascii?Q?ZEsrUbqE2E+eSi/mKUmDLRJ6Fy8xNccd0DmcHr9gxLJfclJ2CLUBgKqPP8dh?= =?us-ascii?Q?uA+Ily5XF6rJlXd23+T/pL23AZ8Yz6XdITAdm4pBKVEYj7rhn3KxLfTBC89S?= =?us-ascii?Q?3n19kygGm0bfbuyeqCrk3EKMYyqtF0mjnvcHVXK08gsxdQb2qLv2YDRQ3NoM?= =?us-ascii?Q?ouy4z8v4VDAXiPydKG1PEL1Qr57+AuAeMqfrRvLm0VnjNM3fPd/IbPSvGb2N?= =?us-ascii?Q?09YQboTpcX+3JuHsZ5oyFBRNTH6iB3m9MmDJRA2anaL8e9KNsoQ3ZxkbprsJ?= =?us-ascii?Q?x+8OgPBc6HbmUNHhAa7UnxU4KJDAbIM/ZL3cyoET1oT3z98otYOGCkz7xG7h?= =?us-ascii?Q?HZpwHr7w6zBb4vXk8+E0wsIQRKRd1wL1TPaRGZvaGSVrLcbqCHU2yBIHljNR?= =?us-ascii?Q?hxK7/8IF06dYOWDi9xYAG6B+BVXAlxUiGZjiP/gJtRoPltQNNqMs9ZjDQsa+?= =?us-ascii?Q?IAPeDv31ddj7kMkEDf2G0Z5OfQQzJlrHCDQZx0hOV2nWnOeywqCArifNz6rO?= =?us-ascii?Q?mTzvBZEYu00I6aN4aFaf7QfnTiFPp6mx5gSDcX9HykGGwqGYCZT/uilYCoHJ?= =?us-ascii?Q?uQ0tGcwDUYCCo8aBLGVeR89MBXlQeiwf5a1iePkYkfBppCnUqDdev45dbFsk?= =?us-ascii?Q?EoV2LfAy49BWv1+nAckTepeCM3W6kE39dReIdRMOjODtmCTOdvzLyxSz/snl?= =?us-ascii?Q?LCG94q7LhwtCxbmwyKDYSThdJta6imPLx8vfAI0vh+BAnU4eDCcmEEGAivQS?= =?us-ascii?Q?6TCUKerkChkA+KGAOPqsvfIBggDmXFE5iT3TJC4bWPT08AuZunaWrC3a3iEz?= =?us-ascii?Q?Lxq6sWQxn0VVTa7A9k+J/+ZTxJMqNDvYg9E?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR13MB0455; 6:Fx9iiNGvNJ/SXY23zf8mwMITRSQRa0F2MsXoNW+7ZS5kiKf+zqBcMYYFIcAP/mikxfQUvHgxXIAEgU5VXT5TB8gR5Bu3O17xqCGplbsjCsQ9c+9OuA1fhMiTMK9k2RlzcZ34CVadB0aKqpJ3dGMPJHlBUwJlFxHqmUWU5XHTe4OijWrfoiCEmuMINsaNqueGpsCmB2w7Ji81pqWx75bY64z+ZpWqNxRp7DyEd3MSUFGU7hwxELOGQAMQStzHkyD0O5GSKZO79hl1/9U1xRqG8ZXEVSjjVdTiE9WAO+m1m95glLIU/tvW8BYrE1goLqmDVIgpsdFc6+FeNjFtWvMQ+Q==; 5:NgndTEd/nteXNnj7N/uorXKFaGq4BDuu/ZKKfsOWU4GidIVftWdG4tvrQoRvVi40XLbeqFwV/fdt3Nwdo90mDpLk3RgL7X38bs3PBLZE22bvSAfYf+ZZFyYqNe+ujaqu0RZ1iPawRlSXKgvKPFgnNw==; 24:ycRgxZVdbEYp78GXb75uDg5W/K0ft5iVNGQTNOeMI0HyLeANKDB+g+LKS0lVWu4N5izmDRtw6WG27icIJxbWBNFp7TdZ7jnf29qfZcsKo4Q=; 7:o9HuPtv5Hve18Q8EmrwkfNeTggEoA8N/WHN826ZlynaaiAwezq0l0Hk+JShfde3ooiAE/ZWgAmXIeTtHOwdyAnHY3h60wXtH22mHtZ+KMU9ZQ8V8RiHzTNNfB2AW7j4Slf1BH1y5Eu5lI/4COB8SqhBVaDcxooyogGRnO8FhoJjM2a/gud6W/LW4PwD9aedtluPp4/Ic+XTXGmr9/ZVPXED/7UEJI7jbnzdgnKzW/UU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: sony.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2017 06:02:37.0435 (UTC) X-MS-Exchange-CrossTenant-Id: 66c65d8a-9158-4521-a2d8-664963db48e4 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=66c65d8a-9158-4521-a2d8-664963db48e4; Ip=[117.103.190.43]; Helo=[jp.sony.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR13MB0455 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Yasunari Takiguchi Add functions for initializing, reading and writing to the SPI device for the Sony CXD2880 DVB-T2/T tuner + demodulator. Signed-off-by: Yasunari Takiguchi Signed-off-by: Masayuki Yamamoto Signed-off-by: Hideki Nozawa Signed-off-by: Kota Yonezawa Signed-off-by: Toshihiko Matsumoto Signed-off-by: Satoshi Watanabe --- [Change list] Changes in V4 drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c -removed unnecessary initialization at variable declaration Changes in V3 drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c -removed unnecessary cast -changed cxd2880_memcpy to memcpy -modified return code -changed hexadecimal code to lower case. drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h -modified return code drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h -modified return code drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c -removed unnecessary cast -modified return code drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h -modified return code .../dvb-frontends/cxd2880/cxd2880_devio_spi.c | 146 +++++++++++++++++++++ .../dvb-frontends/cxd2880/cxd2880_devio_spi.h | 40 ++++++ drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h | 51 +++++++ .../dvb-frontends/cxd2880/cxd2880_spi_device.c | 130 ++++++++++++++++++ .../dvb-frontends/cxd2880/cxd2880_spi_device.h | 43 ++++++ 5 files changed, 410 insertions(+) create mode 100644 drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c create mode 100644 drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h create mode 100644 drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h create mode 100644 drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c create mode 100644 drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h diff --git a/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c b/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c new file mode 100644 index 000000000000..e6226a00fc8c --- /dev/null +++ b/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.c @@ -0,0 +1,146 @@ +/* + * cxd2880_devio_spi.c + * Sony CXD2880 DVB-T2/T tuner + demodulator driver + * I/O interface via SPI + * + * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation + * + * 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; version 2 of the License. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#include "cxd2880_devio_spi.h" + +#define BURST_WRITE_MAX 128 + +static int cxd2880_io_spi_read_reg(struct cxd2880_io *io, + enum cxd2880_io_tgt tgt, + u8 sub_address, u8 *data, + u32 size) +{ + int ret; + struct cxd2880_spi *spi = NULL; + u8 send_data[6]; + u8 *read_data_top = data; + + if ((!io) || (!io->if_object) || (!data)) + return -EINVAL; + + if (sub_address + size > 0x100) + return -ERANGE; + + spi = io->if_object; + + if (tgt == CXD2880_IO_TGT_SYS) + send_data[0] = 0x0b; + else + send_data[0] = 0x0a; + + send_data[3] = 0; + send_data[4] = 0; + send_data[5] = 0; + + while (size > 0) { + send_data[1] = sub_address; + if (size > 255) + send_data[2] = 255; + else + send_data[2] = size; + + ret = + spi->write_read(spi, send_data, sizeof(send_data), + read_data_top, send_data[2]); + if (ret) + return ret; + + sub_address += send_data[2]; + read_data_top += send_data[2]; + size -= send_data[2]; + } + + return ret; +} + +static int cxd2880_io_spi_write_reg(struct cxd2880_io *io, + enum cxd2880_io_tgt tgt, + u8 sub_address, + const u8 *data, u32 size) +{ + int ret; + struct cxd2880_spi *spi = NULL; + u8 send_data[BURST_WRITE_MAX + 4]; + const u8 *write_data_top = data; + + if ((!io) || (!io->if_object) || (!data)) + return -EINVAL; + + if (size > BURST_WRITE_MAX) + return -EOVERFLOW; + + if (sub_address + size > 0x100) + return -ERANGE; + + spi = io->if_object; + + if (tgt == CXD2880_IO_TGT_SYS) + send_data[0] = 0x0f; + else + send_data[0] = 0x0e; + + while (size > 0) { + send_data[1] = sub_address; + if (size > 255) + send_data[2] = 255; + else + send_data[2] = size; + + memcpy(&send_data[3], write_data_top, send_data[2]); + + if (tgt == CXD2880_IO_TGT_SYS) { + send_data[3 + send_data[2]] = 0x00; + ret = spi->write(spi, send_data, send_data[2] + 4); + } else { + ret = spi->write(spi, send_data, send_data[2] + 3); + } + if (ret) + return ret; + + sub_address += send_data[2]; + write_data_top += send_data[2]; + size -= send_data[2]; + } + + return ret; +} + +int cxd2880_io_spi_create(struct cxd2880_io *io, + struct cxd2880_spi *spi, u8 slave_select) +{ + if ((!io) || (!spi)) + return -EINVAL; + + io->read_regs = cxd2880_io_spi_read_reg; + io->write_regs = cxd2880_io_spi_write_reg; + io->write_reg = cxd2880_io_common_write_one_reg; + io->if_object = spi; + io->i2c_address_sys = 0; + io->i2c_address_demod = 0; + io->slave_select = slave_select; + + return 0; +} diff --git a/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h b/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h new file mode 100644 index 000000000000..41a86f0f558e --- /dev/null +++ b/drivers/media/dvb-frontends/cxd2880/cxd2880_devio_spi.h @@ -0,0 +1,40 @@ +/* + * cxd2880_devio_spi.h + * Sony CXD2880 DVB-T2/T tuner + demodulator driver + * I/O interface via SPI + * + * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation + * + * 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; version 2 of the License. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#ifndef CXD2880_DEVIO_SPI_H +#define CXD2880_DEVIO_SPI_H + +#include "cxd2880_common.h" +#include "cxd2880_io.h" +#include "cxd2880_spi.h" + +#include "cxd2880_tnrdmd.h" + +int cxd2880_io_spi_create(struct cxd2880_io *io, + struct cxd2880_spi *spi, + u8 slave_select); + +#endif diff --git a/drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h new file mode 100644 index 000000000000..f9e28daa6a2c --- /dev/null +++ b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi.h @@ -0,0 +1,51 @@ +/* + * cxd2880_spi.h + * Sony CXD2880 DVB-T2/T tuner + demodulator driver + * SPI access definitions + * + * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation + * + * 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; version 2 of the License. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#ifndef CXD2880_SPI_H +#define CXD2880_SPI_H + +#include "cxd2880_common.h" + +enum cxd2880_spi_mode { + CXD2880_SPI_MODE_0, + CXD2880_SPI_MODE_1, + CXD2880_SPI_MODE_2, + CXD2880_SPI_MODE_3 +}; + +struct cxd2880_spi { + int (*read)(struct cxd2880_spi *spi, u8 *data, + u32 size); + int (*write)(struct cxd2880_spi *spi, const u8 *data, + u32 size); + int (*write_read)(struct cxd2880_spi *spi, + const u8 *tx_data, u32 tx_size, + u8 *rx_data, u32 rx_size); + u32 flags; + void *user; +}; + +#endif diff --git a/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c new file mode 100644 index 000000000000..60b14e4a4098 --- /dev/null +++ b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.c @@ -0,0 +1,130 @@ +/* + * cxd2880_spi_device.c + * Sony CXD2880 DVB-T2/T tuner + demodulator driver + * SPI access functions + * + * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation + * + * 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; version 2 of the License. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#include + +#include "cxd2880_spi_device.h" + +static int cxd2880_spi_device_write(struct cxd2880_spi *spi, + const u8 *data, u32 size) +{ + struct cxd2880_spi_device *spi_device = NULL; + struct spi_message msg; + struct spi_transfer tx; + int result = 0; + + if ((!spi) || (!spi->user) || (!data) || (size == 0)) + return -EINVAL; + + spi_device = spi->user; + + memset(&tx, 0, sizeof(tx)); + tx.tx_buf = data; + tx.len = size; + + spi_message_init(&msg); + spi_message_add_tail(&tx, &msg); + result = spi_sync(spi_device->spi, &msg); + + if (result < 0) + return -EIO; + + return 0; +} + +static int cxd2880_spi_device_write_read(struct cxd2880_spi *spi, + const u8 *tx_data, + u32 tx_size, + u8 *rx_data, + u32 rx_size) +{ + struct cxd2880_spi_device *spi_device = NULL; + int result = 0; + + if ((!spi) || (!spi->user) || (!tx_data) || + (tx_size == 0) || (!rx_data) || (rx_size == 0)) + return -EINVAL; + + spi_device = spi->user; + + result = spi_write_then_read(spi_device->spi, tx_data, + tx_size, rx_data, rx_size); + if (result < 0) + return -EIO; + + return 0; +} + +int +cxd2880_spi_device_initialize(struct cxd2880_spi_device *spi_device, + enum cxd2880_spi_mode mode, + u32 speed_hz) +{ + int result = 0; + struct spi_device *spi = spi_device->spi; + + switch (mode) { + case CXD2880_SPI_MODE_0: + spi->mode = SPI_MODE_0; + break; + case CXD2880_SPI_MODE_1: + spi->mode = SPI_MODE_1; + break; + case CXD2880_SPI_MODE_2: + spi->mode = SPI_MODE_2; + break; + case CXD2880_SPI_MODE_3: + spi->mode = SPI_MODE_3; + break; + default: + return -EINVAL; + } + + spi->max_speed_hz = speed_hz; + spi->bits_per_word = 8; + result = spi_setup(spi); + if (result != 0) { + pr_err("spi_setup failed %d\n", result); + return -EINVAL; + } + + return 0; +} + +int cxd2880_spi_device_create_spi(struct cxd2880_spi *spi, + struct cxd2880_spi_device *spi_device) +{ + if ((!spi) || (!spi_device)) + return -EINVAL; + + spi->read = NULL; + spi->write = cxd2880_spi_device_write; + spi->write_read = cxd2880_spi_device_write_read; + spi->flags = 0; + spi->user = spi_device; + + return 0; +} diff --git a/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h new file mode 100644 index 000000000000..63f658e29343 --- /dev/null +++ b/drivers/media/dvb-frontends/cxd2880/cxd2880_spi_device.h @@ -0,0 +1,43 @@ +/* + * cxd2880_spi_device.h + * Sony CXD2880 DVB-T2/T tuner + demodulator driver + * SPI access interface + * + * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation + * + * 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; version 2 of the License. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#ifndef CXD2880_SPI_DEVICE_H +#define CXD2880_SPI_DEVICE_H + +#include "cxd2880_spi.h" + +struct cxd2880_spi_device { + struct spi_device *spi; +}; + +int cxd2880_spi_device_initialize(struct cxd2880_spi_device *spi_device, + enum cxd2880_spi_mode mode, + u32 speedHz); + +int cxd2880_spi_device_create_spi(struct cxd2880_spi *spi, + struct cxd2880_spi_device *spi_device); + +#endif /* CXD2880_SPI_DEVICE_H */