Lines Matching +full:rpc +full:- +full:if

1 // SPDX-License-Identifier: GPL-2.0
3 // RPC-IF SPI/QSPI/Octa driver
7 // Copyright (C) 2019 - 2020 Cogent Embedded, Inc.
13 #include <linux/spi/spi-mem.h>
15 #include <memory/renesas-rpc-if.h>
23 struct rpcif *rpc = spi_controller_get_devdata(spi_dev->controller); in rpcif_spi_mem_prepare() local
26 rpc_op.cmd.opcode = spi_op->cmd.opcode; in rpcif_spi_mem_prepare()
27 rpc_op.cmd.buswidth = spi_op->cmd.buswidth; in rpcif_spi_mem_prepare()
29 if (spi_op->addr.nbytes) { in rpcif_spi_mem_prepare()
30 rpc_op.addr.buswidth = spi_op->addr.buswidth; in rpcif_spi_mem_prepare()
31 rpc_op.addr.nbytes = spi_op->addr.nbytes; in rpcif_spi_mem_prepare()
32 rpc_op.addr.val = spi_op->addr.val; in rpcif_spi_mem_prepare()
35 if (spi_op->dummy.nbytes) { in rpcif_spi_mem_prepare()
36 rpc_op.dummy.buswidth = spi_op->dummy.buswidth; in rpcif_spi_mem_prepare()
37 rpc_op.dummy.ncycles = spi_op->dummy.nbytes * 8 / in rpcif_spi_mem_prepare()
38 spi_op->dummy.buswidth; in rpcif_spi_mem_prepare()
41 if (spi_op->data.nbytes || (offs && len)) { in rpcif_spi_mem_prepare()
42 rpc_op.data.buswidth = spi_op->data.buswidth; in rpcif_spi_mem_prepare()
43 rpc_op.data.nbytes = spi_op->data.nbytes; in rpcif_spi_mem_prepare()
44 switch (spi_op->data.dir) { in rpcif_spi_mem_prepare()
47 rpc_op.data.buf.in = spi_op->data.buf.in; in rpcif_spi_mem_prepare()
51 rpc_op.data.buf.out = spi_op->data.buf.out; in rpcif_spi_mem_prepare()
61 rpcif_prepare(rpc->dev, &rpc_op, offs, len); in rpcif_spi_mem_prepare()
67 if (!spi_mem_default_supports_op(mem, op)) in rpcif_spi_mem_supports_op()
70 if (op->data.buswidth > 4 || op->addr.buswidth > 4 || in rpcif_spi_mem_supports_op()
71 op->dummy.buswidth > 4 || op->cmd.buswidth > 4 || in rpcif_spi_mem_supports_op()
72 op->addr.nbytes > 4) in rpcif_spi_mem_supports_op()
81 struct rpcif *rpc = in rpcif_spi_mem_dirmap_read() local
82 spi_controller_get_devdata(desc->mem->spi->controller); in rpcif_spi_mem_dirmap_read()
84 if (offs + desc->info.offset + len > U32_MAX) in rpcif_spi_mem_dirmap_read()
85 return -EINVAL; in rpcif_spi_mem_dirmap_read()
87 rpcif_spi_mem_prepare(desc->mem->spi, &desc->info.op_tmpl, &offs, &len); in rpcif_spi_mem_dirmap_read()
89 return rpcif_dirmap_read(rpc->dev, offs, len, buf); in rpcif_spi_mem_dirmap_read()
94 struct rpcif *rpc = in rpcif_spi_mem_dirmap_create() local
95 spi_controller_get_devdata(desc->mem->spi->controller); in rpcif_spi_mem_dirmap_create()
97 if (desc->info.offset + desc->info.length > U32_MAX) in rpcif_spi_mem_dirmap_create()
98 return -ENOTSUPP; in rpcif_spi_mem_dirmap_create()
100 if (!rpcif_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl)) in rpcif_spi_mem_dirmap_create()
101 return -ENOTSUPP; in rpcif_spi_mem_dirmap_create()
103 if (!rpc->dirmap && desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN) in rpcif_spi_mem_dirmap_create()
104 return -ENOTSUPP; in rpcif_spi_mem_dirmap_create()
106 if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT) in rpcif_spi_mem_dirmap_create()
107 return -ENOTSUPP; in rpcif_spi_mem_dirmap_create()
115 struct rpcif *rpc = in rpcif_spi_mem_exec_op() local
116 spi_controller_get_devdata(mem->spi->controller); in rpcif_spi_mem_exec_op()
118 rpcif_spi_mem_prepare(mem->spi, op, NULL, NULL); in rpcif_spi_mem_exec_op()
120 return rpcif_manual_xfer(rpc->dev); in rpcif_spi_mem_exec_op()
132 struct device *parent = pdev->dev.parent; in rpcif_spi_probe()
134 struct rpcif *rpc; in rpcif_spi_probe() local
137 ctlr = devm_spi_alloc_host(&pdev->dev, sizeof(*rpc)); in rpcif_spi_probe()
138 if (!ctlr) in rpcif_spi_probe()
139 return -ENOMEM; in rpcif_spi_probe()
141 rpc = spi_controller_get_devdata(ctlr); in rpcif_spi_probe()
142 error = rpcif_sw_init(rpc, parent); in rpcif_spi_probe()
143 if (error) in rpcif_spi_probe()
148 ctlr->dev.of_node = parent->of_node; in rpcif_spi_probe()
150 pm_runtime_enable(rpc->dev); in rpcif_spi_probe()
152 ctlr->num_chipselect = 1; in rpcif_spi_probe()
153 ctlr->mem_ops = &rpcif_spi_mem_ops; in rpcif_spi_probe()
155 ctlr->bits_per_word_mask = SPI_BPW_MASK(8); in rpcif_spi_probe()
156 ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_TX_QUAD | SPI_RX_QUAD; in rpcif_spi_probe()
157 ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX; in rpcif_spi_probe()
159 error = rpcif_hw_init(rpc->dev, false); in rpcif_spi_probe()
160 if (error) in rpcif_spi_probe()
164 if (error) { in rpcif_spi_probe()
165 dev_err(&pdev->dev, "spi_register_controller failed\n"); in rpcif_spi_probe()
172 pm_runtime_disable(rpc->dev); in rpcif_spi_probe()
179 struct rpcif *rpc = spi_controller_get_devdata(ctlr); in rpcif_spi_remove() local
182 pm_runtime_disable(rpc->dev); in rpcif_spi_remove()
205 .name = "rpc-if-spi",
213 MODULE_DESCRIPTION("Renesas RPC-IF SPI driver");