Lines Matching +full:spi +full:- +full:gpio

2  * Freescale SPI controller driver.
9 * CPM SPI and QE buffer descriptors mode support:
24 #include <linux/spi/spi.h>
25 #include <linux/spi/spi_bitbang.h>
28 #include <linux/dma-mapping.h>
33 #include <linux/gpio.h>
40 #include "spi-fsl-lib.h"
51 /* SPI Controller registers */
62 /* SPI Controller mode register definitions */
76 * Default for SPI Mode:
77 * SPI MODE 0 (inactive low, phase middle, MSB, 8-bit length, slow clk
103 static void fsl_spi_change_mode(struct spi_device *spi) in fsl_spi_change_mode() argument
105 struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master); in fsl_spi_change_mode()
106 struct spi_mpc8xxx_cs *cs = spi->controller_state; in fsl_spi_change_mode()
107 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_change_mode()
108 __be32 __iomem *mode = &reg_base->mode; in fsl_spi_change_mode()
111 if (cs->hw_mode == mpc8xxx_spi_read_reg(mode)) in fsl_spi_change_mode()
114 /* Turn off IRQs locally to minimize time that SPI is disabled. */ in fsl_spi_change_mode()
117 /* Turn off SPI unit prior changing mode */ in fsl_spi_change_mode()
118 mpc8xxx_spi_write_reg(mode, cs->hw_mode & ~SPMODE_ENABLE); in fsl_spi_change_mode()
121 if (mspi->flags & SPI_CPM_MODE) { in fsl_spi_change_mode()
122 if (mspi->flags & SPI_QE) { in fsl_spi_change_mode()
123 qe_issue_cmd(QE_INIT_TX_RX, mspi->subblock, in fsl_spi_change_mode()
127 if (mspi->flags & SPI_CPM1) { in fsl_spi_change_mode()
128 out_be16(&mspi->pram->rbptr, in fsl_spi_change_mode()
129 in_be16(&mspi->pram->rbase)); in fsl_spi_change_mode()
130 out_be16(&mspi->pram->tbptr, in fsl_spi_change_mode()
131 in_be16(&mspi->pram->tbase)); in fsl_spi_change_mode()
135 mpc8xxx_spi_write_reg(mode, cs->hw_mode); in fsl_spi_change_mode()
139 static void fsl_spi_chipselect(struct spi_device *spi, int value) in fsl_spi_chipselect() argument
141 struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); in fsl_spi_chipselect()
142 struct fsl_spi_platform_data *pdata = spi->dev.parent->platform_data; in fsl_spi_chipselect()
143 bool pol = spi->mode & SPI_CS_HIGH; in fsl_spi_chipselect()
144 struct spi_mpc8xxx_cs *cs = spi->controller_state; in fsl_spi_chipselect()
147 if (pdata->cs_control) in fsl_spi_chipselect()
148 pdata->cs_control(spi, !pol); in fsl_spi_chipselect()
152 mpc8xxx_spi->rx_shift = cs->rx_shift; in fsl_spi_chipselect()
153 mpc8xxx_spi->tx_shift = cs->tx_shift; in fsl_spi_chipselect()
154 mpc8xxx_spi->get_rx = cs->get_rx; in fsl_spi_chipselect()
155 mpc8xxx_spi->get_tx = cs->get_tx; in fsl_spi_chipselect()
157 fsl_spi_change_mode(spi); in fsl_spi_chipselect()
159 if (pdata->cs_control) in fsl_spi_chipselect()
160 pdata->cs_control(spi, pol); in fsl_spi_chipselect()
165 struct spi_device *spi, in mspi_apply_cpu_mode_quirks() argument
169 cs->rx_shift = 0; in mspi_apply_cpu_mode_quirks()
170 cs->tx_shift = 0; in mspi_apply_cpu_mode_quirks()
172 cs->get_rx = mpc8xxx_spi_rx_buf_u8; in mspi_apply_cpu_mode_quirks()
173 cs->get_tx = mpc8xxx_spi_tx_buf_u8; in mspi_apply_cpu_mode_quirks()
174 if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) { in mspi_apply_cpu_mode_quirks()
175 cs->rx_shift = 16; in mspi_apply_cpu_mode_quirks()
176 cs->tx_shift = 24; in mspi_apply_cpu_mode_quirks()
179 cs->get_rx = mpc8xxx_spi_rx_buf_u16; in mspi_apply_cpu_mode_quirks()
180 cs->get_tx = mpc8xxx_spi_tx_buf_u16; in mspi_apply_cpu_mode_quirks()
181 if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) { in mspi_apply_cpu_mode_quirks()
182 cs->rx_shift = 16; in mspi_apply_cpu_mode_quirks()
183 cs->tx_shift = 16; in mspi_apply_cpu_mode_quirks()
186 cs->get_rx = mpc8xxx_spi_rx_buf_u32; in mspi_apply_cpu_mode_quirks()
187 cs->get_tx = mpc8xxx_spi_tx_buf_u32; in mspi_apply_cpu_mode_quirks()
189 return -EINVAL; in mspi_apply_cpu_mode_quirks()
191 if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE && in mspi_apply_cpu_mode_quirks()
192 spi->mode & SPI_LSB_FIRST) { in mspi_apply_cpu_mode_quirks()
193 cs->tx_shift = 0; in mspi_apply_cpu_mode_quirks()
195 cs->rx_shift = 8; in mspi_apply_cpu_mode_quirks()
197 cs->rx_shift = 0; in mspi_apply_cpu_mode_quirks()
199 mpc8xxx_spi->rx_shift = cs->rx_shift; in mspi_apply_cpu_mode_quirks()
200 mpc8xxx_spi->tx_shift = cs->tx_shift; in mspi_apply_cpu_mode_quirks()
201 mpc8xxx_spi->get_rx = cs->get_rx; in mspi_apply_cpu_mode_quirks()
202 mpc8xxx_spi->get_tx = cs->get_tx; in mspi_apply_cpu_mode_quirks()
208 struct spi_device *spi, in mspi_apply_qe_mode_quirks() argument
217 if (spi->mode & SPI_LSB_FIRST && in mspi_apply_qe_mode_quirks()
219 return -EINVAL; in mspi_apply_qe_mode_quirks()
225 static int fsl_spi_setup_transfer(struct spi_device *spi, in fsl_spi_setup_transfer() argument
232 struct spi_mpc8xxx_cs *cs = spi->controller_state; in fsl_spi_setup_transfer()
234 mpc8xxx_spi = spi_master_get_devdata(spi->master); in fsl_spi_setup_transfer()
237 bits_per_word = t->bits_per_word; in fsl_spi_setup_transfer()
238 hz = t->speed_hz; in fsl_spi_setup_transfer()
241 /* spi_transfer level calls that work per-word */ in fsl_spi_setup_transfer()
243 bits_per_word = spi->bits_per_word; in fsl_spi_setup_transfer()
248 return -EINVAL; in fsl_spi_setup_transfer()
251 hz = spi->max_speed_hz; in fsl_spi_setup_transfer()
253 if (!(mpc8xxx_spi->flags & SPI_CPM_MODE)) in fsl_spi_setup_transfer()
254 bits_per_word = mspi_apply_cpu_mode_quirks(cs, spi, in fsl_spi_setup_transfer()
257 else if (mpc8xxx_spi->flags & SPI_QE) in fsl_spi_setup_transfer()
258 bits_per_word = mspi_apply_qe_mode_quirks(cs, spi, in fsl_spi_setup_transfer()
267 bits_per_word = bits_per_word - 1; in fsl_spi_setup_transfer()
270 cs->hw_mode &= ~(SPMODE_LEN(0xF) | SPMODE_DIV16 in fsl_spi_setup_transfer()
273 cs->hw_mode |= SPMODE_LEN(bits_per_word); in fsl_spi_setup_transfer()
275 if ((mpc8xxx_spi->spibrg / hz) > 64) { in fsl_spi_setup_transfer()
276 cs->hw_mode |= SPMODE_DIV16; in fsl_spi_setup_transfer()
277 pm = (mpc8xxx_spi->spibrg - 1) / (hz * 64) + 1; in fsl_spi_setup_transfer()
280 "Will use %d Hz instead.\n", dev_name(&spi->dev), in fsl_spi_setup_transfer()
281 hz, mpc8xxx_spi->spibrg / 1024); in fsl_spi_setup_transfer()
285 pm = (mpc8xxx_spi->spibrg - 1) / (hz * 4) + 1; in fsl_spi_setup_transfer()
288 pm--; in fsl_spi_setup_transfer()
290 cs->hw_mode |= SPMODE_PM(pm); in fsl_spi_setup_transfer()
292 fsl_spi_change_mode(spi); in fsl_spi_setup_transfer()
298 struct cpm_buf_desc __iomem *tx_bd = mspi->tx_bd; in fsl_spi_cpm_bufs_start()
299 struct cpm_buf_desc __iomem *rx_bd = mspi->rx_bd; in fsl_spi_cpm_bufs_start()
300 unsigned int xfer_len = min(mspi->count, SPI_MRBLR); in fsl_spi_cpm_bufs_start()
302 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_cpm_bufs_start()
304 xfer_ofs = mspi->xfer_in_progress->len - mspi->count; in fsl_spi_cpm_bufs_start()
306 if (mspi->rx_dma == mspi->dma_dummy_rx) in fsl_spi_cpm_bufs_start()
307 out_be32(&rx_bd->cbd_bufaddr, mspi->rx_dma); in fsl_spi_cpm_bufs_start()
309 out_be32(&rx_bd->cbd_bufaddr, mspi->rx_dma + xfer_ofs); in fsl_spi_cpm_bufs_start()
310 out_be16(&rx_bd->cbd_datlen, 0); in fsl_spi_cpm_bufs_start()
311 out_be16(&rx_bd->cbd_sc, BD_SC_EMPTY | BD_SC_INTRPT | BD_SC_WRAP); in fsl_spi_cpm_bufs_start()
313 if (mspi->tx_dma == mspi->dma_dummy_tx) in fsl_spi_cpm_bufs_start()
314 out_be32(&tx_bd->cbd_bufaddr, mspi->tx_dma); in fsl_spi_cpm_bufs_start()
316 out_be32(&tx_bd->cbd_bufaddr, mspi->tx_dma + xfer_ofs); in fsl_spi_cpm_bufs_start()
317 out_be16(&tx_bd->cbd_datlen, xfer_len); in fsl_spi_cpm_bufs_start()
318 out_be16(&tx_bd->cbd_sc, BD_SC_READY | BD_SC_INTRPT | BD_SC_WRAP | in fsl_spi_cpm_bufs_start()
322 mpc8xxx_spi_write_reg(&reg_base->command, SPCOM_STR); in fsl_spi_cpm_bufs_start()
328 struct device *dev = mspi->dev; in fsl_spi_cpm_bufs()
329 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_cpm_bufs()
332 mspi->map_tx_dma = 0; in fsl_spi_cpm_bufs()
333 mspi->map_rx_dma = 0; in fsl_spi_cpm_bufs()
335 mspi->map_tx_dma = 1; in fsl_spi_cpm_bufs()
336 mspi->map_rx_dma = 1; in fsl_spi_cpm_bufs()
339 if (!t->tx_buf) { in fsl_spi_cpm_bufs()
340 mspi->tx_dma = mspi->dma_dummy_tx; in fsl_spi_cpm_bufs()
341 mspi->map_tx_dma = 0; in fsl_spi_cpm_bufs()
344 if (!t->rx_buf) { in fsl_spi_cpm_bufs()
345 mspi->rx_dma = mspi->dma_dummy_rx; in fsl_spi_cpm_bufs()
346 mspi->map_rx_dma = 0; in fsl_spi_cpm_bufs()
349 if (mspi->map_tx_dma) { in fsl_spi_cpm_bufs()
350 void *nonconst_tx = (void *)mspi->tx; /* shut up gcc */ in fsl_spi_cpm_bufs()
352 mspi->tx_dma = dma_map_single(dev, nonconst_tx, t->len, in fsl_spi_cpm_bufs()
354 if (dma_mapping_error(dev, mspi->tx_dma)) { in fsl_spi_cpm_bufs()
356 return -ENOMEM; in fsl_spi_cpm_bufs()
358 } else if (t->tx_buf) { in fsl_spi_cpm_bufs()
359 mspi->tx_dma = t->tx_dma; in fsl_spi_cpm_bufs()
362 if (mspi->map_rx_dma) { in fsl_spi_cpm_bufs()
363 mspi->rx_dma = dma_map_single(dev, mspi->rx, t->len, in fsl_spi_cpm_bufs()
365 if (dma_mapping_error(dev, mspi->rx_dma)) { in fsl_spi_cpm_bufs()
369 } else if (t->rx_buf) { in fsl_spi_cpm_bufs()
370 mspi->rx_dma = t->rx_dma; in fsl_spi_cpm_bufs()
374 mpc8xxx_spi_write_reg(&reg_base->mask, SPIE_RXB); in fsl_spi_cpm_bufs()
376 mspi->xfer_in_progress = t; in fsl_spi_cpm_bufs()
377 mspi->count = t->len; in fsl_spi_cpm_bufs()
385 if (mspi->map_tx_dma) in fsl_spi_cpm_bufs()
386 dma_unmap_single(dev, mspi->tx_dma, t->len, DMA_TO_DEVICE); in fsl_spi_cpm_bufs()
387 return -ENOMEM; in fsl_spi_cpm_bufs()
392 struct device *dev = mspi->dev; in fsl_spi_cpm_bufs_complete()
393 struct spi_transfer *t = mspi->xfer_in_progress; in fsl_spi_cpm_bufs_complete()
395 if (mspi->map_tx_dma) in fsl_spi_cpm_bufs_complete()
396 dma_unmap_single(dev, mspi->tx_dma, t->len, DMA_TO_DEVICE); in fsl_spi_cpm_bufs_complete()
397 if (mspi->map_rx_dma) in fsl_spi_cpm_bufs_complete()
398 dma_unmap_single(dev, mspi->rx_dma, t->len, DMA_FROM_DEVICE); in fsl_spi_cpm_bufs_complete()
399 mspi->xfer_in_progress = NULL; in fsl_spi_cpm_bufs_complete()
406 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_cpu_bufs()
408 mspi->count = len; in fsl_spi_cpu_bufs()
411 mpc8xxx_spi_write_reg(&reg_base->mask, SPIM_NE); in fsl_spi_cpu_bufs()
414 word = mspi->get_tx(mspi); in fsl_spi_cpu_bufs()
415 mpc8xxx_spi_write_reg(&reg_base->transmit, word); in fsl_spi_cpu_bufs()
420 static int fsl_spi_bufs(struct spi_device *spi, struct spi_transfer *t, in fsl_spi_bufs() argument
423 struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); in fsl_spi_bufs()
425 unsigned int len = t->len; in fsl_spi_bufs()
429 reg_base = mpc8xxx_spi->reg_base; in fsl_spi_bufs()
430 bits_per_word = spi->bits_per_word; in fsl_spi_bufs()
431 if (t->bits_per_word) in fsl_spi_bufs()
432 bits_per_word = t->bits_per_word; in fsl_spi_bufs()
437 return -EINVAL; in fsl_spi_bufs()
443 return -EINVAL; in fsl_spi_bufs()
447 mpc8xxx_spi->tx = t->tx_buf; in fsl_spi_bufs()
448 mpc8xxx_spi->rx = t->rx_buf; in fsl_spi_bufs()
450 INIT_COMPLETION(mpc8xxx_spi->done); in fsl_spi_bufs()
452 if (mpc8xxx_spi->flags & SPI_CPM_MODE) in fsl_spi_bufs()
459 wait_for_completion(&mpc8xxx_spi->done); in fsl_spi_bufs()
462 mpc8xxx_spi_write_reg(&reg_base->mask, 0); in fsl_spi_bufs()
464 if (mpc8xxx_spi->flags & SPI_CPM_MODE) in fsl_spi_bufs()
467 return mpc8xxx_spi->count; in fsl_spi_bufs()
472 struct spi_device *spi = m->spi; in fsl_spi_do_one_msg() local
480 list_for_each_entry(t, &m->transfers, transfer_list) { in fsl_spi_do_one_msg()
481 if (t->bits_per_word || t->speed_hz) { in fsl_spi_do_one_msg()
483 status = -EINVAL; in fsl_spi_do_one_msg()
486 status = fsl_spi_setup_transfer(spi, t); in fsl_spi_do_one_msg()
492 fsl_spi_chipselect(spi, BITBANG_CS_ACTIVE); in fsl_spi_do_one_msg()
495 cs_change = t->cs_change; in fsl_spi_do_one_msg()
496 if (t->len) in fsl_spi_do_one_msg()
497 status = fsl_spi_bufs(spi, t, m->is_dma_mapped); in fsl_spi_do_one_msg()
499 status = -EMSGSIZE; in fsl_spi_do_one_msg()
502 m->actual_length += t->len; in fsl_spi_do_one_msg()
504 if (t->delay_usecs) in fsl_spi_do_one_msg()
505 udelay(t->delay_usecs); in fsl_spi_do_one_msg()
509 fsl_spi_chipselect(spi, BITBANG_CS_INACTIVE); in fsl_spi_do_one_msg()
514 m->status = status; in fsl_spi_do_one_msg()
515 m->complete(m->context); in fsl_spi_do_one_msg()
519 fsl_spi_chipselect(spi, BITBANG_CS_INACTIVE); in fsl_spi_do_one_msg()
522 fsl_spi_setup_transfer(spi, NULL); in fsl_spi_do_one_msg()
525 static int fsl_spi_setup(struct spi_device *spi) in fsl_spi_setup() argument
531 struct spi_mpc8xxx_cs *cs = spi->controller_state; in fsl_spi_setup()
533 if (!spi->max_speed_hz) in fsl_spi_setup()
534 return -EINVAL; in fsl_spi_setup()
539 return -ENOMEM; in fsl_spi_setup()
540 spi->controller_state = cs; in fsl_spi_setup()
542 mpc8xxx_spi = spi_master_get_devdata(spi->master); in fsl_spi_setup()
544 reg_base = mpc8xxx_spi->reg_base; in fsl_spi_setup()
546 hw_mode = cs->hw_mode; /* Save original settings */ in fsl_spi_setup()
547 cs->hw_mode = mpc8xxx_spi_read_reg(&reg_base->mode); in fsl_spi_setup()
549 cs->hw_mode &= ~(SPMODE_CP_BEGIN_EDGECLK | SPMODE_CI_INACTIVEHIGH in fsl_spi_setup()
552 if (spi->mode & SPI_CPHA) in fsl_spi_setup()
553 cs->hw_mode |= SPMODE_CP_BEGIN_EDGECLK; in fsl_spi_setup()
554 if (spi->mode & SPI_CPOL) in fsl_spi_setup()
555 cs->hw_mode |= SPMODE_CI_INACTIVEHIGH; in fsl_spi_setup()
556 if (!(spi->mode & SPI_LSB_FIRST)) in fsl_spi_setup()
557 cs->hw_mode |= SPMODE_REV; in fsl_spi_setup()
558 if (spi->mode & SPI_LOOP) in fsl_spi_setup()
559 cs->hw_mode |= SPMODE_LOOP; in fsl_spi_setup()
561 retval = fsl_spi_setup_transfer(spi, NULL); in fsl_spi_setup()
563 cs->hw_mode = hw_mode; /* Restore settings */ in fsl_spi_setup()
572 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_cpm_irq()
574 dev_dbg(mspi->dev, "%s: bd datlen %d, count %d\n", __func__, in fsl_spi_cpm_irq()
575 in_be16(&mspi->rx_bd->cbd_datlen), mspi->count); in fsl_spi_cpm_irq()
577 len = in_be16(&mspi->rx_bd->cbd_datlen); in fsl_spi_cpm_irq()
578 if (len > mspi->count) { in fsl_spi_cpm_irq()
580 len = mspi->count; in fsl_spi_cpm_irq()
584 mpc8xxx_spi_write_reg(&reg_base->event, events); in fsl_spi_cpm_irq()
586 mspi->count -= len; in fsl_spi_cpm_irq()
587 if (mspi->count) in fsl_spi_cpm_irq()
590 complete(&mspi->done); in fsl_spi_cpm_irq()
595 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_cpu_irq()
599 u32 rx_data = mpc8xxx_spi_read_reg(&reg_base->receive); in fsl_spi_cpu_irq()
601 if (mspi->rx) in fsl_spi_cpu_irq()
602 mspi->get_rx(rx_data, mspi); in fsl_spi_cpu_irq()
608 mpc8xxx_spi_read_reg(&reg_base->event)) & in fsl_spi_cpu_irq()
613 mpc8xxx_spi_write_reg(&reg_base->event, events); in fsl_spi_cpu_irq()
615 mspi->count -= 1; in fsl_spi_cpu_irq()
616 if (mspi->count) { in fsl_spi_cpu_irq()
617 u32 word = mspi->get_tx(mspi); in fsl_spi_cpu_irq()
619 mpc8xxx_spi_write_reg(&reg_base->transmit, word); in fsl_spi_cpu_irq()
621 complete(&mspi->done); in fsl_spi_cpu_irq()
630 struct fsl_spi_reg *reg_base = mspi->reg_base; in fsl_spi_irq()
633 events = mpc8xxx_spi_read_reg(&reg_base->event); in fsl_spi_irq()
637 dev_dbg(mspi->dev, "%s: events %x\n", __func__, events); in fsl_spi_irq()
639 if (mspi->flags & SPI_CPM_MODE) in fsl_spi_irq()
674 fsl_dummy_rx_refcnt--; in fsl_spi_free_dummy_rx()
683 struct device *dev = mspi->dev; in fsl_spi_cpm_get_pram()
684 struct device_node *np = dev->of_node; in fsl_spi_cpm_get_pram()
688 unsigned long pram_ofs = -ENOMEM; in fsl_spi_cpm_get_pram()
694 if (mspi->flags & SPI_QE && iprop && size == sizeof(*iprop) * 4) in fsl_spi_cpm_get_pram()
698 if (mspi->flags & SPI_QE) { in fsl_spi_cpm_get_pram()
700 qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, mspi->subblock, in fsl_spi_cpm_get_pram()
707 return -EINVAL; in fsl_spi_cpm_get_pram()
709 if (mspi->flags & SPI_CPM2) { in fsl_spi_cpm_get_pram()
714 u16 rpbase = in_be16(&pram->rpbase); in fsl_spi_cpm_get_pram()
731 struct device *dev = mspi->dev; in fsl_spi_cpm_init()
732 struct device_node *np = dev->of_node; in fsl_spi_cpm_init()
738 if (!(mspi->flags & SPI_CPM_MODE)) in fsl_spi_cpm_init()
742 return -ENOMEM; in fsl_spi_cpm_init()
744 if (mspi->flags & SPI_QE) { in fsl_spi_cpm_init()
745 iprop = of_get_property(np, "cell-index", &size); in fsl_spi_cpm_init()
747 mspi->subblock = *iprop; in fsl_spi_cpm_init()
749 switch (mspi->subblock) { in fsl_spi_cpm_init()
751 dev_warn(dev, "cell-index unspecified, assuming SPI1"); in fsl_spi_cpm_init()
754 mspi->subblock = QE_CR_SUBBLOCK_SPI1; in fsl_spi_cpm_init()
757 mspi->subblock = QE_CR_SUBBLOCK_SPI2; in fsl_spi_cpm_init()
764 dev_err(dev, "can't allocate spi parameter ram\n"); in fsl_spi_cpm_init()
768 bds_ofs = cpm_muram_alloc(sizeof(*mspi->tx_bd) + in fsl_spi_cpm_init()
769 sizeof(*mspi->rx_bd), 8); in fsl_spi_cpm_init()
775 mspi->dma_dummy_tx = dma_map_single(dev, empty_zero_page, PAGE_SIZE, in fsl_spi_cpm_init()
777 if (dma_mapping_error(dev, mspi->dma_dummy_tx)) { in fsl_spi_cpm_init()
782 mspi->dma_dummy_rx = dma_map_single(dev, fsl_dummy_rx, SPI_MRBLR, in fsl_spi_cpm_init()
784 if (dma_mapping_error(dev, mspi->dma_dummy_rx)) { in fsl_spi_cpm_init()
789 mspi->pram = cpm_muram_addr(pram_ofs); in fsl_spi_cpm_init()
791 mspi->tx_bd = cpm_muram_addr(bds_ofs); in fsl_spi_cpm_init()
792 mspi->rx_bd = cpm_muram_addr(bds_ofs + sizeof(*mspi->tx_bd)); in fsl_spi_cpm_init()
795 out_be16(&mspi->pram->tbase, cpm_muram_offset(mspi->tx_bd)); in fsl_spi_cpm_init()
796 out_be16(&mspi->pram->rbase, cpm_muram_offset(mspi->rx_bd)); in fsl_spi_cpm_init()
797 out_8(&mspi->pram->tfcr, CPMFCR_EB | CPMFCR_GBL); in fsl_spi_cpm_init()
798 out_8(&mspi->pram->rfcr, CPMFCR_EB | CPMFCR_GBL); in fsl_spi_cpm_init()
799 out_be16(&mspi->pram->mrblr, SPI_MRBLR); in fsl_spi_cpm_init()
800 out_be32(&mspi->pram->rstate, 0); in fsl_spi_cpm_init()
801 out_be32(&mspi->pram->rdp, 0); in fsl_spi_cpm_init()
802 out_be16(&mspi->pram->rbptr, 0); in fsl_spi_cpm_init()
803 out_be16(&mspi->pram->rbc, 0); in fsl_spi_cpm_init()
804 out_be32(&mspi->pram->rxtmp, 0); in fsl_spi_cpm_init()
805 out_be32(&mspi->pram->tstate, 0); in fsl_spi_cpm_init()
806 out_be32(&mspi->pram->tdp, 0); in fsl_spi_cpm_init()
807 out_be16(&mspi->pram->tbptr, 0); in fsl_spi_cpm_init()
808 out_be16(&mspi->pram->tbc, 0); in fsl_spi_cpm_init()
809 out_be32(&mspi->pram->txtmp, 0); in fsl_spi_cpm_init()
814 dma_unmap_single(dev, mspi->dma_dummy_tx, PAGE_SIZE, DMA_TO_DEVICE); in fsl_spi_cpm_init()
821 return -ENOMEM; in fsl_spi_cpm_init()
826 struct device *dev = mspi->dev; in fsl_spi_cpm_free()
828 if (!(mspi->flags & SPI_CPM_MODE)) in fsl_spi_cpm_free()
831 dma_unmap_single(dev, mspi->dma_dummy_rx, SPI_MRBLR, DMA_FROM_DEVICE); in fsl_spi_cpm_free()
832 dma_unmap_single(dev, mspi->dma_dummy_tx, PAGE_SIZE, DMA_TO_DEVICE); in fsl_spi_cpm_free()
833 cpm_muram_free(cpm_muram_offset(mspi->tx_bd)); in fsl_spi_cpm_free()
834 cpm_muram_free(cpm_muram_offset(mspi->pram)); in fsl_spi_cpm_free()
840 iounmap(mspi->reg_base); in fsl_spi_remove()
847 struct fsl_spi_platform_data *pdata = dev->platform_data; in fsl_spi_probe()
856 ret = -ENOMEM; in fsl_spi_probe()
866 master->setup = fsl_spi_setup; in fsl_spi_probe()
869 mpc8xxx_spi->spi_do_one_msg = fsl_spi_do_one_msg; in fsl_spi_probe()
870 mpc8xxx_spi->spi_remove = fsl_spi_remove; in fsl_spi_probe()
877 if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) { in fsl_spi_probe()
878 mpc8xxx_spi->rx_shift = 16; in fsl_spi_probe()
879 mpc8xxx_spi->tx_shift = 24; in fsl_spi_probe()
882 mpc8xxx_spi->reg_base = ioremap(mem->start, resource_size(mem)); in fsl_spi_probe()
883 if (mpc8xxx_spi->reg_base == NULL) { in fsl_spi_probe()
884 ret = -ENOMEM; in fsl_spi_probe()
888 /* Register for SPI Interrupt */ in fsl_spi_probe()
889 ret = request_irq(mpc8xxx_spi->irq, fsl_spi_irq, in fsl_spi_probe()
895 reg_base = mpc8xxx_spi->reg_base; in fsl_spi_probe()
897 /* SPI controller initializations */ in fsl_spi_probe()
898 mpc8xxx_spi_write_reg(&reg_base->mode, 0); in fsl_spi_probe()
899 mpc8xxx_spi_write_reg(&reg_base->mask, 0); in fsl_spi_probe()
900 mpc8xxx_spi_write_reg(&reg_base->command, 0); in fsl_spi_probe()
901 mpc8xxx_spi_write_reg(&reg_base->event, 0xffffffff); in fsl_spi_probe()
903 /* Enable SPI interface */ in fsl_spi_probe()
904 regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE; in fsl_spi_probe()
905 if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) in fsl_spi_probe()
908 mpc8xxx_spi_write_reg(&reg_base->mode, regval); in fsl_spi_probe()
915 mpc8xxx_spi->irq, mpc8xxx_spi_strmode(mpc8xxx_spi->flags)); in fsl_spi_probe()
920 free_irq(mpc8xxx_spi->irq, mpc8xxx_spi); in fsl_spi_probe()
922 iounmap(mpc8xxx_spi->reg_base); in fsl_spi_probe()
932 static void fsl_spi_cs_control(struct spi_device *spi, bool on) in fsl_spi_cs_control() argument
934 struct device *dev = spi->dev.parent; in fsl_spi_cs_control()
935 struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(dev->platform_data); in fsl_spi_cs_control()
936 u16 cs = spi->chip_select; in fsl_spi_cs_control()
937 int gpio = pinfo->gpios[cs]; in fsl_spi_cs_control() local
938 bool alow = pinfo->alow_flags[cs]; in fsl_spi_cs_control()
940 gpio_set_value(gpio, on ^ alow); in fsl_spi_cs_control()
945 struct device_node *np = dev->of_node; in of_fsl_spi_get_chipselects()
946 struct fsl_spi_platform_data *pdata = dev->platform_data; in of_fsl_spi_get_chipselects()
955 * SPI w/o chip-select line. One SPI device is still permitted in of_fsl_spi_get_chipselects()
958 pdata->max_chipselect = 1; in of_fsl_spi_get_chipselects()
962 pinfo->gpios = kmalloc(ngpios * sizeof(*pinfo->gpios), GFP_KERNEL); in of_fsl_spi_get_chipselects()
963 if (!pinfo->gpios) in of_fsl_spi_get_chipselects()
964 return -ENOMEM; in of_fsl_spi_get_chipselects()
965 memset(pinfo->gpios, -1, ngpios * sizeof(*pinfo->gpios)); in of_fsl_spi_get_chipselects()
967 pinfo->alow_flags = kzalloc(ngpios * sizeof(*pinfo->alow_flags), in of_fsl_spi_get_chipselects()
969 if (!pinfo->alow_flags) { in of_fsl_spi_get_chipselects()
970 ret = -ENOMEM; in of_fsl_spi_get_chipselects()
975 int gpio; in of_fsl_spi_get_chipselects() local
978 gpio = of_get_gpio_flags(np, i, &flags); in of_fsl_spi_get_chipselects()
979 if (!gpio_is_valid(gpio)) { in of_fsl_spi_get_chipselects()
980 dev_err(dev, "invalid gpio #%d: %d\n", i, gpio); in of_fsl_spi_get_chipselects()
981 ret = gpio; in of_fsl_spi_get_chipselects()
985 ret = gpio_request(gpio, dev_name(dev)); in of_fsl_spi_get_chipselects()
987 dev_err(dev, "can't request gpio #%d: %d\n", i, ret); in of_fsl_spi_get_chipselects()
991 pinfo->gpios[i] = gpio; in of_fsl_spi_get_chipselects()
992 pinfo->alow_flags[i] = flags & OF_GPIO_ACTIVE_LOW; in of_fsl_spi_get_chipselects()
994 ret = gpio_direction_output(pinfo->gpios[i], in of_fsl_spi_get_chipselects()
995 pinfo->alow_flags[i]); in of_fsl_spi_get_chipselects()
997 dev_err(dev, "can't set output direction for gpio " in of_fsl_spi_get_chipselects()
1003 pdata->max_chipselect = ngpios; in of_fsl_spi_get_chipselects()
1004 pdata->cs_control = fsl_spi_cs_control; in of_fsl_spi_get_chipselects()
1010 if (gpio_is_valid(pinfo->gpios[i])) in of_fsl_spi_get_chipselects()
1011 gpio_free(pinfo->gpios[i]); in of_fsl_spi_get_chipselects()
1012 i--; in of_fsl_spi_get_chipselects()
1015 kfree(pinfo->alow_flags); in of_fsl_spi_get_chipselects()
1016 pinfo->alow_flags = NULL; in of_fsl_spi_get_chipselects()
1018 kfree(pinfo->gpios); in of_fsl_spi_get_chipselects()
1019 pinfo->gpios = NULL; in of_fsl_spi_get_chipselects()
1025 struct fsl_spi_platform_data *pdata = dev->platform_data; in of_fsl_spi_free_chipselects()
1029 if (!pinfo->gpios) in of_fsl_spi_free_chipselects()
1032 for (i = 0; i < pdata->max_chipselect; i++) { in of_fsl_spi_free_chipselects()
1033 if (gpio_is_valid(pinfo->gpios[i])) in of_fsl_spi_free_chipselects()
1034 gpio_free(pinfo->gpios[i]); in of_fsl_spi_free_chipselects()
1037 kfree(pinfo->gpios); in of_fsl_spi_free_chipselects()
1038 kfree(pinfo->alow_flags); in of_fsl_spi_free_chipselects()
1044 struct device *dev = &ofdev->dev; in of_fsl_spi_probe()
1045 struct device_node *np = ofdev->dev.of_node; in of_fsl_spi_probe()
1049 int ret = -ENOMEM; in of_fsl_spi_probe()
1065 ret = -EINVAL; in of_fsl_spi_probe()
1086 ret = mpc8xxx_spi_remove(&ofdev->dev); in of_fsl_spi_remove()
1089 of_fsl_spi_free_chipselects(&ofdev->dev); in of_fsl_spi_remove()
1094 { .compatible = "fsl,spi" },
1112 * This is "legacy" platform driver, was used by the MPC8323E-RDB boards
1113 * only. The driver should go away soon, since newer MPC8323E-RDB's device
1123 if (!pdev->dev.platform_data) in plat_mpc8xxx_spi_probe()
1124 return -EINVAL; in plat_mpc8xxx_spi_probe()
1128 return -EINVAL; in plat_mpc8xxx_spi_probe()
1132 return -EINVAL; in plat_mpc8xxx_spi_probe()
1134 master = fsl_spi_probe(&pdev->dev, mem, irq); in plat_mpc8xxx_spi_probe()
1142 return mpc8xxx_spi_remove(&pdev->dev); in plat_mpc8xxx_spi_remove()
1188 MODULE_DESCRIPTION("Simple Freescale SPI Driver");