Lines Matching refs:rsb
197 static struct sunxi_rsb_device *sunxi_rsb_device_create(struct sunxi_rsb *rsb, in sunxi_rsb_device_create() argument
207 rdev->rsb = rsb; in sunxi_rsb_device_create()
211 rdev->dev.parent = rsb->dev; in sunxi_rsb_device_create()
266 static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb) in _sunxi_rsb_run_xfer() argument
268 if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) { in _sunxi_rsb_run_xfer()
269 dev_dbg(rsb->dev, "RSB transfer still in progress\n"); in _sunxi_rsb_run_xfer()
273 reinit_completion(&rsb->complete); in _sunxi_rsb_run_xfer()
276 rsb->regs + RSB_INTE); in _sunxi_rsb_run_xfer()
278 rsb->regs + RSB_CTRL); in _sunxi_rsb_run_xfer()
280 if (!wait_for_completion_io_timeout(&rsb->complete, in _sunxi_rsb_run_xfer()
282 dev_dbg(rsb->dev, "RSB timeout\n"); in _sunxi_rsb_run_xfer()
285 writel(RSB_CTRL_ABORT_TRANS, rsb->regs + RSB_CTRL); in _sunxi_rsb_run_xfer()
288 writel(readl(rsb->regs + RSB_INTS), rsb->regs + RSB_INTS); in _sunxi_rsb_run_xfer()
293 if (rsb->status & RSB_INTS_LOAD_BSY) { in _sunxi_rsb_run_xfer()
294 dev_dbg(rsb->dev, "RSB busy\n"); in _sunxi_rsb_run_xfer()
298 if (rsb->status & RSB_INTS_TRANS_ERR) { in _sunxi_rsb_run_xfer()
299 if (rsb->status & RSB_INTS_TRANS_ERR_ACK) { in _sunxi_rsb_run_xfer()
300 dev_dbg(rsb->dev, "RSB slave nack\n"); in _sunxi_rsb_run_xfer()
304 if (rsb->status & RSB_INTS_TRANS_ERR_DATA) { in _sunxi_rsb_run_xfer()
305 dev_dbg(rsb->dev, "RSB transfer data error\n"); in _sunxi_rsb_run_xfer()
313 static int sunxi_rsb_read(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr, in sunxi_rsb_read() argument
333 dev_err(rsb->dev, "Invalid access width: %d\n", len); in sunxi_rsb_read()
337 mutex_lock(&rsb->lock); in sunxi_rsb_read()
339 writel(addr, rsb->regs + RSB_ADDR); in sunxi_rsb_read()
340 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); in sunxi_rsb_read()
341 writel(cmd, rsb->regs + RSB_CMD); in sunxi_rsb_read()
343 ret = _sunxi_rsb_run_xfer(rsb); in sunxi_rsb_read()
347 *buf = readl(rsb->regs + RSB_DATA); in sunxi_rsb_read()
350 mutex_unlock(&rsb->lock); in sunxi_rsb_read()
355 static int sunxi_rsb_write(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr, in sunxi_rsb_write() argument
375 dev_err(rsb->dev, "Invalid access width: %d\n", len); in sunxi_rsb_write()
379 mutex_lock(&rsb->lock); in sunxi_rsb_write()
381 writel(addr, rsb->regs + RSB_ADDR); in sunxi_rsb_write()
382 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR); in sunxi_rsb_write()
383 writel(*buf, rsb->regs + RSB_DATA); in sunxi_rsb_write()
384 writel(cmd, rsb->regs + RSB_CMD); in sunxi_rsb_write()
385 ret = _sunxi_rsb_run_xfer(rsb); in sunxi_rsb_write()
387 mutex_unlock(&rsb->lock); in sunxi_rsb_write()
407 return sunxi_rsb_read(rdev->rsb, rdev->rtaddr, reg, val, ctx->size); in regmap_sunxi_rsb_reg_read()
416 return sunxi_rsb_write(rdev->rsb, rdev->rtaddr, reg, &val, ctx->size); in regmap_sunxi_rsb_reg_write()
476 struct sunxi_rsb *rsb = dev_id; in sunxi_rsb_irq() local
479 status = readl(rsb->regs + RSB_INTS); in sunxi_rsb_irq()
480 rsb->status = status; in sunxi_rsb_irq()
485 writel(status, rsb->regs + RSB_INTS); in sunxi_rsb_irq()
487 complete(&rsb->complete); in sunxi_rsb_irq()
492 static int sunxi_rsb_init_device_mode(struct sunxi_rsb *rsb) in sunxi_rsb_init_device_mode() argument
499 RSB_DMCR_MODE_REG | RSB_DMCR_DEV_ADDR, rsb->regs + RSB_DMCR); in sunxi_rsb_init_device_mode()
501 readl_poll_timeout(rsb->regs + RSB_DMCR, reg, in sunxi_rsb_init_device_mode()
507 writel(readl(rsb->regs + RSB_INTS), rsb->regs + RSB_INTS); in sunxi_rsb_init_device_mode()
546 static int of_rsb_register_devices(struct sunxi_rsb *rsb) in of_rsb_register_devices() argument
548 struct device *dev = rsb->dev; in of_rsb_register_devices()
582 writel(RSB_CMD_STRA, rsb->regs + RSB_CMD); in of_rsb_register_devices()
584 rsb->regs + RSB_DAR); in of_rsb_register_devices()
587 ret = _sunxi_rsb_run_xfer(rsb); in of_rsb_register_devices()
607 rdev = sunxi_rsb_device_create(rsb, child, hwaddr, rtaddr); in of_rsb_register_devices()
627 struct sunxi_rsb *rsb; in sunxi_rsb_probe() local
641 rsb = devm_kzalloc(dev, sizeof(*rsb), GFP_KERNEL); in sunxi_rsb_probe()
642 if (!rsb) in sunxi_rsb_probe()
645 rsb->dev = dev; in sunxi_rsb_probe()
646 platform_set_drvdata(pdev, rsb); in sunxi_rsb_probe()
648 rsb->regs = devm_ioremap_resource(dev, r); in sunxi_rsb_probe()
649 if (IS_ERR(rsb->regs)) in sunxi_rsb_probe()
650 return PTR_ERR(rsb->regs); in sunxi_rsb_probe()
658 rsb->clk = devm_clk_get(dev, NULL); in sunxi_rsb_probe()
659 if (IS_ERR(rsb->clk)) { in sunxi_rsb_probe()
660 ret = PTR_ERR(rsb->clk); in sunxi_rsb_probe()
665 ret = clk_prepare_enable(rsb->clk); in sunxi_rsb_probe()
671 p_clk_freq = clk_get_rate(rsb->clk); in sunxi_rsb_probe()
673 rsb->rstc = devm_reset_control_get(dev, NULL); in sunxi_rsb_probe()
674 if (IS_ERR(rsb->rstc)) { in sunxi_rsb_probe()
675 ret = PTR_ERR(rsb->rstc); in sunxi_rsb_probe()
680 ret = reset_control_deassert(rsb->rstc); in sunxi_rsb_probe()
686 init_completion(&rsb->complete); in sunxi_rsb_probe()
687 mutex_init(&rsb->lock); in sunxi_rsb_probe()
690 writel(RSB_CTRL_SOFT_RST, rsb->regs + RSB_CTRL); in sunxi_rsb_probe()
691 readl_poll_timeout(rsb->regs + RSB_CTRL, reg, in sunxi_rsb_probe()
713 rsb->regs + RSB_CCR); in sunxi_rsb_probe()
715 ret = devm_request_irq(dev, irq, sunxi_rsb_irq, 0, RSB_CTRL_NAME, rsb); in sunxi_rsb_probe()
723 ret = sunxi_rsb_init_device_mode(rsb); in sunxi_rsb_probe()
727 of_rsb_register_devices(rsb); in sunxi_rsb_probe()
732 reset_control_assert(rsb->rstc); in sunxi_rsb_probe()
735 clk_disable_unprepare(rsb->clk); in sunxi_rsb_probe()
742 struct sunxi_rsb *rsb = platform_get_drvdata(pdev); in sunxi_rsb_remove() local
744 device_for_each_child(rsb->dev, NULL, sunxi_rsb_remove_devices); in sunxi_rsb_remove()
745 reset_control_assert(rsb->rstc); in sunxi_rsb_remove()
746 clk_disable_unprepare(rsb->clk); in sunxi_rsb_remove()