sadi 119 drivers/spi/spi-sprd-adi.c static int sprd_adi_check_paddr(struct sprd_adi *sadi, u32 paddr) sadi 121 drivers/spi/spi-sprd-adi.c if (paddr < sadi->slave_pbase || paddr > sadi 122 drivers/spi/spi-sprd-adi.c (sadi->slave_pbase + ADI_SLAVE_ADDR_SIZE)) { sadi 123 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, sadi 132 drivers/spi/spi-sprd-adi.c static unsigned long sprd_adi_to_vaddr(struct sprd_adi *sadi, u32 paddr) sadi 134 drivers/spi/spi-sprd-adi.c return (paddr - sadi->slave_pbase + sadi->slave_vbase); sadi 137 drivers/spi/spi-sprd-adi.c static int sprd_adi_drain_fifo(struct sprd_adi *sadi) sadi 143 drivers/spi/spi-sprd-adi.c sts = readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS); sadi 151 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "drain write fifo timeout\n"); sadi 158 drivers/spi/spi-sprd-adi.c static int sprd_adi_fifo_is_full(struct sprd_adi *sadi) sadi 160 drivers/spi/spi-sprd-adi.c return readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS) & BIT_FIFO_FULL; sadi 163 drivers/spi/spi-sprd-adi.c static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) sadi 170 drivers/spi/spi-sprd-adi.c if (sadi->hwlock) { sadi 171 drivers/spi/spi-sprd-adi.c ret = hwspin_lock_timeout_irqsave(sadi->hwlock, sadi 175 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "get the hw lock failed\n"); sadi 184 drivers/spi/spi-sprd-adi.c writel_relaxed(reg_paddr, sadi->base + REG_ADI_RD_CMD); sadi 193 drivers/spi/spi-sprd-adi.c val = readl_relaxed(sadi->base + REG_ADI_RD_DATA); sadi 201 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "ADI read timeout\n"); sadi 215 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "read error, reg addr = 0x%x, val = 0x%x\n", sadi 224 drivers/spi/spi-sprd-adi.c if (sadi->hwlock) sadi 225 drivers/spi/spi-sprd-adi.c hwspin_unlock_irqrestore(sadi->hwlock, &flags); sadi 229 drivers/spi/spi-sprd-adi.c static int sprd_adi_write(struct sprd_adi *sadi, u32 reg_paddr, u32 val) sadi 231 drivers/spi/spi-sprd-adi.c unsigned long reg = sprd_adi_to_vaddr(sadi, reg_paddr); sadi 236 drivers/spi/spi-sprd-adi.c if (sadi->hwlock) { sadi 237 drivers/spi/spi-sprd-adi.c ret = hwspin_lock_timeout_irqsave(sadi->hwlock, sadi 241 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "get the hw lock failed\n"); sadi 246 drivers/spi/spi-sprd-adi.c ret = sprd_adi_drain_fifo(sadi); sadi 255 drivers/spi/spi-sprd-adi.c if (!sprd_adi_fifo_is_full(sadi)) { sadi 264 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "write fifo is full\n"); sadi 269 drivers/spi/spi-sprd-adi.c if (sadi->hwlock) sadi 270 drivers/spi/spi-sprd-adi.c hwspin_unlock_irqrestore(sadi->hwlock, &flags); sadi 278 drivers/spi/spi-sprd-adi.c struct sprd_adi *sadi = spi_controller_get_devdata(ctlr); sadi 283 drivers/spi/spi-sprd-adi.c phy_reg = *(u32 *)t->rx_buf + sadi->slave_pbase; sadi 285 drivers/spi/spi-sprd-adi.c ret = sprd_adi_check_paddr(sadi, phy_reg); sadi 289 drivers/spi/spi-sprd-adi.c ret = sprd_adi_read(sadi, phy_reg, &val); sadi 302 drivers/spi/spi-sprd-adi.c phy_reg = *p++ + sadi->slave_pbase; sadi 303 drivers/spi/spi-sprd-adi.c ret = sprd_adi_check_paddr(sadi, phy_reg); sadi 308 drivers/spi/spi-sprd-adi.c ret = sprd_adi_write(sadi, phy_reg, val); sadi 312 drivers/spi/spi-sprd-adi.c dev_err(sadi->dev, "no buffer for transfer\n"); sadi 319 drivers/spi/spi-sprd-adi.c static void sprd_adi_set_wdt_rst_mode(struct sprd_adi *sadi) sadi 325 drivers/spi/spi-sprd-adi.c sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val); sadi 327 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val); sadi 334 drivers/spi/spi-sprd-adi.c struct sprd_adi *sadi = container_of(this, struct sprd_adi, sadi 368 drivers/spi/spi-sprd-adi.c sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val); sadi 371 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val); sadi 374 drivers/spi/spi-sprd-adi.c sprd_adi_read(sadi, sadi->slave_pbase + PMIC_MODULE_EN, &val); sadi 376 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + PMIC_MODULE_EN, val); sadi 379 drivers/spi/spi-sprd-adi.c sprd_adi_read(sadi, sadi->slave_pbase + PMIC_CLK_EN, &val); sadi 381 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + PMIC_CLK_EN, val); sadi 384 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, WDG_UNLOCK_KEY); sadi 387 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_LOW, sadi 389 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_HIGH, 0); sadi 392 drivers/spi/spi-sprd-adi.c sprd_adi_read(sadi, sadi->slave_pbase + REG_WDG_CTRL, &val); sadi 394 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_CTRL, val); sadi 397 drivers/spi/spi-sprd-adi.c sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, ~WDG_UNLOCK_KEY); sadi 401 drivers/spi/spi-sprd-adi.c dev_emerg(sadi->dev, "Unable to restart system\n"); sadi 405 drivers/spi/spi-sprd-adi.c static void sprd_adi_hw_init(struct sprd_adi *sadi) sadi 407 drivers/spi/spi-sprd-adi.c struct device_node *np = sadi->dev->of_node; sadi 413 drivers/spi/spi-sprd-adi.c writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIL); sadi 414 drivers/spi/spi-sprd-adi.c writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIH); sadi 417 drivers/spi/spi-sprd-adi.c tmp = readl_relaxed(sadi->base + REG_ADI_GSSI_CFG0); sadi 419 drivers/spi/spi-sprd-adi.c writel_relaxed(tmp, sadi->base + REG_ADI_GSSI_CFG0); sadi 424 drivers/spi/spi-sprd-adi.c dev_info(sadi->dev, "no hw channels setting in node\n"); sadi 438 drivers/spi/spi-sprd-adi.c writel_relaxed(chn_config, sadi->base + sadi 442 drivers/spi/spi-sprd-adi.c value = readl_relaxed(sadi->base + REG_ADI_CHN_EN); sadi 444 drivers/spi/spi-sprd-adi.c writel_relaxed(value, sadi->base + REG_ADI_CHN_EN); sadi 446 drivers/spi/spi-sprd-adi.c value = readl_relaxed(sadi->base + REG_ADI_CHN_EN1); sadi 448 drivers/spi/spi-sprd-adi.c writel_relaxed(value, sadi->base + REG_ADI_CHN_EN1); sadi 457 drivers/spi/spi-sprd-adi.c struct sprd_adi *sadi; sadi 475 drivers/spi/spi-sprd-adi.c sadi = spi_controller_get_devdata(ctlr); sadi 478 drivers/spi/spi-sprd-adi.c sadi->base = devm_ioremap_resource(&pdev->dev, res); sadi 479 drivers/spi/spi-sprd-adi.c if (IS_ERR(sadi->base)) { sadi 480 drivers/spi/spi-sprd-adi.c ret = PTR_ERR(sadi->base); sadi 484 drivers/spi/spi-sprd-adi.c sadi->slave_vbase = (unsigned long)sadi->base + ADI_SLAVE_OFFSET; sadi 485 drivers/spi/spi-sprd-adi.c sadi->slave_pbase = res->start + ADI_SLAVE_OFFSET; sadi 486 drivers/spi/spi-sprd-adi.c sadi->ctlr = ctlr; sadi 487 drivers/spi/spi-sprd-adi.c sadi->dev = &pdev->dev; sadi 490 drivers/spi/spi-sprd-adi.c sadi->hwlock = sadi 492 drivers/spi/spi-sprd-adi.c if (!sadi->hwlock) { sadi 510 drivers/spi/spi-sprd-adi.c sprd_adi_hw_init(sadi); sadi 511 drivers/spi/spi-sprd-adi.c sprd_adi_set_wdt_rst_mode(sadi); sadi 526 drivers/spi/spi-sprd-adi.c sadi->restart_handler.notifier_call = sprd_adi_restart_handler; sadi 527 drivers/spi/spi-sprd-adi.c sadi->restart_handler.priority = 128; sadi 528 drivers/spi/spi-sprd-adi.c ret = register_restart_handler(&sadi->restart_handler); sadi 544 drivers/spi/spi-sprd-adi.c struct sprd_adi *sadi = spi_controller_get_devdata(ctlr); sadi 546 drivers/spi/spi-sprd-adi.c unregister_restart_handler(&sadi->restart_handler);