Lines Matching refs:bs

156 static void bcm2835_debugfs_create(struct bcm2835_spi *bs,  in bcm2835_debugfs_create()  argument
167 bs->debugfs_dir = dir; in bcm2835_debugfs_create()
171 &bs->count_transfer_polling); in bcm2835_debugfs_create()
173 &bs->count_transfer_irq); in bcm2835_debugfs_create()
175 &bs->count_transfer_irq_after_polling); in bcm2835_debugfs_create()
177 &bs->count_transfer_dma); in bcm2835_debugfs_create()
180 static void bcm2835_debugfs_remove(struct bcm2835_spi *bs) in bcm2835_debugfs_remove() argument
182 debugfs_remove_recursive(bs->debugfs_dir); in bcm2835_debugfs_remove()
183 bs->debugfs_dir = NULL; in bcm2835_debugfs_remove()
186 static void bcm2835_debugfs_create(struct bcm2835_spi *bs, in bcm2835_debugfs_create() argument
191 static void bcm2835_debugfs_remove(struct bcm2835_spi *bs) in bcm2835_debugfs_remove() argument
196 static inline u32 bcm2835_rd(struct bcm2835_spi *bs, unsigned int reg) in bcm2835_rd() argument
198 return readl(bs->regs + reg); in bcm2835_rd()
201 static inline void bcm2835_wr(struct bcm2835_spi *bs, unsigned int reg, u32 val) in bcm2835_wr() argument
203 writel(val, bs->regs + reg); in bcm2835_wr()
206 static inline void bcm2835_rd_fifo(struct bcm2835_spi *bs) in bcm2835_rd_fifo() argument
210 while ((bs->rx_len) && in bcm2835_rd_fifo()
211 (bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_RXD)) { in bcm2835_rd_fifo()
212 byte = bcm2835_rd(bs, BCM2835_SPI_FIFO); in bcm2835_rd_fifo()
213 if (bs->rx_buf) in bcm2835_rd_fifo()
214 *bs->rx_buf++ = byte; in bcm2835_rd_fifo()
215 bs->rx_len--; in bcm2835_rd_fifo()
219 static inline void bcm2835_wr_fifo(struct bcm2835_spi *bs) in bcm2835_wr_fifo() argument
223 while ((bs->tx_len) && in bcm2835_wr_fifo()
224 (bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_TXD)) { in bcm2835_wr_fifo()
225 byte = bs->tx_buf ? *bs->tx_buf++ : 0; in bcm2835_wr_fifo()
226 bcm2835_wr(bs, BCM2835_SPI_FIFO, byte); in bcm2835_wr_fifo()
227 bs->tx_len--; in bcm2835_wr_fifo()
241 static inline void bcm2835_rd_fifo_count(struct bcm2835_spi *bs, int count) in bcm2835_rd_fifo_count() argument
246 bs->rx_len -= count; in bcm2835_rd_fifo_count()
249 val = bcm2835_rd(bs, BCM2835_SPI_FIFO); in bcm2835_rd_fifo_count()
251 memcpy(bs->rx_buf, &val, len); in bcm2835_rd_fifo_count()
252 bs->rx_buf += len; in bcm2835_rd_fifo_count()
267 static inline void bcm2835_wr_fifo_count(struct bcm2835_spi *bs, int count) in bcm2835_wr_fifo_count() argument
272 bs->tx_len -= count; in bcm2835_wr_fifo_count()
275 if (bs->tx_buf) { in bcm2835_wr_fifo_count()
277 memcpy(&val, bs->tx_buf, len); in bcm2835_wr_fifo_count()
278 bs->tx_buf += len; in bcm2835_wr_fifo_count()
282 bcm2835_wr(bs, BCM2835_SPI_FIFO, val); in bcm2835_wr_fifo_count()
295 static inline void bcm2835_wait_tx_fifo_empty(struct bcm2835_spi *bs) in bcm2835_wait_tx_fifo_empty() argument
297 while (!(bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_DONE)) in bcm2835_wait_tx_fifo_empty()
306 static inline void bcm2835_rd_fifo_blind(struct bcm2835_spi *bs, int count) in bcm2835_rd_fifo_blind() argument
310 count = min(count, bs->rx_len); in bcm2835_rd_fifo_blind()
311 bs->rx_len -= count; in bcm2835_rd_fifo_blind()
314 val = bcm2835_rd(bs, BCM2835_SPI_FIFO); in bcm2835_rd_fifo_blind()
315 if (bs->rx_buf) in bcm2835_rd_fifo_blind()
316 *bs->rx_buf++ = val; in bcm2835_rd_fifo_blind()
325 static inline void bcm2835_wr_fifo_blind(struct bcm2835_spi *bs, int count) in bcm2835_wr_fifo_blind() argument
329 count = min(count, bs->tx_len); in bcm2835_wr_fifo_blind()
330 bs->tx_len -= count; in bcm2835_wr_fifo_blind()
333 val = bs->tx_buf ? *bs->tx_buf++ : 0; in bcm2835_wr_fifo_blind()
334 bcm2835_wr(bs, BCM2835_SPI_FIFO, val); in bcm2835_wr_fifo_blind()
338 static void bcm2835_spi_reset_hw(struct bcm2835_spi *bs) in bcm2835_spi_reset_hw() argument
340 u32 cs = bcm2835_rd(bs, BCM2835_SPI_CS); in bcm2835_spi_reset_hw()
358 bcm2835_wr(bs, BCM2835_SPI_CS, cs); in bcm2835_spi_reset_hw()
360 bcm2835_wr(bs, BCM2835_SPI_DLEN, 0); in bcm2835_spi_reset_hw()
365 struct bcm2835_spi *bs = dev_id; in bcm2835_spi_interrupt() local
366 u32 cs = bcm2835_rd(bs, BCM2835_SPI_CS); in bcm2835_spi_interrupt()
373 bcm2835_rd_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE); in bcm2835_spi_interrupt()
375 bcm2835_rd_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE_3_4); in bcm2835_spi_interrupt()
377 if (bs->tx_len && cs & BCM2835_SPI_CS_DONE) in bcm2835_spi_interrupt()
378 bcm2835_wr_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE); in bcm2835_spi_interrupt()
381 bcm2835_rd_fifo(bs); in bcm2835_spi_interrupt()
383 bcm2835_wr_fifo(bs); in bcm2835_spi_interrupt()
385 if (!bs->rx_len) { in bcm2835_spi_interrupt()
387 bcm2835_spi_reset_hw(bs); in bcm2835_spi_interrupt()
389 complete(&bs->ctlr->xfer_completion); in bcm2835_spi_interrupt()
400 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_irq() local
403 bs->count_transfer_irq++; in bcm2835_spi_transfer_one_irq()
409 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA); in bcm2835_spi_transfer_one_irq()
413 bcm2835_wr_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE); in bcm2835_spi_transfer_one_irq()
414 bcm2835_wr_fifo(bs); in bcm2835_spi_transfer_one_irq()
418 bcm2835_wr(bs, BCM2835_SPI_CS, cs); in bcm2835_spi_transfer_one_irq()
472 struct bcm2835_spi *bs, in bcm2835_spi_transfer_prologue() argument
477 bs->tfr = tfr; in bcm2835_spi_transfer_prologue()
478 bs->tx_prologue = 0; in bcm2835_spi_transfer_prologue()
479 bs->rx_prologue = 0; in bcm2835_spi_transfer_prologue()
480 bs->tx_spillover = false; in bcm2835_spi_transfer_prologue()
482 if (bs->tx_buf && !sg_is_last(&tfr->tx_sg.sgl[0])) in bcm2835_spi_transfer_prologue()
483 bs->tx_prologue = sg_dma_len(&tfr->tx_sg.sgl[0]) & 3; in bcm2835_spi_transfer_prologue()
485 if (bs->rx_buf && !sg_is_last(&tfr->rx_sg.sgl[0])) { in bcm2835_spi_transfer_prologue()
486 bs->rx_prologue = sg_dma_len(&tfr->rx_sg.sgl[0]) & 3; in bcm2835_spi_transfer_prologue()
488 if (bs->rx_prologue > bs->tx_prologue) { in bcm2835_spi_transfer_prologue()
489 if (!bs->tx_buf || sg_is_last(&tfr->tx_sg.sgl[0])) { in bcm2835_spi_transfer_prologue()
490 bs->tx_prologue = bs->rx_prologue; in bcm2835_spi_transfer_prologue()
492 bs->tx_prologue += 4; in bcm2835_spi_transfer_prologue()
493 bs->tx_spillover = in bcm2835_spi_transfer_prologue()
500 if (!bs->tx_prologue) in bcm2835_spi_transfer_prologue()
504 if (bs->rx_prologue) { in bcm2835_spi_transfer_prologue()
505 bcm2835_wr(bs, BCM2835_SPI_DLEN, bs->rx_prologue); in bcm2835_spi_transfer_prologue()
506 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA in bcm2835_spi_transfer_prologue()
508 bcm2835_wr_fifo_count(bs, bs->rx_prologue); in bcm2835_spi_transfer_prologue()
509 bcm2835_wait_tx_fifo_empty(bs); in bcm2835_spi_transfer_prologue()
510 bcm2835_rd_fifo_count(bs, bs->rx_prologue); in bcm2835_spi_transfer_prologue()
511 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_CLEAR_RX in bcm2835_spi_transfer_prologue()
517 bs->rx_prologue, DMA_FROM_DEVICE); in bcm2835_spi_transfer_prologue()
519 sg_dma_address(&tfr->rx_sg.sgl[0]) += bs->rx_prologue; in bcm2835_spi_transfer_prologue()
520 sg_dma_len(&tfr->rx_sg.sgl[0]) -= bs->rx_prologue; in bcm2835_spi_transfer_prologue()
523 if (!bs->tx_buf) in bcm2835_spi_transfer_prologue()
530 tx_remaining = bs->tx_prologue - bs->rx_prologue; in bcm2835_spi_transfer_prologue()
532 bcm2835_wr(bs, BCM2835_SPI_DLEN, tx_remaining); in bcm2835_spi_transfer_prologue()
533 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA in bcm2835_spi_transfer_prologue()
535 bcm2835_wr_fifo_count(bs, tx_remaining); in bcm2835_spi_transfer_prologue()
536 bcm2835_wait_tx_fifo_empty(bs); in bcm2835_spi_transfer_prologue()
537 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_CLEAR_TX in bcm2835_spi_transfer_prologue()
541 if (likely(!bs->tx_spillover)) { in bcm2835_spi_transfer_prologue()
542 sg_dma_address(&tfr->tx_sg.sgl[0]) += bs->tx_prologue; in bcm2835_spi_transfer_prologue()
543 sg_dma_len(&tfr->tx_sg.sgl[0]) -= bs->tx_prologue; in bcm2835_spi_transfer_prologue()
559 static void bcm2835_spi_undo_prologue(struct bcm2835_spi *bs) in bcm2835_spi_undo_prologue() argument
561 struct spi_transfer *tfr = bs->tfr; in bcm2835_spi_undo_prologue()
563 if (!bs->tx_prologue) in bcm2835_spi_undo_prologue()
566 if (bs->rx_prologue) { in bcm2835_spi_undo_prologue()
567 sg_dma_address(&tfr->rx_sg.sgl[0]) -= bs->rx_prologue; in bcm2835_spi_undo_prologue()
568 sg_dma_len(&tfr->rx_sg.sgl[0]) += bs->rx_prologue; in bcm2835_spi_undo_prologue()
571 if (!bs->tx_buf) in bcm2835_spi_undo_prologue()
574 if (likely(!bs->tx_spillover)) { in bcm2835_spi_undo_prologue()
575 sg_dma_address(&tfr->tx_sg.sgl[0]) -= bs->tx_prologue; in bcm2835_spi_undo_prologue()
576 sg_dma_len(&tfr->tx_sg.sgl[0]) += bs->tx_prologue; in bcm2835_spi_undo_prologue()
578 sg_dma_len(&tfr->tx_sg.sgl[0]) = bs->tx_prologue - 4; in bcm2835_spi_undo_prologue()
583 bs->tx_prologue = 0; in bcm2835_spi_undo_prologue()
595 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_dma_rx_done() local
603 bs->tx_dma_active = false; in bcm2835_spi_dma_rx_done()
604 bs->rx_dma_active = false; in bcm2835_spi_dma_rx_done()
605 bcm2835_spi_undo_prologue(bs); in bcm2835_spi_dma_rx_done()
608 bcm2835_spi_reset_hw(bs); in bcm2835_spi_dma_rx_done()
623 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_dma_tx_done() local
626 while (!(bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_DONE)) in bcm2835_spi_dma_tx_done()
627 bcm2835_wr(bs, BCM2835_SPI_CS, in bcm2835_spi_dma_tx_done()
628 bs->clear_rx_cs[bs->chip_select]); in bcm2835_spi_dma_tx_done()
630 bs->tx_dma_active = false; in bcm2835_spi_dma_tx_done()
638 if (cmpxchg(&bs->rx_dma_active, true, false)) in bcm2835_spi_dma_tx_done()
641 bcm2835_spi_undo_prologue(bs); in bcm2835_spi_dma_tx_done()
642 bcm2835_spi_reset_hw(bs); in bcm2835_spi_dma_tx_done()
660 struct bcm2835_spi *bs, in bcm2835_spi_prepare_sg() argument
700 bs->chip_select = spi->chip_select; in bcm2835_spi_prepare_sg()
761 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_dma() local
766 bs->count_transfer_dma++; in bcm2835_spi_transfer_one_dma()
772 bcm2835_spi_transfer_prologue(ctlr, tfr, bs, cs); in bcm2835_spi_transfer_one_dma()
775 if (bs->tx_buf) { in bcm2835_spi_transfer_one_dma()
776 ret = bcm2835_spi_prepare_sg(ctlr, spi, tfr, bs, true); in bcm2835_spi_transfer_one_dma()
778 cookie = dmaengine_submit(bs->fill_tx_desc); in bcm2835_spi_transfer_one_dma()
785 bcm2835_wr(bs, BCM2835_SPI_DLEN, bs->tx_len); in bcm2835_spi_transfer_one_dma()
788 bcm2835_wr(bs, BCM2835_SPI_CS, in bcm2835_spi_transfer_one_dma()
791 bs->tx_dma_active = true; in bcm2835_spi_transfer_one_dma()
801 if (bs->rx_buf) { in bcm2835_spi_transfer_one_dma()
802 ret = bcm2835_spi_prepare_sg(ctlr, spi, tfr, bs, false); in bcm2835_spi_transfer_one_dma()
804 cookie = dmaengine_submit(bs->clear_rx_desc[spi->chip_select]); in bcm2835_spi_transfer_one_dma()
810 bs->tx_dma_active = false; in bcm2835_spi_transfer_one_dma()
816 bs->rx_dma_active = true; in bcm2835_spi_transfer_one_dma()
823 if (!bs->rx_buf && !bs->tx_dma_active && in bcm2835_spi_transfer_one_dma()
824 cmpxchg(&bs->rx_dma_active, true, false)) { in bcm2835_spi_transfer_one_dma()
826 bcm2835_spi_reset_hw(bs); in bcm2835_spi_transfer_one_dma()
833 bcm2835_spi_reset_hw(bs); in bcm2835_spi_transfer_one_dma()
834 bcm2835_spi_undo_prologue(bs); in bcm2835_spi_transfer_one_dma()
851 struct bcm2835_spi *bs) in bcm2835_dma_release() argument
858 if (bs->fill_tx_desc) in bcm2835_dma_release()
859 dmaengine_desc_free(bs->fill_tx_desc); in bcm2835_dma_release()
861 if (bs->fill_tx_addr) in bcm2835_dma_release()
863 bs->fill_tx_addr, sizeof(u32), in bcm2835_dma_release()
875 if (bs->clear_rx_desc[i]) in bcm2835_dma_release()
876 dmaengine_desc_free(bs->clear_rx_desc[i]); in bcm2835_dma_release()
878 if (bs->clear_rx_addr) in bcm2835_dma_release()
880 bs->clear_rx_addr, in bcm2835_dma_release()
881 sizeof(bs->clear_rx_cs), in bcm2835_dma_release()
890 struct bcm2835_spi *bs) in bcm2835_dma_init() argument
934 bs->fill_tx_addr = dma_map_page_attrs(ctlr->dma_tx->device->dev, in bcm2835_dma_init()
938 if (dma_mapping_error(ctlr->dma_tx->device->dev, bs->fill_tx_addr)) { in bcm2835_dma_init()
940 bs->fill_tx_addr = 0; in bcm2835_dma_init()
945 bs->fill_tx_desc = dmaengine_prep_dma_cyclic(ctlr->dma_tx, in bcm2835_dma_init()
946 bs->fill_tx_addr, in bcm2835_dma_init()
949 if (!bs->fill_tx_desc) { in bcm2835_dma_init()
955 ret = dmaengine_desc_set_reuse(bs->fill_tx_desc); in bcm2835_dma_init()
975 bs->clear_rx_addr = dma_map_single(ctlr->dma_rx->device->dev, in bcm2835_dma_init()
976 bs->clear_rx_cs, in bcm2835_dma_init()
977 sizeof(bs->clear_rx_cs), in bcm2835_dma_init()
979 if (dma_mapping_error(ctlr->dma_rx->device->dev, bs->clear_rx_addr)) { in bcm2835_dma_init()
981 bs->clear_rx_addr = 0; in bcm2835_dma_init()
987 bs->clear_rx_desc[i] = dmaengine_prep_dma_cyclic(ctlr->dma_rx, in bcm2835_dma_init()
988 bs->clear_rx_addr + i * sizeof(u32), in bcm2835_dma_init()
991 if (!bs->clear_rx_desc[i]) { in bcm2835_dma_init()
997 ret = dmaengine_desc_set_reuse(bs->clear_rx_desc[i]); in bcm2835_dma_init()
1013 bcm2835_dma_release(ctlr, bs); in bcm2835_dma_init()
1030 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one_poll() local
1034 bs->count_transfer_polling++; in bcm2835_spi_transfer_one_poll()
1037 bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA); in bcm2835_spi_transfer_one_poll()
1043 bcm2835_wr_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE); in bcm2835_spi_transfer_one_poll()
1049 while (bs->rx_len) { in bcm2835_spi_transfer_one_poll()
1051 bcm2835_wr_fifo(bs); in bcm2835_spi_transfer_one_poll()
1054 bcm2835_rd_fifo(bs); in bcm2835_spi_transfer_one_poll()
1059 if (bs->rx_len && time_after(jiffies, timeout)) { in bcm2835_spi_transfer_one_poll()
1063 bs->tx_len, bs->rx_len); in bcm2835_spi_transfer_one_poll()
1067 bs->count_transfer_irq_after_polling++; in bcm2835_spi_transfer_one_poll()
1075 bcm2835_spi_reset_hw(bs); in bcm2835_spi_transfer_one_poll()
1084 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_transfer_one() local
1087 u32 cs = bs->prepare_cs[spi->chip_select]; in bcm2835_spi_transfer_one()
1091 clk_hz = clk_get_rate(bs->clk); in bcm2835_spi_transfer_one()
1106 bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv); in bcm2835_spi_transfer_one()
1113 bs->tx_buf = tfr->tx_buf; in bcm2835_spi_transfer_one()
1114 bs->rx_buf = tfr->rx_buf; in bcm2835_spi_transfer_one()
1115 bs->tx_len = tfr->len; in bcm2835_spi_transfer_one()
1116 bs->rx_len = tfr->len; in bcm2835_spi_transfer_one()
1146 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_prepare_message() local
1165 bcm2835_wr(bs, BCM2835_SPI_CS, bs->prepare_cs[spi->chip_select]); in bcm2835_spi_prepare_message()
1173 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_handle_err() local
1177 bs->tx_dma_active = false; in bcm2835_spi_handle_err()
1179 bs->rx_dma_active = false; in bcm2835_spi_handle_err()
1180 bcm2835_spi_undo_prologue(bs); in bcm2835_spi_handle_err()
1183 bcm2835_spi_reset_hw(bs); in bcm2835_spi_handle_err()
1194 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_setup() local
1209 bs->prepare_cs[spi->chip_select] = cs; in bcm2835_spi_setup()
1216 bs->clear_rx_cs[spi->chip_select] = cs | in bcm2835_spi_setup()
1221 bs->clear_rx_addr, in bcm2835_spi_setup()
1222 sizeof(bs->clear_rx_cs), in bcm2835_spi_setup()
1278 struct bcm2835_spi *bs; in bcm2835_spi_probe() local
1281 ctlr = devm_spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs), in bcm2835_spi_probe()
1298 bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_probe()
1299 bs->ctlr = ctlr; in bcm2835_spi_probe()
1301 bs->regs = devm_platform_ioremap_resource(pdev, 0); in bcm2835_spi_probe()
1302 if (IS_ERR(bs->regs)) in bcm2835_spi_probe()
1303 return PTR_ERR(bs->regs); in bcm2835_spi_probe()
1305 bs->clk = devm_clk_get(&pdev->dev, NULL); in bcm2835_spi_probe()
1306 if (IS_ERR(bs->clk)) in bcm2835_spi_probe()
1307 return dev_err_probe(&pdev->dev, PTR_ERR(bs->clk), in bcm2835_spi_probe()
1310 bs->irq = platform_get_irq(pdev, 0); in bcm2835_spi_probe()
1311 if (bs->irq <= 0) in bcm2835_spi_probe()
1312 return bs->irq ? bs->irq : -ENODEV; in bcm2835_spi_probe()
1314 clk_prepare_enable(bs->clk); in bcm2835_spi_probe()
1316 err = bcm2835_dma_init(ctlr, &pdev->dev, bs); in bcm2835_spi_probe()
1321 bcm2835_wr(bs, BCM2835_SPI_CS, in bcm2835_spi_probe()
1324 err = devm_request_irq(&pdev->dev, bs->irq, bcm2835_spi_interrupt, 0, in bcm2835_spi_probe()
1325 dev_name(&pdev->dev), bs); in bcm2835_spi_probe()
1338 bcm2835_debugfs_create(bs, dev_name(&pdev->dev)); in bcm2835_spi_probe()
1343 bcm2835_dma_release(ctlr, bs); in bcm2835_spi_probe()
1345 clk_disable_unprepare(bs->clk); in bcm2835_spi_probe()
1352 struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr); in bcm2835_spi_remove() local
1354 bcm2835_debugfs_remove(bs); in bcm2835_spi_remove()
1358 bcm2835_dma_release(ctlr, bs); in bcm2835_spi_remove()
1361 bcm2835_wr(bs, BCM2835_SPI_CS, in bcm2835_spi_remove()
1364 clk_disable_unprepare(bs->clk); in bcm2835_spi_remove()