mtk_nor 113 drivers/mtd/spi-nor/mtk-quadspi.c static void mtk_nor_set_read_mode(struct mtk_nor *mtk_nor) mtk_nor 115 drivers/mtd/spi-nor/mtk-quadspi.c struct spi_nor *nor = &mtk_nor->nor; mtk_nor 119 drivers/mtd/spi-nor/mtk-quadspi.c writeb(nor->read_opcode, mtk_nor->base + mtk_nor 121 drivers/mtd/spi-nor/mtk-quadspi.c writeb(MTK_NOR_FAST_READ, mtk_nor->base + mtk_nor 125 drivers/mtd/spi-nor/mtk-quadspi.c writeb(nor->read_opcode, mtk_nor->base + mtk_nor 127 drivers/mtd/spi-nor/mtk-quadspi.c writeb(MTK_NOR_DUAL_READ_EN, mtk_nor->base + mtk_nor 131 drivers/mtd/spi-nor/mtk-quadspi.c writeb(nor->read_opcode, mtk_nor->base + mtk_nor 133 drivers/mtd/spi-nor/mtk-quadspi.c writeb(MTK_NOR_QUAD_READ_EN, mtk_nor->base + mtk_nor 137 drivers/mtd/spi-nor/mtk-quadspi.c writeb(MTK_NOR_DUAL_DISABLE, mtk_nor->base + mtk_nor 143 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_execute_cmd(struct mtk_nor *mtk_nor, u8 cmdval) mtk_nor 148 drivers/mtd/spi-nor/mtk-quadspi.c writeb(cmdval, mtk_nor->base + MTK_NOR_CMD_REG); mtk_nor 149 drivers/mtd/spi-nor/mtk-quadspi.c return readl_poll_timeout(mtk_nor->base + MTK_NOR_CMD_REG, reg, mtk_nor 153 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_do_tx_rx(struct mtk_nor *mtk_nor, u8 op, mtk_nor 162 drivers/mtd/spi-nor/mtk-quadspi.c writeb(len * 8, mtk_nor->base + MTK_NOR_CNT_REG); mtk_nor 168 drivers/mtd/spi-nor/mtk-quadspi.c writeb(op, mtk_nor->base + MTK_NOR_PRG_REG(idx)); mtk_nor 173 drivers/mtd/spi-nor/mtk-quadspi.c writeb(tx[i], mtk_nor->base + MTK_NOR_PRG_REG(idx)); mtk_nor 177 drivers/mtd/spi-nor/mtk-quadspi.c writeb(0, mtk_nor->base + MTK_NOR_PRG_REG(idx)); mtk_nor 181 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PRG_CMD); mtk_nor 190 drivers/mtd/spi-nor/mtk-quadspi.c rx[i] = readb(mtk_nor->base + MTK_NOR_SHREG(idx)); mtk_nor 196 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_wr_sr(struct mtk_nor *mtk_nor, u8 sr) mtk_nor 198 drivers/mtd/spi-nor/mtk-quadspi.c writeb(sr, mtk_nor->base + MTK_NOR_PRGDATA5_REG); mtk_nor 199 drivers/mtd/spi-nor/mtk-quadspi.c writeb(8, mtk_nor->base + MTK_NOR_CNT_REG); mtk_nor 200 drivers/mtd/spi-nor/mtk-quadspi.c return mtk_nor_execute_cmd(mtk_nor, MTK_NOR_WRSR_CMD); mtk_nor 203 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_write_buffer_enable(struct mtk_nor *mtk_nor) mtk_nor 211 drivers/mtd/spi-nor/mtk-quadspi.c writel(MTK_NOR_WR_BUF_ENABLE, mtk_nor->base + MTK_NOR_CFG2_REG); mtk_nor 212 drivers/mtd/spi-nor/mtk-quadspi.c return readb_poll_timeout(mtk_nor->base + MTK_NOR_CFG2_REG, reg, mtk_nor 216 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_write_buffer_disable(struct mtk_nor *mtk_nor) mtk_nor 220 drivers/mtd/spi-nor/mtk-quadspi.c writel(MTK_NOR_WR_BUF_DISABLE, mtk_nor->base + MTK_NOR_CFG2_REG); mtk_nor 221 drivers/mtd/spi-nor/mtk-quadspi.c return readb_poll_timeout(mtk_nor->base + MTK_NOR_CFG2_REG, reg, mtk_nor 226 drivers/mtd/spi-nor/mtk-quadspi.c static void mtk_nor_set_addr_width(struct mtk_nor *mtk_nor) mtk_nor 229 drivers/mtd/spi-nor/mtk-quadspi.c struct spi_nor *nor = &mtk_nor->nor; mtk_nor 231 drivers/mtd/spi-nor/mtk-quadspi.c val = readb(mtk_nor->base + MTK_NOR_DUAL_REG); mtk_nor 241 drivers/mtd/spi-nor/mtk-quadspi.c dev_warn(mtk_nor->dev, "Unexpected address width %u.\n", mtk_nor 246 drivers/mtd/spi-nor/mtk-quadspi.c writeb(val, mtk_nor->base + MTK_NOR_DUAL_REG); mtk_nor 249 drivers/mtd/spi-nor/mtk-quadspi.c static void mtk_nor_set_addr(struct mtk_nor *mtk_nor, u32 addr) mtk_nor 253 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_set_addr_width(mtk_nor); mtk_nor 256 drivers/mtd/spi-nor/mtk-quadspi.c writeb(addr & 0xff, mtk_nor->base + MTK_NOR_RADR0_REG + i * 4); mtk_nor 260 drivers/mtd/spi-nor/mtk-quadspi.c writeb(addr & 0xff, mtk_nor->base + MTK_NOR_RADR3_REG); mtk_nor 269 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = nor->priv; mtk_nor 272 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_set_read_mode(mtk_nor); mtk_nor 273 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_set_addr(mtk_nor, addr); mtk_nor 276 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PIO_READ_CMD); mtk_nor 279 drivers/mtd/spi-nor/mtk-quadspi.c buf[i] = readb(mtk_nor->base + MTK_NOR_RDATA_REG); mtk_nor 284 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_write_single_byte(struct mtk_nor *mtk_nor, mtk_nor 289 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_set_addr(mtk_nor, addr); mtk_nor 292 drivers/mtd/spi-nor/mtk-quadspi.c writeb(*data++, mtk_nor->base + MTK_NOR_WDATA_REG); mtk_nor 293 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_PIO_WR_CMD); mtk_nor 300 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_write_buffer(struct mtk_nor *mtk_nor, int addr, mtk_nor 305 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_set_addr(mtk_nor, addr); mtk_nor 312 drivers/mtd/spi-nor/mtk-quadspi.c writel(data, mtk_nor->base + MTK_NOR_PP_DATA_REG); mtk_nor 314 drivers/mtd/spi-nor/mtk-quadspi.c return mtk_nor_execute_cmd(mtk_nor, MTK_NOR_WR_CMD); mtk_nor 321 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = nor->priv; mtk_nor 324 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_write_buffer_enable(mtk_nor); mtk_nor 326 drivers/mtd/spi-nor/mtk-quadspi.c dev_warn(mtk_nor->dev, "write buffer enable failed!\n"); mtk_nor 331 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_write_buffer(mtk_nor, to, buf); mtk_nor 333 drivers/mtd/spi-nor/mtk-quadspi.c dev_err(mtk_nor->dev, "write buffer failed!\n"); mtk_nor 339 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_write_buffer_disable(mtk_nor); mtk_nor 341 drivers/mtd/spi-nor/mtk-quadspi.c dev_warn(mtk_nor->dev, "write buffer disable failed!\n"); mtk_nor 346 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_write_single_byte(mtk_nor, to, mtk_nor 349 drivers/mtd/spi-nor/mtk-quadspi.c dev_err(mtk_nor->dev, "write single byte failed!\n"); mtk_nor 360 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = nor->priv; mtk_nor 364 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_execute_cmd(mtk_nor, MTK_NOR_RDSR_CMD); mtk_nor 368 drivers/mtd/spi-nor/mtk-quadspi.c *buf = readb(mtk_nor->base + MTK_NOR_RDSR_REG); mtk_nor 370 drivers/mtd/spi-nor/mtk-quadspi.c dev_err(mtk_nor->dev, "len should be 1 for read status!\n"); mtk_nor 373 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_do_tx_rx(mtk_nor, opcode, NULL, 0, buf, len); mtk_nor 383 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = nor->priv; mtk_nor 388 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_wr_sr(mtk_nor, *buf); mtk_nor 391 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_do_tx_rx(mtk_nor, opcode, buf, len, NULL, 0); mtk_nor 393 drivers/mtd/spi-nor/mtk-quadspi.c dev_warn(mtk_nor->dev, "write reg failure!\n"); mtk_nor 399 drivers/mtd/spi-nor/mtk-quadspi.c static void mtk_nor_disable_clk(struct mtk_nor *mtk_nor) mtk_nor 401 drivers/mtd/spi-nor/mtk-quadspi.c clk_disable_unprepare(mtk_nor->spi_clk); mtk_nor 402 drivers/mtd/spi-nor/mtk-quadspi.c clk_disable_unprepare(mtk_nor->nor_clk); mtk_nor 405 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_enable_clk(struct mtk_nor *mtk_nor) mtk_nor 409 drivers/mtd/spi-nor/mtk-quadspi.c ret = clk_prepare_enable(mtk_nor->spi_clk); mtk_nor 413 drivers/mtd/spi-nor/mtk-quadspi.c ret = clk_prepare_enable(mtk_nor->nor_clk); mtk_nor 415 drivers/mtd/spi-nor/mtk-quadspi.c clk_disable_unprepare(mtk_nor->spi_clk); mtk_nor 422 drivers/mtd/spi-nor/mtk-quadspi.c static int mtk_nor_init(struct mtk_nor *mtk_nor, mtk_nor 435 drivers/mtd/spi-nor/mtk-quadspi.c writel(MTK_NOR_ENABLE_SF_CMD, mtk_nor->base + MTK_NOR_WRPROT_REG); mtk_nor 437 drivers/mtd/spi-nor/mtk-quadspi.c nor = &mtk_nor->nor; mtk_nor 438 drivers/mtd/spi-nor/mtk-quadspi.c nor->dev = mtk_nor->dev; mtk_nor 439 drivers/mtd/spi-nor/mtk-quadspi.c nor->priv = mtk_nor; mtk_nor 461 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor; mtk_nor 468 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor = devm_kzalloc(&pdev->dev, sizeof(*mtk_nor), GFP_KERNEL); mtk_nor 469 drivers/mtd/spi-nor/mtk-quadspi.c if (!mtk_nor) mtk_nor 471 drivers/mtd/spi-nor/mtk-quadspi.c platform_set_drvdata(pdev, mtk_nor); mtk_nor 474 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor->base = devm_ioremap_resource(&pdev->dev, res); mtk_nor 475 drivers/mtd/spi-nor/mtk-quadspi.c if (IS_ERR(mtk_nor->base)) mtk_nor 476 drivers/mtd/spi-nor/mtk-quadspi.c return PTR_ERR(mtk_nor->base); mtk_nor 478 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor->spi_clk = devm_clk_get(&pdev->dev, "spi"); mtk_nor 479 drivers/mtd/spi-nor/mtk-quadspi.c if (IS_ERR(mtk_nor->spi_clk)) mtk_nor 480 drivers/mtd/spi-nor/mtk-quadspi.c return PTR_ERR(mtk_nor->spi_clk); mtk_nor 482 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor->nor_clk = devm_clk_get(&pdev->dev, "sf"); mtk_nor 483 drivers/mtd/spi-nor/mtk-quadspi.c if (IS_ERR(mtk_nor->nor_clk)) mtk_nor 484 drivers/mtd/spi-nor/mtk-quadspi.c return PTR_ERR(mtk_nor->nor_clk); mtk_nor 486 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor->dev = &pdev->dev; mtk_nor 488 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_enable_clk(mtk_nor); mtk_nor 499 drivers/mtd/spi-nor/mtk-quadspi.c ret = mtk_nor_init(mtk_nor, flash_np); mtk_nor 503 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_disable_clk(mtk_nor); mtk_nor 510 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = platform_get_drvdata(pdev); mtk_nor 512 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_disable_clk(mtk_nor); mtk_nor 520 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = dev_get_drvdata(dev); mtk_nor 522 drivers/mtd/spi-nor/mtk-quadspi.c mtk_nor_disable_clk(mtk_nor); mtk_nor 529 drivers/mtd/spi-nor/mtk-quadspi.c struct mtk_nor *mtk_nor = dev_get_drvdata(dev); mtk_nor 531 drivers/mtd/spi-nor/mtk-quadspi.c return mtk_nor_enable_clk(mtk_nor);