1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2006 Ben Dooks
4 * Copyright 2006-2009 Simtec Electronics
5 * Ben Dooks <ben@simtec.co.uk>
8 #include <linux/spinlock.h>
9 #include <linux/interrupt.h>
10 #include <linux/delay.h>
11 #include <linux/errno.h>
12 #include <linux/err.h>
13 #include <linux/clk.h>
14 #include <linux/platform_device.h>
15 #include <linux/gpio.h>
17 #include <linux/slab.h>
19 #include <linux/spi/spi.h>
20 #include <linux/spi/spi_bitbang.h>
21 #include <linux/spi/s3c24xx.h>
22 #include <linux/spi/s3c24xx-fiq.h>
23 #include <linux/module.h>
27 #include "spi-s3c24xx-regs.h"
30 * struct s3c24xx_spi_devstate - per device data
31 * @hz: Last frequency calculated for @sppre field.
32 * @mode: Last mode setting for the @spcon field.
33 * @spcon: Value to write to the SPCON register.
34 * @sppre: Value to write to the SPPRE register.
36 struct s3c24xx_spi_devstate {
51 /* bitbang has to be first */
52 struct spi_bitbang bitbang;
53 struct completion done;
60 struct fiq_handler fiq_handler;
61 enum spi_fiq_mode fiq_mode;
62 unsigned char fiq_inuse;
63 unsigned char fiq_claimed;
65 void (*set_cs)(struct s3c2410_spi_info *spi,
69 const unsigned char *tx;
73 struct spi_master *master;
74 struct spi_device *curdev;
76 struct s3c2410_spi_info *pdata;
79 #define SPCON_DEFAULT (S3C2410_SPCON_MSTR | S3C2410_SPCON_SMOD_INT)
80 #define SPPIN_DEFAULT (S3C2410_SPPIN_KEEP)
82 static inline struct s3c24xx_spi *to_hw(struct spi_device *sdev)
84 return spi_master_get_devdata(sdev->master);
87 static void s3c24xx_spi_gpiocs(struct s3c2410_spi_info *spi, int cs, int pol)
89 gpio_set_value(spi->pin_cs, pol);
92 static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)
94 struct s3c24xx_spi_devstate *cs = spi->controller_state;
95 struct s3c24xx_spi *hw = to_hw(spi);
96 unsigned int cspol = spi->mode & SPI_CS_HIGH ? 1 : 0;
98 /* change the chipselect state and the state of the spi engine clock */
101 case BITBANG_CS_INACTIVE:
102 hw->set_cs(hw->pdata, spi->chip_select, cspol^1);
103 writeb(cs->spcon, hw->regs + S3C2410_SPCON);
106 case BITBANG_CS_ACTIVE:
107 writeb(cs->spcon | S3C2410_SPCON_ENSCK,
108 hw->regs + S3C2410_SPCON);
109 hw->set_cs(hw->pdata, spi->chip_select, cspol);
114 static int s3c24xx_spi_update_state(struct spi_device *spi,
115 struct spi_transfer *t)
117 struct s3c24xx_spi *hw = to_hw(spi);
118 struct s3c24xx_spi_devstate *cs = spi->controller_state;
123 hz = t ? t->speed_hz : spi->max_speed_hz;
126 hz = spi->max_speed_hz;
128 if (spi->mode != cs->mode) {
129 u8 spcon = SPCON_DEFAULT | S3C2410_SPCON_ENSCK;
131 if (spi->mode & SPI_CPHA)
132 spcon |= S3C2410_SPCON_CPHA_FMTB;
134 if (spi->mode & SPI_CPOL)
135 spcon |= S3C2410_SPCON_CPOL_HIGH;
137 cs->mode = spi->mode;
142 clk = clk_get_rate(hw->clk);
143 div = DIV_ROUND_UP(clk, hz * 2) - 1;
148 dev_dbg(&spi->dev, "pre-scaler=%d (wanted %d, got %ld)\n",
149 div, hz, clk / (2 * (div + 1)));
158 static int s3c24xx_spi_setupxfer(struct spi_device *spi,
159 struct spi_transfer *t)
161 struct s3c24xx_spi_devstate *cs = spi->controller_state;
162 struct s3c24xx_spi *hw = to_hw(spi);
165 ret = s3c24xx_spi_update_state(spi, t);
167 writeb(cs->sppre, hw->regs + S3C2410_SPPRE);
172 static int s3c24xx_spi_setup(struct spi_device *spi)
174 struct s3c24xx_spi_devstate *cs = spi->controller_state;
175 struct s3c24xx_spi *hw = to_hw(spi);
178 /* allocate settings on the first call */
180 cs = devm_kzalloc(&spi->dev,
181 sizeof(struct s3c24xx_spi_devstate),
186 cs->spcon = SPCON_DEFAULT;
188 spi->controller_state = cs;
191 /* initialise the state from the device */
192 ret = s3c24xx_spi_update_state(spi, NULL);
196 mutex_lock(&hw->bitbang.lock);
197 if (!hw->bitbang.busy) {
198 hw->bitbang.chipselect(spi, BITBANG_CS_INACTIVE);
199 /* need to ndelay for 0.5 clocktick ? */
201 mutex_unlock(&hw->bitbang.lock);
206 static inline unsigned int hw_txbyte(struct s3c24xx_spi *hw, int count)
208 return hw->tx ? hw->tx[count] : 0;
211 #ifdef CONFIG_SPI_S3C24XX_FIQ
212 /* Support for FIQ based pseudo-DMA to improve the transfer speed.
214 * This code uses the assembly helper in spi_s3c24xx_spi.S which is
215 * used by the FIQ core to move data between main memory and the peripheral
216 * block. Since this is code running on the processor, there is no problem
217 * with cache coherency of the buffers, so we can use any buffer we like.
221 * struct spi_fiq_code - FIQ code and header
222 * @length: The length of the code fragment, excluding this header.
223 * @ack_offset: The offset from @data to the word to place the IRQ ACK bit at.
224 * @data: The code itself to install as a FIQ handler.
226 struct spi_fiq_code {
233 * s3c24xx_spi_tryfiq - attempt to claim and setup FIQ for transfer
234 * @hw: The hardware state.
236 * Claim the FIQ handler (only one can be active at any one time) and
237 * then setup the correct transfer code for this transfer.
239 * This call updates all the necessary state information if successful,
240 * so the caller does not need to do anything more than start the transfer
241 * as normal, since the IRQ will have been re-routed to the FIQ handler.
243 static void s3c24xx_spi_tryfiq(struct s3c24xx_spi *hw)
246 enum spi_fiq_mode mode;
247 struct spi_fiq_code *code;
251 if (!hw->fiq_claimed) {
252 /* try and claim fiq if we haven't got it, and if not
253 * then return and simply use another transfer method */
255 ret = claim_fiq(&hw->fiq_handler);
260 if (hw->tx && !hw->rx)
262 else if (hw->rx && !hw->tx)
265 mode = FIQ_MODE_TXRX;
267 regs.uregs[fiq_rspi] = (long)hw->regs;
268 regs.uregs[fiq_rrx] = (long)hw->rx;
269 regs.uregs[fiq_rtx] = (long)hw->tx + 1;
270 regs.uregs[fiq_rcount] = hw->len - 1;
274 if (hw->fiq_mode != mode) {
279 code = &s3c24xx_spi_fiq_tx;
282 code = &s3c24xx_spi_fiq_rx;
285 code = &s3c24xx_spi_fiq_txrx;
293 ack_ptr = (u32 *)&code->data[code->ack_offset];
294 set_fiq_handler(&code->data, code->length);
297 s3c24xx_set_fiq(hw->irq, ack_ptr, true);
304 * s3c24xx_spi_fiqop - FIQ core code callback
305 * @pw: Data registered with the handler
306 * @release: Whether this is a release or a return.
308 * Called by the FIQ code when another module wants to use the FIQ, so
309 * return whether we are currently using this or not and then update our
312 static int s3c24xx_spi_fiqop(void *pw, int release)
314 struct s3c24xx_spi *hw = pw;
321 /* note, we do not need to unroute the FIQ, as the FIQ
322 * vector code de-routes it to signal the end of transfer */
324 hw->fiq_mode = FIQ_MODE_NONE;
334 * s3c24xx_spi_initfiq - setup the information for the FIQ core
335 * @hw: The hardware state.
337 * Setup the fiq_handler block to pass to the FIQ core.
339 static inline void s3c24xx_spi_initfiq(struct s3c24xx_spi *hw)
341 hw->fiq_handler.dev_id = hw;
342 hw->fiq_handler.name = dev_name(hw->dev);
343 hw->fiq_handler.fiq_op = s3c24xx_spi_fiqop;
347 * s3c24xx_spi_usefiq - return if we should be using FIQ.
348 * @hw: The hardware state.
350 * Return true if the platform data specifies whether this channel is
351 * allowed to use the FIQ.
353 static inline bool s3c24xx_spi_usefiq(struct s3c24xx_spi *hw)
355 return hw->pdata->use_fiq;
359 * s3c24xx_spi_usingfiq - return if channel is using FIQ
360 * @spi: The hardware state.
362 * Return whether the channel is currently using the FIQ (separate from
363 * whether the FIQ is claimed).
365 static inline bool s3c24xx_spi_usingfiq(struct s3c24xx_spi *spi)
367 return spi->fiq_inuse;
371 static inline void s3c24xx_spi_initfiq(struct s3c24xx_spi *s) { }
372 static inline void s3c24xx_spi_tryfiq(struct s3c24xx_spi *s) { }
373 static inline bool s3c24xx_spi_usefiq(struct s3c24xx_spi *s) { return false; }
374 static inline bool s3c24xx_spi_usingfiq(struct s3c24xx_spi *s) { return false; }
376 #endif /* CONFIG_SPI_S3C24XX_FIQ */
378 static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
380 struct s3c24xx_spi *hw = to_hw(spi);
387 init_completion(&hw->done);
390 if (s3c24xx_spi_usefiq(hw) && t->len >= 3)
391 s3c24xx_spi_tryfiq(hw);
393 /* send the first byte */
394 writeb(hw_txbyte(hw, 0), hw->regs + S3C2410_SPTDAT);
396 wait_for_completion(&hw->done);
400 static irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
402 struct s3c24xx_spi *hw = dev;
403 unsigned int spsta = readb(hw->regs + S3C2410_SPSTA);
404 unsigned int count = hw->count;
406 if (spsta & S3C2410_SPSTA_DCOL) {
407 dev_dbg(hw->dev, "data-collision\n");
412 if (!(spsta & S3C2410_SPSTA_READY)) {
413 dev_dbg(hw->dev, "spi not ready for tx?\n");
418 if (!s3c24xx_spi_usingfiq(hw)) {
422 hw->rx[count] = readb(hw->regs + S3C2410_SPRDAT);
427 writeb(hw_txbyte(hw, count), hw->regs + S3C2410_SPTDAT);
435 hw->rx[hw->len-1] = readb(hw->regs + S3C2410_SPRDAT);
444 static void s3c24xx_spi_initialsetup(struct s3c24xx_spi *hw)
446 /* for the moment, permanently enable the clock */
450 /* program defaults into the registers */
452 writeb(0xff, hw->regs + S3C2410_SPPRE);
453 writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
454 writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);
457 if (hw->set_cs == s3c24xx_spi_gpiocs)
458 gpio_direction_output(hw->pdata->pin_cs, 1);
460 if (hw->pdata->gpio_setup)
461 hw->pdata->gpio_setup(hw->pdata, 1);
465 static int s3c24xx_spi_probe(struct platform_device *pdev)
467 struct s3c2410_spi_info *pdata;
468 struct s3c24xx_spi *hw;
469 struct spi_master *master;
472 master = spi_alloc_master(&pdev->dev, sizeof(struct s3c24xx_spi));
473 if (master == NULL) {
474 dev_err(&pdev->dev, "No memory for spi_master\n");
478 hw = spi_master_get_devdata(master);
481 hw->pdata = pdata = dev_get_platdata(&pdev->dev);
482 hw->dev = &pdev->dev;
485 dev_err(&pdev->dev, "No platform data supplied\n");
490 platform_set_drvdata(pdev, hw);
491 init_completion(&hw->done);
493 /* initialise fiq handler */
495 s3c24xx_spi_initfiq(hw);
497 /* setup the master state. */
499 /* the spi->mode bits understood by this driver: */
500 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
502 master->num_chipselect = hw->pdata->num_cs;
503 master->bus_num = pdata->bus_num;
504 master->bits_per_word_mask = SPI_BPW_MASK(8);
506 /* setup the state for the bitbang driver */
508 hw->bitbang.master = hw->master;
509 hw->bitbang.setup_transfer = s3c24xx_spi_setupxfer;
510 hw->bitbang.chipselect = s3c24xx_spi_chipsel;
511 hw->bitbang.txrx_bufs = s3c24xx_spi_txrx;
513 hw->master->setup = s3c24xx_spi_setup;
515 dev_dbg(hw->dev, "bitbang at %p\n", &hw->bitbang);
517 /* find and map our resources */
518 hw->regs = devm_platform_ioremap_resource(pdev, 0);
519 if (IS_ERR(hw->regs)) {
520 err = PTR_ERR(hw->regs);
524 hw->irq = platform_get_irq(pdev, 0);
530 err = devm_request_irq(&pdev->dev, hw->irq, s3c24xx_spi_irq, 0,
533 dev_err(&pdev->dev, "Cannot claim IRQ\n");
537 hw->clk = devm_clk_get(&pdev->dev, "spi");
538 if (IS_ERR(hw->clk)) {
539 dev_err(&pdev->dev, "No clock for device\n");
540 err = PTR_ERR(hw->clk);
544 /* setup any gpio we can */
546 if (!pdata->set_cs) {
547 if (pdata->pin_cs < 0) {
548 dev_err(&pdev->dev, "No chipselect pin\n");
553 err = devm_gpio_request(&pdev->dev, pdata->pin_cs,
554 dev_name(&pdev->dev));
556 dev_err(&pdev->dev, "Failed to get gpio for cs\n");
560 hw->set_cs = s3c24xx_spi_gpiocs;
561 gpio_direction_output(pdata->pin_cs, 1);
563 hw->set_cs = pdata->set_cs;
565 s3c24xx_spi_initialsetup(hw);
567 /* register our spi controller */
569 err = spi_bitbang_start(&hw->bitbang);
571 dev_err(&pdev->dev, "Failed to register SPI master\n");
578 clk_disable(hw->clk);
581 spi_master_put(hw->master);
585 static int s3c24xx_spi_remove(struct platform_device *dev)
587 struct s3c24xx_spi *hw = platform_get_drvdata(dev);
589 spi_bitbang_stop(&hw->bitbang);
590 clk_disable(hw->clk);
591 spi_master_put(hw->master);
598 static int s3c24xx_spi_suspend(struct device *dev)
600 struct s3c24xx_spi *hw = dev_get_drvdata(dev);
603 ret = spi_master_suspend(hw->master);
607 if (hw->pdata && hw->pdata->gpio_setup)
608 hw->pdata->gpio_setup(hw->pdata, 0);
610 clk_disable(hw->clk);
614 static int s3c24xx_spi_resume(struct device *dev)
616 struct s3c24xx_spi *hw = dev_get_drvdata(dev);
618 s3c24xx_spi_initialsetup(hw);
619 return spi_master_resume(hw->master);
622 static const struct dev_pm_ops s3c24xx_spi_pmops = {
623 .suspend = s3c24xx_spi_suspend,
624 .resume = s3c24xx_spi_resume,
627 #define S3C24XX_SPI_PMOPS &s3c24xx_spi_pmops
629 #define S3C24XX_SPI_PMOPS NULL
630 #endif /* CONFIG_PM */
632 MODULE_ALIAS("platform:s3c2410-spi");
633 static struct platform_driver s3c24xx_spi_driver = {
634 .probe = s3c24xx_spi_probe,
635 .remove = s3c24xx_spi_remove,
637 .name = "s3c2410-spi",
638 .pm = S3C24XX_SPI_PMOPS,
641 module_platform_driver(s3c24xx_spi_driver);
643 MODULE_DESCRIPTION("S3C24XX SPI Driver");
644 MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
645 MODULE_LICENSE("GPL");