Lines Matching full:qspi
36 #include "spi-bcm-qspi.h"
233 static inline bool has_bspi(struct bcm_qspi *qspi) in has_bspi() argument
235 return qspi->bspi_mode; in has_bspi()
238 /* Read qspi controller register*/
239 static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type, in bcm_qspi_read() argument
242 return bcm_qspi_readl(qspi->big_endian, qspi->base[type] + offset); in bcm_qspi_read()
245 /* Write qspi controller register*/
246 static inline void bcm_qspi_write(struct bcm_qspi *qspi, enum base_type type, in bcm_qspi_write() argument
249 bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset); in bcm_qspi_write()
253 static int bcm_qspi_bspi_busy_poll(struct bcm_qspi *qspi) in bcm_qspi_bspi_busy_poll() argument
259 if (!(bcm_qspi_read(qspi, BSPI, BSPI_BUSY_STATUS) & 1)) in bcm_qspi_bspi_busy_poll()
263 dev_warn(&qspi->pdev->dev, "timeout waiting for !busy_status\n"); in bcm_qspi_bspi_busy_poll()
267 static inline bool bcm_qspi_bspi_ver_three(struct bcm_qspi *qspi) in bcm_qspi_bspi_ver_three() argument
269 if (qspi->bspi_maj_rev < 4) in bcm_qspi_bspi_ver_three()
274 static void bcm_qspi_bspi_flush_prefetch_buffers(struct bcm_qspi *qspi) in bcm_qspi_bspi_flush_prefetch_buffers() argument
276 bcm_qspi_bspi_busy_poll(qspi); in bcm_qspi_bspi_flush_prefetch_buffers()
278 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 1); in bcm_qspi_bspi_flush_prefetch_buffers()
279 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 1); in bcm_qspi_bspi_flush_prefetch_buffers()
280 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0); in bcm_qspi_bspi_flush_prefetch_buffers()
281 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0); in bcm_qspi_bspi_flush_prefetch_buffers()
284 static int bcm_qspi_bspi_lr_is_fifo_empty(struct bcm_qspi *qspi) in bcm_qspi_bspi_lr_is_fifo_empty() argument
286 return (bcm_qspi_read(qspi, BSPI, BSPI_RAF_STATUS) & in bcm_qspi_bspi_lr_is_fifo_empty()
290 static inline u32 bcm_qspi_bspi_lr_read_fifo(struct bcm_qspi *qspi) in bcm_qspi_bspi_lr_read_fifo() argument
292 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_RAF_READ_DATA); in bcm_qspi_bspi_lr_read_fifo()
295 if (bcm_qspi_bspi_ver_three(qspi)) in bcm_qspi_bspi_lr_read_fifo()
301 static inline void bcm_qspi_bspi_lr_start(struct bcm_qspi *qspi) in bcm_qspi_bspi_lr_start() argument
303 bcm_qspi_bspi_busy_poll(qspi); in bcm_qspi_bspi_lr_start()
304 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL, in bcm_qspi_bspi_lr_start()
308 static inline void bcm_qspi_bspi_lr_clear(struct bcm_qspi *qspi) in bcm_qspi_bspi_lr_clear() argument
310 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL, in bcm_qspi_bspi_lr_clear()
312 bcm_qspi_bspi_flush_prefetch_buffers(qspi); in bcm_qspi_bspi_lr_clear()
315 static void bcm_qspi_bspi_lr_data_read(struct bcm_qspi *qspi) in bcm_qspi_bspi_lr_data_read() argument
317 u32 *buf = (u32 *)qspi->bspi_rf_op->data.buf.in; in bcm_qspi_bspi_lr_data_read()
320 dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_op, in bcm_qspi_bspi_lr_data_read()
321 qspi->bspi_rf_op->data.buf.in, qspi->bspi_rf_op_len); in bcm_qspi_bspi_lr_data_read()
322 while (!bcm_qspi_bspi_lr_is_fifo_empty(qspi)) { in bcm_qspi_bspi_lr_data_read()
323 data = bcm_qspi_bspi_lr_read_fifo(qspi); in bcm_qspi_bspi_lr_data_read()
324 if (likely(qspi->bspi_rf_op_len >= 4) && in bcm_qspi_bspi_lr_data_read()
326 buf[qspi->bspi_rf_op_idx++] = data; in bcm_qspi_bspi_lr_data_read()
327 qspi->bspi_rf_op_len -= 4; in bcm_qspi_bspi_lr_data_read()
330 u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_op_idx]; in bcm_qspi_bspi_lr_data_read()
333 while (qspi->bspi_rf_op_len) { in bcm_qspi_bspi_lr_data_read()
336 qspi->bspi_rf_op_len--; in bcm_qspi_bspi_lr_data_read()
342 static void bcm_qspi_bspi_set_xfer_params(struct bcm_qspi *qspi, u8 cmd_byte, in bcm_qspi_bspi_set_xfer_params() argument
345 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0); in bcm_qspi_bspi_set_xfer_params()
346 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_CYCLE, bpc); in bcm_qspi_bspi_set_xfer_params()
347 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_PHASE, bpp); in bcm_qspi_bspi_set_xfer_params()
348 bcm_qspi_write(qspi, BSPI, BSPI_CMD_AND_MODE_BYTE, cmd_byte); in bcm_qspi_bspi_set_xfer_params()
349 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, flex_mode); in bcm_qspi_bspi_set_xfer_params()
352 static int bcm_qspi_bspi_set_flex_mode(struct bcm_qspi *qspi, in bcm_qspi_bspi_set_flex_mode() argument
361 dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n", in bcm_qspi_bspi_set_flex_mode()
393 bcm_qspi_bspi_set_xfer_params(qspi, command, bpp, bpc, flex_mode); in bcm_qspi_bspi_set_flex_mode()
398 static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, in bcm_qspi_bspi_set_override() argument
403 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL); in bcm_qspi_bspi_set_override()
405 dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n", in bcm_qspi_bspi_set_override()
437 bcm_qspi_write(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL, data); in bcm_qspi_bspi_set_override()
438 bcm_qspi_bspi_set_xfer_params(qspi, op->cmd.opcode, 0, 0, 0); in bcm_qspi_bspi_set_override()
443 static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi, in bcm_qspi_bspi_set_mode() argument
451 qspi->xfer_mode.flex_mode = true; in bcm_qspi_bspi_set_mode()
453 if (!bcm_qspi_bspi_ver_three(qspi)) { in bcm_qspi_bspi_set_mode()
456 val = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL); in bcm_qspi_bspi_set_mode()
458 if (val & mask || qspi->s3_strap_override_ctrl & mask) { in bcm_qspi_bspi_set_mode()
459 qspi->xfer_mode.flex_mode = false; in bcm_qspi_bspi_set_mode()
460 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0); in bcm_qspi_bspi_set_mode()
461 error = bcm_qspi_bspi_set_override(qspi, op, hp); in bcm_qspi_bspi_set_mode()
465 if (qspi->xfer_mode.flex_mode) in bcm_qspi_bspi_set_mode()
466 error = bcm_qspi_bspi_set_flex_mode(qspi, op, hp); in bcm_qspi_bspi_set_mode()
469 dev_warn(&qspi->pdev->dev, in bcm_qspi_bspi_set_mode()
472 } else if (qspi->xfer_mode.width != width || in bcm_qspi_bspi_set_mode()
473 qspi->xfer_mode.addrlen != addrlen || in bcm_qspi_bspi_set_mode()
474 qspi->xfer_mode.hp != hp) { in bcm_qspi_bspi_set_mode()
475 qspi->xfer_mode.width = width; in bcm_qspi_bspi_set_mode()
476 qspi->xfer_mode.addrlen = addrlen; in bcm_qspi_bspi_set_mode()
477 qspi->xfer_mode.hp = hp; in bcm_qspi_bspi_set_mode()
478 dev_dbg(&qspi->pdev->dev, in bcm_qspi_bspi_set_mode()
480 qspi->curr_cs, in bcm_qspi_bspi_set_mode()
481 qspi->xfer_mode.width, in bcm_qspi_bspi_set_mode()
482 qspi->xfer_mode.addrlen, in bcm_qspi_bspi_set_mode()
483 qspi->xfer_mode.hp != -1 ? ", hp mode" : ""); in bcm_qspi_bspi_set_mode()
489 static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi) in bcm_qspi_enable_bspi() argument
491 if (!has_bspi(qspi)) in bcm_qspi_enable_bspi()
494 qspi->bspi_enabled = 1; in bcm_qspi_enable_bspi()
495 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1) == 0) in bcm_qspi_enable_bspi()
498 bcm_qspi_bspi_flush_prefetch_buffers(qspi); in bcm_qspi_enable_bspi()
500 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 0); in bcm_qspi_enable_bspi()
504 static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi) in bcm_qspi_disable_bspi() argument
506 if (!has_bspi(qspi)) in bcm_qspi_disable_bspi()
509 qspi->bspi_enabled = 0; in bcm_qspi_disable_bspi()
510 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1)) in bcm_qspi_disable_bspi()
513 bcm_qspi_bspi_busy_poll(qspi); in bcm_qspi_disable_bspi()
514 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 1); in bcm_qspi_disable_bspi()
518 static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs) in bcm_qspi_chip_select() argument
523 if (qspi->base[CHIP_SELECT]) { in bcm_qspi_chip_select()
524 rd = bcm_qspi_read(qspi, CHIP_SELECT, 0); in bcm_qspi_chip_select()
528 bcm_qspi_write(qspi, CHIP_SELECT, 0, wr); in bcm_qspi_chip_select()
532 dev_dbg(&qspi->pdev->dev, "using cs:%d\n", cs); in bcm_qspi_chip_select()
533 qspi->curr_cs = cs; in bcm_qspi_chip_select()
537 static void bcm_qspi_hw_set_parms(struct bcm_qspi *qspi, in bcm_qspi_hw_set_parms() argument
543 spbr = qspi->base_clk / (2 * xp->speed_hz); in bcm_qspi_hw_set_parms()
546 bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_LSB, spcr); in bcm_qspi_hw_set_parms()
553 bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_MSB, spcr); in bcm_qspi_hw_set_parms()
555 qspi->last_parms = *xp; in bcm_qspi_hw_set_parms()
558 static void bcm_qspi_update_parms(struct bcm_qspi *qspi, in bcm_qspi_update_parms() argument
568 bcm_qspi_hw_set_parms(qspi, &xp); in bcm_qspi_update_parms()
596 static bool bcm_qspi_mspi_transfer_is_last(struct bcm_qspi *qspi, in bcm_qspi_mspi_transfer_is_last() argument
600 spi_transfer_is_last(qspi->master, qt->trans)) in bcm_qspi_mspi_transfer_is_last()
606 static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, in update_qspi_trans_byte_count() argument
629 dev_dbg(&qspi->pdev->dev, "advance msg exit\n"); in update_qspi_trans_byte_count()
630 if (bcm_qspi_mspi_transfer_is_last(qspi, qt)) in update_qspi_trans_byte_count()
639 dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n", in update_qspi_trans_byte_count()
644 static inline u8 read_rxram_slot_u8(struct bcm_qspi *qspi, int slot) in read_rxram_slot_u8() argument
649 return bcm_qspi_read(qspi, MSPI, slot_offset) & 0xff; in read_rxram_slot_u8()
652 static inline u16 read_rxram_slot_u16(struct bcm_qspi *qspi, int slot) in read_rxram_slot_u16() argument
658 return (bcm_qspi_read(qspi, MSPI, lsb_offset) & 0xff) | in read_rxram_slot_u16()
659 ((bcm_qspi_read(qspi, MSPI, msb_offset) & 0xff) << 8); in read_rxram_slot_u16()
662 static void read_from_hw(struct bcm_qspi *qspi, int slots) in read_from_hw() argument
667 bcm_qspi_disable_bspi(qspi); in read_from_hw()
671 dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__); in read_from_hw()
675 tp = qspi->trans_pos; in read_from_hw()
682 buf[tp.byte] = read_rxram_slot_u8(qspi, slot); in read_from_hw()
683 dev_dbg(&qspi->pdev->dev, "RD %02x\n", in read_from_hw()
689 buf[tp.byte / 2] = read_rxram_slot_u16(qspi, in read_from_hw()
691 dev_dbg(&qspi->pdev->dev, "RD %04x\n", in read_from_hw()
695 update_qspi_trans_byte_count(qspi, &tp, in read_from_hw()
699 qspi->trans_pos = tp; in read_from_hw()
702 static inline void write_txram_slot_u8(struct bcm_qspi *qspi, int slot, in write_txram_slot_u8() argument
708 bcm_qspi_write(qspi, MSPI, reg_offset, val); in write_txram_slot_u8()
711 static inline void write_txram_slot_u16(struct bcm_qspi *qspi, int slot, in write_txram_slot_u16() argument
718 bcm_qspi_write(qspi, MSPI, msb_offset, (val >> 8)); in write_txram_slot_u16()
719 bcm_qspi_write(qspi, MSPI, lsb_offset, (val & 0xff)); in write_txram_slot_u16()
722 static inline u32 read_cdram_slot(struct bcm_qspi *qspi, int slot) in read_cdram_slot() argument
724 return bcm_qspi_read(qspi, MSPI, MSPI_CDRAM + (slot << 2)); in read_cdram_slot()
727 static inline void write_cdram_slot(struct bcm_qspi *qspi, int slot, u32 val) in write_cdram_slot() argument
729 bcm_qspi_write(qspi, MSPI, (MSPI_CDRAM + (slot << 2)), val); in write_cdram_slot()
733 static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi) in write_to_hw() argument
739 bcm_qspi_disable_bspi(qspi); in write_to_hw()
740 tp = qspi->trans_pos; in write_to_hw()
741 bcm_qspi_update_parms(qspi, spi, tp.trans); in write_to_hw()
749 write_txram_slot_u8(qspi, slot, val); in write_to_hw()
750 dev_dbg(&qspi->pdev->dev, "WR %02x\n", val); in write_to_hw()
755 write_txram_slot_u16(qspi, slot, val); in write_to_hw()
756 dev_dbg(&qspi->pdev->dev, "WR %04x\n", val); in write_to_hw()
760 if (has_bspi(qspi)) in write_to_hw()
769 write_cdram_slot(qspi, slot, mspi_cdram); in write_to_hw()
771 tstatus = update_qspi_trans_byte_count(qspi, &tp, in write_to_hw()
777 dev_err(&qspi->pdev->dev, "%s: no data to send?", __func__); in write_to_hw()
781 dev_dbg(&qspi->pdev->dev, "submitting %d slots\n", slot); in write_to_hw()
782 bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0); in write_to_hw()
783 bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1); in write_to_hw()
786 mspi_cdram = read_cdram_slot(qspi, slot - 1) & in write_to_hw()
788 write_cdram_slot(qspi, slot - 1, mspi_cdram); in write_to_hw()
791 if (has_bspi(qspi)) in write_to_hw()
792 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 1); in write_to_hw()
797 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0xe0); in write_to_hw()
806 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); in bcm_qspi_bspi_exec_mem_op() local
810 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_exec_mem_op()
812 if (bcm_qspi_bspi_ver_three(qspi)) in bcm_qspi_bspi_exec_mem_op()
817 bcm_qspi_chip_select(qspi, spi->chip_select); in bcm_qspi_bspi_exec_mem_op()
818 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0); in bcm_qspi_bspi_exec_mem_op()
824 if (bcm_qspi_bspi_ver_three(qspi) == false) { in bcm_qspi_bspi_exec_mem_op()
826 bcm_qspi_write(qspi, BSPI, in bcm_qspi_bspi_exec_mem_op()
830 if (!qspi->xfer_mode.flex_mode) in bcm_qspi_bspi_exec_mem_op()
835 if (bcm_qspi_bspi_ver_three(qspi) == true) in bcm_qspi_bspi_exec_mem_op()
843 qspi->bspi_rf_op_idx = 0; in bcm_qspi_bspi_exec_mem_op()
851 reinit_completion(&qspi->bspi_done); in bcm_qspi_bspi_exec_mem_op()
852 bcm_qspi_enable_bspi(qspi); in bcm_qspi_bspi_exec_mem_op()
854 qspi->bspi_rf_op = op; in bcm_qspi_bspi_exec_mem_op()
855 qspi->bspi_rf_op_status = 0; in bcm_qspi_bspi_exec_mem_op()
856 qspi->bspi_rf_op_len = rdlen; in bcm_qspi_bspi_exec_mem_op()
857 dev_dbg(&qspi->pdev->dev, in bcm_qspi_bspi_exec_mem_op()
859 bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr); in bcm_qspi_bspi_exec_mem_op()
860 bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words); in bcm_qspi_bspi_exec_mem_op()
861 bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0); in bcm_qspi_bspi_exec_mem_op()
862 if (qspi->soc_intc) { in bcm_qspi_bspi_exec_mem_op()
873 bcm_qspi_bspi_lr_start(qspi); in bcm_qspi_bspi_exec_mem_op()
874 if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) { in bcm_qspi_bspi_exec_mem_op()
875 dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n"); in bcm_qspi_bspi_exec_mem_op()
892 struct bcm_qspi *qspi = spi_master_get_devdata(master); in bcm_qspi_transfer_one() local
896 bcm_qspi_chip_select(qspi, spi->chip_select); in bcm_qspi_transfer_one()
897 qspi->trans_pos.trans = trans; in bcm_qspi_transfer_one()
898 qspi->trans_pos.byte = 0; in bcm_qspi_transfer_one()
900 while (qspi->trans_pos.byte < trans->len) { in bcm_qspi_transfer_one()
901 reinit_completion(&qspi->mspi_done); in bcm_qspi_transfer_one()
903 slots = write_to_hw(qspi, spi); in bcm_qspi_transfer_one()
904 if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) { in bcm_qspi_transfer_one()
905 dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n"); in bcm_qspi_transfer_one()
909 read_from_hw(qspi, slots); in bcm_qspi_transfer_one()
919 struct bcm_qspi *qspi = spi_master_get_devdata(master); in bcm_qspi_mspi_exec_mem_op() local
938 qspi->trans_pos.mspi_last_trans = false; in bcm_qspi_mspi_exec_mem_op()
942 qspi->trans_pos.mspi_last_trans = true; in bcm_qspi_mspi_exec_mem_op()
959 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); in bcm_qspi_exec_mem_op() local
973 if (bcm_qspi_bspi_ver_three(qspi) == true) { in bcm_qspi_exec_mem_op()
995 ret = bcm_qspi_bspi_set_mode(qspi, op, 0); in bcm_qspi_exec_mem_op()
1013 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_mspi_l2_isr() local
1014 u32 status = bcm_qspi_read(qspi, MSPI, MSPI_MSPI_STATUS); in bcm_qspi_mspi_l2_isr()
1017 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_mspi_l2_isr()
1020 bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status); in bcm_qspi_mspi_l2_isr()
1021 if (qspi->soc_intc) in bcm_qspi_mspi_l2_isr()
1023 complete(&qspi->mspi_done); in bcm_qspi_mspi_l2_isr()
1033 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_bspi_lr_l2_isr() local
1034 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_lr_l2_isr()
1037 if (qspi->bspi_enabled && qspi->bspi_rf_op) { in bcm_qspi_bspi_lr_l2_isr()
1038 bcm_qspi_bspi_lr_data_read(qspi); in bcm_qspi_bspi_lr_l2_isr()
1039 if (qspi->bspi_rf_op_len == 0) { in bcm_qspi_bspi_lr_l2_isr()
1040 qspi->bspi_rf_op = NULL; in bcm_qspi_bspi_lr_l2_isr()
1041 if (qspi->soc_intc) { in bcm_qspi_bspi_lr_l2_isr()
1049 if (qspi->bspi_rf_op_status) in bcm_qspi_bspi_lr_l2_isr()
1050 bcm_qspi_bspi_lr_clear(qspi); in bcm_qspi_bspi_lr_l2_isr()
1052 bcm_qspi_bspi_flush_prefetch_buffers(qspi); in bcm_qspi_bspi_lr_l2_isr()
1055 if (qspi->soc_intc) in bcm_qspi_bspi_lr_l2_isr()
1061 if (qspi->bspi_enabled && status && qspi->bspi_rf_op_len == 0) in bcm_qspi_bspi_lr_l2_isr()
1062 complete(&qspi->bspi_done); in bcm_qspi_bspi_lr_l2_isr()
1070 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_bspi_lr_err_l2_isr() local
1071 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_lr_err_l2_isr()
1073 dev_err(&qspi->pdev->dev, "BSPI INT error\n"); in bcm_qspi_bspi_lr_err_l2_isr()
1074 qspi->bspi_rf_op_status = -EIO; in bcm_qspi_bspi_lr_err_l2_isr()
1075 if (qspi->soc_intc) in bcm_qspi_bspi_lr_err_l2_isr()
1079 complete(&qspi->bspi_done); in bcm_qspi_bspi_lr_err_l2_isr()
1086 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_l1_isr() local
1087 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_l1_isr()
1152 static void bcm_qspi_bspi_init(struct bcm_qspi *qspi) in bcm_qspi_bspi_init() argument
1156 val = bcm_qspi_read(qspi, BSPI, BSPI_REVISION_ID); in bcm_qspi_bspi_init()
1157 qspi->bspi_maj_rev = (val >> 8) & 0xff; in bcm_qspi_bspi_init()
1158 qspi->bspi_min_rev = val & 0xff; in bcm_qspi_bspi_init()
1159 if (!(bcm_qspi_bspi_ver_three(qspi))) { in bcm_qspi_bspi_init()
1161 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_VALUE, 0); in bcm_qspi_bspi_init()
1162 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_ENABLE, 1); in bcm_qspi_bspi_init()
1164 qspi->bspi_enabled = 1; in bcm_qspi_bspi_init()
1165 bcm_qspi_disable_bspi(qspi); in bcm_qspi_bspi_init()
1166 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0); in bcm_qspi_bspi_init()
1167 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0); in bcm_qspi_bspi_init()
1170 static void bcm_qspi_hw_init(struct bcm_qspi *qspi) in bcm_qspi_hw_init() argument
1174 bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_LSB, 0); in bcm_qspi_hw_init()
1175 bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_MSB, 0); in bcm_qspi_hw_init()
1176 bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0); in bcm_qspi_hw_init()
1177 bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, 0); in bcm_qspi_hw_init()
1178 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0x20); in bcm_qspi_hw_init()
1182 parms.speed_hz = qspi->max_speed_hz; in bcm_qspi_hw_init()
1183 bcm_qspi_hw_set_parms(qspi, &parms); in bcm_qspi_hw_init()
1185 if (has_bspi(qspi)) in bcm_qspi_hw_init()
1186 bcm_qspi_bspi_init(qspi); in bcm_qspi_hw_init()
1189 static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi) in bcm_qspi_hw_uninit() argument
1191 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0); in bcm_qspi_hw_uninit()
1192 if (has_bspi(qspi)) in bcm_qspi_hw_uninit()
1193 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0); in bcm_qspi_hw_uninit()
1202 { .compatible = "brcm,spi-bcm-qspi" },
1211 struct bcm_qspi *qspi; in bcm_qspi_probe() local
1232 qspi = spi_master_get_devdata(master); in bcm_qspi_probe()
1233 qspi->pdev = pdev; in bcm_qspi_probe()
1234 qspi->trans_pos.trans = NULL; in bcm_qspi_probe()
1235 qspi->trans_pos.byte = 0; in bcm_qspi_probe()
1236 qspi->trans_pos.mspi_last_trans = true; in bcm_qspi_probe()
1237 qspi->master = master; in bcm_qspi_probe()
1248 qspi->big_endian = of_device_is_big_endian(dev->of_node); in bcm_qspi_probe()
1259 qspi->base[MSPI] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1260 if (IS_ERR(qspi->base[MSPI])) { in bcm_qspi_probe()
1261 ret = PTR_ERR(qspi->base[MSPI]); in bcm_qspi_probe()
1270 qspi->base[BSPI] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1271 if (IS_ERR(qspi->base[BSPI])) { in bcm_qspi_probe()
1272 ret = PTR_ERR(qspi->base[BSPI]); in bcm_qspi_probe()
1275 qspi->bspi_mode = true; in bcm_qspi_probe()
1277 qspi->bspi_mode = false; in bcm_qspi_probe()
1280 dev_info(dev, "using %smspi mode\n", qspi->bspi_mode ? "bspi-" : ""); in bcm_qspi_probe()
1284 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1285 if (IS_ERR(qspi->base[CHIP_SELECT])) { in bcm_qspi_probe()
1286 ret = PTR_ERR(qspi->base[CHIP_SELECT]); in bcm_qspi_probe()
1291 qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id), in bcm_qspi_probe()
1293 if (!qspi->dev_ids) { in bcm_qspi_probe()
1313 &qspi->dev_ids[val]); in bcm_qspi_probe()
1319 qspi->dev_ids[val].dev = qspi; in bcm_qspi_probe()
1320 qspi->dev_ids[val].irqp = &qspi_irq_tab[val]; in bcm_qspi_probe()
1339 qspi->soc_intc = soc_intc; in bcm_qspi_probe()
1342 qspi->soc_intc = NULL; in bcm_qspi_probe()
1345 qspi->clk = devm_clk_get(&pdev->dev, NULL); in bcm_qspi_probe()
1346 if (IS_ERR(qspi->clk)) { in bcm_qspi_probe()
1348 ret = PTR_ERR(qspi->clk); in bcm_qspi_probe()
1352 ret = clk_prepare_enable(qspi->clk); in bcm_qspi_probe()
1358 qspi->base_clk = clk_get_rate(qspi->clk); in bcm_qspi_probe()
1359 qspi->max_speed_hz = qspi->base_clk / (QSPI_SPBR_MIN * 2); in bcm_qspi_probe()
1361 bcm_qspi_hw_init(qspi); in bcm_qspi_probe()
1362 init_completion(&qspi->mspi_done); in bcm_qspi_probe()
1363 init_completion(&qspi->bspi_done); in bcm_qspi_probe()
1364 qspi->curr_cs = -1; in bcm_qspi_probe()
1366 platform_set_drvdata(pdev, qspi); in bcm_qspi_probe()
1368 qspi->xfer_mode.width = -1; in bcm_qspi_probe()
1369 qspi->xfer_mode.addrlen = -1; in bcm_qspi_probe()
1370 qspi->xfer_mode.hp = -1; in bcm_qspi_probe()
1381 bcm_qspi_hw_uninit(qspi); in bcm_qspi_probe()
1382 clk_disable_unprepare(qspi->clk); in bcm_qspi_probe()
1384 kfree(qspi->dev_ids); in bcm_qspi_probe()
1394 struct bcm_qspi *qspi = platform_get_drvdata(pdev); in bcm_qspi_remove() local
1396 bcm_qspi_hw_uninit(qspi); in bcm_qspi_remove()
1397 clk_disable_unprepare(qspi->clk); in bcm_qspi_remove()
1398 kfree(qspi->dev_ids); in bcm_qspi_remove()
1399 spi_unregister_master(qspi->master); in bcm_qspi_remove()
1408 struct bcm_qspi *qspi = dev_get_drvdata(dev); in bcm_qspi_suspend() local
1411 if (!bcm_qspi_bspi_ver_three(qspi)) in bcm_qspi_suspend()
1412 qspi->s3_strap_override_ctrl = in bcm_qspi_suspend()
1413 bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL); in bcm_qspi_suspend()
1415 spi_master_suspend(qspi->master); in bcm_qspi_suspend()
1416 clk_disable(qspi->clk); in bcm_qspi_suspend()
1417 bcm_qspi_hw_uninit(qspi); in bcm_qspi_suspend()
1424 struct bcm_qspi *qspi = dev_get_drvdata(dev); in bcm_qspi_resume() local
1427 bcm_qspi_hw_init(qspi); in bcm_qspi_resume()
1428 bcm_qspi_chip_select(qspi, qspi->curr_cs); in bcm_qspi_resume()
1429 if (qspi->soc_intc) in bcm_qspi_resume()
1431 qspi->soc_intc->bcm_qspi_int_set(qspi->soc_intc, MSPI_DONE, in bcm_qspi_resume()
1434 ret = clk_enable(qspi->clk); in bcm_qspi_resume()
1436 spi_master_resume(qspi->master); in bcm_qspi_resume()
1447 MODULE_DESCRIPTION("Broadcom QSPI driver");