2 * Copyright (C) 2013 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/clk.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/delay.h>
19 #include <linux/dma-mapping.h>
20 #include <linux/err.h>
21 #include <linux/interrupt.h>
22 #include <linux/spi/spi.h>
23 #include <linux/sched.h>
24 #include <linux/kthread.h>
26 #include <linux/of_device.h>
28 #include <soc/sprd/sci_glb_regs.h>
29 #include <soc/sprd/sci.h>
30 #include "sprd_spi_r4p0.h"
32 unsigned long REGS_SPI0_BASE = 0;
33 unsigned long REGS_SPI1_BASE = 0;
34 unsigned long REGS_SPI2_BASE = 0;
36 #define SPI_BASE(id) \
37 ((id == 0) ? REGS_SPI0_BASE : ((id == 1) ? REGS_SPI1_BASE : REGS_SPI2_BASE ))
39 #define ALIGN_UP(a, b)\
40 (((a) + ((b) - 1)) & ~((b) - 1))
42 #define MHz(inte, dec) ((inte) * 1000 * 1000 + (dec) * 1000 * 100)
49 static struct clk_src spi_src_tab[] = {
68 struct sprd_spi_devdata {
69 void __iomem *reg_base;
73 struct list_head msg_queue;
74 struct work_struct work;
75 struct workqueue_struct *work_queue;
93 enum spi_transfer_mode {
99 //extern void clk_force_disable(struct clk *);
101 static void sprd_spi_dump_regs(unsigned long reg_base)
103 printk("SPI_CLKD:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CLKD)));
104 printk("SPI_CTL0:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL0)));
105 printk("SPI_CTL1:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL1)));
106 printk("SPI_CTL2:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL2)));
107 printk("SPI_CTL3:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL3)));
108 printk("SPI_CTL4:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL4)));
109 printk("SPI_CTL5:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL5)));
110 printk("SPI_INT_EN:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_INT_EN)));
111 printk("SPI_DSP_WAIT:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_DSP_WAIT)));
112 printk("SPI_CTL6:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL6)));
113 printk("SPI_CTL7:0x%x \n", __raw_readl((void __iomem *)(reg_base + SPI_CTL7)));
116 static void sprd_spi_wait_for_send_complete(unsigned long reg_base)
119 while (!(__raw_readl((void __iomem *)(reg_base + SPI_STS2)) & SPI_TX_FIFO_REALLY_EMPTY))
121 if (++timeout > SPI_TIME_OUT) {
122 /*fixme, set timeout*/
123 printk("spi send timeout!\n");
124 sprd_spi_dump_regs(reg_base);
129 while (__raw_readl((void __iomem *)(reg_base + SPI_STS2)) & SPI_TX_BUSY)
131 if (++timeout > SPI_TIME_OUT) {
132 /*fixme, set timeout*/
133 printk("spi send timeout!\n");
134 sprd_spi_dump_regs(reg_base);
140 static int sprd_spi_transfer_full_duplex(struct spi_device *spi_dev,
141 struct spi_transfer *trans_node)
145 u32 bits_per_word, block_num;
147 u8 *tx_u8_p, *rx_u8_p;
148 u16 *tx_u16_p, *rx_u16_p;
149 u32 *tx_u32_p, *rx_u32_p;
153 unsigned long reg_base;
154 struct sprd_spi_devdata *spi_chip;
156 spi_chip = spi_master_get_devdata(spi_dev->master);
157 reg_base = (unsigned long)spi_chip->reg_base;
159 /* We config the bits_per_word in function spi_new_device()
160 * but you can reconfig thi option in spi_transfer
162 if (unlikely(trans_node->bits_per_word != spi_dev->bits_per_word)) {
163 printk("%s %d\n", __func__, __LINE__);
164 reg_val = __raw_readl(spi_chip->reg_base + SPI_CTL0);
165 reg_val &= ~(0x1f << 2);
166 if (trans_node->bits_per_word != MAX_BITS_PER_WORD) {
167 reg_val |= trans_node->bits_per_word << 2;
168 printk("%s %d\n", __func__, __LINE__);
170 __raw_writel(reg_val, spi_chip->reg_base + SPI_CTL0);
172 /*fixme!the bits_per_word alaign up with 8*/
173 bytes_per_word = ALIGN_UP(trans_node->bits_per_word, 8) >> 3;
175 bits_per_word = ALIGN_UP(spi_dev->bits_per_word, 8);
177 reg_val = __raw_readl((void __iomem *)(reg_base + SPI_CTL0));
178 reg_val &= ~(0x1f << 2);
179 if (32 != bits_per_word) {
180 reg_val |= bits_per_word << 2;
182 writel(reg_val, (void __iomem *)(reg_base + SPI_CTL0));
186 src_buf = trans_node->tx_buf;
189 dst_buf = trans_node->rx_buf;
191 send_data_msk = 0xffffffff;
193 if (src_buf && dst_buf) {
194 transfer_mode = rt_mode;
197 transfer_mode = rx_mode;
198 /*in rx mode, we always send 0 to slave*/
200 src_buf = trans_node->rx_buf;
202 transfer_mode = tx_mode;
206 reg_val = __raw_readl((void __iomem *)(reg_base + SPI_CTL1));
208 reg_val &= ~(0x3 << 12);
210 if (transfer_mode == tx_mode) {
211 reg_val |= SPI_TX_MODE;
213 reg_val |= SPI_RX_MODE |SPI_TX_MODE;
216 writel(reg_val, (void __iomem *)(reg_base + SPI_CTL1));
219 writel(0x1, (void __iomem *)(reg_base + SPI_FIFO_RST));
220 writel(0x0, (void __iomem *)(reg_base + SPI_FIFO_RST));
222 /*alaway set cs pin to low level when transfer */
223 if (spi_dev->chip_select < SPRD_SPI_CHIP_CS_NUM) {
224 reg_val = __raw_readl((void __iomem *)(reg_base + SPI_CTL0));
225 reg_val &= ~(0x1 << (spi_dev->chip_select + 8));
226 writel(reg_val, (void __iomem *)(reg_base + SPI_CTL0));
228 /*fixme, need to support gpio cs*/
231 switch (bits_per_word) {
233 tx_u8_p = (u8 *)src_buf;
234 rx_u8_p = (u8 *)dst_buf;
235 block_num = trans_node->len;
236 for (; block_num >= SPRD_SPI_FIFO_SIZE; block_num -= SPRD_SPI_FIFO_SIZE)
238 for (i = 0; i < SPRD_SPI_FIFO_SIZE; i++, tx_u8_p++)
240 __raw_writeb(*tx_u8_p & send_data_msk,
241 (void __iomem *)(reg_base + SPI_TXD));
244 sprd_spi_wait_for_send_complete(reg_base);
246 if (transfer_mode == tx_mode)
249 for (i = 0; i < SPRD_SPI_FIFO_SIZE; i++, rx_u8_p++)
251 *rx_u8_p = __raw_readb((void __iomem *)(reg_base + SPI_TXD));
255 for (i = 0; i < block_num; i++, tx_u8_p++)
257 __raw_writeb(*tx_u8_p & send_data_msk, (void __iomem *)(reg_base + SPI_TXD));
260 sprd_spi_wait_for_send_complete(reg_base);
262 if (transfer_mode == tx_mode)
265 for (i = 0; i < block_num; i++, rx_u8_p++)
267 *rx_u8_p = __raw_readb((void __iomem *)(reg_base + SPI_TXD));
272 tx_u16_p = (u16 *)src_buf;
273 rx_u16_p = (u16 *)dst_buf;
274 block_num = trans_node->len >> 1;
276 for (;block_num >= SPRD_SPI_FIFO_SIZE; block_num -= SPRD_SPI_FIFO_SIZE)
278 for (i =0; i < SPRD_SPI_FIFO_SIZE; i++, tx_u16_p++)
280 __raw_writew(*tx_u16_p & send_data_msk,
281 (void __iomem *)(reg_base + SPI_TXD));
284 sprd_spi_wait_for_send_complete(reg_base);
286 if (transfer_mode == tx_mode)
289 for (i = 0; i < SPRD_SPI_FIFO_SIZE; i++, rx_u16_p++)
291 *rx_u16_p = __raw_readw((void __iomem *)(reg_base + SPI_TXD));
295 for (i = 0; i < block_num; i++, tx_u16_p++)
297 __raw_writew(*tx_u16_p & send_data_msk, (void __iomem *)(reg_base + SPI_TXD));
300 sprd_spi_wait_for_send_complete(reg_base);
302 if (transfer_mode == tx_mode)
305 for (i = 0; i < block_num; i++, rx_u16_p++)
307 *rx_u16_p = __raw_readw((void __iomem *)(reg_base + SPI_TXD));
312 tx_u32_p = (u32 *)src_buf;
313 rx_u32_p = (u32 *)dst_buf;
314 block_num = (trans_node->len + 3) >> 2;
316 for (;block_num >= SPRD_SPI_FIFO_SIZE; block_num -= SPRD_SPI_FIFO_SIZE)
318 for (i = 0; i < SPRD_SPI_FIFO_SIZE; i++, tx_u32_p++)
320 __raw_writel(*tx_u32_p & send_data_msk,
321 (void __iomem *)(reg_base + SPI_TXD));
324 sprd_spi_wait_for_send_complete(reg_base);
326 if (transfer_mode == tx_mode)
329 for (i = 0; i < SPRD_SPI_FIFO_SIZE; i++, rx_u32_p++)
331 *rx_u32_p = __raw_readl((void __iomem *)(reg_base + SPI_TXD));
335 for (i = 0; i < block_num; i++, tx_u32_p++)
337 __raw_writel(*tx_u32_p & send_data_msk, (void __iomem *)(reg_base + SPI_TXD));
340 sprd_spi_wait_for_send_complete(reg_base);
342 if (transfer_mode == tx_mode)
345 for (i = 0; i < block_num; i++, rx_u32_p++)
347 *rx_u32_p = __raw_readl((void __iomem *)(reg_base + SPI_TXD));
356 if (spi_dev->chip_select < SPRD_SPI_CHIP_CS_NUM) {
357 reg_val = __raw_readl((void __iomem *)(reg_base + SPI_CTL0));
359 __raw_writel(reg_val, (void __iomem *)(reg_base + SPI_CTL0));
361 /*fixme, need to support gpio cs*/
364 reg_val = __raw_readl((void __iomem *)(reg_base + SPI_CTL1));
365 reg_val &= ~(0x3 << 12);
366 writel(reg_val, (void __iomem *)(reg_base + SPI_CTL1));
368 return trans_node->len;
371 static void sprd_spi_transfer_work(struct work_struct *work)
374 struct sprd_spi_devdata *spi_chip;
375 struct spi_message *spi_msg;
376 struct spi_transfer *transfer_node;
379 spi_chip = container_of(work, struct sprd_spi_devdata, work);
381 clk_prepare_enable(spi_chip->clk);
384 spin_lock_irqsave(&spi_chip->lock, flags);
386 while (!list_empty(&spi_chip->msg_queue))
388 spi_msg = container_of(spi_chip->msg_queue.next,
389 struct spi_message, queue);
390 list_del_init(&spi_msg->queue);
391 spin_unlock_irqrestore(&spi_chip->lock, flags);
393 list_for_each_entry(transfer_node,
394 &spi_msg->transfers, transfer_list)
396 if (transfer_node->tx_buf || transfer_node->rx_buf) {
397 ret = sprd_spi_transfer_full_duplex(spi_msg->spi,
402 if (spi_msg->complete) {
403 spi_msg->status = 0x0;
404 spi_msg->complete(spi_msg->context);
406 spin_lock_irqsave(&spi_chip->lock, flags);
409 //clk_disable_unprepare(spi_chip->clk);
411 spin_unlock_irqrestore(&spi_chip->lock, flags);
413 clk_disable_unprepare(spi_chip->clk);
416 static int sprd_spi_transfer(struct spi_device *spi_dev, struct spi_message *msg)
418 struct sprd_spi_devdata *spi_chip;
421 spi_chip = spi_master_get_devdata(spi_dev->master);
423 spin_lock_irqsave(&spi_chip->lock, flags);
425 list_add_tail(&msg->queue, &spi_chip->msg_queue);
427 queue_work(spi_chip->work_queue, &spi_chip->work);
429 spin_unlock_irqrestore(&spi_chip->lock, flags);
434 /*this function must be exectued in spi's clk is enable*/
435 static void sprd_spi_backup_config(struct sprd_spi_devdata *spi_chip)
437 unsigned long reg_base;
439 reg_base = (unsigned long)spi_chip->reg_base;
441 spi_chip->reg_backup[0] = __raw_readl((void __iomem *)(reg_base + SPI_CLKD));
442 spi_chip->reg_backup[1] = __raw_readl((void __iomem *)(reg_base + SPI_CTL0));
443 spi_chip->reg_backup[2] = __raw_readl((void __iomem *)(reg_base + SPI_CTL1));
444 spi_chip->reg_backup[3] = __raw_readl((void __iomem *)(reg_base + SPI_CTL2));
445 spi_chip->reg_backup[4] = __raw_readl((void __iomem *)(reg_base + SPI_CTL3));
446 spi_chip->reg_backup[5] = __raw_readl((void __iomem *)(reg_base + SPI_CTL4));
447 spi_chip->reg_backup[6] = __raw_readl((void __iomem *)(reg_base + SPI_CTL5));
448 spi_chip->reg_backup[7] = __raw_readl((void __iomem *)(reg_base + SPI_INT_EN));
449 spi_chip->reg_backup[8] = __raw_readl((void __iomem *)(reg_base + SPI_DSP_WAIT));
450 spi_chip->reg_backup[9] = __raw_readl((void __iomem *)(reg_base + SPI_CTL6));
451 spi_chip->reg_backup[10] = __raw_readl((void __iomem *)(reg_base + SPI_CTL7));
454 /*this function must be exectued in spi's clk is enable*/
455 static void sprd_spi_restore_config(const struct sprd_spi_devdata *spi_chip)
457 unsigned long reg_base;
459 reg_base = (unsigned long)spi_chip->reg_base;
461 __raw_writel(spi_chip->reg_backup[0], (void __iomem *)(reg_base + SPI_CLKD));
462 __raw_writel(spi_chip->reg_backup[1], (void __iomem *)(reg_base + SPI_CTL0));
463 __raw_writel(spi_chip->reg_backup[2], (void __iomem *)(reg_base + SPI_CTL1));
464 __raw_writel(spi_chip->reg_backup[3], (void __iomem *)(reg_base + SPI_CTL2));
465 __raw_writel(spi_chip->reg_backup[4], (void __iomem *)(reg_base + SPI_CTL3));
466 __raw_writel(spi_chip->reg_backup[5], (void __iomem *)(reg_base + SPI_CTL4));
467 __raw_writel(spi_chip->reg_backup[6], (void __iomem *)(reg_base + SPI_CTL5));
468 __raw_writel(spi_chip->reg_backup[7], (void __iomem *)(reg_base + SPI_INT_EN));
469 __raw_writel(spi_chip->reg_backup[8], (void __iomem *)(reg_base + SPI_DSP_WAIT));
470 __raw_writel(spi_chip->reg_backup[9], (void __iomem *)(reg_base + SPI_CTL6));
471 __raw_writel(spi_chip->reg_backup[10], (void __iomem *)(reg_base + SPI_CTL7));
474 static int sprd_spi_setup(struct spi_device *spi_dev)
478 u32 spi_work_clk, spi_src_clk, spi_clk_div;
479 const char *src_clk_name;
480 struct clk *clk_parent;
481 struct sprd_spi_devdata *spi_chip;
483 spi_chip = spi_master_get_devdata(spi_dev->master);
485 /*fixme, need to check the parmeter*/
487 /*if the spi_src_clk is 48MHz,the spi max working clk is 24MHz*/
488 spi_work_clk = spi_dev->max_speed_hz << 1;
489 if (spi_work_clk > MHz(192, 0))
491 for(i = 0; i < ARRAY_SIZE(spi_src_tab); i++) {
492 if(!(spi_src_tab[i].freq % spi_work_clk))
495 if(i == ARRAY_SIZE(spi_src_tab))
497 src_clk_name = spi_src_tab[i].name;
498 spi_src_clk = spi_src_tab[i].freq;
500 clk_parent = clk_get(&(spi_dev->master->dev), src_clk_name);
501 if (IS_ERR(clk_parent)) {
502 printk("Can't get the clock source: %s\n", src_clk_name);
506 clk_set_parent(spi_chip->clk, clk_parent);
509 clk_prepare_enable(spi_chip->clk);
512 if (spi_dev->bits_per_word > MAX_BITS_PER_WORD) {
516 /*the default bits_per_word is 8*/
517 if (spi_dev->bits_per_word == MAX_BITS_PER_WORD) {
520 reg_val = spi_dev->bits_per_word << 2;
523 /*set all cs to high level*/
527 switch (spi_dev->mode & 0x3) {
535 reg_val |= BIT(13) | BIT(1);
538 reg_val |= BIT(13) | BIT(0);
544 __raw_writel(reg_val, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CTL0));
545 __raw_writel(0x0, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CTL1));
547 __raw_writel(0x0, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CTL2));
548 __raw_writel(0x0, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CTL4));
549 __raw_writel(0x9, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CTL5));
550 __raw_writel(0x0, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_INT_EN));
552 __raw_writel(0x1, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_FIFO_RST));
553 for (i = 0; i < 0x20; i++);
554 __raw_writel(0x0, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_FIFO_RST));
556 clk_set_rate(spi_chip->clk, spi_src_clk);
558 spi_clk_div = spi_src_clk / (spi_dev->max_speed_hz << 1) - 1;
560 __raw_writel(spi_clk_div, (void __iomem *)((unsigned long)spi_chip->reg_base + SPI_CLKD));
562 /*wait the clk config become effective*/
565 sprd_spi_backup_config(spi_chip);
566 spi_chip->is_active = true;
568 /*disable the clk after config complete*/
569 clk_disable_unprepare(spi_chip->clk);
574 static void sprd_spi_cleanup(struct spi_device *spi)
576 struct sprd_spi_devdata *spi_chip;
578 spi_chip = spi_master_get_devdata(spi->master);
580 clk_disable_unprepare(spi_chip->clk);
583 static int sprd_spi_probe(struct platform_device *pdev)
587 struct resource *regs;
588 struct spi_master *master;
589 struct sprd_spi_devdata *spi_chip;
591 pdev->id = of_alias_get_id(pdev->dev.of_node, "spi");
593 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
595 dev_err(&pdev->dev, "spi_%d get io resource failed!\n", pdev->id);
600 REGS_SPI0_BASE = (unsigned long)ioremap_nocache(regs->start,
601 resource_size(regs));
605 else if (1 == pdev->id) {
606 REGS_SPI1_BASE = (unsigned long)ioremap_nocache(regs->start,
607 resource_size(regs));
611 else if (2 == pdev->id) {
612 REGS_SPI2_BASE = (unsigned long)ioremap_nocache(regs->start,
613 resource_size(regs));
618 dev_info(&pdev->dev, "probe spi %d get regbase 0x%lx\n", pdev->id,
621 irq_num = platform_get_irq(pdev, 0);
623 dev_err(&pdev->dev, "spi_%d get irq resource failed!\n", pdev->id);
626 dev_info(&pdev->dev, "probe spi %d get irq num %d\n", pdev->id, irq_num);
628 master = spi_alloc_master(&pdev->dev, sizeof (*spi_chip));
630 dev_err(&pdev->dev, "spi_%d spi_alloc_master failed!\n", pdev->id);
634 spi_chip = spi_master_get_devdata(master);
639 spi_chip->clk = clk_get(NULL, "clk_spi0");
642 spi_chip->clk = clk_get(NULL, "clk_spi1");
645 spi_chip->clk = clk_get(NULL, "clk_spi2");
651 if (IS_ERR(spi_chip->clk)) {
655 spi_chip->reg_base = (void __iomem *)SPI_BASE(pdev->id);
656 spi_chip->irq_num = irq_num;
658 master->mode_bits = SPI_CPOL | SPI_CPHA;
659 master->bus_num = pdev->id;
660 master->num_chipselect = SPRD_SPI_CHIP_CS_NUM;
662 master->setup = sprd_spi_setup;
663 #ifdef SPI_NEW_INTERFACE
664 master->prepare_transfer_hardware = xxxxx;
665 master->transfer_one_message = xxxx;
666 master->unprepare_transfer_hardware = xxxx;
668 master->transfer = sprd_spi_transfer;
669 master->cleanup = sprd_spi_cleanup;
672 INIT_LIST_HEAD(&spi_chip->msg_queue);
673 spin_lock_init(&spi_chip->lock);
674 /*on multi core system, use the create_workqueue() is better??*/
675 // spi_chip->work_queue = create_singlethread_workqueue(pdev->name);
676 spi_chip->work_queue = create_workqueue(pdev->name);
677 INIT_WORK(&spi_chip->work, sprd_spi_transfer_work);
679 platform_set_drvdata(pdev, master);
681 ret = spi_register_master(master);
683 printk("register spi master %d failed!\n", master->bus_num);
690 spi_master_put(master);
696 static int __exit sprd_spi_remove(struct platform_device *pdev)
698 struct spi_master *master = platform_get_drvdata(pdev);
699 struct sprd_spi_devdata *spi_chip = spi_master_get_devdata(master);
701 destroy_workqueue(spi_chip->work_queue);
703 clk_disable_unprepare(spi_chip->clk);
705 spi_unregister_master(master);
707 spi_master_put(master);
713 static int sprd_spi_suspend(struct platform_device *pdev, pm_message_t mesg)
715 struct spi_master *master = platform_get_drvdata(pdev);
717 struct sprd_spi_devdata *spi_chip = spi_master_get_devdata(master);
718 if (IS_ERR(spi_chip->clk)) {
719 pr_err("can't get spi_clk when suspend()\n");
723 if (spi_chip->is_active)
724 clk_disable_unprepare(spi_chip->clk);
729 static int sprd_spi_resume(struct platform_device *pdev)
731 struct spi_master *master = platform_get_drvdata(pdev);
733 struct sprd_spi_devdata *spi_chip = spi_master_get_devdata(master);
735 if (spi_chip->is_active) {
737 clk_prepare_enable(spi_chip->clk);
739 sprd_spi_restore_config(spi_chip);
741 clk_disable_unprepare(spi_chip->clk);
748 #define sprd_spi_suspend NULL
749 #define sprd_spi_resume NULL
752 static const struct of_device_id sprd_spi_of_match[] = {
753 { .compatible = "sprd,sprd-spi", },
757 static struct platform_driver sprd_spi_driver = {
760 .owner = THIS_MODULE,
761 .of_match_table = of_match_ptr(sprd_spi_of_match),
763 .suspend = sprd_spi_suspend,
764 .resume = sprd_spi_resume,
765 .probe = sprd_spi_probe,
766 .remove = __exit_p(sprd_spi_remove),
769 static int __init sprd_spi_init(void)
771 return platform_driver_register(&sprd_spi_driver);
774 subsys_initcall(sprd_spi_init);
776 static void __exit sprd_spi_exit(void)
778 platform_driver_unregister(&sprd_spi_driver);
781 module_exit(sprd_spi_exit);
783 MODULE_DESCRIPTION("SpreadTrum SPI(r4p0 version) Controller driver");
784 MODULE_AUTHOR("Jack.Jiang <Jack.Jiang@spreadtrum.com>");
785 MODULE_LICENSE("GPL");