diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-09-08 08:41:18 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-09-08 08:41:18 +0200 |
commit | 36db84bb10758e2f160c197d267aad3f03e57045 (patch) | |
tree | 38214383d36659181ea397e6eec232b012d8ca12 /drivers | |
parent | 43c5a7cb5278a1cba7960bda8876c7182cdca9b5 (diff) | |
parent | 8d430633b26678da9f0ba85ef1b530a72d68ae96 (diff) | |
download | barebox-36db84bb10758e2f160c197d267aad3f03e57045.tar.gz barebox-36db84bb10758e2f160c197d267aad3f03e57045.tar.xz |
Merge branch 'for-next/misc'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpio/gpio-generic.c | 13 | ||||
-rw-r--r-- | drivers/of/base.c | 23 | ||||
-rw-r--r-- | drivers/serial/serial_ns16550.c | 19 | ||||
-rw-r--r-- | drivers/usb/gadget/autostart.c | 17 |
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); |