Lines Matching +full:mpc5200 +full:- +full:spi

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * MPC52xx PSC in SPI mode driver.
20 #include <linux/spi/spi.h>
31 void (*cs_control)(struct spi_device *spi, bool on);
58 static int mpc52xx_psc_spi_transfer_setup(struct spi_device *spi, in mpc52xx_psc_spi_transfer_setup() argument
61 struct mpc52xx_psc_spi_cs *cs = spi->controller_state; in mpc52xx_psc_spi_transfer_setup()
63 cs->speed_hz = (t && t->speed_hz) in mpc52xx_psc_spi_transfer_setup()
64 ? t->speed_hz : spi->max_speed_hz; in mpc52xx_psc_spi_transfer_setup()
65 cs->bits_per_word = (t && t->bits_per_word) in mpc52xx_psc_spi_transfer_setup()
66 ? t->bits_per_word : spi->bits_per_word; in mpc52xx_psc_spi_transfer_setup()
67 cs->bits_per_word = ((cs->bits_per_word + 7) / 8) * 8; in mpc52xx_psc_spi_transfer_setup()
71 static void mpc52xx_psc_spi_activate_cs(struct spi_device *spi) in mpc52xx_psc_spi_activate_cs() argument
73 struct mpc52xx_psc_spi_cs *cs = spi->controller_state; in mpc52xx_psc_spi_activate_cs()
74 struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); in mpc52xx_psc_spi_activate_cs()
75 struct mpc52xx_psc __iomem *psc = mps->psc; in mpc52xx_psc_spi_activate_cs()
79 sicr = in_be32(&psc->sicr); in mpc52xx_psc_spi_activate_cs()
82 if (spi->mode & SPI_CPHA) in mpc52xx_psc_spi_activate_cs()
86 if (spi->mode & SPI_CPOL) in mpc52xx_psc_spi_activate_cs()
91 if (spi->mode & SPI_LSB_FIRST) in mpc52xx_psc_spi_activate_cs()
95 out_be32(&psc->sicr, sicr); in mpc52xx_psc_spi_activate_cs()
98 * Because psc->ccr is defined as 16bit register instead of 32bit in mpc52xx_psc_spi_activate_cs()
101 ccr = in_be16((u16 __iomem *)&psc->ccr); in mpc52xx_psc_spi_activate_cs()
103 if (cs->speed_hz) in mpc52xx_psc_spi_activate_cs()
104 ccr |= (MCLK / cs->speed_hz - 1) & 0xFF; in mpc52xx_psc_spi_activate_cs()
105 else /* by default SPI Clk 1MHz */ in mpc52xx_psc_spi_activate_cs()
106 ccr |= (MCLK / 1000000 - 1) & 0xFF; in mpc52xx_psc_spi_activate_cs()
107 out_be16((u16 __iomem *)&psc->ccr, ccr); in mpc52xx_psc_spi_activate_cs()
108 mps->bits_per_word = cs->bits_per_word; in mpc52xx_psc_spi_activate_cs()
110 if (mps->cs_control) in mpc52xx_psc_spi_activate_cs()
111 mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 1 : 0); in mpc52xx_psc_spi_activate_cs()
114 static void mpc52xx_psc_spi_deactivate_cs(struct spi_device *spi) in mpc52xx_psc_spi_deactivate_cs() argument
116 struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); in mpc52xx_psc_spi_deactivate_cs()
118 if (mps->cs_control) in mpc52xx_psc_spi_deactivate_cs()
119 mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 0 : 1); in mpc52xx_psc_spi_deactivate_cs()
126 static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, in mpc52xx_psc_spi_transfer_rxtx() argument
129 struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); in mpc52xx_psc_spi_transfer_rxtx()
130 struct mpc52xx_psc __iomem *psc = mps->psc; in mpc52xx_psc_spi_transfer_rxtx()
131 struct mpc52xx_psc_fifo __iomem *fifo = mps->fifo; in mpc52xx_psc_spi_transfer_rxtx()
134 unsigned char *rx_buf = (unsigned char *)t->rx_buf; in mpc52xx_psc_spi_transfer_rxtx()
135 unsigned char *tx_buf = (unsigned char *)t->tx_buf; in mpc52xx_psc_spi_transfer_rxtx()
141 if (!t->tx_buf && !t->rx_buf && t->len) in mpc52xx_psc_spi_transfer_rxtx()
142 return -EINVAL; in mpc52xx_psc_spi_transfer_rxtx()
145 out_8(&psc->command, MPC52xx_PSC_TX_ENABLE | MPC52xx_PSC_RX_ENABLE); in mpc52xx_psc_spi_transfer_rxtx()
146 while (rb < t->len) { in mpc52xx_psc_spi_transfer_rxtx()
147 if (t->len - rb > MPC52xx_PSC_BUFSIZE) { in mpc52xx_psc_spi_transfer_rxtx()
151 send_at_once = t->len - sb; in mpc52xx_psc_spi_transfer_rxtx()
152 rfalarm = MPC52xx_PSC_BUFSIZE - (t->len - rb); in mpc52xx_psc_spi_transfer_rxtx()
156 dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); in mpc52xx_psc_spi_transfer_rxtx()
157 for (; send_at_once; sb++, send_at_once--) { in mpc52xx_psc_spi_transfer_rxtx()
160 out_8(&psc->ircr2, 0x01); in mpc52xx_psc_spi_transfer_rxtx()
163 out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]); in mpc52xx_psc_spi_transfer_rxtx()
165 out_8(&psc->mpc52xx_psc_buffer_8, 0); in mpc52xx_psc_spi_transfer_rxtx()
173 out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1); in mpc52xx_psc_spi_transfer_rxtx()
174 if (t->len - rb == 1) { in mpc52xx_psc_spi_transfer_rxtx()
175 out_8(&psc->mode, 0); in mpc52xx_psc_spi_transfer_rxtx()
177 out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); in mpc52xx_psc_spi_transfer_rxtx()
178 out_be16(&fifo->rfalarm, rfalarm); in mpc52xx_psc_spi_transfer_rxtx()
180 out_be16(&psc->mpc52xx_psc_imr, MPC52xx_PSC_IMR_RXRDY); in mpc52xx_psc_spi_transfer_rxtx()
181 wait_for_completion(&mps->done); in mpc52xx_psc_spi_transfer_rxtx()
182 recv_at_once = in_be16(&fifo->rfnum); in mpc52xx_psc_spi_transfer_rxtx()
183 dev_dbg(&spi->dev, "%d bytes received\n", recv_at_once); in mpc52xx_psc_spi_transfer_rxtx()
187 for (; recv_at_once; rb++, recv_at_once--) in mpc52xx_psc_spi_transfer_rxtx()
188 rx_buf[rb] = in_8(&psc->mpc52xx_psc_buffer_8); in mpc52xx_psc_spi_transfer_rxtx()
190 for (; recv_at_once; rb++, recv_at_once--) in mpc52xx_psc_spi_transfer_rxtx()
191 in_8(&psc->mpc52xx_psc_buffer_8); in mpc52xx_psc_spi_transfer_rxtx()
195 out_8(&psc->command, MPC52xx_PSC_TX_DISABLE | MPC52xx_PSC_RX_DISABLE); in mpc52xx_psc_spi_transfer_rxtx()
205 spin_lock_irq(&mps->lock); in mpc52xx_psc_spi_work()
206 mps->busy = 1; in mpc52xx_psc_spi_work()
207 while (!list_empty(&mps->queue)) { in mpc52xx_psc_spi_work()
209 struct spi_device *spi; in mpc52xx_psc_spi_work() local
214 m = container_of(mps->queue.next, struct spi_message, queue); in mpc52xx_psc_spi_work()
215 list_del_init(&m->queue); in mpc52xx_psc_spi_work()
216 spin_unlock_irq(&mps->lock); in mpc52xx_psc_spi_work()
218 spi = m->spi; in mpc52xx_psc_spi_work()
221 list_for_each_entry (t, &m->transfers, transfer_list) { in mpc52xx_psc_spi_work()
222 if (t->bits_per_word || t->speed_hz) { in mpc52xx_psc_spi_work()
223 status = mpc52xx_psc_spi_transfer_setup(spi, t); in mpc52xx_psc_spi_work()
229 mpc52xx_psc_spi_activate_cs(spi); in mpc52xx_psc_spi_work()
230 cs_change = t->cs_change; in mpc52xx_psc_spi_work()
232 status = mpc52xx_psc_spi_transfer_rxtx(spi, t); in mpc52xx_psc_spi_work()
235 m->actual_length += t->len; in mpc52xx_psc_spi_work()
240 mpc52xx_psc_spi_deactivate_cs(spi); in mpc52xx_psc_spi_work()
243 m->status = status; in mpc52xx_psc_spi_work()
244 if (m->complete) in mpc52xx_psc_spi_work()
245 m->complete(m->context); in mpc52xx_psc_spi_work()
248 mpc52xx_psc_spi_deactivate_cs(spi); in mpc52xx_psc_spi_work()
250 mpc52xx_psc_spi_transfer_setup(spi, NULL); in mpc52xx_psc_spi_work()
252 spin_lock_irq(&mps->lock); in mpc52xx_psc_spi_work()
254 mps->busy = 0; in mpc52xx_psc_spi_work()
255 spin_unlock_irq(&mps->lock); in mpc52xx_psc_spi_work()
258 static int mpc52xx_psc_spi_setup(struct spi_device *spi) in mpc52xx_psc_spi_setup() argument
260 struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); in mpc52xx_psc_spi_setup()
261 struct mpc52xx_psc_spi_cs *cs = spi->controller_state; in mpc52xx_psc_spi_setup()
264 if (spi->bits_per_word%8) in mpc52xx_psc_spi_setup()
265 return -EINVAL; in mpc52xx_psc_spi_setup()
270 return -ENOMEM; in mpc52xx_psc_spi_setup()
271 spi->controller_state = cs; in mpc52xx_psc_spi_setup()
274 cs->bits_per_word = spi->bits_per_word; in mpc52xx_psc_spi_setup()
275 cs->speed_hz = spi->max_speed_hz; in mpc52xx_psc_spi_setup()
277 spin_lock_irqsave(&mps->lock, flags); in mpc52xx_psc_spi_setup()
278 if (!mps->busy) in mpc52xx_psc_spi_setup()
279 mpc52xx_psc_spi_deactivate_cs(spi); in mpc52xx_psc_spi_setup()
280 spin_unlock_irqrestore(&mps->lock, flags); in mpc52xx_psc_spi_setup()
285 static int mpc52xx_psc_spi_transfer(struct spi_device *spi, in mpc52xx_psc_spi_transfer() argument
288 struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); in mpc52xx_psc_spi_transfer()
291 m->actual_length = 0; in mpc52xx_psc_spi_transfer()
292 m->status = -EINPROGRESS; in mpc52xx_psc_spi_transfer()
294 spin_lock_irqsave(&mps->lock, flags); in mpc52xx_psc_spi_transfer()
295 list_add_tail(&m->queue, &mps->queue); in mpc52xx_psc_spi_transfer()
296 schedule_work(&mps->work); in mpc52xx_psc_spi_transfer()
297 spin_unlock_irqrestore(&mps->lock, flags); in mpc52xx_psc_spi_transfer()
302 static void mpc52xx_psc_spi_cleanup(struct spi_device *spi) in mpc52xx_psc_spi_cleanup() argument
304 kfree(spi->controller_state); in mpc52xx_psc_spi_cleanup()
309 struct mpc52xx_psc __iomem *psc = mps->psc; in mpc52xx_psc_spi_port_config()
310 struct mpc52xx_psc_fifo __iomem *fifo = mps->fifo; in mpc52xx_psc_spi_port_config()
315 mclken_div = (mps->sysclk ? mps->sysclk : 512000000) / MCLK; in mpc52xx_psc_spi_port_config()
321 out_8(&psc->command, MPC52xx_PSC_RST_RX); in mpc52xx_psc_spi_port_config()
322 out_8(&psc->command, MPC52xx_PSC_RST_TX); in mpc52xx_psc_spi_port_config()
323 out_8(&psc->command, MPC52xx_PSC_TX_DISABLE | MPC52xx_PSC_RX_DISABLE); in mpc52xx_psc_spi_port_config()
326 out_be16(&psc->mpc52xx_psc_imr, 0); in mpc52xx_psc_spi_port_config()
327 out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1); in mpc52xx_psc_spi_port_config()
328 out_8(&fifo->rfcntl, 0); in mpc52xx_psc_spi_port_config()
329 out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); in mpc52xx_psc_spi_port_config()
331 /* Configure 8bit codec mode as a SPI master and use EOF flags */ in mpc52xx_psc_spi_port_config()
333 out_be32(&psc->sicr, 0x0180C800); in mpc52xx_psc_spi_port_config()
334 out_be16((u16 __iomem *)&psc->ccr, 0x070F); /* default SPI Clk 1MHz */ in mpc52xx_psc_spi_port_config()
337 out_8(&psc->ctur, 0x00); in mpc52xx_psc_spi_port_config()
338 out_8(&psc->ctlr, 0x84); in mpc52xx_psc_spi_port_config()
340 mps->bits_per_word = 8; in mpc52xx_psc_spi_port_config()
348 struct mpc52xx_psc __iomem *psc = mps->psc; in mpc52xx_psc_spi_isr()
351 if (in_be16(&psc->mpc52xx_psc_isr) & MPC52xx_PSC_IMR_RXRDY) { in mpc52xx_psc_spi_isr()
352 out_be16(&psc->mpc52xx_psc_imr, 0); in mpc52xx_psc_spi_isr()
353 complete(&mps->done); in mpc52xx_psc_spi_isr()
359 /* bus_num is used only for the case dev->platform_data == NULL */
370 return -ENOMEM; in mpc52xx_psc_spi_do_probe()
375 /* the spi->mode bits understood by this driver: */ in mpc52xx_psc_spi_do_probe()
376 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LSB_FIRST; in mpc52xx_psc_spi_do_probe()
378 mps->irq = irq; in mpc52xx_psc_spi_do_probe()
382 mps->cs_control = NULL; in mpc52xx_psc_spi_do_probe()
383 mps->sysclk = 0; in mpc52xx_psc_spi_do_probe()
384 master->bus_num = bus_num; in mpc52xx_psc_spi_do_probe()
385 master->num_chipselect = 255; in mpc52xx_psc_spi_do_probe()
387 mps->cs_control = pdata->cs_control; in mpc52xx_psc_spi_do_probe()
388 mps->sysclk = pdata->sysclk; in mpc52xx_psc_spi_do_probe()
389 master->bus_num = pdata->bus_num; in mpc52xx_psc_spi_do_probe()
390 master->num_chipselect = pdata->max_chipselect; in mpc52xx_psc_spi_do_probe()
392 master->setup = mpc52xx_psc_spi_setup; in mpc52xx_psc_spi_do_probe()
393 master->transfer = mpc52xx_psc_spi_transfer; in mpc52xx_psc_spi_do_probe()
394 master->cleanup = mpc52xx_psc_spi_cleanup; in mpc52xx_psc_spi_do_probe()
395 master->dev.of_node = dev->of_node; in mpc52xx_psc_spi_do_probe()
397 mps->psc = ioremap(regaddr, size); in mpc52xx_psc_spi_do_probe()
398 if (!mps->psc) { in mpc52xx_psc_spi_do_probe()
400 ret = -EFAULT; in mpc52xx_psc_spi_do_probe()
404 mps->fifo = ((void __iomem *)mps->psc) + sizeof(struct mpc52xx_psc); in mpc52xx_psc_spi_do_probe()
406 ret = request_irq(mps->irq, mpc52xx_psc_spi_isr, 0, "mpc52xx-psc-spi", in mpc52xx_psc_spi_do_probe()
411 ret = mpc52xx_psc_spi_port_config(master->bus_num, mps); in mpc52xx_psc_spi_do_probe()
413 dev_err(dev, "can't configure PSC! Is it capable of SPI?\n"); in mpc52xx_psc_spi_do_probe()
417 spin_lock_init(&mps->lock); in mpc52xx_psc_spi_do_probe()
418 init_completion(&mps->done); in mpc52xx_psc_spi_do_probe()
419 INIT_WORK(&mps->work, mpc52xx_psc_spi_work); in mpc52xx_psc_spi_do_probe()
420 INIT_LIST_HEAD(&mps->queue); in mpc52xx_psc_spi_do_probe()
429 free_irq(mps->irq, mps); in mpc52xx_psc_spi_do_probe()
431 if (mps->psc) in mpc52xx_psc_spi_do_probe()
432 iounmap(mps->psc); in mpc52xx_psc_spi_do_probe()
442 s16 id = -1; in mpc52xx_psc_spi_of_probe()
444 regaddr_p = of_get_address(op->dev.of_node, 0, &size64, NULL); in mpc52xx_psc_spi_of_probe()
446 dev_err(&op->dev, "Invalid PSC address\n"); in mpc52xx_psc_spi_of_probe()
447 return -EINVAL; in mpc52xx_psc_spi_of_probe()
449 regaddr64 = of_translate_address(op->dev.of_node, regaddr_p); in mpc52xx_psc_spi_of_probe()
452 if (op->dev.platform_data == NULL) { in mpc52xx_psc_spi_of_probe()
455 psc_nump = of_get_property(op->dev.of_node, "cell-index", NULL); in mpc52xx_psc_spi_of_probe()
457 dev_err(&op->dev, "Invalid cell-index property\n"); in mpc52xx_psc_spi_of_probe()
458 return -EINVAL; in mpc52xx_psc_spi_of_probe()
463 return mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64, in mpc52xx_psc_spi_of_probe()
464 irq_of_parse_and_map(op->dev.of_node, 0), id); in mpc52xx_psc_spi_of_probe()
472 flush_work(&mps->work); in mpc52xx_psc_spi_of_remove()
474 free_irq(mps->irq, mps); in mpc52xx_psc_spi_of_remove()
475 if (mps->psc) in mpc52xx_psc_spi_of_remove()
476 iounmap(mps->psc); in mpc52xx_psc_spi_of_remove()
483 { .compatible = "fsl,mpc5200-psc-spi", },
484 { .compatible = "mpc5200-psc-spi", }, /* old */
494 .name = "mpc52xx-psc-spi",
501 MODULE_DESCRIPTION("MPC52xx PSC SPI Driver");