OSDN Git Service

spi: spi-s3c24xx: remove redundant return value check of platform_get_resource()
[uclinux-h8/linux.git] / drivers / spi / spi-s3c24xx.c
1 /*
2  * Copyright (c) 2006 Ben Dooks
3  * Copyright 2006-2009 Simtec Electronics
4  *      Ben Dooks <ben@simtec.co.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10 */
11
12 #include <linux/init.h>
13 #include <linux/spinlock.h>
14 #include <linux/workqueue.h>
15 #include <linux/interrupt.h>
16 #include <linux/delay.h>
17 #include <linux/errno.h>
18 #include <linux/err.h>
19 #include <linux/clk.h>
20 #include <linux/platform_device.h>
21 #include <linux/gpio.h>
22 #include <linux/io.h>
23 #include <linux/slab.h>
24
25 #include <linux/spi/spi.h>
26 #include <linux/spi/spi_bitbang.h>
27 #include <linux/spi/s3c24xx.h>
28 #include <linux/module.h>
29
30 #include <plat/regs-spi.h>
31
32 #include <plat/fiq.h>
33 #include <asm/fiq.h>
34
35 #include "spi-s3c24xx-fiq.h"
36
37 /**
38  * s3c24xx_spi_devstate - per device data
39  * @hz: Last frequency calculated for @sppre field.
40  * @mode: Last mode setting for the @spcon field.
41  * @spcon: Value to write to the SPCON register.
42  * @sppre: Value to write to the SPPRE register.
43  */
44 struct s3c24xx_spi_devstate {
45         unsigned int    hz;
46         unsigned int    mode;
47         u8              spcon;
48         u8              sppre;
49 };
50
51 enum spi_fiq_mode {
52         FIQ_MODE_NONE   = 0,
53         FIQ_MODE_TX     = 1,
54         FIQ_MODE_RX     = 2,
55         FIQ_MODE_TXRX   = 3,
56 };
57
58 struct s3c24xx_spi {
59         /* bitbang has to be first */
60         struct spi_bitbang       bitbang;
61         struct completion        done;
62
63         void __iomem            *regs;
64         int                      irq;
65         int                      len;
66         int                      count;
67
68         struct fiq_handler       fiq_handler;
69         enum spi_fiq_mode        fiq_mode;
70         unsigned char            fiq_inuse;
71         unsigned char            fiq_claimed;
72
73         void                    (*set_cs)(struct s3c2410_spi_info *spi,
74                                           int cs, int pol);
75
76         /* data buffers */
77         const unsigned char     *tx;
78         unsigned char           *rx;
79
80         struct clk              *clk;
81         struct spi_master       *master;
82         struct spi_device       *curdev;
83         struct device           *dev;
84         struct s3c2410_spi_info *pdata;
85 };
86
87
88 #define SPCON_DEFAULT (S3C2410_SPCON_MSTR | S3C2410_SPCON_SMOD_INT)
89 #define SPPIN_DEFAULT (S3C2410_SPPIN_KEEP)
90
91 static inline struct s3c24xx_spi *to_hw(struct spi_device *sdev)
92 {
93         return spi_master_get_devdata(sdev->master);
94 }
95
96 static void s3c24xx_spi_gpiocs(struct s3c2410_spi_info *spi, int cs, int pol)
97 {
98         gpio_set_value(spi->pin_cs, pol);
99 }
100
101 static void s3c24xx_spi_chipsel(struct spi_device *spi, int value)
102 {
103         struct s3c24xx_spi_devstate *cs = spi->controller_state;
104         struct s3c24xx_spi *hw = to_hw(spi);
105         unsigned int cspol = spi->mode & SPI_CS_HIGH ? 1 : 0;
106
107         /* change the chipselect state and the state of the spi engine clock */
108
109         switch (value) {
110         case BITBANG_CS_INACTIVE:
111                 hw->set_cs(hw->pdata, spi->chip_select, cspol^1);
112                 writeb(cs->spcon, hw->regs + S3C2410_SPCON);
113                 break;
114
115         case BITBANG_CS_ACTIVE:
116                 writeb(cs->spcon | S3C2410_SPCON_ENSCK,
117                        hw->regs + S3C2410_SPCON);
118                 hw->set_cs(hw->pdata, spi->chip_select, cspol);
119                 break;
120         }
121 }
122
123 static int s3c24xx_spi_update_state(struct spi_device *spi,
124                                     struct spi_transfer *t)
125 {
126         struct s3c24xx_spi *hw = to_hw(spi);
127         struct s3c24xx_spi_devstate *cs = spi->controller_state;
128         unsigned int bpw;
129         unsigned int hz;
130         unsigned int div;
131         unsigned long clk;
132
133         bpw = t ? t->bits_per_word : spi->bits_per_word;
134         hz  = t ? t->speed_hz : spi->max_speed_hz;
135
136         if (!bpw)
137                 bpw = 8;
138
139         if (!hz)
140                 hz = spi->max_speed_hz;
141
142         if (bpw != 8) {
143                 dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);
144                 return -EINVAL;
145         }
146
147         if (spi->mode != cs->mode) {
148                 u8 spcon = SPCON_DEFAULT | S3C2410_SPCON_ENSCK;
149
150                 if (spi->mode & SPI_CPHA)
151                         spcon |= S3C2410_SPCON_CPHA_FMTB;
152
153                 if (spi->mode & SPI_CPOL)
154                         spcon |= S3C2410_SPCON_CPOL_HIGH;
155
156                 cs->mode = spi->mode;
157                 cs->spcon = spcon;
158         }
159
160         if (cs->hz != hz) {
161                 clk = clk_get_rate(hw->clk);
162                 div = DIV_ROUND_UP(clk, hz * 2) - 1;
163
164                 if (div > 255)
165                         div = 255;
166
167                 dev_dbg(&spi->dev, "pre-scaler=%d (wanted %d, got %ld)\n",
168                         div, hz, clk / (2 * (div + 1)));
169
170                 cs->hz = hz;
171                 cs->sppre = div;
172         }
173
174         return 0;
175 }
176
177 static int s3c24xx_spi_setupxfer(struct spi_device *spi,
178                                  struct spi_transfer *t)
179 {
180         struct s3c24xx_spi_devstate *cs = spi->controller_state;
181         struct s3c24xx_spi *hw = to_hw(spi);
182         int ret;
183
184         ret = s3c24xx_spi_update_state(spi, t);
185         if (!ret)
186                 writeb(cs->sppre, hw->regs + S3C2410_SPPRE);
187
188         return ret;
189 }
190
191 static int s3c24xx_spi_setup(struct spi_device *spi)
192 {
193         struct s3c24xx_spi_devstate *cs = spi->controller_state;
194         struct s3c24xx_spi *hw = to_hw(spi);
195         int ret;
196
197         /* allocate settings on the first call */
198         if (!cs) {
199                 cs = kzalloc(sizeof(struct s3c24xx_spi_devstate), GFP_KERNEL);
200                 if (!cs) {
201                         dev_err(&spi->dev, "no memory for controller state\n");
202                         return -ENOMEM;
203                 }
204
205                 cs->spcon = SPCON_DEFAULT;
206                 cs->hz = -1;
207                 spi->controller_state = cs;
208         }
209
210         /* initialise the state from the device */
211         ret = s3c24xx_spi_update_state(spi, NULL);
212         if (ret)
213                 return ret;
214
215         spin_lock(&hw->bitbang.lock);
216         if (!hw->bitbang.busy) {
217                 hw->bitbang.chipselect(spi, BITBANG_CS_INACTIVE);
218                 /* need to ndelay for 0.5 clocktick ? */
219         }
220         spin_unlock(&hw->bitbang.lock);
221
222         return 0;
223 }
224
225 static void s3c24xx_spi_cleanup(struct spi_device *spi)
226 {
227         kfree(spi->controller_state);
228 }
229
230 static inline unsigned int hw_txbyte(struct s3c24xx_spi *hw, int count)
231 {
232         return hw->tx ? hw->tx[count] : 0;
233 }
234
235 #ifdef CONFIG_SPI_S3C24XX_FIQ
236 /* Support for FIQ based pseudo-DMA to improve the transfer speed.
237  *
238  * This code uses the assembly helper in spi_s3c24xx_spi.S which is
239  * used by the FIQ core to move data between main memory and the peripheral
240  * block. Since this is code running on the processor, there is no problem
241  * with cache coherency of the buffers, so we can use any buffer we like.
242  */
243
244 /**
245  * struct spi_fiq_code - FIQ code and header
246  * @length: The length of the code fragment, excluding this header.
247  * @ack_offset: The offset from @data to the word to place the IRQ ACK bit at.
248  * @data: The code itself to install as a FIQ handler.
249  */
250 struct spi_fiq_code {
251         u32     length;
252         u32     ack_offset;
253         u8      data[0];
254 };
255
256 extern struct spi_fiq_code s3c24xx_spi_fiq_txrx;
257 extern struct spi_fiq_code s3c24xx_spi_fiq_tx;
258 extern struct spi_fiq_code s3c24xx_spi_fiq_rx;
259
260 /**
261  * ack_bit - turn IRQ into IRQ acknowledgement bit
262  * @irq: The interrupt number
263  *
264  * Returns the bit to write to the interrupt acknowledge register.
265  */
266 static inline u32 ack_bit(unsigned int irq)
267 {
268         return 1 << (irq - IRQ_EINT0);
269 }
270
271 /**
272  * s3c24xx_spi_tryfiq - attempt to claim and setup FIQ for transfer
273  * @hw: The hardware state.
274  *
275  * Claim the FIQ handler (only one can be active at any one time) and
276  * then setup the correct transfer code for this transfer.
277  *
278  * This call updates all the necessary state information if successful,
279  * so the caller does not need to do anything more than start the transfer
280  * as normal, since the IRQ will have been re-routed to the FIQ handler.
281 */
282 static void s3c24xx_spi_tryfiq(struct s3c24xx_spi *hw)
283 {
284         struct pt_regs regs;
285         enum spi_fiq_mode mode;
286         struct spi_fiq_code *code;
287         int ret;
288
289         if (!hw->fiq_claimed) {
290                 /* try and claim fiq if we haven't got it, and if not
291                  * then return and simply use another transfer method */
292
293                 ret = claim_fiq(&hw->fiq_handler);
294                 if (ret)
295                         return;
296         }
297
298         if (hw->tx && !hw->rx)
299                 mode = FIQ_MODE_TX;
300         else if (hw->rx && !hw->tx)
301                 mode = FIQ_MODE_RX;
302         else
303                 mode = FIQ_MODE_TXRX;
304
305         regs.uregs[fiq_rspi] = (long)hw->regs;
306         regs.uregs[fiq_rrx]  = (long)hw->rx;
307         regs.uregs[fiq_rtx]  = (long)hw->tx + 1;
308         regs.uregs[fiq_rcount] = hw->len - 1;
309         regs.uregs[fiq_rirq] = (long)S3C24XX_VA_IRQ;
310
311         set_fiq_regs(&regs);
312
313         if (hw->fiq_mode != mode) {
314                 u32 *ack_ptr;
315
316                 hw->fiq_mode = mode;
317
318                 switch (mode) {
319                 case FIQ_MODE_TX:
320                         code = &s3c24xx_spi_fiq_tx;
321                         break;
322                 case FIQ_MODE_RX:
323                         code = &s3c24xx_spi_fiq_rx;
324                         break;
325                 case FIQ_MODE_TXRX:
326                         code = &s3c24xx_spi_fiq_txrx;
327                         break;
328                 default:
329                         code = NULL;
330                 }
331
332                 BUG_ON(!code);
333
334                 ack_ptr = (u32 *)&code->data[code->ack_offset];
335                 *ack_ptr = ack_bit(hw->irq);
336
337                 set_fiq_handler(&code->data, code->length);
338         }
339
340         s3c24xx_set_fiq(hw->irq, true);
341
342         hw->fiq_mode = mode;
343         hw->fiq_inuse = 1;
344 }
345
346 /**
347  * s3c24xx_spi_fiqop - FIQ core code callback
348  * @pw: Data registered with the handler
349  * @release: Whether this is a release or a return.
350  *
351  * Called by the FIQ code when another module wants to use the FIQ, so
352  * return whether we are currently using this or not and then update our
353  * internal state.
354  */
355 static int s3c24xx_spi_fiqop(void *pw, int release)
356 {
357         struct s3c24xx_spi *hw = pw;
358         int ret = 0;
359
360         if (release) {
361                 if (hw->fiq_inuse)
362                         ret = -EBUSY;
363
364                 /* note, we do not need to unroute the FIQ, as the FIQ
365                  * vector code de-routes it to signal the end of transfer */
366
367                 hw->fiq_mode = FIQ_MODE_NONE;
368                 hw->fiq_claimed = 0;
369         } else {
370                 hw->fiq_claimed = 1;
371         }
372
373         return ret;
374 }
375
376 /**
377  * s3c24xx_spi_initfiq - setup the information for the FIQ core
378  * @hw: The hardware state.
379  *
380  * Setup the fiq_handler block to pass to the FIQ core.
381  */
382 static inline void s3c24xx_spi_initfiq(struct s3c24xx_spi *hw)
383 {
384         hw->fiq_handler.dev_id = hw;
385         hw->fiq_handler.name = dev_name(hw->dev);
386         hw->fiq_handler.fiq_op = s3c24xx_spi_fiqop;
387 }
388
389 /**
390  * s3c24xx_spi_usefiq - return if we should be using FIQ.
391  * @hw: The hardware state.
392  *
393  * Return true if the platform data specifies whether this channel is
394  * allowed to use the FIQ.
395  */
396 static inline bool s3c24xx_spi_usefiq(struct s3c24xx_spi *hw)
397 {
398         return hw->pdata->use_fiq;
399 }
400
401 /**
402  * s3c24xx_spi_usingfiq - return if channel is using FIQ
403  * @spi: The hardware state.
404  *
405  * Return whether the channel is currently using the FIQ (separate from
406  * whether the FIQ is claimed).
407  */
408 static inline bool s3c24xx_spi_usingfiq(struct s3c24xx_spi *spi)
409 {
410         return spi->fiq_inuse;
411 }
412 #else
413
414 static inline void s3c24xx_spi_initfiq(struct s3c24xx_spi *s) { }
415 static inline void s3c24xx_spi_tryfiq(struct s3c24xx_spi *s) { }
416 static inline bool s3c24xx_spi_usefiq(struct s3c24xx_spi *s) { return false; }
417 static inline bool s3c24xx_spi_usingfiq(struct s3c24xx_spi *s) { return false; }
418
419 #endif /* CONFIG_SPI_S3C24XX_FIQ */
420
421 static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
422 {
423         struct s3c24xx_spi *hw = to_hw(spi);
424
425         hw->tx = t->tx_buf;
426         hw->rx = t->rx_buf;
427         hw->len = t->len;
428         hw->count = 0;
429
430         init_completion(&hw->done);
431
432         hw->fiq_inuse = 0;
433         if (s3c24xx_spi_usefiq(hw) && t->len >= 3)
434                 s3c24xx_spi_tryfiq(hw);
435
436         /* send the first byte */
437         writeb(hw_txbyte(hw, 0), hw->regs + S3C2410_SPTDAT);
438
439         wait_for_completion(&hw->done);
440         return hw->count;
441 }
442
443 static irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
444 {
445         struct s3c24xx_spi *hw = dev;
446         unsigned int spsta = readb(hw->regs + S3C2410_SPSTA);
447         unsigned int count = hw->count;
448
449         if (spsta & S3C2410_SPSTA_DCOL) {
450                 dev_dbg(hw->dev, "data-collision\n");
451                 complete(&hw->done);
452                 goto irq_done;
453         }
454
455         if (!(spsta & S3C2410_SPSTA_READY)) {
456                 dev_dbg(hw->dev, "spi not ready for tx?\n");
457                 complete(&hw->done);
458                 goto irq_done;
459         }
460
461         if (!s3c24xx_spi_usingfiq(hw)) {
462                 hw->count++;
463
464                 if (hw->rx)
465                         hw->rx[count] = readb(hw->regs + S3C2410_SPRDAT);
466
467                 count++;
468
469                 if (count < hw->len)
470                         writeb(hw_txbyte(hw, count), hw->regs + S3C2410_SPTDAT);
471                 else
472                         complete(&hw->done);
473         } else {
474                 hw->count = hw->len;
475                 hw->fiq_inuse = 0;
476
477                 if (hw->rx)
478                         hw->rx[hw->len-1] = readb(hw->regs + S3C2410_SPRDAT);
479
480                 complete(&hw->done);
481         }
482
483  irq_done:
484         return IRQ_HANDLED;
485 }
486
487 static void s3c24xx_spi_initialsetup(struct s3c24xx_spi *hw)
488 {
489         /* for the moment, permanently enable the clock */
490
491         clk_enable(hw->clk);
492
493         /* program defaults into the registers */
494
495         writeb(0xff, hw->regs + S3C2410_SPPRE);
496         writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
497         writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);
498
499         if (hw->pdata) {
500                 if (hw->set_cs == s3c24xx_spi_gpiocs)
501                         gpio_direction_output(hw->pdata->pin_cs, 1);
502
503                 if (hw->pdata->gpio_setup)
504                         hw->pdata->gpio_setup(hw->pdata, 1);
505         }
506 }
507
508 static int s3c24xx_spi_probe(struct platform_device *pdev)
509 {
510         struct s3c2410_spi_info *pdata;
511         struct s3c24xx_spi *hw;
512         struct spi_master *master;
513         struct resource *res;
514         int err = 0;
515
516         master = spi_alloc_master(&pdev->dev, sizeof(struct s3c24xx_spi));
517         if (master == NULL) {
518                 dev_err(&pdev->dev, "No memory for spi_master\n");
519                 return -ENOMEM;
520         }
521
522         hw = spi_master_get_devdata(master);
523         memset(hw, 0, sizeof(struct s3c24xx_spi));
524
525         hw->master = master;
526         hw->pdata = pdata = dev_get_platdata(&pdev->dev);
527         hw->dev = &pdev->dev;
528
529         if (pdata == NULL) {
530                 dev_err(&pdev->dev, "No platform data supplied\n");
531                 err = -ENOENT;
532                 goto err_no_pdata;
533         }
534
535         platform_set_drvdata(pdev, hw);
536         init_completion(&hw->done);
537
538         /* initialise fiq handler */
539
540         s3c24xx_spi_initfiq(hw);
541
542         /* setup the master state. */
543
544         /* the spi->mode bits understood by this driver: */
545         master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
546
547         master->num_chipselect = hw->pdata->num_cs;
548         master->bus_num = pdata->bus_num;
549
550         /* setup the state for the bitbang driver */
551
552         hw->bitbang.master         = hw->master;
553         hw->bitbang.setup_transfer = s3c24xx_spi_setupxfer;
554         hw->bitbang.chipselect     = s3c24xx_spi_chipsel;
555         hw->bitbang.txrx_bufs      = s3c24xx_spi_txrx;
556
557         hw->master->setup  = s3c24xx_spi_setup;
558         hw->master->cleanup = s3c24xx_spi_cleanup;
559
560         dev_dbg(hw->dev, "bitbang at %p\n", &hw->bitbang);
561
562         /* find and map our resources */
563         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
564         hw->regs = devm_ioremap_resource(&pdev->dev, res);
565         if (IS_ERR(hw->regs)) {
566                 err = PTR_ERR(hw->regs);
567                 goto err_no_pdata;
568         }
569
570         hw->irq = platform_get_irq(pdev, 0);
571         if (hw->irq < 0) {
572                 dev_err(&pdev->dev, "No IRQ specified\n");
573                 err = -ENOENT;
574                 goto err_no_pdata;
575         }
576
577         err = devm_request_irq(&pdev->dev, hw->irq, s3c24xx_spi_irq, 0,
578                                 pdev->name, hw);
579         if (err) {
580                 dev_err(&pdev->dev, "Cannot claim IRQ\n");
581                 goto err_no_pdata;
582         }
583
584         hw->clk = devm_clk_get(&pdev->dev, "spi");
585         if (IS_ERR(hw->clk)) {
586                 dev_err(&pdev->dev, "No clock for device\n");
587                 err = PTR_ERR(hw->clk);
588                 goto err_no_pdata;
589         }
590
591         /* setup any gpio we can */
592
593         if (!pdata->set_cs) {
594                 if (pdata->pin_cs < 0) {
595                         dev_err(&pdev->dev, "No chipselect pin\n");
596                         err = -EINVAL;
597                         goto err_register;
598                 }
599
600                 err = devm_gpio_request(&pdev->dev, pdata->pin_cs,
601                                         dev_name(&pdev->dev));
602                 if (err) {
603                         dev_err(&pdev->dev, "Failed to get gpio for cs\n");
604                         goto err_register;
605                 }
606
607                 hw->set_cs = s3c24xx_spi_gpiocs;
608                 gpio_direction_output(pdata->pin_cs, 1);
609         } else
610                 hw->set_cs = pdata->set_cs;
611
612         s3c24xx_spi_initialsetup(hw);
613
614         /* register our spi controller */
615
616         err = spi_bitbang_start(&hw->bitbang);
617         if (err) {
618                 dev_err(&pdev->dev, "Failed to register SPI master\n");
619                 goto err_register;
620         }
621
622         return 0;
623
624  err_register:
625         clk_disable(hw->clk);
626
627  err_no_pdata:
628         spi_master_put(hw->master);
629         return err;
630 }
631
632 static int s3c24xx_spi_remove(struct platform_device *dev)
633 {
634         struct s3c24xx_spi *hw = platform_get_drvdata(dev);
635
636         spi_bitbang_stop(&hw->bitbang);
637         clk_disable(hw->clk);
638         spi_master_put(hw->master);
639         return 0;
640 }
641
642
643 #ifdef CONFIG_PM
644
645 static int s3c24xx_spi_suspend(struct device *dev)
646 {
647         struct s3c24xx_spi *hw = dev_get_drvdata(dev);
648
649         if (hw->pdata && hw->pdata->gpio_setup)
650                 hw->pdata->gpio_setup(hw->pdata, 0);
651
652         clk_disable(hw->clk);
653         return 0;
654 }
655
656 static int s3c24xx_spi_resume(struct device *dev)
657 {
658         struct s3c24xx_spi *hw = dev_get_drvdata(dev);
659
660         s3c24xx_spi_initialsetup(hw);
661         return 0;
662 }
663
664 static const struct dev_pm_ops s3c24xx_spi_pmops = {
665         .suspend        = s3c24xx_spi_suspend,
666         .resume         = s3c24xx_spi_resume,
667 };
668
669 #define S3C24XX_SPI_PMOPS &s3c24xx_spi_pmops
670 #else
671 #define S3C24XX_SPI_PMOPS NULL
672 #endif /* CONFIG_PM */
673
674 MODULE_ALIAS("platform:s3c2410-spi");
675 static struct platform_driver s3c24xx_spi_driver = {
676         .probe          = s3c24xx_spi_probe,
677         .remove         = s3c24xx_spi_remove,
678         .driver         = {
679                 .name   = "s3c2410-spi",
680                 .owner  = THIS_MODULE,
681                 .pm     = S3C24XX_SPI_PMOPS,
682         },
683 };
684 module_platform_driver(s3c24xx_spi_driver);
685
686 MODULE_DESCRIPTION("S3C24XX SPI Driver");
687 MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
688 MODULE_LICENSE("GPL");