0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/spi/spi.h>
0013 #include <linux/spi/spi-mem.h>
0014
0015 #include <memory/renesas-rpc-if.h>
0016
0017 #include <asm/unaligned.h>
0018
0019 static void rpcif_spi_mem_prepare(struct spi_device *spi_dev,
0020 const struct spi_mem_op *spi_op,
0021 u64 *offs, size_t *len)
0022 {
0023 struct rpcif *rpc = spi_controller_get_devdata(spi_dev->controller);
0024 struct rpcif_op rpc_op = { };
0025
0026 rpc_op.cmd.opcode = spi_op->cmd.opcode;
0027 rpc_op.cmd.buswidth = spi_op->cmd.buswidth;
0028
0029 if (spi_op->addr.nbytes) {
0030 rpc_op.addr.buswidth = spi_op->addr.buswidth;
0031 rpc_op.addr.nbytes = spi_op->addr.nbytes;
0032 rpc_op.addr.val = spi_op->addr.val;
0033 }
0034
0035 if (spi_op->dummy.nbytes) {
0036 rpc_op.dummy.buswidth = spi_op->dummy.buswidth;
0037 rpc_op.dummy.ncycles = spi_op->dummy.nbytes * 8 /
0038 spi_op->dummy.buswidth;
0039 }
0040
0041 if (spi_op->data.nbytes || (offs && len)) {
0042 rpc_op.data.buswidth = spi_op->data.buswidth;
0043 rpc_op.data.nbytes = spi_op->data.nbytes;
0044 switch (spi_op->data.dir) {
0045 case SPI_MEM_DATA_IN:
0046 rpc_op.data.dir = RPCIF_DATA_IN;
0047 rpc_op.data.buf.in = spi_op->data.buf.in;
0048 break;
0049 case SPI_MEM_DATA_OUT:
0050 rpc_op.data.dir = RPCIF_DATA_OUT;
0051 rpc_op.data.buf.out = spi_op->data.buf.out;
0052 break;
0053 case SPI_MEM_NO_DATA:
0054 rpc_op.data.dir = RPCIF_NO_DATA;
0055 break;
0056 }
0057 } else {
0058 rpc_op.data.dir = RPCIF_NO_DATA;
0059 }
0060
0061 rpcif_prepare(rpc, &rpc_op, offs, len);
0062 }
0063
0064 static bool rpcif_spi_mem_supports_op(struct spi_mem *mem,
0065 const struct spi_mem_op *op)
0066 {
0067 if (!spi_mem_default_supports_op(mem, op))
0068 return false;
0069
0070 if (op->data.buswidth > 4 || op->addr.buswidth > 4 ||
0071 op->dummy.buswidth > 4 || op->cmd.buswidth > 4 ||
0072 op->addr.nbytes > 4)
0073 return false;
0074
0075 return true;
0076 }
0077
0078 static ssize_t rpcif_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
0079 u64 offs, size_t len, void *buf)
0080 {
0081 struct rpcif *rpc =
0082 spi_controller_get_devdata(desc->mem->spi->controller);
0083
0084 if (offs + desc->info.offset + len > U32_MAX)
0085 return -EINVAL;
0086
0087 rpcif_spi_mem_prepare(desc->mem->spi, &desc->info.op_tmpl, &offs, &len);
0088
0089 return rpcif_dirmap_read(rpc, offs, len, buf);
0090 }
0091
0092 static int rpcif_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
0093 {
0094 struct rpcif *rpc =
0095 spi_controller_get_devdata(desc->mem->spi->controller);
0096
0097 if (desc->info.offset + desc->info.length > U32_MAX)
0098 return -ENOTSUPP;
0099
0100 if (!rpcif_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
0101 return -ENOTSUPP;
0102
0103 if (!rpc->dirmap && desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN)
0104 return -ENOTSUPP;
0105
0106 if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT)
0107 return -ENOTSUPP;
0108
0109 return 0;
0110 }
0111
0112 static int rpcif_spi_mem_exec_op(struct spi_mem *mem,
0113 const struct spi_mem_op *op)
0114 {
0115 struct rpcif *rpc =
0116 spi_controller_get_devdata(mem->spi->controller);
0117
0118 rpcif_spi_mem_prepare(mem->spi, op, NULL, NULL);
0119
0120 return rpcif_manual_xfer(rpc);
0121 }
0122
0123 static const struct spi_controller_mem_ops rpcif_spi_mem_ops = {
0124 .supports_op = rpcif_spi_mem_supports_op,
0125 .exec_op = rpcif_spi_mem_exec_op,
0126 .dirmap_create = rpcif_spi_mem_dirmap_create,
0127 .dirmap_read = rpcif_spi_mem_dirmap_read,
0128 };
0129
0130 static int rpcif_spi_probe(struct platform_device *pdev)
0131 {
0132 struct device *parent = pdev->dev.parent;
0133 struct spi_controller *ctlr;
0134 struct rpcif *rpc;
0135 int error;
0136
0137 ctlr = devm_spi_alloc_master(&pdev->dev, sizeof(*rpc));
0138 if (!ctlr)
0139 return -ENOMEM;
0140
0141 rpc = spi_controller_get_devdata(ctlr);
0142 error = rpcif_sw_init(rpc, parent);
0143 if (error)
0144 return error;
0145
0146 platform_set_drvdata(pdev, ctlr);
0147
0148 ctlr->dev.of_node = parent->of_node;
0149
0150 rpcif_enable_rpm(rpc);
0151
0152 ctlr->num_chipselect = 1;
0153 ctlr->mem_ops = &rpcif_spi_mem_ops;
0154
0155 ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
0156 ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_TX_QUAD | SPI_RX_QUAD;
0157 ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX;
0158
0159 error = rpcif_hw_init(rpc, false);
0160 if (error)
0161 goto out_disable_rpm;
0162
0163 error = spi_register_controller(ctlr);
0164 if (error) {
0165 dev_err(&pdev->dev, "spi_register_controller failed\n");
0166 goto out_disable_rpm;
0167 }
0168
0169 return 0;
0170
0171 out_disable_rpm:
0172 rpcif_disable_rpm(rpc);
0173 return error;
0174 }
0175
0176 static int rpcif_spi_remove(struct platform_device *pdev)
0177 {
0178 struct spi_controller *ctlr = platform_get_drvdata(pdev);
0179 struct rpcif *rpc = spi_controller_get_devdata(ctlr);
0180
0181 spi_unregister_controller(ctlr);
0182 rpcif_disable_rpm(rpc);
0183
0184 return 0;
0185 }
0186
0187 static int __maybe_unused rpcif_spi_suspend(struct device *dev)
0188 {
0189 struct spi_controller *ctlr = dev_get_drvdata(dev);
0190
0191 return spi_controller_suspend(ctlr);
0192 }
0193
0194 static int __maybe_unused rpcif_spi_resume(struct device *dev)
0195 {
0196 struct spi_controller *ctlr = dev_get_drvdata(dev);
0197
0198 return spi_controller_resume(ctlr);
0199 }
0200
0201 static SIMPLE_DEV_PM_OPS(rpcif_spi_pm_ops, rpcif_spi_suspend, rpcif_spi_resume);
0202
0203 static struct platform_driver rpcif_spi_driver = {
0204 .probe = rpcif_spi_probe,
0205 .remove = rpcif_spi_remove,
0206 .driver = {
0207 .name = "rpc-if-spi",
0208 #ifdef CONFIG_PM_SLEEP
0209 .pm = &rpcif_spi_pm_ops,
0210 #endif
0211 },
0212 };
0213 module_platform_driver(rpcif_spi_driver);
0214
0215 MODULE_DESCRIPTION("Renesas RPC-IF SPI driver");
0216 MODULE_LICENSE("GPL v2");