• Home
  • Raw
  • Download

Lines Matching +full:op +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
22 #include <linux/spi/spi-mem.h>
25 #include "spi-bcm-qspi.h"
63 /* Override mode masks */
158 u8 mode; member
236 return qspi->bspi_mode; in has_bspi()
239 /* hardware supports spcr3 and fast baud-rate */
243 ((qspi->mspi_maj_rev >= 1) && in bcm_qspi_has_fastbr()
244 (qspi->mspi_min_rev >= 5))) in bcm_qspi_has_fastbr()
253 if (!has_bspi(qspi) && (qspi->mspi_spcr3_sysclk || in bcm_qspi_has_sysclk_108()
254 ((qspi->mspi_maj_rev >= 1) && in bcm_qspi_has_sysclk_108()
255 (qspi->mspi_min_rev >= 6)))) in bcm_qspi_has_sysclk_108()
273 return bcm_qspi_readl(qspi->big_endian, qspi->base[type] + offset); in bcm_qspi_read()
280 bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset); in bcm_qspi_write()
294 dev_warn(&qspi->pdev->dev, "timeout waiting for !busy_status\n"); in bcm_qspi_bspi_busy_poll()
295 return -EIO; in bcm_qspi_bspi_busy_poll()
300 if (qspi->bspi_maj_rev < 4) in bcm_qspi_bspi_ver_three()
348 u32 *buf = (u32 *)qspi->bspi_rf_op->data.buf.in; in bcm_qspi_bspi_lr_data_read()
351 dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_op, in bcm_qspi_bspi_lr_data_read()
352 qspi->bspi_rf_op->data.buf.in, qspi->bspi_rf_op_len); in bcm_qspi_bspi_lr_data_read()
355 if (likely(qspi->bspi_rf_op_len >= 4) && in bcm_qspi_bspi_lr_data_read()
357 buf[qspi->bspi_rf_op_idx++] = data; in bcm_qspi_bspi_lr_data_read()
358 qspi->bspi_rf_op_len -= 4; in bcm_qspi_bspi_lr_data_read()
361 u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_op_idx]; in bcm_qspi_bspi_lr_data_read()
364 while (qspi->bspi_rf_op_len) { in bcm_qspi_bspi_lr_data_read()
367 qspi->bspi_rf_op_len--; in bcm_qspi_bspi_lr_data_read()
384 const struct spi_mem_op *op, int hp) in bcm_qspi_bspi_set_flex_mode() argument
387 u8 command = op->cmd.opcode; in bcm_qspi_bspi_set_flex_mode()
388 int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE; in bcm_qspi_bspi_set_flex_mode()
389 int addrlen = op->addr.nbytes; in bcm_qspi_bspi_set_flex_mode()
392 dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n", in bcm_qspi_bspi_set_flex_mode()
398 bpp |= (op->dummy.nbytes * 8) / op->dummy.buswidth; in bcm_qspi_bspi_set_flex_mode()
403 /* default mode, does not need flex_cmd */ in bcm_qspi_bspi_set_flex_mode()
409 bpc |= 0x00010100; /* address and mode are 2-bit */ in bcm_qspi_bspi_set_flex_mode()
416 bpc |= 0x00020200; /* address and mode are 4-bit */ in bcm_qspi_bspi_set_flex_mode()
421 return -EINVAL; in bcm_qspi_bspi_set_flex_mode()
430 const struct spi_mem_op *op, int hp) in bcm_qspi_bspi_set_override() argument
432 int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE; in bcm_qspi_bspi_set_override()
433 int addrlen = op->addr.nbytes; in bcm_qspi_bspi_set_override()
436 dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n", in bcm_qspi_bspi_set_override()
441 /* clear quad/dual mode */ in bcm_qspi_bspi_set_override()
446 /* clear dual mode and set quad mode */ in bcm_qspi_bspi_set_override()
451 /* clear quad mode set dual mode */ in bcm_qspi_bspi_set_override()
456 return -EINVAL; in bcm_qspi_bspi_set_override()
460 /* set 4byte mode*/ in bcm_qspi_bspi_set_override()
463 /* clear 4 byte mode */ in bcm_qspi_bspi_set_override()
466 /* set the override mode */ in bcm_qspi_bspi_set_override()
469 bcm_qspi_bspi_set_xfer_params(qspi, op->cmd.opcode, 0, 0, 0); in bcm_qspi_bspi_set_override()
475 const struct spi_mem_op *op, int hp) in bcm_qspi_bspi_set_mode() argument
478 int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE; in bcm_qspi_bspi_set_mode()
479 int addrlen = op->addr.nbytes; in bcm_qspi_bspi_set_mode()
481 /* default mode */ in bcm_qspi_bspi_set_mode()
482 qspi->xfer_mode.flex_mode = true; in bcm_qspi_bspi_set_mode()
489 if (val & mask || qspi->s3_strap_override_ctrl & mask) { in bcm_qspi_bspi_set_mode()
490 qspi->xfer_mode.flex_mode = false; in bcm_qspi_bspi_set_mode()
492 error = bcm_qspi_bspi_set_override(qspi, op, hp); in bcm_qspi_bspi_set_mode()
496 if (qspi->xfer_mode.flex_mode) in bcm_qspi_bspi_set_mode()
497 error = bcm_qspi_bspi_set_flex_mode(qspi, op, hp); in bcm_qspi_bspi_set_mode()
500 dev_warn(&qspi->pdev->dev, in bcm_qspi_bspi_set_mode()
503 } else if (qspi->xfer_mode.width != width || in bcm_qspi_bspi_set_mode()
504 qspi->xfer_mode.addrlen != addrlen || in bcm_qspi_bspi_set_mode()
505 qspi->xfer_mode.hp != hp) { in bcm_qspi_bspi_set_mode()
506 qspi->xfer_mode.width = width; in bcm_qspi_bspi_set_mode()
507 qspi->xfer_mode.addrlen = addrlen; in bcm_qspi_bspi_set_mode()
508 qspi->xfer_mode.hp = hp; in bcm_qspi_bspi_set_mode()
509 dev_dbg(&qspi->pdev->dev, in bcm_qspi_bspi_set_mode()
510 "cs:%d %d-lane output, %d-byte address%s\n", in bcm_qspi_bspi_set_mode()
511 qspi->curr_cs, in bcm_qspi_bspi_set_mode()
512 qspi->xfer_mode.width, in bcm_qspi_bspi_set_mode()
513 qspi->xfer_mode.addrlen, in bcm_qspi_bspi_set_mode()
514 qspi->xfer_mode.hp != -1 ? ", hp mode" : ""); in bcm_qspi_bspi_set_mode()
525 qspi->bspi_enabled = 1; in bcm_qspi_enable_bspi()
540 qspi->bspi_enabled = 0; in bcm_qspi_disable_bspi()
554 if (qspi->base[CHIP_SELECT]) { in bcm_qspi_chip_select()
563 dev_dbg(&qspi->pdev->dev, "using cs:%d\n", cs); in bcm_qspi_chip_select()
564 qspi->curr_cs = cs; in bcm_qspi_chip_select()
573 if (xp->speed_hz) in bcm_qspi_hw_set_parms()
574 spbr = qspi->base_clk / (2 * xp->speed_hz); in bcm_qspi_hw_set_parms()
579 if (!qspi->mspi_maj_rev) in bcm_qspi_hw_set_parms()
586 if (xp->bits_per_word != 16) in bcm_qspi_hw_set_parms()
587 spcr |= xp->bits_per_word << 2; in bcm_qspi_hw_set_parms()
588 spcr |= xp->mode & 3; in bcm_qspi_hw_set_parms()
601 qspi->base_clk = MSPI_BASE_FREQ * 4; in bcm_qspi_hw_set_parms()
609 qspi->last_parms = *xp; in bcm_qspi_hw_set_parms()
618 xp.speed_hz = trans->speed_hz; in bcm_qspi_update_parms()
619 xp.bits_per_word = trans->bits_per_word; in bcm_qspi_update_parms()
620 xp.mode = spi->mode; in bcm_qspi_update_parms()
629 if (spi->bits_per_word > 16) in bcm_qspi_setup()
630 return -EINVAL; in bcm_qspi_setup()
636 return -ENOMEM; in bcm_qspi_setup()
639 xp->speed_hz = spi->max_speed_hz; in bcm_qspi_setup()
640 xp->mode = spi->mode; in bcm_qspi_setup()
642 if (spi->bits_per_word) in bcm_qspi_setup()
643 xp->bits_per_word = spi->bits_per_word; in bcm_qspi_setup()
645 xp->bits_per_word = 8; in bcm_qspi_setup()
653 if (qt->mspi_last_trans && in bcm_qspi_mspi_transfer_is_last()
654 spi_transfer_is_last(qspi->master, qt->trans)) in bcm_qspi_mspi_transfer_is_last()
666 if (qt->trans->bits_per_word <= 8) in update_qspi_trans_byte_count()
667 qt->byte++; in update_qspi_trans_byte_count()
669 qt->byte += 2; in update_qspi_trans_byte_count()
671 if (qt->byte >= qt->trans->len) { in update_qspi_trans_byte_count()
673 /* in TX mode, need to pause for a delay or CS change */ in update_qspi_trans_byte_count()
674 if (qt->trans->delay_usecs && in update_qspi_trans_byte_count()
677 if (qt->trans->cs_change && in update_qspi_trans_byte_count()
686 qt->trans = NULL; in update_qspi_trans_byte_count()
689 dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n", in update_qspi_trans_byte_count()
690 qt->trans, qt->trans ? qt->trans->len : 0, qt->byte, ret); in update_qspi_trans_byte_count()
721 dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__); in read_from_hw()
725 tp = qspi->trans_pos; in read_from_hw()
728 if (tp.trans->bits_per_word <= 8) { in read_from_hw()
729 u8 *buf = tp.trans->rx_buf; in read_from_hw()
733 dev_dbg(&qspi->pdev->dev, "RD %02x\n", in read_from_hw()
736 u16 *buf = tp.trans->rx_buf; in read_from_hw()
741 dev_dbg(&qspi->pdev->dev, "RD %04x\n", in read_from_hw()
749 qspi->trans_pos = tp; in read_from_hw()
790 tp = qspi->trans_pos; in write_to_hw()
795 if (tp.trans->bits_per_word <= 8) { in write_to_hw()
796 const u8 *buf = tp.trans->tx_buf; in write_to_hw()
800 dev_dbg(&qspi->pdev->dev, "WR %02x\n", val); in write_to_hw()
802 const u16 *buf = tp.trans->tx_buf; in write_to_hw()
806 dev_dbg(&qspi->pdev->dev, "WR %04x\n", val); in write_to_hw()
813 mspi_cdram |= (~(1 << spi->chip_select) & in write_to_hw()
816 mspi_cdram |= ((tp.trans->bits_per_word <= 8) ? 0 : in write_to_hw()
827 dev_err(&qspi->pdev->dev, "%s: no data to send?", __func__); in write_to_hw()
831 dev_dbg(&qspi->pdev->dev, "submitting %d slots\n", slot); in write_to_hw()
833 bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1); in write_to_hw()
845 mspi_cdram = read_cdram_slot(qspi, slot - 1) & in write_to_hw()
847 write_cdram_slot(qspi, slot - 1, mspi_cdram); in write_to_hw()
863 const struct spi_mem_op *op) in bcm_qspi_bspi_exec_mem_op() argument
865 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); in bcm_qspi_bspi_exec_mem_op()
869 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_exec_mem_op()
872 if (op->addr.nbytes == BSPI_ADDRLEN_4BYTES) in bcm_qspi_bspi_exec_mem_op()
873 return -EIO; in bcm_qspi_bspi_exec_mem_op()
875 from = op->addr.val; in bcm_qspi_bspi_exec_mem_op()
876 if (!spi->cs_gpiod) in bcm_qspi_bspi_exec_mem_op()
877 bcm_qspi_chip_select(qspi, spi->chip_select); in bcm_qspi_bspi_exec_mem_op()
881 * when using flex mode we need to send in bcm_qspi_bspi_exec_mem_op()
890 if (!qspi->xfer_mode.flex_mode) in bcm_qspi_bspi_exec_mem_op()
902 len = op->data.nbytes; in bcm_qspi_bspi_exec_mem_op()
903 qspi->bspi_rf_op_idx = 0; in bcm_qspi_bspi_exec_mem_op()
911 reinit_completion(&qspi->bspi_done); in bcm_qspi_bspi_exec_mem_op()
914 qspi->bspi_rf_op = op; in bcm_qspi_bspi_exec_mem_op()
915 qspi->bspi_rf_op_status = 0; in bcm_qspi_bspi_exec_mem_op()
916 qspi->bspi_rf_op_len = rdlen; in bcm_qspi_bspi_exec_mem_op()
917 dev_dbg(&qspi->pdev->dev, in bcm_qspi_bspi_exec_mem_op()
922 if (qspi->soc_intc) { in bcm_qspi_bspi_exec_mem_op()
927 soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE); in bcm_qspi_bspi_exec_mem_op()
928 soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true); in bcm_qspi_bspi_exec_mem_op()
934 if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) { in bcm_qspi_bspi_exec_mem_op()
935 dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n"); in bcm_qspi_bspi_exec_mem_op()
936 ret = -ETIMEDOUT; in bcm_qspi_bspi_exec_mem_op()
942 len -= rdlen; in bcm_qspi_bspi_exec_mem_op()
956 if (!spi->cs_gpiod) in bcm_qspi_transfer_one()
957 bcm_qspi_chip_select(qspi, spi->chip_select); in bcm_qspi_transfer_one()
958 qspi->trans_pos.trans = trans; in bcm_qspi_transfer_one()
959 qspi->trans_pos.byte = 0; in bcm_qspi_transfer_one()
961 while (qspi->trans_pos.byte < trans->len) { in bcm_qspi_transfer_one()
962 reinit_completion(&qspi->mspi_done); in bcm_qspi_transfer_one()
965 if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) { in bcm_qspi_transfer_one()
966 dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n"); in bcm_qspi_transfer_one()
967 return -ETIMEDOUT; in bcm_qspi_transfer_one()
978 const struct spi_mem_op *op) in bcm_qspi_mspi_exec_mem_op() argument
980 struct spi_master *master = spi->master; in bcm_qspi_mspi_exec_mem_op()
991 cmd[0] = op->cmd.opcode; in bcm_qspi_mspi_exec_mem_op()
992 for (i = 0; i < op->addr.nbytes; i++) in bcm_qspi_mspi_exec_mem_op()
993 cmd[1 + i] = op->addr.val >> (8 * (op->addr.nbytes - i - 1)); in bcm_qspi_mspi_exec_mem_op()
996 t[0].len = op->addr.nbytes + op->dummy.nbytes + 1; in bcm_qspi_mspi_exec_mem_op()
997 t[0].bits_per_word = spi->bits_per_word; in bcm_qspi_mspi_exec_mem_op()
998 t[0].tx_nbits = op->cmd.buswidth; in bcm_qspi_mspi_exec_mem_op()
1000 qspi->trans_pos.mspi_last_trans = false; in bcm_qspi_mspi_exec_mem_op()
1004 qspi->trans_pos.mspi_last_trans = true; in bcm_qspi_mspi_exec_mem_op()
1007 t[1].rx_buf = op->data.buf.in; in bcm_qspi_mspi_exec_mem_op()
1008 t[1].len = op->data.nbytes; in bcm_qspi_mspi_exec_mem_op()
1009 t[1].rx_nbits = op->data.buswidth; in bcm_qspi_mspi_exec_mem_op()
1010 t[1].bits_per_word = spi->bits_per_word; in bcm_qspi_mspi_exec_mem_op()
1018 const struct spi_mem_op *op) in bcm_qspi_exec_mem_op() argument
1020 struct spi_device *spi = mem->spi; in bcm_qspi_exec_mem_op()
1021 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); in bcm_qspi_exec_mem_op()
1027 if (!op->data.nbytes || !op->addr.nbytes || op->addr.nbytes > 4 || in bcm_qspi_exec_mem_op()
1028 op->data.dir != SPI_MEM_DATA_IN) in bcm_qspi_exec_mem_op()
1029 return -ENOTSUPP; in bcm_qspi_exec_mem_op()
1031 buf = op->data.buf.in; in bcm_qspi_exec_mem_op()
1032 addr = op->addr.val; in bcm_qspi_exec_mem_op()
1033 len = op->data.nbytes; in bcm_qspi_exec_mem_op()
1045 (~ADDR_4MB_MASK & (addr + len - 1))) in bcm_qspi_exec_mem_op()
1049 /* non-aligned and very short transfers are handled by MSPI */ in bcm_qspi_exec_mem_op()
1055 return bcm_qspi_mspi_exec_mem_op(spi, op); in bcm_qspi_exec_mem_op()
1057 ret = bcm_qspi_bspi_set_mode(qspi, op, 0); in bcm_qspi_exec_mem_op()
1060 ret = bcm_qspi_bspi_exec_mem_op(spi, op); in bcm_qspi_exec_mem_op()
1075 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_mspi_l2_isr()
1079 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_mspi_l2_isr()
1083 if (qspi->soc_intc) in bcm_qspi_mspi_l2_isr()
1084 soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_DONE); in bcm_qspi_mspi_l2_isr()
1085 complete(&qspi->mspi_done); in bcm_qspi_mspi_l2_isr()
1095 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_bspi_lr_l2_isr()
1096 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_lr_l2_isr()
1097 u32 status = qspi_dev_id->irqp->mask; in bcm_qspi_bspi_lr_l2_isr()
1099 if (qspi->bspi_enabled && qspi->bspi_rf_op) { in bcm_qspi_bspi_lr_l2_isr()
1101 if (qspi->bspi_rf_op_len == 0) { in bcm_qspi_bspi_lr_l2_isr()
1102 qspi->bspi_rf_op = NULL; in bcm_qspi_bspi_lr_l2_isr()
1103 if (qspi->soc_intc) { in bcm_qspi_bspi_lr_l2_isr()
1105 soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, in bcm_qspi_bspi_lr_l2_isr()
1111 if (qspi->bspi_rf_op_status) in bcm_qspi_bspi_lr_l2_isr()
1117 if (qspi->soc_intc) in bcm_qspi_bspi_lr_l2_isr()
1119 soc_intc->bcm_qspi_int_ack(soc_intc, BSPI_DONE); in bcm_qspi_bspi_lr_l2_isr()
1123 if (qspi->bspi_enabled && status && qspi->bspi_rf_op_len == 0) in bcm_qspi_bspi_lr_l2_isr()
1124 complete(&qspi->bspi_done); in bcm_qspi_bspi_lr_l2_isr()
1132 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_bspi_lr_err_l2_isr()
1133 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_bspi_lr_err_l2_isr()
1135 dev_err(&qspi->pdev->dev, "BSPI INT error\n"); in bcm_qspi_bspi_lr_err_l2_isr()
1136 qspi->bspi_rf_op_status = -EIO; in bcm_qspi_bspi_lr_err_l2_isr()
1137 if (qspi->soc_intc) in bcm_qspi_bspi_lr_err_l2_isr()
1139 soc_intc->bcm_qspi_int_ack(soc_intc, BSPI_ERR); in bcm_qspi_bspi_lr_err_l2_isr()
1141 complete(&qspi->bspi_done); in bcm_qspi_bspi_lr_err_l2_isr()
1148 struct bcm_qspi *qspi = qspi_dev_id->dev; in bcm_qspi_l1_isr()
1149 struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; in bcm_qspi_l1_isr()
1153 u32 status = soc_intc->bcm_qspi_get_int_status(soc_intc); in bcm_qspi_l1_isr()
1219 qspi->bspi_maj_rev = (val >> 8) & 0xff; in bcm_qspi_bspi_init()
1220 qspi->bspi_min_rev = val & 0xff; in bcm_qspi_bspi_init()
1222 /* Force mapping of BSPI address -> flash offset */ in bcm_qspi_bspi_init()
1226 qspi->bspi_enabled = 1; in bcm_qspi_bspi_init()
1242 parms.mode = SPI_MODE_3; in bcm_qspi_hw_init()
1244 parms.speed_hz = qspi->max_speed_hz; in bcm_qspi_hw_init()
1289 .compatible = "brcm,spi-bcm7445-qspi",
1294 .compatible = "brcm,spi-bcm-qspi",
1298 .compatible = "brcm,spi-bcm7216-qspi",
1302 .compatible = "brcm,spi-bcm7278-qspi",
1314 struct device *dev = &pdev->dev; in bcm_qspi_probe()
1324 /* We only support device-tree instantiation */ in bcm_qspi_probe()
1325 if (!dev->of_node) in bcm_qspi_probe()
1326 return -ENODEV; in bcm_qspi_probe()
1328 of_id = of_match_node(bcm_qspi_of_match, dev->of_node); in bcm_qspi_probe()
1330 return -ENODEV; in bcm_qspi_probe()
1332 data = of_id->data; in bcm_qspi_probe()
1337 return -ENOMEM; in bcm_qspi_probe()
1342 qspi->clk = devm_clk_get_optional(&pdev->dev, NULL); in bcm_qspi_probe()
1343 if (IS_ERR(qspi->clk)) in bcm_qspi_probe()
1344 return PTR_ERR(qspi->clk); in bcm_qspi_probe()
1346 qspi->pdev = pdev; in bcm_qspi_probe()
1347 qspi->trans_pos.trans = NULL; in bcm_qspi_probe()
1348 qspi->trans_pos.byte = 0; in bcm_qspi_probe()
1349 qspi->trans_pos.mspi_last_trans = true; in bcm_qspi_probe()
1350 qspi->master = master; in bcm_qspi_probe()
1352 master->bus_num = -1; in bcm_qspi_probe()
1353 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD; in bcm_qspi_probe()
1354 master->setup = bcm_qspi_setup; in bcm_qspi_probe()
1355 master->transfer_one = bcm_qspi_transfer_one; in bcm_qspi_probe()
1356 master->mem_ops = &bcm_qspi_mem_ops; in bcm_qspi_probe()
1357 master->cleanup = bcm_qspi_cleanup; in bcm_qspi_probe()
1358 master->dev.of_node = dev->of_node; in bcm_qspi_probe()
1359 master->num_chipselect = NUM_CHIPSELECT; in bcm_qspi_probe()
1360 master->use_gpio_descriptors = true; in bcm_qspi_probe()
1362 qspi->big_endian = of_device_is_big_endian(dev->of_node); in bcm_qspi_probe()
1364 if (!of_property_read_u32(dev->of_node, "num-cs", &val)) in bcm_qspi_probe()
1365 master->num_chipselect = val; in bcm_qspi_probe()
1373 qspi->base[MSPI] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1374 if (IS_ERR(qspi->base[MSPI])) in bcm_qspi_probe()
1375 return PTR_ERR(qspi->base[MSPI]); in bcm_qspi_probe()
1382 qspi->base[BSPI] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1383 if (IS_ERR(qspi->base[BSPI])) in bcm_qspi_probe()
1384 return PTR_ERR(qspi->base[BSPI]); in bcm_qspi_probe()
1385 qspi->bspi_mode = true; in bcm_qspi_probe()
1387 qspi->bspi_mode = false; in bcm_qspi_probe()
1390 dev_info(dev, "using %smspi mode\n", qspi->bspi_mode ? "bspi-" : ""); in bcm_qspi_probe()
1394 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res); in bcm_qspi_probe()
1395 if (IS_ERR(qspi->base[CHIP_SELECT])) in bcm_qspi_probe()
1396 return PTR_ERR(qspi->base[CHIP_SELECT]); in bcm_qspi_probe()
1399 qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id), in bcm_qspi_probe()
1401 if (!qspi->dev_ids) in bcm_qspi_probe()
1402 return -ENOMEM; in bcm_qspi_probe()
1409 qspi->soc_intc = soc_intc; in bcm_qspi_probe()
1410 soc_intc->bcm_qspi_int_set(soc_intc, MSPI_DONE, true); in bcm_qspi_probe()
1412 qspi->soc_intc = NULL; in bcm_qspi_probe()
1415 if (qspi->clk) { in bcm_qspi_probe()
1416 ret = clk_prepare_enable(qspi->clk); in bcm_qspi_probe()
1421 qspi->base_clk = clk_get_rate(qspi->clk); in bcm_qspi_probe()
1423 qspi->base_clk = MSPI_BASE_FREQ; in bcm_qspi_probe()
1426 if (data->has_mspi_rev) { in bcm_qspi_probe()
1433 qspi->mspi_maj_rev = (rev >> 4) & 0xf; in bcm_qspi_probe()
1434 qspi->mspi_min_rev = rev & 0xf; in bcm_qspi_probe()
1435 qspi->mspi_spcr3_sysclk = data->has_spcr3_sysclk; in bcm_qspi_probe()
1437 qspi->max_speed_hz = qspi->base_clk / (bcm_qspi_spbr_min(qspi) * 2); in bcm_qspi_probe()
1446 irq = -1; in bcm_qspi_probe()
1457 ret = devm_request_irq(&pdev->dev, irq, in bcm_qspi_probe()
1460 &qspi->dev_ids[val]); in bcm_qspi_probe()
1462 dev_err(&pdev->dev, "IRQ %s not found\n", name); in bcm_qspi_probe()
1466 qspi->dev_ids[val].dev = qspi; in bcm_qspi_probe()
1467 qspi->dev_ids[val].irqp = &qspi_irq_tab[val]; in bcm_qspi_probe()
1469 dev_dbg(&pdev->dev, "registered IRQ %s %d\n", in bcm_qspi_probe()
1476 dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n"); in bcm_qspi_probe()
1477 ret = -EINVAL; in bcm_qspi_probe()
1482 init_completion(&qspi->mspi_done); in bcm_qspi_probe()
1483 init_completion(&qspi->bspi_done); in bcm_qspi_probe()
1484 qspi->curr_cs = -1; in bcm_qspi_probe()
1488 qspi->xfer_mode.width = -1; in bcm_qspi_probe()
1489 qspi->xfer_mode.addrlen = -1; in bcm_qspi_probe()
1490 qspi->xfer_mode.hp = -1; in bcm_qspi_probe()
1503 clk_disable_unprepare(qspi->clk); in bcm_qspi_probe()
1505 kfree(qspi->dev_ids); in bcm_qspi_probe()
1515 spi_unregister_master(qspi->master); in bcm_qspi_remove()
1517 clk_disable_unprepare(qspi->clk); in bcm_qspi_remove()
1518 kfree(qspi->dev_ids); in bcm_qspi_remove()
1531 qspi->s3_strap_override_ctrl = in bcm_qspi_suspend()
1534 spi_master_suspend(qspi->master); in bcm_qspi_suspend()
1535 clk_disable_unprepare(qspi->clk); in bcm_qspi_suspend()
1547 bcm_qspi_chip_select(qspi, qspi->curr_cs); in bcm_qspi_resume()
1548 if (qspi->soc_intc) in bcm_qspi_resume()
1550 qspi->soc_intc->bcm_qspi_int_set(qspi->soc_intc, MSPI_DONE, in bcm_qspi_resume()
1553 ret = clk_prepare_enable(qspi->clk); in bcm_qspi_resume()
1555 spi_master_resume(qspi->master); in bcm_qspi_resume()