summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-09-08 08:41:18 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2017-09-08 08:41:18 +0200
commit36db84bb10758e2f160c197d267aad3f03e57045 (patch)
tree38214383d36659181ea397e6eec232b012d8ca12 /drivers
parent43c5a7cb5278a1cba7960bda8876c7182cdca9b5 (diff)
parent8d430633b26678da9f0ba85ef1b530a72d68ae96 (diff)
downloadbarebox-36db84bb10758e2f160c197d267aad3f03e57045.tar.gz
barebox-36db84bb10758e2f160c197d267aad3f03e57045.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpio/gpio-generic.c13
-rw-r--r--drivers/of/base.c23
-rw-r--r--drivers/serial/serial_ns16550.c19
-rw-r--r--drivers/usb/gadget/autostart.c17
4 files changed, 64 insertions, 8 deletions
diff --git a/drivers/gpio/gpio-generic.c b/drivers/gpio/gpio-generic.c
index c6202fc651..14b451bfff 100644
--- a/drivers/gpio/gpio-generic.c
+++ b/drivers/gpio/gpio-generic.c
@@ -308,7 +308,7 @@ static void __iomem *bgpio_map(struct device_d *dev, const char *name,
resource_size_t sane_sz, int *err)
{
struct resource *r;
- void __iomem *ret;
+ struct resource *ret;
*err = 0;
@@ -327,7 +327,7 @@ static void __iomem *bgpio_map(struct device_d *dev, const char *name,
return NULL;
}
- return ret;
+ return IOMEM(ret->start);
}
static int bgpio_dev_probe(struct device_d *dev)
@@ -410,9 +410,18 @@ static struct platform_device_id bgpio_id_table[] = {
{ }
};
+static struct of_device_id __maybe_unused bgpio_of_match[] = {
+ {
+ .compatible = "wd,mbl-gpio",
+ }, {
+ /* sentinel */
+ }
+};
+
static struct driver_d bgpio_driver = {
.name = "basic-mmio-gpio",
.id_table = bgpio_id_table,
+ .of_compatible = DRV_OF_COMPAT(bgpio_of_match),
.probe = bgpio_dev_probe,
.remove = bgpio_dev_remove,
};
diff --git a/drivers/of/base.c b/drivers/of/base.c
index ea330d1310..95bea4ee83 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -1622,6 +1622,29 @@ int of_device_is_available(const struct device_node *device)
EXPORT_SYMBOL(of_device_is_available);
/**
+ * of_device_is_big_endian - check if a device has BE registers
+ *
+ * @device: Node to check for endianness
+ *
+ * Returns true if the device has a "big-endian" property, or if the kernel
+ * was compiled for BE *and* the device has a "native-endian" property.
+ * Returns false otherwise.
+ *
+ * Callers would nominally use ioread32be/iowrite32be if
+ * of_device_is_big_endian() == true, or readl/writel otherwise.
+ */
+bool of_device_is_big_endian(const struct device_node *device)
+{
+ if (of_property_read_bool(device, "big-endian"))
+ return true;
+ if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) &&
+ of_property_read_bool(device, "native-endian"))
+ return true;
+ return false;
+}
+EXPORT_SYMBOL(of_device_is_big_endian);
+
+/**
* of_get_parent - Get a node's parent if any
* @node: Node to get parent
*
diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c
index a8953cd99d..4d73ea8b87 100644
--- a/drivers/serial/serial_ns16550.c
+++ b/drivers/serial/serial_ns16550.c
@@ -94,6 +94,16 @@ static void ns16550_write_reg_mmio_32(struct ns16550_priv *priv, uint8_t val, un
writel(val, priv->mmiobase + offset);
}
+static uint8_t ns16550_read_reg_mmio_32be(struct ns16550_priv *priv, unsigned offset)
+{
+ return ioread32be(priv->mmiobase + offset);
+}
+
+static void ns16550_write_reg_mmio_32be(struct ns16550_priv *priv, uint8_t val, unsigned offset)
+{
+ iowrite32be(val, priv->mmiobase + offset);
+}
+
static uint8_t ns16550_read_reg_ioport_8(struct ns16550_priv *priv, unsigned offset)
{
return inb(priv->iobase + offset);
@@ -305,8 +315,13 @@ static void ns16550_probe_dt(struct device_d *dev, struct ns16550_priv *priv)
priv->write_reg = ns16550_write_reg_mmio_16;
break;
case 4:
- priv->read_reg = ns16550_read_reg_mmio_32;
- priv->write_reg = ns16550_write_reg_mmio_32;
+ if (of_device_is_big_endian(np)) {
+ priv->read_reg = ns16550_read_reg_mmio_32be;
+ priv->write_reg = ns16550_write_reg_mmio_32be;
+ } else {
+ priv->read_reg = ns16550_read_reg_mmio_32;
+ priv->write_reg = ns16550_write_reg_mmio_32;
+ }
break;
default:
dev_err(dev, "unsupported reg-io-width (%d)\n",
diff --git a/drivers/usb/gadget/autostart.c b/drivers/usb/gadget/autostart.c
index 4ad1dd6be1..465d8fd380 100644
--- a/drivers/usb/gadget/autostart.c
+++ b/drivers/usb/gadget/autostart.c
@@ -31,19 +31,28 @@ static char *fastboot_function;
static int usbgadget_autostart(void)
{
- struct f_multi_opts opts = {};
+ struct f_multi_opts *opts;
+ int ret;
if (!autostart)
return 0;
setenv("otg.mode", "peripheral");
+ opts = xzalloc(sizeof(*opts));
+ opts->release = usb_multi_opts_release;
+
if (fastboot_function)
- opts.fastboot_opts.files = file_list_parse(fastboot_function);
+ opts->fastboot_opts.files = file_list_parse(fastboot_function);
+
+ opts->create_acm = acm;
+
- opts.create_acm = acm;
+ ret = usb_multi_register(opts);
+ if (ret)
+ usb_multi_opts_release(opts);
- return usb_multi_register(&opts);
+ return ret;
}
postenvironment_initcall(usbgadget_autostart);