Lines Matching +full:spi +full:- +full:based

1 // SPDX-License-Identifier: GPL-2.0-only
3 * SH SCI SPI interface
7 * Based on S3C24XX GPIO based SPI driver, which is:
17 #include <linux/spi/spi.h>
18 #include <linux/spi/spi_bitbang.h>
21 #include <asm/spi.h>
33 #define SCSPTR(sp) (sp->membase + 0x1c)
45 * This makes regular read-modify-write difficult so we in setbits()
46 * use sp->val to keep track of the latest register value. in setbits()
50 sp->val |= bits; in setbits()
52 sp->val &= ~bits; in setbits()
54 iowrite8(sp->val, SCSPTR(sp)); in setbits()
59 setbits(spi_controller_get_devdata(dev->controller), PIN_SCK, on); in setsck()
64 setbits(spi_controller_get_devdata(dev->controller), PIN_TXD, on); in setmosi()
69 struct sh_sci_spi *sp = spi_controller_get_devdata(dev->controller); in getmiso()
76 #include "spi-bitbang-txrx.h"
78 static u32 sh_sci_spi_txrx_mode0(struct spi_device *spi, in sh_sci_spi_txrx_mode0() argument
82 return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); in sh_sci_spi_txrx_mode0()
85 static u32 sh_sci_spi_txrx_mode1(struct spi_device *spi, in sh_sci_spi_txrx_mode1() argument
89 return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); in sh_sci_spi_txrx_mode1()
92 static u32 sh_sci_spi_txrx_mode2(struct spi_device *spi, in sh_sci_spi_txrx_mode2() argument
96 return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); in sh_sci_spi_txrx_mode2()
99 static u32 sh_sci_spi_txrx_mode3(struct spi_device *spi, in sh_sci_spi_txrx_mode3() argument
103 return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); in sh_sci_spi_txrx_mode3()
108 struct sh_sci_spi *sp = spi_controller_get_devdata(dev->controller); in sh_sci_spi_chipselect()
110 if (sp->info->chip_select) in sh_sci_spi_chipselect()
111 (sp->info->chip_select)(sp->info, spi_get_chipselect(dev, 0), value); in sh_sci_spi_chipselect()
121 host = spi_alloc_host(&dev->dev, sizeof(struct sh_sci_spi)); in sh_sci_spi_probe()
123 dev_err(&dev->dev, "failed to allocate spi host\n"); in sh_sci_spi_probe()
124 ret = -ENOMEM; in sh_sci_spi_probe()
131 sp->info = dev_get_platdata(&dev->dev); in sh_sci_spi_probe()
132 if (!sp->info) { in sh_sci_spi_probe()
133 dev_err(&dev->dev, "platform data is missing\n"); in sh_sci_spi_probe()
134 ret = -ENOENT; in sh_sci_spi_probe()
138 /* setup spi bitbang adaptor */ in sh_sci_spi_probe()
139 sp->bitbang.ctlr = host; in sh_sci_spi_probe()
140 sp->bitbang.ctlr->bus_num = sp->info->bus_num; in sh_sci_spi_probe()
141 sp->bitbang.ctlr->num_chipselect = sp->info->num_chipselect; in sh_sci_spi_probe()
142 sp->bitbang.chipselect = sh_sci_spi_chipselect; in sh_sci_spi_probe()
144 sp->bitbang.txrx_word[SPI_MODE_0] = sh_sci_spi_txrx_mode0; in sh_sci_spi_probe()
145 sp->bitbang.txrx_word[SPI_MODE_1] = sh_sci_spi_txrx_mode1; in sh_sci_spi_probe()
146 sp->bitbang.txrx_word[SPI_MODE_2] = sh_sci_spi_txrx_mode2; in sh_sci_spi_probe()
147 sp->bitbang.txrx_word[SPI_MODE_3] = sh_sci_spi_txrx_mode3; in sh_sci_spi_probe()
151 ret = -ENOENT; in sh_sci_spi_probe()
154 sp->membase = ioremap(r->start, resource_size(r)); in sh_sci_spi_probe()
155 if (!sp->membase) { in sh_sci_spi_probe()
156 ret = -ENXIO; in sh_sci_spi_probe()
159 sp->val = ioread8(SCSPTR(sp)); in sh_sci_spi_probe()
162 ret = spi_bitbang_start(&sp->bitbang); in sh_sci_spi_probe()
167 iounmap(sp->membase); in sh_sci_spi_probe()
169 spi_controller_put(sp->bitbang.ctlr); in sh_sci_spi_probe()
178 spi_bitbang_stop(&sp->bitbang); in sh_sci_spi_remove()
180 iounmap(sp->membase); in sh_sci_spi_remove()
181 spi_controller_put(sp->bitbang.ctlr); in sh_sci_spi_remove()
193 MODULE_DESCRIPTION("SH SCI SPI Driver");