In the device tree file the higher offsets of the reset controller are not used, so this patch supporting higher bits is not needed. The sunxi architecture switched to the simple reset controller with kernel 4.19 and then this patch does not apply any more. The sunxi target in OpenWrt is very close to mainline, so if the device tree files from the mainline Linux kernel need this the mainline kernel will get support for this. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>master
parent
cfc9bde379
commit
48f81ee1d0
@ -1,26 +0,0 @@ |
|||||||
From fce20ac5d8c98f1a8ea5298051d9fa669e455f04 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hans de Goede <hdegoede@redhat.com>
|
|
||||||
Date: Tue, 4 Aug 2015 23:22:45 +0200
|
|
||||||
Subject: [PATCH] musb: sunxi: Ignore VBus errors in host-only mode
|
|
||||||
|
|
||||||
For some unclear reason sometimes we get VBus errors in host-only mode,
|
|
||||||
even though we do not have any vbus-detection then. Ignore these.
|
|
||||||
|
|
||||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
||||||
---
|
|
||||||
drivers/usb/musb/sunxi.c | 4 ++++
|
|
||||||
1 file changed, 4 insertions(+)
|
|
||||||
|
|
||||||
--- a/drivers/usb/musb/sunxi.c
|
|
||||||
+++ b/drivers/usb/musb/sunxi.c
|
|
||||||
@@ -192,6 +192,10 @@ static irqreturn_t sunxi_musb_interrupt(
|
|
||||||
musb_writeb(musb->mregs, MUSB_FADDR, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Ignore Vbus errors when in host only mode */
|
|
||||||
+ if (musb->port_mode == MUSB_PORT_MODE_HOST)
|
|
||||||
+ musb->int_usb &= ~MUSB_INTR_VBUSERROR;
|
|
||||||
+
|
|
||||||
musb->int_tx = readw(musb->mregs + SUNXI_MUSB_INTRTX);
|
|
||||||
if (musb->int_tx)
|
|
||||||
writew(musb->int_tx, musb->mregs + SUNXI_MUSB_INTRTX);
|
|
@ -1,92 +0,0 @@ |
|||||||
From 5f0bb9d0bc545ef53a83f7bd176fdc0736eed8e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jens Kuske <jenskuske@gmail.com>
|
|
||||||
Date: Tue, 27 Oct 2015 17:50:24 +0100
|
|
||||||
Subject: [PATCH] reset: sunxi: Add Allwinner H3 bus resets
|
|
||||||
|
|
||||||
The H3 bus resets have some holes between the registers, so we add
|
|
||||||
an of_xlate() function to skip them according to the datasheet.
|
|
||||||
|
|
||||||
Signed-off-by: Jens Kuske <jenskuske@gmail.com>
|
|
||||||
---
|
|
||||||
.../bindings/reset/allwinner,sunxi-clock-reset.txt | 1 +
|
|
||||||
drivers/reset/reset-sunxi.c | 30 +++++++++++++++++++---
|
|
||||||
2 files changed, 28 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
--- a/Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt
|
|
||||||
+++ b/Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt
|
|
||||||
@@ -8,6 +8,7 @@ Required properties:
|
|
||||||
- compatible: Should be one of the following:
|
|
||||||
"allwinner,sun6i-a31-ahb1-reset"
|
|
||||||
"allwinner,sun6i-a31-clock-reset"
|
|
||||||
+ "allwinner,sun8i-h3-bus-reset"
|
|
||||||
- reg: should be register base and length as documented in the
|
|
||||||
datasheet
|
|
||||||
- #reset-cells: 1, see below
|
|
||||||
--- a/drivers/reset/reset-sunxi.c
|
|
||||||
+++ b/drivers/reset/reset-sunxi.c
|
|
||||||
@@ -77,7 +77,9 @@ static const struct reset_control_ops su
|
|
||||||
.deassert = sunxi_reset_deassert,
|
|
||||||
};
|
|
||||||
|
|
||||||
-static int sunxi_reset_init(struct device_node *np)
|
|
||||||
+static int sunxi_reset_init(struct device_node *np,
|
|
||||||
+ int (*of_xlate)(struct reset_controller_dev *rcdev,
|
|
||||||
+ const struct of_phandle_args *reset_spec))
|
|
||||||
{
|
|
||||||
struct sunxi_reset_data *data;
|
|
||||||
struct resource res;
|
|
||||||
@@ -110,6 +112,7 @@ static int sunxi_reset_init(struct devic
|
|
||||||
data->rcdev.nr_resets = size * 8;
|
|
||||||
data->rcdev.ops = &sunxi_reset_ops;
|
|
||||||
data->rcdev.of_node = np;
|
|
||||||
+ data->rcdev.of_xlate = of_xlate;
|
|
||||||
|
|
||||||
return reset_controller_register(&data->rcdev);
|
|
||||||
|
|
||||||
@@ -118,6 +121,21 @@ err_alloc:
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
+static int sun8i_h3_bus_reset_xlate(struct reset_controller_dev *rcdev,
|
|
||||||
+ const struct of_phandle_args *reset_spec)
|
|
||||||
+{
|
|
||||||
+ unsigned int index = reset_spec->args[0];
|
|
||||||
+
|
|
||||||
+ if (index < 96)
|
|
||||||
+ return index;
|
|
||||||
+ else if (index < 128)
|
|
||||||
+ return index + 32;
|
|
||||||
+ else if (index < 160)
|
|
||||||
+ return index + 64;
|
|
||||||
+ else
|
|
||||||
+ return -EINVAL;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* These are the reset controller we need to initialize early on in
|
|
||||||
* our system, before we can even think of using a regular device
|
|
||||||
@@ -125,15 +143,21 @@ err_alloc:
|
|
||||||
*/
|
|
||||||
static const struct of_device_id sunxi_early_reset_dt_ids[] __initconst = {
|
|
||||||
{ .compatible = "allwinner,sun6i-a31-ahb1-reset", },
|
|
||||||
+ { .compatible = "allwinner,sun8i-h3-bus-reset", .data = sun8i_h3_bus_reset_xlate, },
|
|
||||||
{ /* sentinel */ },
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init sun6i_reset_init(void)
|
|
||||||
{
|
|
||||||
struct device_node *np;
|
|
||||||
-
|
|
||||||
- for_each_matching_node(np, sunxi_early_reset_dt_ids)
|
|
||||||
- sunxi_reset_init(np);
|
|
||||||
+ const struct of_device_id *match;
|
|
||||||
+ int (*of_xlate)(struct reset_controller_dev *rcdev,
|
|
||||||
+ const struct of_phandle_args *reset_spec);
|
|
||||||
+
|
|
||||||
+ for_each_matching_node_and_match(np, sunxi_early_reset_dt_ids, &match) {
|
|
||||||
+ of_xlate = match->data;
|
|
||||||
+ sunxi_reset_init(np, of_xlate);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
Loading…
Reference in new issue