spifi 64 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_wait_for_cmd(struct nxp_spifi *spifi) spifi 69 drivers/mtd/spi-nor/nxp-spifi.c ret = readb_poll_timeout(spifi->io_base + SPIFI_STAT, stat, spifi 72 drivers/mtd/spi-nor/nxp-spifi.c dev_warn(spifi->dev, "command timed out\n"); spifi 77 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_reset(struct nxp_spifi *spifi) spifi 82 drivers/mtd/spi-nor/nxp-spifi.c writel(SPIFI_STAT_RESET, spifi->io_base + SPIFI_STAT); spifi 83 drivers/mtd/spi-nor/nxp-spifi.c ret = readb_poll_timeout(spifi->io_base + SPIFI_STAT, stat, spifi 86 drivers/mtd/spi-nor/nxp-spifi.c dev_warn(spifi->dev, "state reset timed out\n"); spifi 91 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_set_memory_mode_off(struct nxp_spifi *spifi) spifi 95 drivers/mtd/spi-nor/nxp-spifi.c if (!spifi->memory_mode) spifi 98 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_reset(spifi); spifi 100 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "unable to enter command mode\n"); spifi 102 drivers/mtd/spi-nor/nxp-spifi.c spifi->memory_mode = false; spifi 107 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_set_memory_mode_on(struct nxp_spifi *spifi) spifi 112 drivers/mtd/spi-nor/nxp-spifi.c if (spifi->memory_mode) spifi 115 drivers/mtd/spi-nor/nxp-spifi.c writel(spifi->mcmd, spifi->io_base + SPIFI_MCMD); spifi 116 drivers/mtd/spi-nor/nxp-spifi.c ret = readb_poll_timeout(spifi->io_base + SPIFI_STAT, stat, spifi 119 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "unable to enter memory mode\n"); spifi 121 drivers/mtd/spi-nor/nxp-spifi.c spifi->memory_mode = true; spifi 128 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = nor->priv; spifi 132 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_set_memory_mode_off(spifi); spifi 140 drivers/mtd/spi-nor/nxp-spifi.c writel(cmd, spifi->io_base + SPIFI_CMD); spifi 143 drivers/mtd/spi-nor/nxp-spifi.c *buf++ = readb(spifi->io_base + SPIFI_DATA); spifi 145 drivers/mtd/spi-nor/nxp-spifi.c return nxp_spifi_wait_for_cmd(spifi); spifi 150 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = nor->priv; spifi 154 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_set_memory_mode_off(spifi); spifi 163 drivers/mtd/spi-nor/nxp-spifi.c writel(cmd, spifi->io_base + SPIFI_CMD); spifi 166 drivers/mtd/spi-nor/nxp-spifi.c writeb(*buf++, spifi->io_base + SPIFI_DATA); spifi 168 drivers/mtd/spi-nor/nxp-spifi.c return nxp_spifi_wait_for_cmd(spifi); spifi 174 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = nor->priv; spifi 177 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_set_memory_mode_on(spifi); spifi 181 drivers/mtd/spi-nor/nxp-spifi.c memcpy_fromio(buf, spifi->flash_base + from, len); spifi 189 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = nor->priv; spifi 194 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_set_memory_mode_off(spifi); spifi 198 drivers/mtd/spi-nor/nxp-spifi.c writel(to, spifi->io_base + SPIFI_ADDR); spifi 204 drivers/mtd/spi-nor/nxp-spifi.c SPIFI_CMD_FRAMEFORM(spifi->nor.addr_width + 1); spifi 205 drivers/mtd/spi-nor/nxp-spifi.c writel(cmd, spifi->io_base + SPIFI_CMD); spifi 208 drivers/mtd/spi-nor/nxp-spifi.c writeb(buf[i], spifi->io_base + SPIFI_DATA); spifi 210 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_wait_for_cmd(spifi); spifi 219 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = nor->priv; spifi 223 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_set_memory_mode_off(spifi); spifi 227 drivers/mtd/spi-nor/nxp-spifi.c writel(offs, spifi->io_base + SPIFI_ADDR); spifi 231 drivers/mtd/spi-nor/nxp-spifi.c SPIFI_CMD_FRAMEFORM(spifi->nor.addr_width + 1); spifi 232 drivers/mtd/spi-nor/nxp-spifi.c writel(cmd, spifi->io_base + SPIFI_CMD); spifi 234 drivers/mtd/spi-nor/nxp-spifi.c return nxp_spifi_wait_for_cmd(spifi); spifi 237 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_setup_memory_cmd(struct nxp_spifi *spifi) spifi 239 drivers/mtd/spi-nor/nxp-spifi.c switch (spifi->nor.read_proto) { spifi 241 drivers/mtd/spi-nor/nxp-spifi.c spifi->mcmd = SPIFI_CMD_FIELDFORM_ALL_SERIAL; spifi 245 drivers/mtd/spi-nor/nxp-spifi.c spifi->mcmd = SPIFI_CMD_FIELDFORM_QUAD_DUAL_DATA; spifi 248 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "unsupported SPI read mode\n"); spifi 253 drivers/mtd/spi-nor/nxp-spifi.c if (spifi->nor.addr_width < 1 || spifi->nor.addr_width > 4) spifi 256 drivers/mtd/spi-nor/nxp-spifi.c spifi->mcmd |= SPIFI_CMD_OPCODE(spifi->nor.read_opcode) | spifi 257 drivers/mtd/spi-nor/nxp-spifi.c SPIFI_CMD_INTLEN(spifi->nor.read_dummy / 8) | spifi 258 drivers/mtd/spi-nor/nxp-spifi.c SPIFI_CMD_FRAMEFORM(spifi->nor.addr_width + 1); spifi 269 drivers/mtd/spi-nor/nxp-spifi.c static int nxp_spifi_setup_flash(struct nxp_spifi *spifi, spifi 292 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "unsupported rx-bus-width\n"); spifi 326 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "only mode 0 and 3 supported\n"); spifi 330 drivers/mtd/spi-nor/nxp-spifi.c writel(ctrl, spifi->io_base + SPIFI_CTRL); spifi 332 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.dev = spifi->dev; spifi 333 drivers/mtd/spi-nor/nxp-spifi.c spi_nor_set_flash_node(&spifi->nor, np); spifi 334 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.priv = spifi; spifi 335 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.read = nxp_spifi_read; spifi 336 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.write = nxp_spifi_write; spifi 337 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.erase = nxp_spifi_erase; spifi 338 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.read_reg = nxp_spifi_read_reg; spifi 339 drivers/mtd/spi-nor/nxp-spifi.c spifi->nor.write_reg = nxp_spifi_write_reg; spifi 350 drivers/mtd/spi-nor/nxp-spifi.c nxp_spifi_dummy_id_read(&spifi->nor); spifi 352 drivers/mtd/spi-nor/nxp-spifi.c ret = spi_nor_scan(&spifi->nor, NULL, &hwcaps); spifi 354 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "device scan failed\n"); spifi 358 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_setup_memory_cmd(spifi); spifi 360 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "memory command setup failed\n"); spifi 364 drivers/mtd/spi-nor/nxp-spifi.c ret = mtd_device_register(&spifi->nor.mtd, NULL, 0); spifi 366 drivers/mtd/spi-nor/nxp-spifi.c dev_err(spifi->dev, "mtd device parse failed\n"); spifi 376 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi; spifi 380 drivers/mtd/spi-nor/nxp-spifi.c spifi = devm_kzalloc(&pdev->dev, sizeof(*spifi), GFP_KERNEL); spifi 381 drivers/mtd/spi-nor/nxp-spifi.c if (!spifi) spifi 385 drivers/mtd/spi-nor/nxp-spifi.c spifi->io_base = devm_ioremap_resource(&pdev->dev, res); spifi 386 drivers/mtd/spi-nor/nxp-spifi.c if (IS_ERR(spifi->io_base)) spifi 387 drivers/mtd/spi-nor/nxp-spifi.c return PTR_ERR(spifi->io_base); spifi 390 drivers/mtd/spi-nor/nxp-spifi.c spifi->flash_base = devm_ioremap_resource(&pdev->dev, res); spifi 391 drivers/mtd/spi-nor/nxp-spifi.c if (IS_ERR(spifi->flash_base)) spifi 392 drivers/mtd/spi-nor/nxp-spifi.c return PTR_ERR(spifi->flash_base); spifi 394 drivers/mtd/spi-nor/nxp-spifi.c spifi->clk_spifi = devm_clk_get(&pdev->dev, "spifi"); spifi 395 drivers/mtd/spi-nor/nxp-spifi.c if (IS_ERR(spifi->clk_spifi)) { spifi 397 drivers/mtd/spi-nor/nxp-spifi.c return PTR_ERR(spifi->clk_spifi); spifi 400 drivers/mtd/spi-nor/nxp-spifi.c spifi->clk_reg = devm_clk_get(&pdev->dev, "reg"); spifi 401 drivers/mtd/spi-nor/nxp-spifi.c if (IS_ERR(spifi->clk_reg)) { spifi 403 drivers/mtd/spi-nor/nxp-spifi.c return PTR_ERR(spifi->clk_reg); spifi 406 drivers/mtd/spi-nor/nxp-spifi.c ret = clk_prepare_enable(spifi->clk_reg); spifi 412 drivers/mtd/spi-nor/nxp-spifi.c ret = clk_prepare_enable(spifi->clk_spifi); spifi 418 drivers/mtd/spi-nor/nxp-spifi.c spifi->dev = &pdev->dev; spifi 419 drivers/mtd/spi-nor/nxp-spifi.c platform_set_drvdata(pdev, spifi); spifi 422 drivers/mtd/spi-nor/nxp-spifi.c nxp_spifi_reset(spifi); spifi 423 drivers/mtd/spi-nor/nxp-spifi.c writel(0, spifi->io_base + SPIFI_IDATA); spifi 424 drivers/mtd/spi-nor/nxp-spifi.c writel(0, spifi->io_base + SPIFI_MCMD); spifi 425 drivers/mtd/spi-nor/nxp-spifi.c nxp_spifi_reset(spifi); spifi 434 drivers/mtd/spi-nor/nxp-spifi.c ret = nxp_spifi_setup_flash(spifi, flash_np); spifi 444 drivers/mtd/spi-nor/nxp-spifi.c clk_disable_unprepare(spifi->clk_spifi); spifi 446 drivers/mtd/spi-nor/nxp-spifi.c clk_disable_unprepare(spifi->clk_reg); spifi 452 drivers/mtd/spi-nor/nxp-spifi.c struct nxp_spifi *spifi = platform_get_drvdata(pdev); spifi 454 drivers/mtd/spi-nor/nxp-spifi.c mtd_device_unregister(&spifi->nor.mtd); spifi 455 drivers/mtd/spi-nor/nxp-spifi.c clk_disable_unprepare(spifi->clk_spifi); spifi 456 drivers/mtd/spi-nor/nxp-spifi.c clk_disable_unprepare(spifi->clk_reg);