Lines Matching defs:fiu

66 static void wpcm_fiu_set_opcode(struct wpcm_fiu_spi *fiu, u8 opcode)
68 writeb(opcode, fiu->regs + FIU_UMA_CODE);
71 static void wpcm_fiu_set_addr(struct wpcm_fiu_spi *fiu, u32 addr)
73 writeb((addr >> 0) & 0xff, fiu->regs + FIU_UMA_AB0);
74 writeb((addr >> 8) & 0xff, fiu->regs + FIU_UMA_AB1);
75 writeb((addr >> 16) & 0xff, fiu->regs + FIU_UMA_AB2);
78 static void wpcm_fiu_set_data(struct wpcm_fiu_spi *fiu, const u8 *data, unsigned int nbytes)
83 writeb(data[i], fiu->regs + FIU_UMA_DB0 + i);
86 static void wpcm_fiu_get_data(struct wpcm_fiu_spi *fiu, u8 *data, unsigned int nbytes)
91 data[i] = readb(fiu->regs + FIU_UMA_DB0 + i);
97 static int wpcm_fiu_do_uma(struct wpcm_fiu_spi *fiu, unsigned int cs,
109 writeb(cts, fiu->regs + FIU_UMA_CTS);
112 if (!(readb(fiu->regs + FIU_UMA_CTS) & FIU_UMA_CTS_EXEC_DONE))
115 dev_info(fiu->dev, "UMA transfer has not finished in %d iterations\n", UMA_WAIT_ITERATIONS);
119 static void wpcm_fiu_ects_assert(struct wpcm_fiu_spi *fiu, unsigned int cs)
121 u8 ects = readb(fiu->regs + FIU_UMA_ECTS);
124 writeb(ects, fiu->regs + FIU_UMA_ECTS);
127 static void wpcm_fiu_ects_deassert(struct wpcm_fiu_spi *fiu, unsigned int cs)
129 u8 ects = readb(fiu->regs + FIU_UMA_ECTS);
132 writeb(ects, fiu->regs + FIU_UMA_ECTS);
152 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(mem->spi->controller);
155 wpcm_fiu_set_opcode(fiu, op->cmd.opcode);
156 wpcm_fiu_set_addr(fiu, op->addr.val);
158 wpcm_fiu_set_data(fiu, op->data.buf.out, op->data.nbytes);
160 ret = wpcm_fiu_do_uma(fiu, spi_get_chipselect(mem->spi, 0), op->addr.nbytes == 3,
164 wpcm_fiu_get_data(fiu, op->data.buf.in, op->data.nbytes);
197 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(mem->spi->controller);
200 wpcm_fiu_ects_assert(fiu, cs);
202 wpcm_fiu_set_opcode(fiu, op->cmd.opcode);
203 wpcm_fiu_set_addr(fiu, op->addr.val >> 8);
204 wpcm_fiu_do_uma(fiu, cs, true, false, 0);
206 wpcm_fiu_set_opcode(fiu, op->addr.val & 0xff);
207 wpcm_fiu_set_addr(fiu, 0);
209 wpcm_fiu_set_data(fiu, op->data.buf.out, op->data.nbytes);
210 wpcm_fiu_do_uma(fiu, cs, false, op->data.dir == SPI_MEM_DATA_OUT, op->data.nbytes);
212 wpcm_fiu_ects_deassert(fiu, cs);
215 wpcm_fiu_get_data(fiu, op->data.buf.in, op->data.nbytes);
242 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(mem->spi->controller);
246 wpcm_fiu_set_opcode(fiu, op->cmd.opcode);
247 wpcm_fiu_set_addr(fiu, 0);
248 wpcm_fiu_do_uma(fiu, cs, false, false, 3);
249 wpcm_fiu_get_data(fiu, op->data.buf.in, 3);
252 wpcm_fiu_set_opcode(fiu, op->cmd.opcode);
253 wpcm_fiu_set_addr(fiu, 0);
254 wpcm_fiu_do_uma(fiu, cs, true, false, 3);
255 wpcm_fiu_get_data(fiu, op->data.buf.in + 3, 3);
279 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(mem->spi->controller);
282 wpcm_fiu_ects_assert(fiu, cs);
285 wpcm_fiu_set_opcode(fiu, op->cmd.opcode);
286 wpcm_fiu_set_addr(fiu, op->addr.val);
287 wpcm_fiu_do_uma(fiu, cs, op->addr.nbytes != 0, true, op->dummy.nbytes - 1);
290 wpcm_fiu_set_opcode(fiu, 0);
291 wpcm_fiu_set_addr(fiu, 0);
292 wpcm_fiu_do_uma(fiu, cs, false, false, op->data.nbytes);
293 wpcm_fiu_get_data(fiu, op->data.buf.in, op->data.nbytes);
295 wpcm_fiu_ects_deassert(fiu, cs);
341 static void wpcm_fiu_stall_host(struct wpcm_fiu_spi *fiu, bool stall)
343 if (fiu->shm_regmap) {
344 int res = regmap_update_bits(fiu->shm_regmap, SHM_FLASH_SIZE,
348 dev_warn(fiu->dev, "Failed to (un)stall host memory accesses: %d\n", res);
354 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(mem->spi->controller);
357 wpcm_fiu_stall_host(fiu, true);
362 wpcm_fiu_stall_host(fiu, false);
377 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(desc->mem->spi->controller);
393 if (cs * MAX_MEMORY_SIZE_PER_CS + desc->info.offset + desc->info.length > fiu->memory_size)
401 struct wpcm_fiu_spi *fiu = spi_controller_get_devdata(desc->mem->spi->controller);
409 if (!fiu->memory || offs >= fiu->memory_size)
412 len = min_t(size_t, len, fiu->memory_size - offs);
413 memcpy_fromio(buf, fiu->memory + offs, len);
426 static void wpcm_fiu_hw_init(struct wpcm_fiu_spi *fiu)
429 writeb(FIU_BURST_CFG_R16, fiu->regs + FIU_BURST_BFG);
430 writeb(MAX_MEMORY_SIZE_TOTAL / (512 << 10), fiu->regs + FIU_CFG);
431 writeb(MAX_MEMORY_SIZE_PER_CS / (512 << 10) | BIT(6), fiu->regs + FIU_SPI_FL_CFG);
434 writeb(0x0f, fiu->regs + FIU_UMA_ECTS);
441 struct wpcm_fiu_spi *fiu;
444 ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
448 fiu = spi_controller_get_devdata(ctrl);
449 fiu->dev = dev;
452 fiu->regs = devm_ioremap_resource(dev, res);
453 if (IS_ERR(fiu->regs)) {
455 return PTR_ERR(fiu->regs);
458 fiu->clk = devm_clk_get_enabled(dev, NULL);
459 if (IS_ERR(fiu->clk))
460 return PTR_ERR(fiu->clk);
463 fiu->memory = devm_ioremap_resource(dev, res);
464 fiu->memory_size = min_t(size_t, resource_size(res), MAX_MEMORY_SIZE_TOTAL);
465 if (IS_ERR(fiu->memory)) {
467 return PTR_ERR(fiu->memory);
470 fiu->shm_regmap = syscon_regmap_lookup_by_phandle_optional(dev->of_node, "nuvoton,shm");
472 wpcm_fiu_hw_init(fiu);
483 ctrl->min_speed_hz = clk_get_rate(fiu->clk);
484 ctrl->max_speed_hz = clk_get_rate(fiu->clk);
490 { .compatible = "nuvoton,wpcm450-fiu", },
497 .name = "wpcm450-fiu",