Merge branch 'master' of https://gitlab.denx.de/u-boot/custodians/u-boot-spi
authorTom Rini <trini@konsulko.com>
Mon, 16 Sep 2019 17:13:12 +0000 (13:13 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 16 Sep 2019 17:13:12 +0000 (13:13 -0400)
- fix mvebu_a3700_spi clock prescale (Marek BehĂșn)
- unmark MXS_SPI, DEPRECATED (Lukasz)
- add spi_write_then_read (Jagan)
- fix SST26* flash ICs (Eugeniy)
- fix soft_spi data abort (Christophe)

19 files changed:
arch/sh/cpu/sh4/config.mk
arch/sh/cpu/u-boot.lds
arch/sh/dts/sh7751-r2dplus.dts
common/usb.c
common/usb_kbd.c
common/usb_storage.c
configs/r2dplus_defconfig
drivers/usb/emul/sandbox_keyb.c
drivers/usb/emul/usb-emul-uclass.c
drivers/usb/host/dwc2.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/sl811-hcd.c
drivers/usb/host/usb-sandbox.c
drivers/usb/host/usb-uclass.c
drivers/usb/host/xhci.c
drivers/usb/musb-new/musb_uboot.c
drivers/usb/musb/musb_hcd.c
include/usb.h

index d62d285e606d309930dea116155e3229a8b520cb..23fec6649293b51acc27c9bf321f443acf2ed4bc 100644 (file)
@@ -6,4 +6,4 @@
 # (C) Copyright 2007
 # Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
 #
-PLATFORM_CPPFLAGS += -m4-nofpu
+PLATFORM_CPPFLAGS += $(call cc-option,-m4-nofpu,-m4)
index 47302da252a9311369d50b4d3df7b8f32edeb9f5..4cc97737f1c97e0ad6811f633460cbf20bfb80a1 100644 (file)
@@ -25,6 +25,7 @@ ENTRY(_start)
 
 SECTIONS
 {
+       . = CONFIG_SYS_TEXT_BASE;
        reloc_dst = .;
 
        PROVIDE (_ftext = .);
index ecaf0772d8fee550eb68b94203761a7e9e6b42db..efaeb33e360f3eb1f43b9189085eb03d4f2d8cc5 100644 (file)
@@ -21,6 +21,7 @@
                #size-cells = <2>;
                #interrupt-cells = <1>;
                ranges = <0x01000000 0 0xfe240000 0 0xfe240000 0 0x00040000
-                         0x02000000 0 0xfd000000 0 0xfd000000 0 0x01000000>;
+                         0x02000000 0 0xfd000000 0 0xfd000000 0 0x01000000
+                         0x42000000 0 0x0c000000 0 0x8c000000 0 0x04000000>;
        };
 };
index b70f614d244f56a2ea2c29b007f45158dc92818c..d9bcb5a57e89f5922aaba1e353a120d82490ef34 100644 (file)
@@ -192,12 +192,15 @@ int usb_disable_asynch(int disable)
  */
 
 /*
- * submits an Interrupt Message
+ * submits an Interrupt Message. Some drivers may implement non-blocking
+ * polling: when non-block is true and the device is not responding return
+ * -EAGAIN instead of waiting for device to respond.
  */
-int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                       void *buffer, int transfer_len, int interval)
+int usb_int_msg(struct usb_device *dev, unsigned long pipe,
+               void *buffer, int transfer_len, int interval, bool nonblock)
 {
-       return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
+       return submit_int_msg(dev, pipe, buffer, transfer_len, interval,
+                             nonblock);
 }
 
 /*
index 387373746147dff2e22b99860b37c6fcc405d2b8..d178af248af0d5ad0b93892f00ec2dc778fbbb63 100644 (file)
@@ -340,10 +340,9 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev)
        struct usb_kbd_pdata *data = dev->privptr;
 
        /* Submit a interrupt transfer request */
-       usb_submit_int_msg(dev, data->intpipe, &data->new[0], data->intpktsize,
-                          data->intinterval);
-
-       usb_kbd_irq_worker(dev);
+       if (usb_int_msg(dev, data->intpipe, &data->new[0],
+                       data->intpktsize, data->intinterval, true) >= 0)
+               usb_kbd_irq_worker(dev);
 #elif defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP) || \
       defined(CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE)
 #if defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP)
@@ -505,8 +504,8 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum)
        if (usb_get_report(dev, iface->desc.bInterfaceNumber,
                           1, 0, data->new, USB_KBD_BOOT_REPORT_SIZE) < 0) {
 #else
-       if (usb_submit_int_msg(dev, data->intpipe, data->new, data->intpktsize,
-                              data->intinterval) < 0) {
+       if (usb_int_msg(dev, data->intpipe, data->new, data->intpktsize,
+                       data->intinterval, false) < 0) {
 #endif
                printf("Failed to get keyboard state from device %04x:%04x\n",
                       dev->descriptor.idVendor, dev->descriptor.idProduct);
index 8c889bb1a64856060196b87daf23e3365c2a0260..54f8e53c63076cec6dc5a5ba27b746c9edec1908 100644 (file)
@@ -650,8 +650,8 @@ static int usb_stor_CBI_get_status(struct scsi_cmd *srb, struct us_data *us)
        int timeout;
 
        us->ip_wanted = 1;
-       submit_int_msg(us->pusb_dev, us->irqpipe,
-                       (void *) &us->ip_data, us->irqmaxp, us->irqinterval);
+       usb_int_msg(us->pusb_dev, us->irqpipe,
+                   (void *)&us->ip_data, us->irqmaxp, us->irqinterval, false);
        timeout = 1000;
        while (timeout--) {
                if (us->ip_wanted == 0)
index b2334affc3e878b17479786fc73a2ea9883a4e5f..e10ac939c5b9354470091efd2dcd72bc3769f69e 100644 (file)
@@ -12,6 +12,7 @@ CONFIG_CMD_DM=y
 CONFIG_CMD_IDE=y
 CONFIG_CMD_PCI=y
 # CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_EXT2=y
index 635945179efcc038965407fd4709202282d9589c..dc43880d27e69bc9882ddd3847303bd4e9544b91 100644 (file)
@@ -178,7 +178,8 @@ static int sandbox_keyb_control(struct udevice *dev, struct usb_device *udev,
 }
 
 static int sandbox_keyb_interrupt(struct udevice *dev, struct usb_device *udev,
-               unsigned long pipe, void *buffer, int length, int interval)
+               unsigned long pipe, void *buffer, int length, int interval,
+               bool nonblock)
 {
        struct sandbox_keyb_priv *priv = dev_get_priv(dev);
        uint8_t *data = buffer;
index 973981545b91a23c71004c45f5744e7e48148bed..50da6bda8e4eda036aae71bdd04727840a6fa49a 100644 (file)
@@ -245,7 +245,8 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
 }
 
 int usb_emul_int(struct udevice *emul, struct usb_device *udev,
-                 unsigned long pipe, void *buffer, int length, int interval)
+                 unsigned long pipe, void *buffer, int length, int interval,
+                 bool nonblock)
 {
        struct dm_usb_ops *ops = usb_get_emul_ops(emul);
 
@@ -253,7 +254,8 @@ int usb_emul_int(struct udevice *emul, struct usb_device *udev,
                return -ENOSYS;
        debug("%s: dev=%s\n", __func__, emul->name);
 
-       return ops->interrupt(emul, udev, pipe, buffer, length, interval);
+       return ops->interrupt(emul, udev, pipe, buffer, length, interval,
+                             nonblock);
 }
 
 int usb_emul_setup_device(struct udevice *dev, struct usb_string *strings,
index a62a2f8a951d1ecd8572db56647dcc4b748491fd..350d820a6e50b914e564ea180eb804628d327164 100644 (file)
@@ -1108,7 +1108,8 @@ static int _submit_control_msg(struct dwc2_priv *priv, struct usb_device *dev,
 }
 
 int _submit_int_msg(struct dwc2_priv *priv, struct usb_device *dev,
-                   unsigned long pipe, void *buffer, int len, int interval)
+                   unsigned long pipe, void *buffer, int len, int interval,
+                   bool nonblock)
 {
        unsigned long timeout;
        int ret;
@@ -1122,7 +1123,7 @@ int _submit_int_msg(struct dwc2_priv *priv, struct usb_device *dev,
                        return -ETIMEDOUT;
                }
                ret = _submit_bulk_msg(priv, dev, pipe, buffer, len);
-               if (ret != -EAGAIN)
+               if ((ret != -EAGAIN) || nonblock)
                        return ret;
        }
 }
@@ -1236,9 +1237,10 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-                  int len, int interval)
+                  int len, int interval, bool nonblock)
 {
-       return _submit_int_msg(&local, dev, pipe, buffer, len, interval);
+       return _submit_int_msg(&local, dev, pipe, buffer, len, interval,
+                              nonblock);
 }
 
 /* U-Boot USB control interface */
@@ -1292,13 +1294,14 @@ static int dwc2_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int dwc2_submit_int_msg(struct udevice *dev, struct usb_device *udev,
                               unsigned long pipe, void *buffer, int length,
-                              int interval)
+                              int interval, bool nonblock)
 {
        struct dwc2_priv *priv = dev_get_priv(dev);
 
        debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
 
-       return _submit_int_msg(priv, udev, pipe, buffer, length, interval);
+       return _submit_int_msg(priv, udev, pipe, buffer, length, interval,
+                              nonblock);
 }
 
 static int dwc2_usb_ofdata_to_platdata(struct udevice *dev)
index 4b28db70a5665f744920280118ad7aa2aff504bb..61a61abb21129ed0a2c6e3d5c70e6ba47231af78 100644 (file)
@@ -1482,7 +1482,8 @@ out:
 }
 
 static int _ehci_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                               void *buffer, int length, int interval)
+                               void *buffer, int length, int interval,
+                               bool nonblock)
 {
        void *backbuffer;
        struct int_queue *queue;
@@ -1532,9 +1533,10 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                  void *buffer, int length, int interval)
+                  void *buffer, int length, int interval, bool nonblock)
 {
-       return _ehci_submit_int_msg(dev, pipe, buffer, length, interval);
+       return _ehci_submit_int_msg(dev, pipe, buffer, length, interval,
+                                   nonblock);
 }
 
 struct int_queue *create_int_queue(struct usb_device *dev,
@@ -1576,10 +1578,11 @@ static int ehci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int ehci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
                               unsigned long pipe, void *buffer, int length,
-                              int interval)
+                              int interval, bool nonblock)
 {
        debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
-       return _ehci_submit_int_msg(udev, pipe, buffer, length, interval);
+       return _ehci_submit_int_msg(udev, pipe, buffer, length, interval,
+                                   nonblock);
 }
 
 static struct int_queue *ehci_create_int_queue(struct udevice *dev,
index 58aa824ec0347685e0b08fac304eb6db6e46cf41..57e92a9c89317b5d100f68f5f4670a97ed932931 100644 (file)
@@ -1703,7 +1703,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-               int transfer_len, int interval)
+               int transfer_len, int interval, bool nonblock)
 {
        info("submit_int_msg");
        return submit_common_msg(&gohci, dev, pipe, buffer, transfer_len, NULL,
@@ -2155,7 +2155,7 @@ static int ohci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int ohci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
                               unsigned long pipe, void *buffer, int length,
-                              int interval)
+                              int interval, bool nonblock)
 {
        ohci_t *ohci = dev_get_priv(usb_get_bus(dev));
 
index daba0dcd1aeea4a885c2537c80c46f0b905cfc2e..e08da6130bd5ca7d53f71c688c4250d41aad79ee 100644 (file)
@@ -384,7 +384,7 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-                  int len, int interval)
+                  int len, int interval, bool nonblock)
 {
        PDEBUG(0, "dev = %p pipe = %#lx buf = %p size = %d int = %d\n", dev, pipe,
               buffer, len, interval);
index ff9d5b7231e82090b09f1e3bc719755eedc961d8..28ee4b093b64820250ae7e72e7997cac9ff04eaf 100644 (file)
@@ -99,7 +99,7 @@ static int sandbox_submit_bulk(struct udevice *bus, struct usb_device *udev,
 
 static int sandbox_submit_int(struct udevice *bus, struct usb_device *udev,
                              unsigned long pipe, void *buffer, int length,
-                             int interval)
+                             int interval, bool nonblock)
 {
        struct udevice *emul;
        int ret;
@@ -110,7 +110,8 @@ static int sandbox_submit_int(struct udevice *bus, struct usb_device *udev,
        usbmon_trace(bus, pipe, NULL, emul);
        if (ret)
                return ret;
-       ret = usb_emul_int(emul, udev, pipe, buffer, length, interval);
+       ret = usb_emul_int(emul, udev, pipe, buffer, length, interval,
+                          nonblock);
 
        return ret;
 }
index 6e118b5a8ffa408fd8b9c7f5595e0ae47b200b58..852165158869f7031c48b76d11281f3e5d519aef 100644 (file)
@@ -31,7 +31,7 @@ int usb_disable_asynch(int disable)
 }
 
 int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
-                  int length, int interval)
+                  int length, int interval, bool nonblock)
 {
        struct udevice *bus = udev->controller_dev;
        struct dm_usb_ops *ops = usb_get_ops(bus);
@@ -39,7 +39,8 @@ int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
        if (!ops->interrupt)
                return -ENOSYS;
 
-       return ops->interrupt(bus, udev, pipe, buffer, length, interval);
+       return ops->interrupt(bus, udev, pipe, buffer, length, interval,
+                             nonblock);
 }
 
 int submit_control_msg(struct usb_device *udev, unsigned long pipe,
index 44c5f2d264c16cd3e8c1ff433fff7f89a21ca467..b3e4dcd66fa1b611ab743fe63a39b1afa8d6f919 100644 (file)
@@ -1109,7 +1109,8 @@ unknown:
  * @return 0
  */
 static int _xhci_submit_int_msg(struct usb_device *udev, unsigned long pipe,
-                               void *buffer, int length, int interval)
+                               void *buffer, int length, int interval,
+                               bool nonblock)
 {
        if (usb_pipetype(pipe) != PIPE_INTERRUPT) {
                printf("non-interrupt pipe (type=%lu)", usb_pipetype(pipe));
@@ -1277,9 +1278,10 @@ int submit_bulk_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
 }
 
 int submit_int_msg(struct usb_device *udev, unsigned long pipe, void *buffer,
-                  int length, int interval)
+                  int length, int interval, bool nonblock)
 {
-       return _xhci_submit_int_msg(udev, pipe, buffer, length, interval);
+       return _xhci_submit_int_msg(udev, pipe, buffer, length, interval,
+                                   nonblock);
 }
 
 /**
@@ -1386,10 +1388,11 @@ static int xhci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int xhci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
                               unsigned long pipe, void *buffer, int length,
-                              int interval)
+                              int interval, bool nonblock)
 {
        debug("%s: dev='%s', udev=%p\n", __func__, dev->name, udev);
-       return _xhci_submit_int_msg(udev, pipe, buffer, length, interval);
+       return _xhci_submit_int_msg(udev, pipe, buffer, length, interval,
+                                   nonblock);
 }
 
 static int xhci_alloc_device(struct udevice *dev, struct usb_device *udev)
index 9c8cc6e584439850310ee126c268346cadcbc613..9eb593402ea0c55c625adc09b052a38805e11995 100644 (file)
@@ -110,7 +110,7 @@ static int _musb_submit_bulk_msg(struct musb_host_data *host,
 
 static int _musb_submit_int_msg(struct musb_host_data *host,
        struct usb_device *dev, unsigned long pipe,
-       void *buffer, int len, int interval)
+       void *buffer, int len, int interval, bool nonblock)
 {
        construct_urb(&host->urb, &host->hep, dev, USB_ENDPOINT_XFER_INT, pipe,
                      buffer, len, NULL, interval);
@@ -268,9 +268,10 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe,
 }
 
 int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                  void *buffer, int length, int interval)
+                  void *buffer, int length, int interval, bool nonblock)
 {
-       return _musb_submit_int_msg(&musb_host, dev, pipe, buffer, length, interval);
+       return _musb_submit_int_msg(&musb_host, dev, pipe, buffer, length,
+                                   interval, nonblock);
 }
 
 struct int_queue *create_int_queue(struct usb_device *dev,
@@ -320,10 +321,11 @@ static int musb_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
 
 static int musb_submit_int_msg(struct udevice *dev, struct usb_device *udev,
                               unsigned long pipe, void *buffer, int length,
-                              int interval)
+                              int interval, bool nonblock)
 {
        struct musb_host_data *host = dev_get_priv(dev);
-       return _musb_submit_int_msg(host, udev, pipe, buffer, length, interval);
+       return _musb_submit_int_msg(host, udev, pipe, buffer, length, interval,
+                                   nonblock);
 }
 
 static struct int_queue *musb_create_int_queue(struct udevice *dev,
index 1f2805270aa3690d6a3b1d9db519e4f0986d19ba..adcd319b6d0b865f57a2201716603cd03d9f1756 100644 (file)
@@ -1049,8 +1049,8 @@ int usb_lowlevel_stop(int index)
  * This function supports usb interrupt transfers. Currently, usb interrupt
  * transfers are not supported.
  */
-int submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                               void *buffer, int len, int interval)
+int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
+                  int len, int interval, bool nonblock)
 {
        int dir_out = usb_pipeout(pipe);
        int ep = usb_pipeendpoint(pipe);
index 420a30e49fa157b259da5794a72b45fecb1d1af2..bcad552f85f033009a3a436c9b0e593501ffa0bd 100644 (file)
@@ -184,7 +184,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
 int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
                        int transfer_len, struct devrequest *setup);
 int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-                       int transfer_len, int interval);
+                       int transfer_len, int interval, bool nonblock);
 
 #if defined CONFIG_USB_EHCI_HCD || defined CONFIG_USB_MUSB_HOST \
        || CONFIG_IS_ENABLED(DM_USB)
@@ -261,8 +261,8 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
                        void *data, unsigned short size, int timeout);
 int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
                        void *data, int len, int *actual_length, int timeout);
-int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
-                       void *buffer, int transfer_len, int interval);
+int usb_int_msg(struct usb_device *dev, unsigned long pipe,
+               void *buffer, int transfer_len, int interval, bool nonblock);
 int usb_disable_asynch(int disable);
 int usb_maxpacket(struct usb_device *dev, unsigned long pipe);
 int usb_get_configuration_no(struct usb_device *dev, int cfgno,
@@ -708,7 +708,7 @@ struct dm_usb_ops {
         */
        int (*interrupt)(struct udevice *bus, struct usb_device *udev,
                         unsigned long pipe, void *buffer, int length,
-                        int interval);
+                        int interval, bool nonblock);
 
        /**
         * create_int_queue() - Create and queue interrupt packets
@@ -1029,7 +1029,8 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
  * @return 0 if OK, -ve on error
  */
 int usb_emul_int(struct udevice *emul, struct usb_device *udev,
-                 unsigned long pipe, void *buffer, int length, int interval);
+                 unsigned long pipe, void *buffer, int length, int interval,
+                 bool nonblock);
 
 /**
  * usb_emul_find() - Find an emulator for a particular device