Lines Matching refs:sadi
120 static int sprd_adi_check_paddr(struct sprd_adi *sadi, u32 paddr) in sprd_adi_check_paddr() argument
122 if (paddr < sadi->slave_pbase || paddr > in sprd_adi_check_paddr()
123 (sadi->slave_pbase + ADI_SLAVE_ADDR_SIZE)) { in sprd_adi_check_paddr()
124 dev_err(sadi->dev, in sprd_adi_check_paddr()
133 static unsigned long sprd_adi_to_vaddr(struct sprd_adi *sadi, u32 paddr) in sprd_adi_to_vaddr() argument
135 return (paddr - sadi->slave_pbase + sadi->slave_vbase); in sprd_adi_to_vaddr()
138 static int sprd_adi_drain_fifo(struct sprd_adi *sadi) in sprd_adi_drain_fifo() argument
144 sts = readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS); in sprd_adi_drain_fifo()
152 dev_err(sadi->dev, "drain write fifo timeout\n"); in sprd_adi_drain_fifo()
159 static int sprd_adi_fifo_is_full(struct sprd_adi *sadi) in sprd_adi_fifo_is_full() argument
161 return readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS) & BIT_FIFO_FULL; in sprd_adi_fifo_is_full()
164 static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) in sprd_adi_read() argument
171 if (sadi->hwlock) { in sprd_adi_read()
172 ret = hwspin_lock_timeout_irqsave(sadi->hwlock, in sprd_adi_read()
176 dev_err(sadi->dev, "get the hw lock failed\n"); in sprd_adi_read()
185 writel_relaxed(reg_paddr, sadi->base + REG_ADI_RD_CMD); in sprd_adi_read()
194 val = readl_relaxed(sadi->base + REG_ADI_RD_DATA); in sprd_adi_read()
202 dev_err(sadi->dev, "ADI read timeout\n"); in sprd_adi_read()
216 dev_err(sadi->dev, "read error, reg addr = 0x%x, val = 0x%x\n", in sprd_adi_read()
225 if (sadi->hwlock) in sprd_adi_read()
226 hwspin_unlock_irqrestore(sadi->hwlock, &flags); in sprd_adi_read()
230 static int sprd_adi_write(struct sprd_adi *sadi, u32 reg_paddr, u32 val) in sprd_adi_write() argument
232 unsigned long reg = sprd_adi_to_vaddr(sadi, reg_paddr); in sprd_adi_write()
237 if (sadi->hwlock) { in sprd_adi_write()
238 ret = hwspin_lock_timeout_irqsave(sadi->hwlock, in sprd_adi_write()
242 dev_err(sadi->dev, "get the hw lock failed\n"); in sprd_adi_write()
247 ret = sprd_adi_drain_fifo(sadi); in sprd_adi_write()
256 if (!sprd_adi_fifo_is_full(sadi)) { in sprd_adi_write()
265 dev_err(sadi->dev, "write fifo is full\n"); in sprd_adi_write()
270 if (sadi->hwlock) in sprd_adi_write()
271 hwspin_unlock_irqrestore(sadi->hwlock, &flags); in sprd_adi_write()
279 struct sprd_adi *sadi = spi_controller_get_devdata(ctlr); in sprd_adi_transfer_one() local
284 phy_reg = *(u32 *)t->rx_buf + sadi->slave_pbase; in sprd_adi_transfer_one()
286 ret = sprd_adi_check_paddr(sadi, phy_reg); in sprd_adi_transfer_one()
290 ret = sprd_adi_read(sadi, phy_reg, &val); in sprd_adi_transfer_one()
303 phy_reg = *p++ + sadi->slave_pbase; in sprd_adi_transfer_one()
304 ret = sprd_adi_check_paddr(sadi, phy_reg); in sprd_adi_transfer_one()
309 ret = sprd_adi_write(sadi, phy_reg, val); in sprd_adi_transfer_one()
313 dev_err(sadi->dev, "no buffer for transfer\n"); in sprd_adi_transfer_one()
320 static void sprd_adi_set_wdt_rst_mode(struct sprd_adi *sadi) in sprd_adi_set_wdt_rst_mode() argument
326 sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val); in sprd_adi_set_wdt_rst_mode()
328 sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val); in sprd_adi_set_wdt_rst_mode()
335 struct sprd_adi *sadi = container_of(this, struct sprd_adi, in sprd_adi_restart_handler() local
369 sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val); in sprd_adi_restart_handler()
372 sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val); in sprd_adi_restart_handler()
375 sprd_adi_read(sadi, sadi->slave_pbase + PMIC_MODULE_EN, &val); in sprd_adi_restart_handler()
377 sprd_adi_write(sadi, sadi->slave_pbase + PMIC_MODULE_EN, val); in sprd_adi_restart_handler()
380 sprd_adi_read(sadi, sadi->slave_pbase + PMIC_CLK_EN, &val); in sprd_adi_restart_handler()
382 sprd_adi_write(sadi, sadi->slave_pbase + PMIC_CLK_EN, val); in sprd_adi_restart_handler()
385 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, WDG_UNLOCK_KEY); in sprd_adi_restart_handler()
387 sprd_adi_read(sadi, sadi->slave_pbase + REG_WDG_CTRL, &val); in sprd_adi_restart_handler()
389 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_CTRL, val); in sprd_adi_restart_handler()
392 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_HIGH, 0); in sprd_adi_restart_handler()
393 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_LOW, in sprd_adi_restart_handler()
397 sprd_adi_read(sadi, sadi->slave_pbase + REG_WDG_CTRL, &val); in sprd_adi_restart_handler()
399 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_CTRL, val); in sprd_adi_restart_handler()
402 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, ~WDG_UNLOCK_KEY); in sprd_adi_restart_handler()
406 dev_emerg(sadi->dev, "Unable to restart system\n"); in sprd_adi_restart_handler()
410 static void sprd_adi_hw_init(struct sprd_adi *sadi) in sprd_adi_hw_init() argument
412 struct device_node *np = sadi->dev->of_node; in sprd_adi_hw_init()
418 writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIL); in sprd_adi_hw_init()
419 writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIH); in sprd_adi_hw_init()
422 tmp = readl_relaxed(sadi->base + REG_ADI_GSSI_CFG0); in sprd_adi_hw_init()
424 writel_relaxed(tmp, sadi->base + REG_ADI_GSSI_CFG0); in sprd_adi_hw_init()
429 dev_info(sadi->dev, "no hw channels setting in node\n"); in sprd_adi_hw_init()
443 writel_relaxed(chn_config, sadi->base + in sprd_adi_hw_init()
447 value = readl_relaxed(sadi->base + REG_ADI_CHN_EN); in sprd_adi_hw_init()
449 writel_relaxed(value, sadi->base + REG_ADI_CHN_EN); in sprd_adi_hw_init()
451 value = readl_relaxed(sadi->base + REG_ADI_CHN_EN1); in sprd_adi_hw_init()
453 writel_relaxed(value, sadi->base + REG_ADI_CHN_EN1); in sprd_adi_hw_init()
462 struct sprd_adi *sadi; in sprd_adi_probe() local
480 sadi = spi_controller_get_devdata(ctlr); in sprd_adi_probe()
483 sadi->base = devm_ioremap_resource(&pdev->dev, res); in sprd_adi_probe()
484 if (IS_ERR(sadi->base)) { in sprd_adi_probe()
485 ret = PTR_ERR(sadi->base); in sprd_adi_probe()
489 sadi->slave_vbase = (unsigned long)sadi->base + ADI_SLAVE_OFFSET; in sprd_adi_probe()
490 sadi->slave_pbase = res->start + ADI_SLAVE_OFFSET; in sprd_adi_probe()
491 sadi->ctlr = ctlr; in sprd_adi_probe()
492 sadi->dev = &pdev->dev; in sprd_adi_probe()
495 sadi->hwlock = in sprd_adi_probe()
497 if (!sadi->hwlock) { in sprd_adi_probe()
512 sprd_adi_hw_init(sadi); in sprd_adi_probe()
513 sprd_adi_set_wdt_rst_mode(sadi); in sprd_adi_probe()
528 sadi->restart_handler.notifier_call = sprd_adi_restart_handler; in sprd_adi_probe()
529 sadi->restart_handler.priority = 128; in sprd_adi_probe()
530 ret = register_restart_handler(&sadi->restart_handler); in sprd_adi_probe()
546 struct sprd_adi *sadi = spi_controller_get_devdata(ctlr); in sprd_adi_remove() local
548 unregister_restart_handler(&sadi->restart_handler); in sprd_adi_remove()