Lines Matching refs:mcfqspi

68 struct mcfqspi {  struct
77 static void mcfqspi_wr_qmr(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qmr() argument
79 writew(val, mcfqspi->iobase + MCFQSPI_QMR); in mcfqspi_wr_qmr()
82 static void mcfqspi_wr_qdlyr(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qdlyr() argument
84 writew(val, mcfqspi->iobase + MCFQSPI_QDLYR); in mcfqspi_wr_qdlyr()
87 static u16 mcfqspi_rd_qdlyr(struct mcfqspi *mcfqspi) in mcfqspi_rd_qdlyr() argument
89 return readw(mcfqspi->iobase + MCFQSPI_QDLYR); in mcfqspi_rd_qdlyr()
92 static void mcfqspi_wr_qwr(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qwr() argument
94 writew(val, mcfqspi->iobase + MCFQSPI_QWR); in mcfqspi_wr_qwr()
97 static void mcfqspi_wr_qir(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qir() argument
99 writew(val, mcfqspi->iobase + MCFQSPI_QIR); in mcfqspi_wr_qir()
102 static void mcfqspi_wr_qar(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qar() argument
104 writew(val, mcfqspi->iobase + MCFQSPI_QAR); in mcfqspi_wr_qar()
107 static void mcfqspi_wr_qdr(struct mcfqspi *mcfqspi, u16 val) in mcfqspi_wr_qdr() argument
109 writew(val, mcfqspi->iobase + MCFQSPI_QDR); in mcfqspi_wr_qdr()
112 static u16 mcfqspi_rd_qdr(struct mcfqspi *mcfqspi) in mcfqspi_rd_qdr() argument
114 return readw(mcfqspi->iobase + MCFQSPI_QDR); in mcfqspi_rd_qdr()
117 static void mcfqspi_cs_select(struct mcfqspi *mcfqspi, u8 chip_select, in mcfqspi_cs_select() argument
120 mcfqspi->cs_control->select(mcfqspi->cs_control, chip_select, cs_high); in mcfqspi_cs_select()
123 static void mcfqspi_cs_deselect(struct mcfqspi *mcfqspi, u8 chip_select, in mcfqspi_cs_deselect() argument
126 mcfqspi->cs_control->deselect(mcfqspi->cs_control, chip_select, cs_high); in mcfqspi_cs_deselect()
129 static int mcfqspi_cs_setup(struct mcfqspi *mcfqspi) in mcfqspi_cs_setup() argument
131 return (mcfqspi->cs_control->setup) ? in mcfqspi_cs_setup()
132 mcfqspi->cs_control->setup(mcfqspi->cs_control) : 0; in mcfqspi_cs_setup()
135 static void mcfqspi_cs_teardown(struct mcfqspi *mcfqspi) in mcfqspi_cs_teardown() argument
137 if (mcfqspi->cs_control->teardown) in mcfqspi_cs_teardown()
138 mcfqspi->cs_control->teardown(mcfqspi->cs_control); in mcfqspi_cs_teardown()
146 static bool mcfqspi_qdlyr_spe(struct mcfqspi *mcfqspi) in mcfqspi_qdlyr_spe() argument
148 return mcfqspi_rd_qdlyr(mcfqspi) & MCFQSPI_QDLYR_SPE; in mcfqspi_qdlyr_spe()
153 struct mcfqspi *mcfqspi = dev_id; in mcfqspi_irq_handler() local
156 mcfqspi_wr_qir(mcfqspi, MCFQSPI_QIR_SPIFE | MCFQSPI_QIR_SPIF); in mcfqspi_irq_handler()
157 wake_up(&mcfqspi->waitq); in mcfqspi_irq_handler()
162 static void mcfqspi_transfer_msg8(struct mcfqspi *mcfqspi, unsigned count, in mcfqspi_transfer_msg8() argument
169 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_CMDBUF); in mcfqspi_transfer_msg8()
171 mcfqspi_wr_qdr(mcfqspi, MCFQSPI_QCR_BITSE); in mcfqspi_transfer_msg8()
173 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_TXBUF); in mcfqspi_transfer_msg8()
176 mcfqspi_wr_qdr(mcfqspi, *txbuf++); in mcfqspi_transfer_msg8()
179 mcfqspi_wr_qdr(mcfqspi, 0); in mcfqspi_transfer_msg8()
184 mcfqspi_wr_qwr(mcfqspi, 0x700); in mcfqspi_transfer_msg8()
185 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg8()
188 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg8()
189 mcfqspi_wr_qwr(mcfqspi, qwr); in mcfqspi_transfer_msg8()
190 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg8()
192 mcfqspi_wr_qar(mcfqspi, in mcfqspi_transfer_msg8()
195 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg8()
199 mcfqspi_wr_qar(mcfqspi, in mcfqspi_transfer_msg8()
202 mcfqspi_wr_qdr(mcfqspi, *txbuf++); in mcfqspi_transfer_msg8()
208 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg8()
209 mcfqspi_wr_qwr(mcfqspi, qwr); in mcfqspi_transfer_msg8()
210 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg8()
212 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_RXBUF + offset); in mcfqspi_transfer_msg8()
214 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg8()
218 mcfqspi_wr_qwr(mcfqspi, (n - 1) << 8); in mcfqspi_transfer_msg8()
219 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg8()
221 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg8()
223 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_RXBUF + offset); in mcfqspi_transfer_msg8()
225 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg8()
229 static void mcfqspi_transfer_msg16(struct mcfqspi *mcfqspi, unsigned count, in mcfqspi_transfer_msg16() argument
236 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_CMDBUF); in mcfqspi_transfer_msg16()
238 mcfqspi_wr_qdr(mcfqspi, MCFQSPI_QCR_BITSE); in mcfqspi_transfer_msg16()
240 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_TXBUF); in mcfqspi_transfer_msg16()
243 mcfqspi_wr_qdr(mcfqspi, *txbuf++); in mcfqspi_transfer_msg16()
246 mcfqspi_wr_qdr(mcfqspi, 0); in mcfqspi_transfer_msg16()
251 mcfqspi_wr_qwr(mcfqspi, 0x700); in mcfqspi_transfer_msg16()
252 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg16()
255 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg16()
256 mcfqspi_wr_qwr(mcfqspi, qwr); in mcfqspi_transfer_msg16()
257 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg16()
259 mcfqspi_wr_qar(mcfqspi, in mcfqspi_transfer_msg16()
262 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg16()
266 mcfqspi_wr_qar(mcfqspi, in mcfqspi_transfer_msg16()
269 mcfqspi_wr_qdr(mcfqspi, *txbuf++); in mcfqspi_transfer_msg16()
275 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg16()
276 mcfqspi_wr_qwr(mcfqspi, qwr); in mcfqspi_transfer_msg16()
277 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg16()
279 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_RXBUF + offset); in mcfqspi_transfer_msg16()
281 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg16()
285 mcfqspi_wr_qwr(mcfqspi, (n - 1) << 8); in mcfqspi_transfer_msg16()
286 mcfqspi_wr_qdlyr(mcfqspi, MCFQSPI_QDLYR_SPE); in mcfqspi_transfer_msg16()
288 wait_event(mcfqspi->waitq, !mcfqspi_qdlyr_spe(mcfqspi)); in mcfqspi_transfer_msg16()
290 mcfqspi_wr_qar(mcfqspi, MCFQSPI_QAR_RXBUF + offset); in mcfqspi_transfer_msg16()
292 *rxbuf++ = mcfqspi_rd_qdr(mcfqspi); in mcfqspi_transfer_msg16()
298 struct mcfqspi *mcfqspi = spi_master_get_devdata(spi->master); in mcfqspi_set_cs() local
302 mcfqspi_cs_select(mcfqspi, spi->chip_select, cs_high); in mcfqspi_set_cs()
304 mcfqspi_cs_deselect(mcfqspi, spi->chip_select, cs_high); in mcfqspi_set_cs()
311 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_transfer_one() local
320 mcfqspi_wr_qmr(mcfqspi, qmr); in mcfqspi_transfer_one()
322 mcfqspi_wr_qir(mcfqspi, MCFQSPI_QIR_SPIFE); in mcfqspi_transfer_one()
324 mcfqspi_transfer_msg8(mcfqspi, t->len, t->tx_buf, t->rx_buf); in mcfqspi_transfer_one()
326 mcfqspi_transfer_msg16(mcfqspi, t->len / 2, t->tx_buf, in mcfqspi_transfer_one()
328 mcfqspi_wr_qir(mcfqspi, 0); in mcfqspi_transfer_one()
350 struct mcfqspi *mcfqspi; in mcfqspi_probe() local
366 master = spi_alloc_master(&pdev->dev, sizeof(*mcfqspi)); in mcfqspi_probe()
372 mcfqspi = spi_master_get_devdata(master); in mcfqspi_probe()
375 mcfqspi->iobase = devm_ioremap_resource(&pdev->dev, res); in mcfqspi_probe()
376 if (IS_ERR(mcfqspi->iobase)) { in mcfqspi_probe()
377 status = PTR_ERR(mcfqspi->iobase); in mcfqspi_probe()
381 mcfqspi->irq = platform_get_irq(pdev, 0); in mcfqspi_probe()
382 if (mcfqspi->irq < 0) { in mcfqspi_probe()
388 status = devm_request_irq(&pdev->dev, mcfqspi->irq, mcfqspi_irq_handler, in mcfqspi_probe()
389 0, pdev->name, mcfqspi); in mcfqspi_probe()
395 mcfqspi->clk = devm_clk_get(&pdev->dev, "qspi_clk"); in mcfqspi_probe()
396 if (IS_ERR(mcfqspi->clk)) { in mcfqspi_probe()
398 status = PTR_ERR(mcfqspi->clk); in mcfqspi_probe()
401 clk_enable(mcfqspi->clk); in mcfqspi_probe()
406 mcfqspi->cs_control = pdata->cs_control; in mcfqspi_probe()
407 status = mcfqspi_cs_setup(mcfqspi); in mcfqspi_probe()
413 init_waitqueue_head(&mcfqspi->waitq); in mcfqspi_probe()
437 mcfqspi_cs_teardown(mcfqspi); in mcfqspi_probe()
439 clk_disable(mcfqspi->clk); in mcfqspi_probe()
451 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_remove() local
455 mcfqspi_wr_qmr(mcfqspi, MCFQSPI_QMR_MSTR); in mcfqspi_remove()
457 mcfqspi_cs_teardown(mcfqspi); in mcfqspi_remove()
458 clk_disable(mcfqspi->clk); in mcfqspi_remove()
467 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_suspend() local
474 clk_disable(mcfqspi->clk); in mcfqspi_suspend()
482 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_resume() local
484 clk_enable(mcfqspi->clk); in mcfqspi_resume()
494 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_runtime_suspend() local
496 clk_disable(mcfqspi->clk); in mcfqspi_runtime_suspend()
504 struct mcfqspi *mcfqspi = spi_master_get_devdata(master); in mcfqspi_runtime_resume() local
506 clk_enable(mcfqspi->clk); in mcfqspi_runtime_resume()