Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751497AbdHPEcb (ORCPT ); Wed, 16 Aug 2017 00:32:31 -0400 Received: from mail-bl2nam02on0104.outbound.protection.outlook.com ([104.47.38.104]:51361 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750827AbdHPEc3 (ORCPT ); Wed, 16 Aug 2017 00:32:29 -0400 From: To: , , CC: , , Yasunari Takiguchi , Masayuki Yamamoto , Hideki Nozawa , "Kota Yonezawa" , Toshihiko Matsumoto , Satoshi Watanabe Subject: [PATCH v3 04/14] [media] cxd2880: Add spi device IO routines Date: Wed, 16 Aug 2017 13:35:34 +0900 Message-ID: <20170816043534.21300-1-Yasunari.Takiguchi@sony.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170816041714.20551-1-Yasunari.Takiguchi@sony.com> References: <20170816041714.20551-1-Yasunari.Takiguchi@sony.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [43.25.41.74] X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:117.103.190.44;IPV:NLI;CTRY:JP;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(39860400002)(2980300002)(438002)(189002)(199003)(7736002)(86152003)(50986999)(76176999)(246002)(8936002)(305945005)(7636002)(6306002)(54906002)(2876002)(6666003)(356003)(2906002)(2950100002)(5660300001)(107886003)(39060400002)(50466002)(36756003)(8676002)(50226002)(86362001)(575784001)(48376002)(189998001)(66066001)(3846002)(47776003)(49486002)(2201001)(6116002)(478600001)(1076002)(105586002)(4326008)(72206003)(626005)(106466001)(5003940100001)(2004002);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR13MB0453;H:JPYOKXEG104.jp.sony.com;FPR:;SPF:Pass;PTR:jpyokxeg104.jp.sony.com;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT043;1:Jc278lc6Sp8GW0bRpnPny/h+YWXoESJAQN4htsoBdzrOYH4HkZ38pi3DMQ1ae8FSYk7bctJXGwuD4DSZCogyTrU0mdu03Uhx+3/kjm5iYdy3WMGX07zLOWQKF6JV2kWkPmNAdhoHBnucirAbY46ETmIriemWFCWcjuSx5s75WAPtqRltfpIMK6FarCJtHSw42fwXboBKSuUwfldVtz0fe/rXqF0J+xZ43sTdYmzvWRQfzZWKjqUWQ8CxwrD/rm2d6OhzbkUDU9n53FSZG7WHQ33PdYPFHCYOgRB2pVc4powexabaT0+xaNSrojwQ2PVHwUQRFVPZdoVvPtGeY7shfbJ7IAlPASykn18EYOz14Flz97IKWvVtuJK84K2MpprdSdfCnXnwB26eiuaEYDW7Wq/JF9VuDiCyWNKeaAX/uZPBaDLhYMXbUMPMIwW7J9lx8EdoyweKsTTeeB8zZpidgneI7dKxI101RSjhOtXGx7cE4jVr6AwCw/4Y2419W0vmMIGnMNhH+rXCx3Hau2fzyu3SeQnVtQqcYfMDim5FKBnSAdXdlWon/lJeXHoIJv066pH19FrQWaqJLRZeMiwg2hPMdYs39HZ5RF64DqNObobq3ips6gmIuT8kP0mLdqBs4itSLHJMlhFGJGKvBwoEfVlrVQ5iBwnQAwyHx0vb84WfN+JcyJQKngsIaOLmqGIFxlxiSHwyQPci8MOsswEX6lOO6CG/vVdMF61UJlGZK2I8JXoX/fuyhQxqz4dArw69MEaKASaLZgAemmqioNo43MmVRemFMwanq526JSfuYRu4NKUfyChvTEx9oegtbstc94nZjY5xJ990B4VSeML9MjUOZEw17RYYjn04qN9X/u8Wqg5ljigwOp/YCF13wYit X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bba586dc-a465-4a83-511d-08d4e45fcb7c X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(8251501002)(300000503095)(300135400095)(2017052603153)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:BY2PR13MB0453; X-Microsoft-Exchange-Diagnostics: 1;BY2PR13MB0453;3:+nBWn6DKNYDNT8zNTzKv/C7jUp6dD4H2d2QNi7WjkOAZfqlQSNwDSdaDOZR51RQdAMh1XcHoxWo5c/0PjMWmDQfyFyxj1WqwblwADWgVHeCVOuXFlIHZOciLtDNdpzGekKyGiw8clzEi0G/z/1+WAweM3j2lnSUZyVlZDrm31jpiJHQwNMPxCCuwccRcP4JAX7CTD0OwAbi7kwUFdUknfoXLJ3lZLWWyZwQQR2GCCE5Vhsos8/pQYhLzT8eRR09A0U4/9E9LhXXf15J00wqvyN0hybl3dDUrJVoGYGBFacm6ynMToaH0vavLVITWEusFJLag/plTPotbil6ZBjdmwwrnObm/k9CqxXljglYMnTk=;25:NRDJBhpP6FsjeRs66RFpPvSd7473vloBgP6MsgHtdOFTNtjdXM1symLSmtDKx7rXJBPDtLj81OUmsJr+2GFgYxpPYj0Rr4KUxUZ1p+04m1awjWxbeZXVlIYosnz22WJdFLbF1p+f5vzdEigYAbQXSVM9rf7PRlIzHczLtZB3KZHCSWzEN6mdL6W1Mi2ZeLbHo5vTMEog+dxKKmsel8pXF7ytqRrfSpwU9xoVQX2X44I4KBI21K4iak/0YnnqvU46Zkbf1uy5xBfwarKyv8J2A2Ghp9lV1MxmE02EuYHxW8LeIJwXdCEzD6T0b39TxmZhbfMualKaAVPbWlPaViBgqg== X-MS-TrafficTypeDiagnostic: BY2PR13MB0453: X-Microsoft-Exchange-Diagnostics: 1;BY2PR13MB0453;31:sWae5eekds7lRELiW8EhA+cdj6Ml7hs8/2zqEzxC3oLinyGEcLiN16+yuPuSevw09UCg5L4WgfahJI2EON2HT+nJ3Tugq/Vuk/pqJVZMLBAXPiqGIOvcbFuaX2CkIYgWqeLf0HDSFyf5m3wTMGZxWUkpqPHYbBUeeEBgtAxknfjz39bnPu9R8NL66HSNnXR4KnporRLup1T0QPRN7FPqxRedk2fLcBlres+cLLVdPnI=;20:TBzIsNIgat0rXMITqmqvwKieYEFP2LHXtrj1uhvxjSUc4J1G/JlqZB3uk1xvkkkub+SkFPIKTrFY7QAaoVHPlw8mkoDAcQzd0b9PIavxdTAh+aL4otC/zyCZT34hrqmdvKP1Rld1CQMeLx5iVbktk2Ja6vvNd4vJmiC5BqTuGMNIi1fny04I83I5C4B7cJfQDW5Sh+niomsVOT5ZiuXuGSWAVTEd14DBgW32aepj3dcmb/lqorXiaQHeGlJM0xLCmxESzpOXGvtGAr/1j2Yos8WsPPy1c0Zh5rW/iHjIoUs5JWmFn3Yx54Rb8CIUyLef1mT8QOAKYxf/9FxUlbmni+BByUyO0JngVgL6K5XGsk6MifMKtiTQACB4VYDyV/ChulPEQiCCOWOjRdvuVKpMvLtjUIiIYYHhcN6cSRgfewfhuYDXZ5BDUtkQCPW24ITEadaH7w7gpJM0P44kTBIbUD8oUkZ45Txn5fHBEGU0/EbAY3y18akPIoE+I9SmyyHn 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)(601004)(2401047)(13016025)(13018025)(8121501046)(5005006)(3002001)(100000703101)(100105400095)(10201501046)(93006095)(93004095)(6055026)(6041248)(20161123558100)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123555025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:BY2PR13MB0453;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:BY2PR13MB0453; X-Microsoft-Exchange-Diagnostics: 1;BY2PR13MB0453;4:cGKqwbrf/9+GO9GNrRpU2p8pLIGUVnbEBnkl1yFYiuapn/ZkZ5Utin9tsRhMmDRA090enr+9Ad7mhR9wfZflvXnCk7dX0hrUjqYzQA9xITGwKXO45WlfE5YY98snv7+eTWZfC8T+WxQBtBY69eRKdqxsNjrwPZvZKBdSZKoy+sONj+MTNyjtEodZQEBYs3vLuSToMxqhwTdkurUUwCOj7nbk4BDL624U+E5NHLhbDqJ14NoxQv/Ov/M4ksII8E9YrwQYSQmMUfaeW4do3rwMCtU2ZRaP8/rSrEjOXxdETRMvPJCN1k24SUDUBNDStMAmVC/iBDOvItLQ6yJqbKdfgnHsVvlAVqIeafAelkE493bGkYnvjL2k4IyiF3Rr25ov X-Forefront-PRVS: 0401647B7F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR13MB0453;23:pOxSLTMXfBBZJix/n/osEQwGwg0uZRedfiwvQC11t?= =?us-ascii?Q?U/ETo52gExobpZ0usuAKZAVW6yGzDWwC8gtXTve/jU169as+zLWgXaL6U5AO?= =?us-ascii?Q?CWdFmcHzLkP1uJOaTn7zfFptWlJ53IV96KUj1T+nmvT0IALhA46g06An7o3W?= =?us-ascii?Q?lmubY+y2GJVFtNOqGzAlkH7OOKw58qLNvGF2udWDQwAe9o3wLiwnO2VembWW?= =?us-ascii?Q?foK8rrjofG6i7u/0lftiSP/nYZKyLQ6FZ58OWf7yRbsj3UAI4t/QI9KBTeve?= =?us-ascii?Q?I0annuwNuLp1Y34ieNPoTupkMmCPDlPiWDBDu4INyQ7I6Zfos43ZJbdja6/P?= =?us-ascii?Q?K+318e/XSAc0y2AcXdFLjOxpMuH6Q+dmN8mfvHvcD4jN10S6G/bDVhwZKuv0?= =?us-ascii?Q?0cQGZf+irqXT9FZfU1a+xOVyXKAwPmNQqSMvXq8E7ldRap7zYg3a+dX6RYdO?= =?us-ascii?Q?JBtlsPxunJgf958NX9aucs8/05eN6+AbdqvHKoGuSuGHSvBy9iTyWM1DN/Yz?= =?us-ascii?Q?BoQndGOHJAuTMsoz7ipiqpwjImTIyRhnqZPrgotOqmcp+N0deVXDepO91XXX?= =?us-ascii?Q?61rWL/QsoqMGogdPYibIPHHFZ9Xb7ZqpOg9dcxfjw28lqzB/QVao65yvYRwD?= =?us-ascii?Q?YREgGBf2eDQGeZNNW/8C/AOEsNGThDK/sO10HiWczh+Q+voLZNWHEJLck8gU?= =?us-ascii?Q?O+1pU0XuRx41j4OsCzSIs2sep4EseOHrPdU62DhPOiTMCf1uE0T3KQE44hgp?= =?us-ascii?Q?jTpJOjzin9OKfTS0+KHmW5Gu5LUdeuJmQx+WjKdeetL5lOj96aQSi0cz8NqK?= =?us-ascii?Q?BpS+N/m0k1HLppjXJ9G7GU1NsajQPc9TDCfZ76JEdMO3iK1r1HzlGYjkettk?= =?us-ascii?Q?9zYC8hiPYEWMVTOTR0OhewhhbcSM8CuNo20qxytmyhuJNyGYdSbbaBd/ej1t?= =?us-ascii?Q?klhUHHEti9YRtNV3EsztCnNXdXdbeTr6VCvsEjGTBtgmF0bq8Ea5zF4BPQd5?= =?us-ascii?Q?30qA8CsjqZy9gH/W4xpw8Ulrv/pvvE73S7YYqlQUn4u/Dmp6jEvVw1L09Pto?= =?us-ascii?Q?9JXlP8CbJF6GNIF1yTkfdS1MlLNFU1NQ+x1ImEJpYSOox34QSx6Q88zO7PdR?= =?us-ascii?Q?8aTWxjj+AU=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR13MB0453;6:59NMaK8R4NP14Xgj8IjCB+gg0W2ClfM3MGD5cMn7RYmAIe8I5G4nR/zq4LDKrghdUoC8zh0H2N9n1DrlM0bv+jkvlVHa9ZzZbYYbw+bXFw77Lqzqg/Nxgp9rklwUdm8rFZaHn7lQNG6Xb4UKPwC2KRUOd/ppKYg98dIw3BVjNrsc2fdyIL7iQuOrVcvQYu/Z+jAaazO2XNe5EwrMWpNimgMhvar4f/hmL0+1q4I2lc8Gb3sKyQXe59QcAOoejjmHiOewPPQmWjlLfbpCpzNApQ0uSLH2FXmrkV3TAngRAYmU/eeTZ9qwAxLbhLlSOtowgsVwEXp/fLoC/yyv69Ccyw==;5:G+bcsbf6IWaRGfPs4soMJBB5jMhIBWwy736uYoHpg71HYNkL6EZA8ESDmtOXDaG/6AA8gIS0+JKsVWZlpNUiUWytxKzYyN6QyZOrMFFX/SJALsGeBLsKPikkejbt+zQgkujLKuYtI6ygsqGZ9iaC+w==;24:aibQGdPHQiKeyeHDGVcUDTWFTg9oVcaPW9dtMotdXUo5iyH7g5+cKfLdLFMGFPd0s+JHX3/liO6pNaFlk+Rp/UtnSg4Ri0ZyTinhDTA1YQw=;7:2+TmV26T/DF/rSCCCNHhhCPD51iepfR6l1t87t/aEHVFdUNZwbJqpOEB6MrnYR7+t6JeYmDBeGRd3SibYKZhxzXj46/Jq9O/xNlzJ6I4n/CoOkH2BIzzCp8KmmL35/GwAConHCQYBIGTCBIGx5sOA6Njm+DsF+CDxB2sKp+ZCul8QSAiiJ7KuwZL0UGd9OgMCM5rmgmkt6xXvTGANrO5hSTIaNY3WN+SK7RTMwSZLmg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: sony.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Aug 2017 04:32:24.8342 (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.44];Helo=[JPYOKXEG104.jp.sony.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR13MB0453 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 15607 Lines: 483 From: Yasunari Takiguchi Add functions for initializing, reading and writing to the SPI device for the Sony CXD2880 DVB-T2/T tuner + demodulator. [Change list] 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 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 --- .../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..2cf4fb0e4610 --- /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 = 0; + 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 = 0; + 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 */ -- 2.13.0