Commit e7135a28 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'sunxi-fixes-for-6.1-1' of...

Merge tag 'sunxi-fixes-for-6.1-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into arm/fixes

- RSB bus communication fixes
- missing IOMMU reference property to H6 Hantro G2

* tag 'sunxi-fixes-for-6.1-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux:
  arm64: dts: allwinner: h6: Add IOMMU reference to Hantro G2
  media: dt-bindings: allwinner: h6-vpu-g2: Add IOMMU reference property
  bus: sunxi-rsb: Support atomic transfers
  bus: sunxi-rsb: Remove the shutdown callback

Link: https://lore.kernel.org/r/Y3ftpBFk5+fndA4B@jernej-laptopSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 37cd15e6 50edc257
...@@ -36,6 +36,9 @@ properties: ...@@ -36,6 +36,9 @@ properties:
resets: resets:
maxItems: 1 maxItems: 1
iommus:
maxItems: 1
required: required:
- compatible - compatible
- reg - reg
...@@ -43,6 +46,7 @@ required: ...@@ -43,6 +46,7 @@ required:
- clocks - clocks
- clock-names - clock-names
- resets - resets
- iommus
additionalProperties: false additionalProperties: false
...@@ -59,6 +63,7 @@ examples: ...@@ -59,6 +63,7 @@ examples:
clocks = <&ccu CLK_BUS_VP9>, <&ccu CLK_VP9>; clocks = <&ccu CLK_BUS_VP9>, <&ccu CLK_VP9>;
clock-names = "bus", "mod"; clock-names = "bus", "mod";
resets = <&ccu RST_BUS_VP9>; resets = <&ccu RST_BUS_VP9>;
iommus = <&iommu 5>;
}; };
... ...
...@@ -161,6 +161,7 @@ video-codec-g2@1c00000 { ...@@ -161,6 +161,7 @@ video-codec-g2@1c00000 {
clocks = <&ccu CLK_BUS_VP9>, <&ccu CLK_VP9>; clocks = <&ccu CLK_BUS_VP9>, <&ccu CLK_VP9>;
clock-names = "bus", "mod"; clock-names = "bus", "mod";
resets = <&ccu RST_BUS_VP9>; resets = <&ccu RST_BUS_VP9>;
iommus = <&iommu 5>;
}; };
video-codec@1c0e000 { video-codec@1c0e000 {
......
...@@ -267,6 +267,9 @@ EXPORT_SYMBOL_GPL(sunxi_rsb_driver_register); ...@@ -267,6 +267,9 @@ EXPORT_SYMBOL_GPL(sunxi_rsb_driver_register);
/* common code that starts a transfer */ /* common code that starts a transfer */
static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb) static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
{ {
u32 int_mask, status;
bool timeout;
if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) { if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
dev_dbg(rsb->dev, "RSB transfer still in progress\n"); dev_dbg(rsb->dev, "RSB transfer still in progress\n");
return -EBUSY; return -EBUSY;
...@@ -274,13 +277,23 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb) ...@@ -274,13 +277,23 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
reinit_completion(&rsb->complete); reinit_completion(&rsb->complete);
writel(RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER, int_mask = RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER;
rsb->regs + RSB_INTE); writel(int_mask, rsb->regs + RSB_INTE);
writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB, writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB,
rsb->regs + RSB_CTRL); rsb->regs + RSB_CTRL);
if (!wait_for_completion_io_timeout(&rsb->complete, if (irqs_disabled()) {
msecs_to_jiffies(100))) { timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
status, (status & int_mask),
10, 100000);
writel(status, rsb->regs + RSB_INTS);
} else {
timeout = !wait_for_completion_io_timeout(&rsb->complete,
msecs_to_jiffies(100));
status = rsb->status;
}
if (timeout) {
dev_dbg(rsb->dev, "RSB timeout\n"); dev_dbg(rsb->dev, "RSB timeout\n");
/* abort the transfer */ /* abort the transfer */
...@@ -292,18 +305,18 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb) ...@@ -292,18 +305,18 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
if (rsb->status & RSB_INTS_LOAD_BSY) { if (status & RSB_INTS_LOAD_BSY) {
dev_dbg(rsb->dev, "RSB busy\n"); dev_dbg(rsb->dev, "RSB busy\n");
return -EBUSY; return -EBUSY;
} }
if (rsb->status & RSB_INTS_TRANS_ERR) { if (status & RSB_INTS_TRANS_ERR) {
if (rsb->status & RSB_INTS_TRANS_ERR_ACK) { if (status & RSB_INTS_TRANS_ERR_ACK) {
dev_dbg(rsb->dev, "RSB slave nack\n"); dev_dbg(rsb->dev, "RSB slave nack\n");
return -EINVAL; return -EINVAL;
} }
if (rsb->status & RSB_INTS_TRANS_ERR_DATA) { if (status & RSB_INTS_TRANS_ERR_DATA) {
dev_dbg(rsb->dev, "RSB transfer data error\n"); dev_dbg(rsb->dev, "RSB transfer data error\n");
return -EIO; return -EIO;
} }
...@@ -812,14 +825,6 @@ static int sunxi_rsb_remove(struct platform_device *pdev) ...@@ -812,14 +825,6 @@ static int sunxi_rsb_remove(struct platform_device *pdev)
return 0; return 0;
} }
static void sunxi_rsb_shutdown(struct platform_device *pdev)
{
struct sunxi_rsb *rsb = platform_get_drvdata(pdev);
pm_runtime_disable(&pdev->dev);
sunxi_rsb_hw_exit(rsb);
}
static const struct dev_pm_ops sunxi_rsb_dev_pm_ops = { static const struct dev_pm_ops sunxi_rsb_dev_pm_ops = {
SET_RUNTIME_PM_OPS(sunxi_rsb_runtime_suspend, SET_RUNTIME_PM_OPS(sunxi_rsb_runtime_suspend,
sunxi_rsb_runtime_resume, NULL) sunxi_rsb_runtime_resume, NULL)
...@@ -835,7 +840,6 @@ MODULE_DEVICE_TABLE(of, sunxi_rsb_of_match_table); ...@@ -835,7 +840,6 @@ MODULE_DEVICE_TABLE(of, sunxi_rsb_of_match_table);
static struct platform_driver sunxi_rsb_driver = { static struct platform_driver sunxi_rsb_driver = {
.probe = sunxi_rsb_probe, .probe = sunxi_rsb_probe,
.remove = sunxi_rsb_remove, .remove = sunxi_rsb_remove,
.shutdown = sunxi_rsb_shutdown,
.driver = { .driver = {
.name = RSB_CTRL_NAME, .name = RSB_CTRL_NAME,
.of_match_table = sunxi_rsb_of_match_table, .of_match_table = sunxi_rsb_of_match_table,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment