pic32s 123 drivers/spi/spi-pic32.c static inline void pic32_spi_enable(struct pic32_spi *pic32s) pic32s 125 drivers/spi/spi-pic32.c writel(CTRL_ON | CTRL_SIDL, &pic32s->regs->ctrl_set); pic32s 128 drivers/spi/spi-pic32.c static inline void pic32_spi_disable(struct pic32_spi *pic32s) pic32s 130 drivers/spi/spi-pic32.c writel(CTRL_ON | CTRL_SIDL, &pic32s->regs->ctrl_clr); pic32s 136 drivers/spi/spi-pic32.c static void pic32_spi_set_clk_rate(struct pic32_spi *pic32s, u32 spi_ck) pic32s 141 drivers/spi/spi-pic32.c div = DIV_ROUND_CLOSEST(clk_get_rate(pic32s->clk), 2 * spi_ck) - 1; pic32s 143 drivers/spi/spi-pic32.c writel(div & BAUD_MASK, &pic32s->regs->baud); pic32s 146 drivers/spi/spi-pic32.c static inline u32 pic32_rx_fifo_level(struct pic32_spi *pic32s) pic32s 148 drivers/spi/spi-pic32.c u32 sr = readl(&pic32s->regs->status); pic32s 153 drivers/spi/spi-pic32.c static inline u32 pic32_tx_fifo_level(struct pic32_spi *pic32s) pic32s 155 drivers/spi/spi-pic32.c u32 sr = readl(&pic32s->regs->status); pic32s 161 drivers/spi/spi-pic32.c static u32 pic32_tx_max(struct pic32_spi *pic32s, int n_bytes) pic32s 165 drivers/spi/spi-pic32.c tx_left = (pic32s->tx_end - pic32s->tx) / n_bytes; pic32s 166 drivers/spi/spi-pic32.c tx_room = pic32s->fifo_n_elm - pic32_tx_fifo_level(pic32s); pic32s 176 drivers/spi/spi-pic32.c rxtx_gap = ((pic32s->rx_end - pic32s->rx) - pic32s 177 drivers/spi/spi-pic32.c (pic32s->tx_end - pic32s->tx)) / n_bytes; pic32s 178 drivers/spi/spi-pic32.c return min3(tx_left, tx_room, (u32)(pic32s->fifo_n_elm - rxtx_gap)); pic32s 182 drivers/spi/spi-pic32.c static u32 pic32_rx_max(struct pic32_spi *pic32s, int n_bytes) pic32s 184 drivers/spi/spi-pic32.c u32 rx_left = (pic32s->rx_end - pic32s->rx) / n_bytes; pic32s 186 drivers/spi/spi-pic32.c return min_t(u32, rx_left, pic32_rx_fifo_level(pic32s)); pic32s 190 drivers/spi/spi-pic32.c static void pic32_spi_rx_##__name(struct pic32_spi *pic32s) \ pic32s 193 drivers/spi/spi-pic32.c u32 mx = pic32_rx_max(pic32s, sizeof(__type)); \ pic32s 195 drivers/spi/spi-pic32.c v = read##__bwl(&pic32s->regs->buf); \ pic32s 196 drivers/spi/spi-pic32.c if (pic32s->rx_end - pic32s->len) \ pic32s 197 drivers/spi/spi-pic32.c *(__type *)(pic32s->rx) = v; \ pic32s 198 drivers/spi/spi-pic32.c pic32s->rx += sizeof(__type); \ pic32s 202 drivers/spi/spi-pic32.c static void pic32_spi_tx_##__name(struct pic32_spi *pic32s) \ pic32s 205 drivers/spi/spi-pic32.c u32 mx = pic32_tx_max(pic32s, sizeof(__type)); \ pic32s 208 drivers/spi/spi-pic32.c if (pic32s->tx_end - pic32s->len) \ pic32s 209 drivers/spi/spi-pic32.c v = *(__type *)(pic32s->tx); \ pic32s 210 drivers/spi/spi-pic32.c write##__bwl(v, &pic32s->regs->buf); \ pic32s 211 drivers/spi/spi-pic32.c pic32s->tx += sizeof(__type); \ pic32s 219 drivers/spi/spi-pic32.c static void pic32_err_stop(struct pic32_spi *pic32s, const char *msg) pic32s 222 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->fault_irq); pic32s 223 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->rx_irq); pic32s 224 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->tx_irq); pic32s 227 drivers/spi/spi-pic32.c dev_err(&pic32s->master->dev, "%s\n", msg); pic32s 228 drivers/spi/spi-pic32.c if (pic32s->master->cur_msg) pic32s 229 drivers/spi/spi-pic32.c pic32s->master->cur_msg->status = -EIO; pic32s 230 drivers/spi/spi-pic32.c complete(&pic32s->xfer_done); pic32s 235 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = dev_id; pic32s 238 drivers/spi/spi-pic32.c status = readl(&pic32s->regs->status); pic32s 242 drivers/spi/spi-pic32.c writel(STAT_RX_OV, &pic32s->regs->status_clr); pic32s 243 drivers/spi/spi-pic32.c writel(STAT_TX_UR, &pic32s->regs->status_clr); pic32s 244 drivers/spi/spi-pic32.c pic32_err_stop(pic32s, "err_irq: fifo ov/ur-run\n"); pic32s 249 drivers/spi/spi-pic32.c pic32_err_stop(pic32s, "err_irq: frame error"); pic32s 253 drivers/spi/spi-pic32.c if (!pic32s->master->cur_msg) { pic32s 254 drivers/spi/spi-pic32.c pic32_err_stop(pic32s, "err_irq: no mesg"); pic32s 263 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = dev_id; pic32s 265 drivers/spi/spi-pic32.c pic32s->rx_fifo(pic32s); pic32s 268 drivers/spi/spi-pic32.c if (pic32s->rx_end == pic32s->rx) { pic32s 270 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->fault_irq); pic32s 271 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->rx_irq); pic32s 274 drivers/spi/spi-pic32.c complete(&pic32s->xfer_done); pic32s 282 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = dev_id; pic32s 284 drivers/spi/spi-pic32.c pic32s->tx_fifo(pic32s); pic32s 287 drivers/spi/spi-pic32.c if (pic32s->tx_end == pic32s->tx) pic32s 288 drivers/spi/spi-pic32.c disable_irq_nosync(pic32s->tx_irq); pic32s 295 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = data; pic32s 297 drivers/spi/spi-pic32.c complete(&pic32s->xfer_done); pic32s 300 drivers/spi/spi-pic32.c static int pic32_spi_dma_transfer(struct pic32_spi *pic32s, pic32s 303 drivers/spi/spi-pic32.c struct spi_master *master = pic32s->master; pic32s 334 drivers/spi/spi-pic32.c desc_rx->callback_param = pic32s; pic32s 357 drivers/spi/spi-pic32.c static int pic32_spi_dma_config(struct pic32_spi *pic32s, u32 dma_width) pic32s 360 drivers/spi/spi-pic32.c struct spi_master *master = pic32s->master; pic32s 365 drivers/spi/spi-pic32.c cfg.src_addr = pic32s->dma_base + buf_offset; pic32s 366 drivers/spi/spi-pic32.c cfg.dst_addr = pic32s->dma_base + buf_offset; pic32s 367 drivers/spi/spi-pic32.c cfg.src_maxburst = pic32s->fifo_n_elm / 2; /* fill one-half */ pic32s 368 drivers/spi/spi-pic32.c cfg.dst_maxburst = pic32s->fifo_n_elm / 2; /* drain one-half */ pic32s 372 drivers/spi/spi-pic32.c cfg.slave_id = pic32s->tx_irq; pic32s 380 drivers/spi/spi-pic32.c cfg.slave_id = pic32s->rx_irq; pic32s 389 drivers/spi/spi-pic32.c static int pic32_spi_set_word_size(struct pic32_spi *pic32s, u8 bits_per_word) pic32s 396 drivers/spi/spi-pic32.c pic32s->rx_fifo = pic32_spi_rx_byte; pic32s 397 drivers/spi/spi-pic32.c pic32s->tx_fifo = pic32_spi_tx_byte; pic32s 402 drivers/spi/spi-pic32.c pic32s->rx_fifo = pic32_spi_rx_word; pic32s 403 drivers/spi/spi-pic32.c pic32s->tx_fifo = pic32_spi_tx_word; pic32s 408 drivers/spi/spi-pic32.c pic32s->rx_fifo = pic32_spi_rx_dword; pic32s 409 drivers/spi/spi-pic32.c pic32s->tx_fifo = pic32_spi_tx_dword; pic32s 419 drivers/spi/spi-pic32.c pic32s->fifo_n_elm = DIV_ROUND_UP(pic32s->fifo_n_byte, pic32s 422 drivers/spi/spi-pic32.c v = readl(&pic32s->regs->ctrl); pic32s 425 drivers/spi/spi-pic32.c writel(v, &pic32s->regs->ctrl); pic32s 428 drivers/spi/spi-pic32.c if (test_bit(PIC32F_DMA_PREP, &pic32s->flags)) pic32s 429 drivers/spi/spi-pic32.c pic32_spi_dma_config(pic32s, dmawidth); pic32s 436 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = spi_master_get_devdata(master); pic32s 438 drivers/spi/spi-pic32.c pic32_spi_enable(pic32s); pic32s 446 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = spi_master_get_devdata(master); pic32s 451 drivers/spi/spi-pic32.c if (pic32s->bits_per_word != spi->bits_per_word) { pic32s 452 drivers/spi/spi-pic32.c pic32_spi_set_word_size(pic32s, spi->bits_per_word); pic32s 453 drivers/spi/spi-pic32.c pic32s->bits_per_word = spi->bits_per_word; pic32s 457 drivers/spi/spi-pic32.c if (pic32s->speed_hz != spi->max_speed_hz) { pic32s 458 drivers/spi/spi-pic32.c pic32_spi_set_clk_rate(pic32s, spi->max_speed_hz); pic32s 459 drivers/spi/spi-pic32.c pic32s->speed_hz = spi->max_speed_hz; pic32s 463 drivers/spi/spi-pic32.c if (pic32s->mode != spi->mode) { pic32s 464 drivers/spi/spi-pic32.c val = readl(&pic32s->regs->ctrl); pic32s 478 drivers/spi/spi-pic32.c writel(val, &pic32s->regs->ctrl); pic32s 479 drivers/spi/spi-pic32.c pic32s->mode = spi->mode; pic32s 489 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = spi_master_get_devdata(master); pic32s 493 drivers/spi/spi-pic32.c test_bit(PIC32F_DMA_PREP, &pic32s->flags); pic32s 500 drivers/spi/spi-pic32.c struct pic32_spi *pic32s; pic32s 505 drivers/spi/spi-pic32.c pic32s = spi_master_get_devdata(master); pic32s 509 drivers/spi/spi-pic32.c (transfer->bits_per_word != pic32s->bits_per_word)) { pic32s 510 drivers/spi/spi-pic32.c ret = pic32_spi_set_word_size(pic32s, transfer->bits_per_word); pic32s 513 drivers/spi/spi-pic32.c pic32s->bits_per_word = transfer->bits_per_word; pic32s 517 drivers/spi/spi-pic32.c if (transfer->speed_hz && (transfer->speed_hz != pic32s->speed_hz)) { pic32s 518 drivers/spi/spi-pic32.c pic32_spi_set_clk_rate(pic32s, transfer->speed_hz); pic32s 519 drivers/spi/spi-pic32.c pic32s->speed_hz = transfer->speed_hz; pic32s 522 drivers/spi/spi-pic32.c reinit_completion(&pic32s->xfer_done); pic32s 526 drivers/spi/spi-pic32.c ret = pic32_spi_dma_transfer(pic32s, transfer); pic32s 536 drivers/spi/spi-pic32.c pic32s->tx = (const void *)transfer->tx_buf; pic32s 537 drivers/spi/spi-pic32.c pic32s->rx = (const void *)transfer->rx_buf; pic32s 538 drivers/spi/spi-pic32.c pic32s->tx_end = pic32s->tx + transfer->len; pic32s 539 drivers/spi/spi-pic32.c pic32s->rx_end = pic32s->rx + transfer->len; pic32s 540 drivers/spi/spi-pic32.c pic32s->len = transfer->len; pic32s 543 drivers/spi/spi-pic32.c enable_irq(pic32s->fault_irq); pic32s 544 drivers/spi/spi-pic32.c enable_irq(pic32s->rx_irq); pic32s 545 drivers/spi/spi-pic32.c enable_irq(pic32s->tx_irq); pic32s 549 drivers/spi/spi-pic32.c timeout = wait_for_completion_timeout(&pic32s->xfer_done, 2 * HZ); pic32s 573 drivers/spi/spi-pic32.c struct pic32_spi *pic32s = spi_master_get_devdata(master); pic32s 575 drivers/spi/spi-pic32.c pic32_spi_disable(pic32s); pic32s 609 drivers/spi/spi-pic32.c static void pic32_spi_dma_prep(struct pic32_spi *pic32s, struct device *dev) pic32s 611 drivers/spi/spi-pic32.c struct spi_master *master = pic32s->master; pic32s 631 drivers/spi/spi-pic32.c if (pic32_spi_dma_config(pic32s, DMA_SLAVE_BUSWIDTH_1_BYTE)) pic32s 635 drivers/spi/spi-pic32.c set_bit(PIC32F_DMA_PREP, &pic32s->flags); pic32s 647 drivers/spi/spi-pic32.c static void pic32_spi_dma_unprep(struct pic32_spi *pic32s) pic32s 649 drivers/spi/spi-pic32.c if (!test_bit(PIC32F_DMA_PREP, &pic32s->flags)) pic32s 652 drivers/spi/spi-pic32.c clear_bit(PIC32F_DMA_PREP, &pic32s->flags); pic32s 653 drivers/spi/spi-pic32.c if (pic32s->master->dma_rx) pic32s 654 drivers/spi/spi-pic32.c dma_release_channel(pic32s->master->dma_rx); pic32s 656 drivers/spi/spi-pic32.c if (pic32s->master->dma_tx) pic32s 657 drivers/spi/spi-pic32.c dma_release_channel(pic32s->master->dma_tx); pic32s 660 drivers/spi/spi-pic32.c static void pic32_spi_hw_init(struct pic32_spi *pic32s) pic32s 665 drivers/spi/spi-pic32.c pic32_spi_disable(pic32s); pic32s 667 drivers/spi/spi-pic32.c ctrl = readl(&pic32s->regs->ctrl); pic32s 670 drivers/spi/spi-pic32.c pic32s->fifo_n_byte = 16; pic32s 692 drivers/spi/spi-pic32.c writel(ctrl, &pic32s->regs->ctrl); pic32s 696 drivers/spi/spi-pic32.c writel(ctrl, &pic32s->regs->ctrl2_set); pic32s 700 drivers/spi/spi-pic32.c struct pic32_spi *pic32s) pic32s 706 drivers/spi/spi-pic32.c pic32s->regs = devm_ioremap_resource(&pdev->dev, mem); pic32s 707 drivers/spi/spi-pic32.c if (IS_ERR(pic32s->regs)) pic32s 708 drivers/spi/spi-pic32.c return PTR_ERR(pic32s->regs); pic32s 710 drivers/spi/spi-pic32.c pic32s->dma_base = mem->start; pic32s 713 drivers/spi/spi-pic32.c pic32s->fault_irq = platform_get_irq_byname(pdev, "fault"); pic32s 714 drivers/spi/spi-pic32.c if (pic32s->fault_irq < 0) pic32s 715 drivers/spi/spi-pic32.c return pic32s->fault_irq; pic32s 717 drivers/spi/spi-pic32.c pic32s->rx_irq = platform_get_irq_byname(pdev, "rx"); pic32s 718 drivers/spi/spi-pic32.c if (pic32s->rx_irq < 0) pic32s 719 drivers/spi/spi-pic32.c return pic32s->rx_irq; pic32s 721 drivers/spi/spi-pic32.c pic32s->tx_irq = platform_get_irq_byname(pdev, "tx"); pic32s 722 drivers/spi/spi-pic32.c if (pic32s->tx_irq < 0) pic32s 723 drivers/spi/spi-pic32.c return pic32s->tx_irq; pic32s 726 drivers/spi/spi-pic32.c pic32s->clk = devm_clk_get(&pdev->dev, "mck0"); pic32s 727 drivers/spi/spi-pic32.c if (IS_ERR(pic32s->clk)) { pic32s 729 drivers/spi/spi-pic32.c ret = PTR_ERR(pic32s->clk); pic32s 733 drivers/spi/spi-pic32.c ret = clk_prepare_enable(pic32s->clk); pic32s 737 drivers/spi/spi-pic32.c pic32_spi_hw_init(pic32s); pic32s 749 drivers/spi/spi-pic32.c struct pic32_spi *pic32s; pic32s 752 drivers/spi/spi-pic32.c master = spi_alloc_master(&pdev->dev, sizeof(*pic32s)); pic32s 756 drivers/spi/spi-pic32.c pic32s = spi_master_get_devdata(master); pic32s 757 drivers/spi/spi-pic32.c pic32s->master = master; pic32s 759 drivers/spi/spi-pic32.c ret = pic32_spi_hw_probe(pdev, pic32s); pic32s 766 drivers/spi/spi-pic32.c master->max_speed_hz = clk_get_rate(pic32s->clk); pic32s 779 drivers/spi/spi-pic32.c pic32_spi_dma_prep(pic32s, &pdev->dev); pic32s 780 drivers/spi/spi-pic32.c if (test_bit(PIC32F_DMA_PREP, &pic32s->flags)) pic32s 783 drivers/spi/spi-pic32.c init_completion(&pic32s->xfer_done); pic32s 784 drivers/spi/spi-pic32.c pic32s->mode = -1; pic32s 787 drivers/spi/spi-pic32.c irq_set_status_flags(pic32s->fault_irq, IRQ_NOAUTOEN); pic32s 788 drivers/spi/spi-pic32.c ret = devm_request_irq(&pdev->dev, pic32s->fault_irq, pic32s 790 drivers/spi/spi-pic32.c dev_name(&pdev->dev), pic32s); pic32s 792 drivers/spi/spi-pic32.c dev_err(&pdev->dev, "request fault-irq %d\n", pic32s->rx_irq); pic32s 797 drivers/spi/spi-pic32.c irq_set_status_flags(pic32s->rx_irq, IRQ_NOAUTOEN); pic32s 798 drivers/spi/spi-pic32.c ret = devm_request_irq(&pdev->dev, pic32s->rx_irq, pic32s 800 drivers/spi/spi-pic32.c dev_name(&pdev->dev), pic32s); pic32s 802 drivers/spi/spi-pic32.c dev_err(&pdev->dev, "request rx-irq %d\n", pic32s->rx_irq); pic32s 807 drivers/spi/spi-pic32.c irq_set_status_flags(pic32s->tx_irq, IRQ_NOAUTOEN); pic32s 808 drivers/spi/spi-pic32.c ret = devm_request_irq(&pdev->dev, pic32s->tx_irq, pic32s 810 drivers/spi/spi-pic32.c dev_name(&pdev->dev), pic32s); pic32s 812 drivers/spi/spi-pic32.c dev_err(&pdev->dev, "request tx-irq %d\n", pic32s->tx_irq); pic32s 823 drivers/spi/spi-pic32.c platform_set_drvdata(pdev, pic32s); pic32s 828 drivers/spi/spi-pic32.c clk_disable_unprepare(pic32s->clk); pic32s 836 drivers/spi/spi-pic32.c struct pic32_spi *pic32s; pic32s 838 drivers/spi/spi-pic32.c pic32s = platform_get_drvdata(pdev); pic32s 839 drivers/spi/spi-pic32.c pic32_spi_disable(pic32s); pic32s 840 drivers/spi/spi-pic32.c clk_disable_unprepare(pic32s->clk); pic32s 841 drivers/spi/spi-pic32.c pic32_spi_dma_unprep(pic32s);