Lines Matching +full:is +full:- +full:decoded +full:- +full:cs
1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2015-2018, IBM Corporation.
32 u32 soft_rst_cmd_ctrl; /* 0x50 Auto Soft-Reset Command Control */
113 /* Auto Soft-Reset Command Control */
121 * CE0 0x20000000 - 0x2fffffff 128MB
122 * CE1 0x28000000 - 0x29ffffff 32MB
123 * CE2 0x2a000000 - 0x2bffffff 32MB
125 * The full address space of the AHB window of the controller is
126 * covered and CE0 start address and CE2 end addresses are read-only.
136 ((((start) & 0x0ff00000) >> 16) | (((end) - 0x100000) & 0xffff0000))
171 u8 cs; member
172 /* Initialized when the SPI bus is
288 struct aspeed_spi_priv *priv = dev_get_priv(dev->parent); in aspeed_spi_get_flash()
289 u8 cs = slave_plat->cs; in aspeed_spi_get_flash() local
291 if (cs >= priv->flash_count) { in aspeed_spi_get_flash()
292 pr_err("invalid CS %u\n", cs); in aspeed_spi_get_flash()
296 return &priv->flashes[cs]; in aspeed_spi_get_flash()
301 u32 hclk_rate = priv->hclk_rate; in aspeed_g6_spi_hclk_divisor()
326 debug("hclk=%d required=%d h_div %d, divisor is %d (mask %x) speed=%d\n", in aspeed_g6_spi_hclk_divisor()
336 u32 hclk_rate = priv->hclk_rate; in aspeed_spi_hclk_divisor()
348 debug("hclk=%d required=%d divisor is %d (mask %x) speed=%d\n", in aspeed_spi_hclk_divisor()
363 u32 flash_addr = (u32)flash->ahb_base + 0x10000; in aspeed_spi_fmc_checksum()
367 writel(flash_addr, &priv->regs->dma_flash_addr); in aspeed_spi_fmc_checksum()
368 writel(FLASH_CALIBRATION_LEN, &priv->regs->dma_len); in aspeed_spi_fmc_checksum()
378 writel(dma_ctrl, &priv->regs->dma_ctrl); in aspeed_spi_fmc_checksum()
379 while (!(readl(&priv->regs->intr_ctrl) & INTR_CTRL_DMA_STATUS)) in aspeed_spi_fmc_checksum()
382 writel(0x0, &priv->regs->intr_ctrl); in aspeed_spi_fmc_checksum()
384 checksum = readl(&priv->regs->dma_checksum); in aspeed_spi_fmc_checksum()
386 writel(0x0, &priv->regs->dma_ctrl); in aspeed_spi_fmc_checksum()
397 u32 flash_addr = (u32)flash->ahb_base; in aspeed_g6_spi_fmc_checksum()
401 writel(DMA_GET_REQ_MAGIC, &priv->regs->dma_ctrl); in aspeed_g6_spi_fmc_checksum()
402 if (readl(&priv->regs->dma_ctrl) & DAM_CTRL_REQUEST) { in aspeed_g6_spi_fmc_checksum()
403 while (!(readl(&priv->regs->dma_ctrl) & DAM_CTRL_GRANT)) in aspeed_g6_spi_fmc_checksum()
407 writel(flash_addr, &priv->regs->dma_flash_addr); in aspeed_g6_spi_fmc_checksum()
408 writel(FLASH_CALIBRATION_LEN, &priv->regs->dma_len); in aspeed_g6_spi_fmc_checksum()
418 writel(dma_ctrl, &priv->regs->dma_ctrl); in aspeed_g6_spi_fmc_checksum()
419 while (!(readl(&priv->regs->intr_ctrl) & INTR_CTRL_DMA_STATUS)) in aspeed_g6_spi_fmc_checksum()
422 checksum = readl(&priv->regs->dma_checksum); in aspeed_g6_spi_fmc_checksum()
424 writel(0x0, &priv->regs->intr_ctrl); in aspeed_g6_spi_fmc_checksum()
425 writel(0x0, &priv->regs->dma_ctrl); in aspeed_g6_spi_fmc_checksum()
426 writel(DMA_DISCARD_REQ_MAGIC, &priv->regs->dma_ctrl); in aspeed_g6_spi_fmc_checksum()
435 if (priv->new_ver) in aspeed_spi_read_checksum()
439 if (!priv->is_fmc) { in aspeed_spi_read_checksum()
451 * Check whether the data is not all 0 or 1 in order to
452 * avoid calibriate umount spi-flash.
493 * consecutive good points is too short. in get_mid_point_of_longest_one()
496 return -1; in get_mid_point_of_longest_one()
504 u32 cs = flash->cs; in aspeed_spi_timing_calibration() local
513 u32 max_freq = flash->max_freq; in aspeed_spi_timing_calibration()
520 if (priv->new_ver) { in aspeed_spi_timing_calibration()
521 timing_reg = readl(&priv->regs->timings + cs); in aspeed_spi_timing_calibration()
529 reg_val = flash->ce_ctrl_fread & CE_CTRL_FREQ_MASK; in aspeed_spi_timing_calibration()
530 writel(reg_val, &priv->regs->ce_ctrl[cs]); in aspeed_spi_timing_calibration()
533 return -ENOMEM; in aspeed_spi_timing_calibration()
535 memcpy_fromio(tmp_buf, flash->ahb_base, FLASH_CALIBRATION_LEN); in aspeed_spi_timing_calibration()
537 debug("flash data is monotonous, skip calibration.\n"); in aspeed_spi_timing_calibration()
552 return -ENOMEM; in aspeed_spi_timing_calibration()
556 for (i = 0; i < ARRAY_SIZE(hclk_masks) - 1; i++) { in aspeed_spi_timing_calibration()
557 if (priv->hclk_rate / (i + 2) > max_freq) { in aspeed_spi_timing_calibration()
558 debug("skipping freq %ld\n", priv->hclk_rate / (i + 2)); in aspeed_spi_timing_calibration()
562 max_freq = (u32)priv->hclk_rate / (i + 2); in aspeed_spi_timing_calibration()
570 hclk_masks[3 - i], in aspeed_spi_timing_calibration()
590 writel(final_delay, &priv->regs->timings + cs); in aspeed_spi_timing_calibration()
597 reg_val = readl(&priv->regs->ce_ctrl[cs]); in aspeed_spi_timing_calibration()
599 writel(reg_val, &priv->regs->ce_ctrl[cs]); in aspeed_spi_timing_calibration()
602 flash->ce_ctrl_user = in aspeed_spi_timing_calibration()
603 (flash->ce_ctrl_user & CE_CTRL_FREQ_MASK) | CE_G6_CTRL_CLOCK_FREQ(hclk_div); in aspeed_spi_timing_calibration()
604 flash->ce_ctrl_fread = in aspeed_spi_timing_calibration()
605 (flash->ce_ctrl_fread & CE_CTRL_FREQ_MASK) | CE_G6_CTRL_CLOCK_FREQ(hclk_div); in aspeed_spi_timing_calibration()
607 debug("cs: %d, freq: %dMHz\n", cs, max_freq / 1000000); in aspeed_spi_timing_calibration()
617 timing_reg = readl(&priv->regs->timings); in aspeed_spi_timing_calibration()
625 u32 hdiv = 5 - i; in aspeed_spi_timing_calibration()
626 u32 hshift = (hdiv - 1) << 2; in aspeed_spi_timing_calibration()
630 if (priv->hclk_rate / hdiv > flash->max_freq) { in aspeed_spi_timing_calibration()
631 debug("skipping freq %ld\n", priv->hclk_rate / hdiv); in aspeed_spi_timing_calibration()
669 writel(timing_reg, &priv->regs->timings); in aspeed_spi_timing_calibration()
677 int cs; in aspeed_spi_controller_init() local
683 setbits_le32(&priv->regs->conf, in aspeed_spi_controller_init()
690 if (priv->new_ver) { in aspeed_spi_controller_init()
691 for (cs = 0; cs < priv->flash_count; cs++) { in aspeed_spi_controller_init()
692 struct aspeed_spi_flash *flash = &priv->flashes[cs]; in aspeed_spi_controller_init()
694 switch(cs) { in aspeed_spi_controller_init()
696 flash->ahb_base = priv->ahb_base; in aspeed_spi_controller_init()
697 debug("cs0 mem-map : %x\n", (u32)flash->ahb_base); in aspeed_spi_controller_init()
700 flash->ahb_base = priv->flashes[0].ahb_base + 0x4000000; /* cs0 + 64MB */ in aspeed_spi_controller_init()
701 debug("cs1 mem-map : %x end %x\n", in aspeed_spi_controller_init()
702 (u32)flash->ahb_base, (u32)flash->ahb_base + 0x4000000); in aspeed_spi_controller_init()
705 flash->ahb_base = priv->flashes[0].ahb_base + 0x4000000 * 2; /* cs0 + 128MB : use 64MB */ in aspeed_spi_controller_init()
706 debug("cs2 mem-map : %x end %x\n", in aspeed_spi_controller_init()
707 (u32)flash->ahb_base, (u32)flash->ahb_base + 0x4000000); in aspeed_spi_controller_init()
711 G6_SEGMENT_ADDR_VALUE((u32)flash->ahb_base, (u32)flash->ahb_base + 0x4000000); in aspeed_spi_controller_init()
712 writel(addr_config, &priv->regs->segment_addr[cs]); in aspeed_spi_controller_init()
713 flash->cs = cs; in aspeed_spi_controller_init()
714 flash->ce_ctrl_user = CE_CTRL_USERMODE; in aspeed_spi_controller_init()
715 flash->ce_ctrl_fread = CE_CTRL_READMODE; in aspeed_spi_controller_init()
718 for (cs = 0; cs < priv->flash_count; cs++) { in aspeed_spi_controller_init()
719 struct aspeed_spi_flash *flash = &priv->flashes[cs]; in aspeed_spi_controller_init()
720 u32 seg_addr = readl(&priv->regs->segment_addr[cs]); in aspeed_spi_controller_init()
722 * The start address of the AHB window of CE0 is in aspeed_spi_controller_init()
723 * read-only and is the same as the address of the in aspeed_spi_controller_init()
727 flash->ahb_base = cs ? (void *)SEGMENT_ADDR_START(seg_addr) : in aspeed_spi_controller_init()
728 priv->ahb_base; in aspeed_spi_controller_init()
730 flash->cs = cs; in aspeed_spi_controller_init()
731 flash->ce_ctrl_user = CE_CTRL_USERMODE; in aspeed_spi_controller_init()
732 flash->ce_ctrl_fread = CE_CTRL_READMODE; in aspeed_spi_controller_init()
746 len -= offset; in aspeed_spi_read_from_ahb()
761 len -= offset; in aspeed_spi_write_to_ahb()
771 u32 ctrl_reg = flash->ce_ctrl_user | CE_CTRL_STOP_ACTIVE; in aspeed_spi_start_user()
773 /* Deselect CS and set USER command mode */ in aspeed_spi_start_user()
774 writel(ctrl_reg, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_start_user()
776 /* Select CS */ in aspeed_spi_start_user()
777 clrbits_le32(&priv->regs->ce_ctrl[flash->cs], CE_CTRL_STOP_ACTIVE); in aspeed_spi_start_user()
783 /* Deselect CS first */ in aspeed_spi_stop_user()
784 setbits_le32(&priv->regs->ce_ctrl[flash->cs], CE_CTRL_STOP_ACTIVE); in aspeed_spi_stop_user()
787 writel(flash->ce_ctrl_fread, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_stop_user()
801 if (priv->spi_exec_op_cmd) { in aspeed_spi_read_reg()
802 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_read_reg()
807 aspeed_spi_write_to_ahb(flash->ahb_base, &opcode, 1); in aspeed_spi_read_reg()
808 aspeed_spi_read_from_ahb(flash->ahb_base, read_buf, len); in aspeed_spi_read_reg()
826 if (priv->spi_exec_op_cmd) { in aspeed_spi_write_reg()
838 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_write_reg()
843 aspeed_spi_write_to_ahb(flash->ahb_base, &opcode, 1); in aspeed_spi_write_reg()
844 aspeed_spi_write_to_ahb(flash->ahb_base, write_buf, len); in aspeed_spi_write_reg()
850 /* For ast2600, if 2 chips ABR mode is enabled, in aspeed_spi_write_reg()
852 * the scenario where spi controller is at 4B mode in aspeed_spi_write_reg()
853 * and flash site is at 3B mode after 3rd switch. in aspeed_spi_write_reg()
855 if (priv->new_ver == 1 && (readl(SPI_3B_AUTO_CLR_REG) & SPI_3B_AUTO_CLR)) in aspeed_spi_write_reg()
856 writel(readl(&priv->regs->soft_rst_cmd_ctrl) | SOFT_RST_CMD_EN, in aspeed_spi_write_reg()
857 &priv->regs->soft_rst_cmd_ctrl); in aspeed_spi_write_reg()
859 writel(readl(&priv->regs->ctrl) | (0x11 << flash->cs), &priv->regs->ctrl); in aspeed_spi_write_reg()
862 writel(readl(&priv->regs->ctrl) & ~(0x11 << flash->cs), &priv->regs->ctrl); in aspeed_spi_write_reg()
875 aspeed_spi_write_to_ahb(flash->ahb_base, &cmdbuf[0], 1); in aspeed_spi_send_cmd_addr()
877 if(flash->write_iomode == CE_CTRL_IO_QUAD_ADDR_DATA && (flag & SPI_WRITE_TO_FLASH)) in aspeed_spi_send_cmd_addr()
878 writel(flash->ce_ctrl_user | flash->write_iomode, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_send_cmd_addr()
879 else if(flash->read_iomode == CE_CTRL_IO_QUAD_ADDR_DATA && (flag & SPI_READ_FROM_FLASH)) in aspeed_spi_send_cmd_addr()
880 writel(flash->ce_ctrl_user | flash->read_iomode, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_send_cmd_addr()
884 aspeed_spi_write_to_ahb(flash->ahb_base, &cmdbuf[i], 1); in aspeed_spi_send_cmd_addr()
895 ASPEED_SPI_OP(flash->read_iomode, in aspeed_spi_read_user()
898 ASPEED_SPI_OP_DUMMY(flash->spi->read_dummy / 8), in aspeed_spi_read_user()
901 if (priv->spi_exec_op_cmd) { in aspeed_spi_read_user()
902 op.addr.nbytes = cmdlen - 1 - op.dummy.nbytes; in aspeed_spi_read_user()
904 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_read_user()
912 cmdlen - (flash->spi->read_dummy / 8), SPI_READ_FROM_FLASH); in aspeed_spi_read_user()
914 for (i = 0; i < (flash->spi->read_dummy / 8); i++) in aspeed_spi_read_user()
915 aspeed_spi_write_to_ahb(flash->ahb_base, &dummy, 1); in aspeed_spi_read_user()
917 if (flash->read_iomode) { in aspeed_spi_read_user()
918 clrbits_le32(&priv->regs->ce_ctrl[flash->cs], in aspeed_spi_read_user()
920 setbits_le32(&priv->regs->ce_ctrl[flash->cs], flash->read_iomode); in aspeed_spi_read_user()
923 aspeed_spi_read_from_ahb(flash->ahb_base, read_buf, len); in aspeed_spi_read_user()
937 ASPEED_SPI_OP(flash->read_iomode, in aspeed_spi_read_sfdp()
940 ASPEED_SPI_OP_DUMMY(flash->spi->read_dummy / 8), in aspeed_spi_read_sfdp()
943 if (priv->spi_exec_op_cmd) { in aspeed_spi_read_sfdp()
945 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_read_sfdp()
949 /* only 1-1-1 mode is used to read SFDP */ in aspeed_spi_read_sfdp()
954 cmdlen - (flash->spi->read_dummy / 8), 0); in aspeed_spi_read_sfdp()
956 for (i = 0; i < (flash->spi->read_dummy / 8); i++) in aspeed_spi_read_sfdp()
957 aspeed_spi_write_to_ahb(flash->ahb_base, &dummy, 1); in aspeed_spi_read_sfdp()
959 aspeed_spi_read_from_ahb(flash->ahb_base, read_buf, len); in aspeed_spi_read_sfdp()
971 ASPEED_SPI_OP(flash->write_iomode, in aspeed_spi_write_user()
977 if (priv->spi_exec_op_cmd) { in aspeed_spi_write_user()
978 op.addr.nbytes = cmdlen - 1; in aspeed_spi_write_user()
980 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_write_user()
986 /* cmd buffer = cmd + addr : normally cmd is use signle mode*/ in aspeed_spi_write_user()
990 if(flash->write_iomode == CE_CTRL_IO_QUAD_DATA) in aspeed_spi_write_user()
991 writel(flash->ce_ctrl_user | flash->write_iomode, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_write_user()
993 aspeed_spi_write_to_ahb(flash->ahb_base, write_buf, len); in aspeed_spi_write_user()
1003 u8 addrlen = cmdlen - 1; in aspeed_spi_flash_to_addr()
1007 * U-Boot SPI Flash layer uses 3 bytes addresses, but it might in aspeed_spi_flash_to_addr()
1024 cmdlen - (flash->spi->read_dummy/8)); in aspeed_spi_read()
1026 ASPEED_SPI_OP(flash->read_iomode, in aspeed_spi_read()
1029 ASPEED_SPI_OP_DUMMY(flash->spi->read_dummy / 8), in aspeed_spi_read()
1032 if (priv->spi_exec_op_cmd) { in aspeed_spi_read()
1033 op.addr.nbytes = cmdlen - 1 - op.dummy.nbytes; in aspeed_spi_read()
1035 priv->spi_exec_op_cmd(priv, flash, &op); in aspeed_spi_read()
1041 * - if read SFDP content. in aspeed_spi_read()
1042 * - if the AHB window configured for the device is in aspeed_spi_read()
1044 * - if read offset is smaller than the decoded start address in aspeed_spi_read()
1045 * and the decoded range is not multiple of flash size. in aspeed_spi_read()
1047 if ((offset + len >= flash->ahb_size) || \ in aspeed_spi_read()
1048 (offset < ((int)flash->ahb_base & 0x0FFFFFFF) && \ in aspeed_spi_read()
1049 (((int)flash->ahb_base & 0x0FFFFFFF) % flash->spi->size) != 0)) { in aspeed_spi_read()
1054 memcpy_fromio(read_buf, flash->ahb_base + offset, len); in aspeed_spi_read()
1063 uint32_t cs = flash->cs; in aspeed_spi_exec_op_cmd_mode() local
1073 op->io_mode, op->cmd.opcode, op->addr.val, op->dummy.nbytes, in aspeed_spi_exec_op_cmd_mode()
1074 op->data.nbytes, op->data.dir == ASPEED_SPI_DIR_IN ? "in" : "out"); in aspeed_spi_exec_op_cmd_mode()
1076 addr_mode_reg = readl(&priv->regs->ctrl); in aspeed_spi_exec_op_cmd_mode()
1078 addr_data_mask = readl(&priv->regs->cmd_ctrl); in aspeed_spi_exec_op_cmd_mode()
1080 ctrl_val = flash->ce_ctrl_fread & (~0xf0ff40c7); in aspeed_spi_exec_op_cmd_mode()
1081 ctrl_val |= op->io_mode; in aspeed_spi_exec_op_cmd_mode()
1083 ctrl_val |= op->cmd.opcode << 16; in aspeed_spi_exec_op_cmd_mode()
1086 if (op->addr.nbytes != 0) { in aspeed_spi_exec_op_cmd_mode()
1087 if (op->addr.nbytes == 3) in aspeed_spi_exec_op_cmd_mode()
1088 addr_mode_reg &= ~(0x11 << cs); in aspeed_spi_exec_op_cmd_mode()
1090 addr_mode_reg |= (0x11 << cs); in aspeed_spi_exec_op_cmd_mode()
1093 op_addr = flash->ahb_base + op->addr.val; in aspeed_spi_exec_op_cmd_mode()
1096 op_addr = flash->ahb_base; in aspeed_spi_exec_op_cmd_mode()
1099 if (op->dummy.nbytes != 0) { in aspeed_spi_exec_op_cmd_mode()
1100 ctrl_val |= ((op->dummy.nbytes & 0x3) << 6 | in aspeed_spi_exec_op_cmd_mode()
1101 ((op->dummy.nbytes & 0x4) >> 2) << 14); in aspeed_spi_exec_op_cmd_mode()
1105 if (op->data.nbytes != 0) { in aspeed_spi_exec_op_cmd_mode()
1107 if (op->data.nbytes < 4) in aspeed_spi_exec_op_cmd_mode()
1108 addr_data_mask |= ~((1 << op->data.nbytes) - 1); in aspeed_spi_exec_op_cmd_mode()
1110 data_byte = op->data.nbytes; in aspeed_spi_exec_op_cmd_mode()
1111 if (op->data.dir == ASPEED_SPI_DIR_OUT) { in aspeed_spi_exec_op_cmd_mode()
1113 memset(priv->tmp_buf, 0xff, ((data_byte / 4) + 1) * 4); in aspeed_spi_exec_op_cmd_mode()
1114 memcpy(priv->tmp_buf, op->data.buf.out, data_byte); in aspeed_spi_exec_op_cmd_mode()
1115 data_buf = priv->tmp_buf; in aspeed_spi_exec_op_cmd_mode()
1118 data_buf = op->data.buf.out; in aspeed_spi_exec_op_cmd_mode()
1121 data_buf = op->data.buf.in; in aspeed_spi_exec_op_cmd_mode()
1130 if (op->data.dir == ASPEED_SPI_DIR_OUT) in aspeed_spi_exec_op_cmd_mode()
1136 writel(ctrl_val, &priv->regs->ce_ctrl[cs]); in aspeed_spi_exec_op_cmd_mode()
1137 writel(addr_mode_reg, &priv->regs->ctrl); in aspeed_spi_exec_op_cmd_mode()
1138 writel(addr_data_mask, &priv->regs->cmd_ctrl); in aspeed_spi_exec_op_cmd_mode()
1144 if (op->data.dir == ASPEED_SPI_DIR_OUT) in aspeed_spi_exec_op_cmd_mode()
1150 writel(flash->ce_ctrl_fread, &priv->regs->ce_ctrl[cs]); in aspeed_spi_exec_op_cmd_mode()
1151 writel(addr_mode_reg_backup, &priv->regs->ctrl); in aspeed_spi_exec_op_cmd_mode()
1152 writel(0x0, &priv->regs->cmd_ctrl); in aspeed_spi_exec_op_cmd_mode()
1160 struct udevice *bus = dev->parent; in aspeed_spi_xfer()
1163 u8 *cmd_buf = priv->cmd_buf; in aspeed_spi_xfer()
1170 return -ENXIO; in aspeed_spi_xfer()
1174 priv->cmd_len = bitlen / 8; in aspeed_spi_xfer()
1175 memcpy(cmd_buf, dout, priv->cmd_len); in aspeed_spi_xfer()
1179 /* if start and end bit are set, the data bytes is 0. */ in aspeed_spi_xfer()
1185 debug("CS%u: %s cmd %zu bytes data %zu bytes\n", flash->cs, in aspeed_spi_xfer()
1186 din ? "read" : "write", priv->cmd_len, data_bytes); in aspeed_spi_xfer()
1189 if (priv->cmd_len == 0) { in aspeed_spi_xfer()
1190 pr_err("No command is progress !\n"); in aspeed_spi_xfer()
1191 return -1; in aspeed_spi_xfer()
1195 if (priv->cmd_len == 1) { in aspeed_spi_xfer()
1201 priv->cmd_len, in aspeed_spi_xfer()
1206 iomode = flash->read_iomode; in aspeed_spi_xfer()
1207 flash->read_iomode = 0; in aspeed_spi_xfer()
1209 priv->cmd_len, in aspeed_spi_xfer()
1212 flash->read_iomode = iomode; in aspeed_spi_xfer()
1215 priv->cmd_len, in aspeed_spi_xfer()
1220 if (priv->cmd_len == 1) { in aspeed_spi_xfer()
1226 priv->cmd_len, in aspeed_spi_xfer()
1234 memset(cmd_buf, 0, sizeof(priv->cmd_buf)); in aspeed_spi_xfer()
1235 priv->cmd_len = 0; in aspeed_spi_xfer()
1249 reg_val = readl(&priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1260 reg_val = readl(&priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1265 writel(reg_val, &priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1270 writel(reg_val, &priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1277 reg_val = readl(&priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1281 writel(reg_val, &priv->regs->fully_qualified_cmd[i]); in aspeed_spi_fill_FQCD()
1298 bit_offset = (addr_width - 3) * 8; in aspeed_spi_fill_AQCD()
1301 reg_val = readl(&priv->regs->addr_qualified_cmd[i]); in aspeed_spi_fill_AQCD()
1311 reg_val = readl(&priv->regs->addr_qualified_cmd[i]); in aspeed_spi_fill_AQCD()
1316 writel(reg_val, &priv->regs->addr_qualified_cmd[i]); in aspeed_spi_fill_AQCD()
1324 writel(reg_val, &priv->regs->addr_qualified_cmd[i]); in aspeed_spi_fill_AQCD()
1331 u32 cs, bool enable) in aspeed_spi_cmd_filter_config() argument
1335 reg_val = readl(&priv->regs->write_cmd_filter_ctrl); in aspeed_spi_cmd_filter_config()
1338 reg_val |= BIT(cs); in aspeed_spi_cmd_filter_config()
1340 reg_val &= ~BIT(cs); in aspeed_spi_cmd_filter_config()
1342 writel(reg_val, &priv->regs->write_cmd_filter_ctrl); in aspeed_spi_cmd_filter_config()
1354 addr_ftr_ctrl = readl(&priv->regs->write_addr_filter_ctrl); in aspeed_spi_write_addr_ftr_sanity()
1358 reg_val = readl(&priv->regs->write_addr_filter[i]); in aspeed_spi_write_addr_ftr_sanity()
1363 return -1; in aspeed_spi_write_addr_ftr_sanity()
1365 return -1; in aspeed_spi_write_addr_ftr_sanity()
1393 return -1; in aspeed_add_write_addr_ftr()
1396 addr_ftr_ctrl = readl(&priv->regs->write_addr_filter_ctrl); in aspeed_add_write_addr_ftr()
1400 end = offset + len - 1; in aspeed_add_write_addr_ftr()
1407 writel(reg_val, &priv->regs->write_addr_filter[i]); in aspeed_add_write_addr_ftr()
1409 writel(addr_ftr_ctrl, &priv->regs->write_addr_filter_ctrl); in aspeed_add_write_addr_ftr()
1420 return -1; in aspeed_add_write_addr_ftr()
1438 return -1; in aspeed_remove_write_addr_ftr()
1443 return -1; in aspeed_remove_write_addr_ftr()
1448 return -1; in aspeed_remove_write_addr_ftr()
1451 addr_ftr_ctrl = readl(&priv->regs->write_addr_filter_ctrl); in aspeed_remove_write_addr_ftr()
1457 reg_val = readl(&priv->regs->write_addr_filter[i]); in aspeed_remove_write_addr_ftr()
1465 writel(addr_ftr_ctrl, &priv->regs->write_addr_filter_ctrl); in aspeed_remove_write_addr_ftr()
1466 writel(0x0, &priv->regs->write_addr_filter[i]); in aspeed_remove_write_addr_ftr()
1474 return -1; in aspeed_remove_write_addr_ftr()
1482 struct udevice *bus = dev->parent; in aspeed_spi_mem_wlock()
1492 return -ENXIO; in aspeed_spi_mem_wlock()
1494 nor = flash->spi; in aspeed_spi_mem_wlock()
1497 nor->name, nor->read_opcode, nor->erase_opcode, nor->program_opcode); in aspeed_spi_mem_wlock()
1500 aspeed_spi_fill_FQCD(priv, nor->read_opcode); in aspeed_spi_mem_wlock()
1501 aspeed_spi_fill_AQCD(priv, nor->erase_opcode, nor->addr_width); in aspeed_spi_mem_wlock()
1502 aspeed_spi_fill_AQCD(priv, nor->program_opcode, nor->addr_width); in aspeed_spi_mem_wlock()
1503 aspeed_spi_cmd_filter_config(priv, flash->cs, true); in aspeed_spi_mem_wlock()
1513 return -1; in aspeed_spi_mem_wlock()
1520 struct udevice *bus = dev->parent; in aspeed_spi_mem_wunlock()
1526 return -1; in aspeed_spi_mem_wunlock()
1536 debug("pre_probe slave device on CS%u, max_hz %u, mode 0x%x.\n", in aspeed_spi_child_pre_probe()
1537 slave_plat->cs, slave_plat->max_hz, slave_plat->mode); in aspeed_spi_child_pre_probe()
1540 return -ENXIO; in aspeed_spi_child_pre_probe()
1548 * of its related flash size. Namely, the total decoded size
1553 int cs, j; in aspeed_g6_adjust_decode_sz() local
1556 for (cs = len - 1; cs >= 0; cs--) { in aspeed_g6_adjust_decode_sz()
1558 for (j = 0; j < cs; j++) in aspeed_g6_adjust_decode_sz()
1561 if (sz % decode_sz_arr[cs] != 0) in aspeed_g6_adjust_decode_sz()
1562 decode_sz_arr[0] += (sz % decode_sz_arr[cs]); in aspeed_g6_adjust_decode_sz()
1567 * It is possible to automatically define a contiguous address space
1581 u32 cs; in aspeed_spi_flash_set_segment() local
1586 flash->ahb_size = flash->spi->size; in aspeed_spi_flash_set_segment()
1588 if (priv->new_ver) { in aspeed_spi_flash_set_segment()
1589 for (cs = 0; cs < ASPEED_SPI_MAX_CS; cs++) { in aspeed_spi_flash_set_segment()
1590 reg_val = readl(&priv->regs->segment_addr[cs]); in aspeed_spi_flash_set_segment()
1593 decode_sz_arr[cs] = in aspeed_spi_flash_set_segment()
1594 G6_SEGMENT_ADDR_END(reg_val) - G6_SEGMENT_ADDR_START(reg_val); in aspeed_spi_flash_set_segment()
1596 decode_sz_arr[cs] = 0; in aspeed_spi_flash_set_segment()
1600 decode_sz_arr[flash->cs] = flash->ahb_size; in aspeed_spi_flash_set_segment()
1601 aspeed_g6_adjust_decode_sz(decode_sz_arr, flash->cs + 1); in aspeed_spi_flash_set_segment()
1603 for (cs = 0; cs < ASPEED_SPI_MAX_CS; cs++) in aspeed_spi_flash_set_segment()
1604 total_decode_sz += decode_sz_arr[cs]; in aspeed_spi_flash_set_segment()
1606 if (total_decode_sz > priv->ahb_size) { in aspeed_spi_flash_set_segment()
1607 printf("err: Total decoded size, 0x%x, is too large.\n", total_decode_sz); in aspeed_spi_flash_set_segment()
1608 return -ENOMEM; in aspeed_spi_flash_set_segment()
1611 for (cs = 0; cs < ASPEED_SPI_MAX_CS; cs++) { in aspeed_spi_flash_set_segment()
1612 struct aspeed_spi_flash *flash = &priv->flashes[cs]; in aspeed_spi_flash_set_segment()
1614 flash->ahb_base = (void __iomem *)((u32)priv->ahb_base + cur_offset); in aspeed_spi_flash_set_segment()
1616 if (decode_sz_arr[cs] != 0) { in aspeed_spi_flash_set_segment()
1617 seg_addr = G6_SEGMENT_ADDR_VALUE((u32)flash->ahb_base, in aspeed_spi_flash_set_segment()
1618 (u32)flash->ahb_base + decode_sz_arr[cs]); in aspeed_spi_flash_set_segment()
1623 writel(seg_addr, &priv->regs->segment_addr[cs]); in aspeed_spi_flash_set_segment()
1624 flash->ahb_size = decode_sz_arr[cs]; in aspeed_spi_flash_set_segment()
1625 cur_offset += decode_sz_arr[cs]; in aspeed_spi_flash_set_segment()
1628 seg_addr = SEGMENT_ADDR_VALUE((u32)flash->ahb_base, in aspeed_spi_flash_set_segment()
1629 (u32)flash->ahb_base + flash->ahb_size); in aspeed_spi_flash_set_segment()
1630 writel(seg_addr, &priv->regs->segment_addr[flash->cs]); in aspeed_spi_flash_set_segment()
1643 struct udevice *bus = dev->parent; in aspeed_spi_flash_init()
1646 flash->spi = spi_flash; in aspeed_spi_flash_init()
1653 if (!spi_flash->name) in aspeed_spi_flash_init()
1660 if (flash->init) in aspeed_spi_flash_init()
1663 debug("CS%u: init %s flags:%x size:%d page:%d sector:%d erase:%d", in aspeed_spi_flash_init()
1664 flash->cs, in aspeed_spi_flash_init()
1665 spi_flash->name, spi_flash->flags, spi_flash->size, in aspeed_spi_flash_init()
1666 spi_flash->page_size, spi_flash->sector_size, in aspeed_spi_flash_init()
1667 spi_flash->erase_size); in aspeed_spi_flash_init()
1669 spi_flash->erase_opcode, in aspeed_spi_flash_init()
1670 spi_flash->read_opcode, spi_flash->program_opcode, in aspeed_spi_flash_init()
1671 spi_flash->read_dummy, slave->speed); in aspeed_spi_flash_init()
1673 flash->ce_ctrl_user = CE_CTRL_USERMODE; in aspeed_spi_flash_init()
1674 flash->max_freq = slave->speed; in aspeed_spi_flash_init()
1676 if(priv->new_ver) in aspeed_spi_flash_init()
1677 read_hclk = aspeed_g6_spi_hclk_divisor(priv, slave->speed); in aspeed_spi_flash_init()
1679 read_hclk = aspeed_spi_hclk_divisor(priv, slave->speed); in aspeed_spi_flash_init()
1681 switch(flash->spi->read_opcode) { in aspeed_spi_flash_init()
1684 flash->read_iomode = CE_CTRL_IO_SINGLE; in aspeed_spi_flash_init()
1688 flash->read_iomode = CE_CTRL_IO_DUAL_DATA; in aspeed_spi_flash_init()
1692 flash->read_iomode = CE_CTRL_IO_QUAD_DATA; in aspeed_spi_flash_init()
1696 flash->read_iomode = CE_CTRL_IO_QUAD_ADDR_DATA; in aspeed_spi_flash_init()
1701 switch(flash->spi->program_opcode) { in aspeed_spi_flash_init()
1704 flash->write_iomode = CE_CTRL_IO_SINGLE; in aspeed_spi_flash_init()
1708 flash->write_iomode = CE_CTRL_IO_QUAD_DATA; in aspeed_spi_flash_init()
1712 flash->write_iomode = CE_CTRL_IO_QUAD_ADDR_DATA; in aspeed_spi_flash_init()
1717 if(priv->new_ver) { in aspeed_spi_flash_init()
1718 flash->ce_ctrl_fread = CE_G6_CTRL_CLOCK_FREQ(read_hclk) | in aspeed_spi_flash_init()
1719 flash->read_iomode | in aspeed_spi_flash_init()
1720 CE_CTRL_CMD(flash->spi->read_opcode) | in aspeed_spi_flash_init()
1721 CE_CTRL_DUMMY((flash->spi->read_dummy/8)) | in aspeed_spi_flash_init()
1723 flash->ce_ctrl_user |= CE_G6_CTRL_CLOCK_FREQ(read_hclk); in aspeed_spi_flash_init()
1725 flash->ce_ctrl_fread = CE_CTRL_CLOCK_FREQ(read_hclk) | in aspeed_spi_flash_init()
1726 flash->read_iomode | in aspeed_spi_flash_init()
1727 CE_CTRL_CMD(flash->spi->read_opcode) | in aspeed_spi_flash_init()
1728 CE_CTRL_DUMMY((flash->spi->read_dummy/8)) | in aspeed_spi_flash_init()
1732 if (flash->spi->addr_width == 4) in aspeed_spi_flash_init()
1733 writel(readl(&priv->regs->ctrl) | 0x11 << flash->cs, &priv->regs->ctrl); in aspeed_spi_flash_init()
1735 debug("CS%u: USER mode 0x%08x FREAD mode 0x%08x\n", flash->cs, in aspeed_spi_flash_init()
1736 flash->ce_ctrl_user, flash->ce_ctrl_fread); in aspeed_spi_flash_init()
1739 writel(flash->ce_ctrl_fread, &priv->regs->ce_ctrl[flash->cs]); in aspeed_spi_flash_init()
1750 if (!dev_read_bool(bus, "timing-calibration-disabled")) { in aspeed_spi_flash_init()
1757 flash->init = true; in aspeed_spi_flash_init()
1764 struct udevice *bus = dev->parent; in aspeed_spi_claim_bus()
1771 debug("%s: claim bus CS%u\n", bus->name, slave_plat->cs); in aspeed_spi_claim_bus()
1775 return -ENODEV; in aspeed_spi_claim_bus()
1777 if (priv->new_ver) { in aspeed_spi_claim_bus()
1778 if (dev_read_bool(bus, "timing-calibration-disabled")) { in aspeed_spi_claim_bus()
1779 read_hclk = aspeed_g6_spi_hclk_divisor(priv, slave->speed); in aspeed_spi_claim_bus()
1780 flash->ce_ctrl_user &= CE_CTRL_FREQ_MASK; in aspeed_spi_claim_bus()
1781 flash->ce_ctrl_user |= CE_G6_CTRL_CLOCK_FREQ(read_hclk); in aspeed_spi_claim_bus()
1782 flash->ce_ctrl_fread &= CE_CTRL_FREQ_MASK; in aspeed_spi_claim_bus()
1783 flash->ce_ctrl_fread |= CE_G6_CTRL_CLOCK_FREQ(read_hclk); in aspeed_spi_claim_bus()
1792 struct udevice *bus = dev->parent; in aspeed_spi_release_bus()
1795 debug("%s: release bus CS%u\n", bus->name, slave_plat->cs); in aspeed_spi_release_bus()
1798 return -ENODEV; in aspeed_spi_release_bus()
1805 debug("%s: setting mode to %x\n", bus->name, mode); in aspeed_spi_set_mode()
1809 pr_err("%s invalid QUAD IO mode\n", bus->name); in aspeed_spi_set_mode()
1810 return -EINVAL; in aspeed_spi_set_mode()
1814 /* The CE Control Register is set in claim_bus() */ in aspeed_spi_set_mode()
1820 debug("%s: setting speed to %u\n", bus->name, hz); in aspeed_spi_set_speed()
1822 /* The CE Control Register is set in claim_bus() */ in aspeed_spi_set_speed()
1833 (ofnode_device_is_compatible(node, "spi-flash") || in aspeed_spi_count_flash_devices()
1834 ofnode_device_is_compatible(node, "jedec,spi-nor"))) in aspeed_spi_count_flash_devices()
1843 debug("%s assigned req_seq=%d seq=%d\n", bus->name, bus->req_seq, in aspeed_spi_bind()
1844 bus->seq); in aspeed_spi_bind()
1860 priv->regs = (void __iomem *)res_regs.start; in aspeed_spi_probe()
1866 priv->ahb_base = (void __iomem *)res_ahb.start; in aspeed_spi_probe()
1867 priv->ahb_size = res_ahb.end - res_ahb.start + 1; in aspeed_spi_probe()
1871 pr_err("%s could not get clock: %d\n", bus->name, ret); in aspeed_spi_probe()
1875 priv->hclk_rate = clk_get_rate(&hclk); in aspeed_spi_probe()
1878 priv->num_cs = dev_read_u32_default(bus, "num-cs", ASPEED_SPI_MAX_CS); in aspeed_spi_probe()
1880 priv->flash_count = aspeed_spi_count_flash_devices(bus); in aspeed_spi_probe()
1881 if (priv->flash_count > priv->num_cs) { in aspeed_spi_probe()
1882 pr_err("%s has too many flash devices: %d\n", bus->name, in aspeed_spi_probe()
1883 priv->flash_count); in aspeed_spi_probe()
1884 return -EINVAL; in aspeed_spi_probe()
1887 if (!priv->flash_count) { in aspeed_spi_probe()
1888 pr_err("%s has no flash devices ?!\n", bus->name); in aspeed_spi_probe()
1889 return -ENODEV; in aspeed_spi_probe()
1892 if (device_is_compatible(bus, "aspeed,ast2600-fmc") || in aspeed_spi_probe()
1893 device_is_compatible(bus, "aspeed,ast2600-spi")) { in aspeed_spi_probe()
1894 priv->new_ver = 1; in aspeed_spi_probe()
1897 if (dev_read_bool(bus, "aspeed-spi-command-mode")) { in aspeed_spi_probe()
1899 priv->tmp_buf = memalign(4, 512); in aspeed_spi_probe()
1900 priv->spi_exec_op_cmd = aspeed_spi_exec_op_cmd_mode; in aspeed_spi_probe()
1902 priv->spi_exec_op_cmd = NULL; in aspeed_spi_probe()
1909 priv->is_fmc = dev_get_driver_data(bus); in aspeed_spi_probe()
1916 bus->name, priv->regs, priv->ahb_base, priv->flash_count, bus->seq); in aspeed_spi_probe()
1934 { .compatible = "aspeed,ast2600-fmc", .data = 1 },
1935 { .compatible = "aspeed,ast2600-spi", .data = 0 },
1936 { .compatible = "aspeed,ast2500-fmc", .data = 1 },
1937 { .compatible = "aspeed,ast2500-spi", .data = 0 },
1938 { .compatible = "aspeed,ast2400-fmc", .data = 1 },