Lines Matching defs:rsb

49 #include <linux/sunxi-rsb.h>
112 #define RSB_CTRL_NAME "sunxi-rsb"
197 * @rsb: RSB controller
202 static struct sunxi_rsb_device *sunxi_rsb_device_create(struct sunxi_rsb *rsb,
212 rdev->rsb = rsb;
216 rdev->dev.parent = rsb->dev;
273 static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
278 if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
279 dev_dbg(rsb->dev, "RSB transfer still in progress\n");
283 reinit_completion(&rsb->complete);
286 writel(int_mask, rsb->regs + RSB_INTE);
288 rsb->regs + RSB_CTRL);
291 timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
294 writel(status, rsb->regs + RSB_INTS);
296 timeout = !wait_for_completion_io_timeout(&rsb->complete,
298 status = rsb->status;
302 dev_dbg(rsb->dev, "RSB timeout\n");
305 writel(RSB_CTRL_ABORT_TRANS, rsb->regs + RSB_CTRL);
308 writel(readl(rsb->regs + RSB_INTS), rsb->regs + RSB_INTS);
314 dev_dbg(rsb->dev, "RSB busy\n");
320 dev_dbg(rsb->dev, "RSB slave nack\n");
325 dev_dbg(rsb->dev, "RSB transfer data error\n");
333 static int sunxi_rsb_read(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr,
353 dev_err(rsb->dev, "Invalid access width: %zd\n", len);
357 ret = pm_runtime_resume_and_get(rsb->dev);
361 mutex_lock(&rsb->lock);
363 writel(addr, rsb->regs + RSB_ADDR);
364 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR);
365 writel(cmd, rsb->regs + RSB_CMD);
367 ret = _sunxi_rsb_run_xfer(rsb);
371 *buf = readl(rsb->regs + RSB_DATA) & GENMASK(len * 8 - 1, 0);
374 mutex_unlock(&rsb->lock);
376 pm_runtime_mark_last_busy(rsb->dev);
377 pm_runtime_put_autosuspend(rsb->dev);
382 static int sunxi_rsb_write(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr,
402 dev_err(rsb->dev, "Invalid access width: %zd\n", len);
406 ret = pm_runtime_resume_and_get(rsb->dev);
410 mutex_lock(&rsb->lock);
412 writel(addr, rsb->regs + RSB_ADDR);
413 writel(RSB_DAR_RTA(rtaddr), rsb->regs + RSB_DAR);
414 writel(*buf, rsb->regs + RSB_DATA);
415 writel(cmd, rsb->regs + RSB_CMD);
416 ret = _sunxi_rsb_run_xfer(rsb);
418 mutex_unlock(&rsb->lock);
420 pm_runtime_mark_last_busy(rsb->dev);
421 pm_runtime_put_autosuspend(rsb->dev);
441 return sunxi_rsb_read(rdev->rsb, rdev->rtaddr, reg, val, ctx->size);
450 return sunxi_rsb_write(rdev->rsb, rdev->rtaddr, reg, &val, ctx->size);
510 struct sunxi_rsb *rsb = dev_id;
513 status = readl(rsb->regs + RSB_INTS);
514 rsb->status = status;
519 writel(status, rsb->regs + RSB_INTS);
521 complete(&rsb->complete);
526 static int sunxi_rsb_init_device_mode(struct sunxi_rsb *rsb)
533 RSB_DMCR_MODE_REG | RSB_DMCR_DEV_ADDR, rsb->regs + RSB_DMCR);
535 readl_poll_timeout(rsb->regs + RSB_DMCR, reg,
541 writel(readl(rsb->regs + RSB_INTS), rsb->regs + RSB_INTS);
580 static int of_rsb_register_devices(struct sunxi_rsb *rsb)
582 struct device *dev = rsb->dev;
616 writel(RSB_CMD_STRA, rsb->regs + RSB_CMD);
618 rsb->regs + RSB_DAR);
621 ret = _sunxi_rsb_run_xfer(rsb);
641 rdev = sunxi_rsb_device_create(rsb, child, hwaddr, rtaddr);
650 static int sunxi_rsb_hw_init(struct sunxi_rsb *rsb)
652 struct device *dev = rsb->dev;
657 ret = clk_prepare_enable(rsb->clk);
663 ret = reset_control_deassert(rsb->rstc);
670 writel(RSB_CTRL_SOFT_RST, rsb->regs + RSB_CTRL);
671 readl_poll_timeout(rsb->regs + RSB_CTRL, reg,
681 p_clk_freq = clk_get_rate(rsb->clk);
682 clk_div = p_clk_freq / rsb->clk_freq / 2;
694 rsb->regs + RSB_CCR);
699 clk_disable_unprepare(rsb->clk);
704 static void sunxi_rsb_hw_exit(struct sunxi_rsb *rsb)
706 reset_control_assert(rsb->rstc);
709 if (!pm_runtime_status_suspended(rsb->dev))
710 clk_disable_unprepare(rsb->clk);
715 struct sunxi_rsb *rsb = dev_get_drvdata(dev);
717 clk_disable_unprepare(rsb->clk);
724 struct sunxi_rsb *rsb = dev_get_drvdata(dev);
726 return clk_prepare_enable(rsb->clk);
731 struct sunxi_rsb *rsb = dev_get_drvdata(dev);
733 sunxi_rsb_hw_exit(rsb);
740 struct sunxi_rsb *rsb = dev_get_drvdata(dev);
742 return sunxi_rsb_hw_init(rsb);
749 struct sunxi_rsb *rsb;
761 rsb = devm_kzalloc(dev, sizeof(*rsb), GFP_KERNEL);
762 if (!rsb)
765 rsb->dev = dev;
766 rsb->clk_freq = clk_freq;
767 platform_set_drvdata(pdev, rsb);
768 rsb->regs = devm_platform_ioremap_resource(pdev, 0);
769 if (IS_ERR(rsb->regs))
770 return PTR_ERR(rsb->regs);
776 rsb->clk = devm_clk_get(dev, NULL);
777 if (IS_ERR(rsb->clk)) {
778 ret = PTR_ERR(rsb->clk);
783 rsb->rstc = devm_reset_control_get(dev, NULL);
784 if (IS_ERR(rsb->rstc)) {
785 ret = PTR_ERR(rsb->rstc);
790 init_completion(&rsb->complete);
791 mutex_init(&rsb->lock);
793 ret = devm_request_irq(dev, irq, sunxi_rsb_irq, 0, RSB_CTRL_NAME, rsb);
800 ret = sunxi_rsb_hw_init(rsb);
805 ret = sunxi_rsb_init_device_mode(rsb);
815 of_rsb_register_devices(rsb);
822 struct sunxi_rsb *rsb = platform_get_drvdata(pdev);
824 device_for_each_child(rsb->dev, NULL, sunxi_rsb_remove_devices);
826 sunxi_rsb_hw_exit(rsb);
836 { .compatible = "allwinner,sun8i-a23-rsb" },