aboutsummaryrefslogtreecommitdiffstats
diff options
-rw-r--r--series24
-rw-r--r--tty/8250-allow-platforms-to-override-pm-hook.patch115
-rw-r--r--tty/alchemy-add-uart-pm-methods.patch128
-rw-r--r--tty/altera_uart-add-support-for-different-address-strides.patch223
-rw-r--r--tty/altera_uart-add-support-for-getting-mapbase-and-irq-from-resources.patch111
-rw-r--r--tty/altera_uart-add-support-for-polling-mode-irq-less.patch92
-rw-r--r--tty/altera_uart-don-t-use-plain-integer-as-null-pointer.patch33
-rw-r--r--tty/altera_uart-fix-missing-prototype-for-registering-an-early-console.patch42
-rw-r--r--tty/altera_uart-fixup-type-usage-of-port-flags.patch46
-rw-r--r--tty/altera_uart-make-it-possible-to-use-altera-uart-and-8250-ports-together.patch63
-rw-r--r--tty/serial-8250-don-t-delay-after-transmitter-is-ready.patch42
-rw-r--r--tty/serial-factor-out-uart_poll_timeout-from-8250-driver.patch91
-rw-r--r--tty/serial-mark-the-8250-driver-as-maintained.patch29
-rw-r--r--tty/tty-maintainers-add-drivers-serial-jsm-as-maintained-driver.patch35
-rw-r--r--usb/scsi-sd-add-a-no_read_capacity_16-scsi_device-flag.patch85
-rw-r--r--usb/scsi-sr-add-no_read_disc_info-scsi_device-flag.patch72
-rw-r--r--usb/usb-add-uas-driver.patch2
-rw-r--r--usb/usb-do-not-print-eshutdown-message-if-usb-at-otg-device-mode.patch36
-rw-r--r--usb/usb-gadget-goku_udc-fix-error-path.patch117
-rw-r--r--usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch2
-rw-r--r--usb/usb-musb-gadget-kill-duplicate-code-in-musb_gadget_queue.patch34
-rw-r--r--usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch4
-rw-r--r--usb/usb-musb-gadget-only-enable-autoclear-in-double-buffered-case.patch2
-rw-r--r--usb/usb-musb-gadget-unmapping-the-dma-buffer-when-switching-to-pio-mode.patch190
-rw-r--r--usb/usb-storage-add-new-no_read_capacity_16-quirk.patch67
-rw-r--r--usb/usb-storage-add-new-no_read_disc_info-quirk.patch71
-rw-r--r--usb/usb-usbtest-support-gadget-zero-isochronous-configurations.patch31
27 files changed, 1556 insertions, 231 deletions
diff --git a/series b/series
index 66d8e67342f7df..8c2ae43fb21c4f 100644
--- a/series
+++ b/series
@@ -95,6 +95,19 @@ tty/tty-fix-warning-left-over-from-tiocgicount-changes.patch
tty/tty-add-a-new-file-proc-tty-consoles.patch
tty/vcs-add-poll-fasync-support.patch
tty/vcs-invoke-the-vt-update-callback-when-dev-vcs-is-written-to.patch
+tty/tty-maintainers-add-drivers-serial-jsm-as-maintained-driver.patch
+tty/serial-8250-don-t-delay-after-transmitter-is-ready.patch
+tty/serial-mark-the-8250-driver-as-maintained.patch
+tty/serial-factor-out-uart_poll_timeout-from-8250-driver.patch
+tty/altera_uart-add-support-for-polling-mode-irq-less.patch
+tty/altera_uart-add-support-for-getting-mapbase-and-irq-from-resources.patch
+tty/altera_uart-add-support-for-different-address-strides.patch
+tty/altera_uart-make-it-possible-to-use-altera-uart-and-8250-ports-together.patch
+tty/altera_uart-fixup-type-usage-of-port-flags.patch
+tty/altera_uart-fix-missing-prototype-for-registering-an-early-console.patch
+tty/altera_uart-don-t-use-plain-integer-as-null-pointer.patch
+tty/8250-allow-platforms-to-override-pm-hook.patch
+tty/alchemy-add-uart-pm-methods.patch
###################################
# USB stuff for after 2.6.36 is out
@@ -168,10 +181,8 @@ usb/usb-musb-support-iso-high-bandwidth-for-gadget-mode.patch
usb/usb-musb-musbhsdma-increase-max_len-to-1mb.patch
usb/usb-musb-host-unmap-the-buffer-for-pio-data-transfers.patch
usb/usb-musb-change-to-direct-addr-in-context-save-restore.patch
-usb/usb-musb-gadget-unmapping-the-dma-buffer-when-switching-to-pio-mode.patch
usb/usb-musb-host-support-dma-transfers-greater-than-max-channel-length.patch
usb/usb-musb-suppress-warning-about-unused-flags.patch
-usb/usb-musb-gadget-kill-duplicate-code-in-musb_gadget_queue.patch
usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch
usb/usb-musb-ignore-spurious-sessreq-interrupts.patch
usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch
@@ -196,8 +207,17 @@ usb/usb-imx21-hcd-refactor-hardware-data-memory-management.patch
usb/usb-imx21-hcd-fix-isochronous-endpoint-idle.patch
usb/usb-introduce-unmap_urb_setup_for_dma.patch
usb/usb-imx21-hcd-accept-arbitary-transfer-buffer-alignement.patch
+usb/usb-gadget-goku_udc-fix-error-path.patch
+usb/scsi-sr-add-no_read_disc_info-scsi_device-flag.patch
+usb/usb-storage-add-new-no_read_disc_info-quirk.patch
+usb/scsi-sd-add-a-no_read_capacity_16-scsi_device-flag.patch
+usb/usb-storage-add-new-no_read_capacity_16-quirk.patch
+usb/usb-do-not-print-eshutdown-message-if-usb-at-otg-device-mode.patch
+usb/usb-usbtest-support-gadget-zero-isochronous-configurations.patch
# staging stuff for next is now in the staging-next tree on git.kernel.org
+
+
diff --git a/tty/8250-allow-platforms-to-override-pm-hook.patch b/tty/8250-allow-platforms-to-override-pm-hook.patch
new file mode 100644
index 00000000000000..88cdd897a75fdd
--- /dev/null
+++ b/tty/8250-allow-platforms-to-override-pm-hook.patch
@@ -0,0 +1,115 @@
+From manuel.lauss@googlemail.com Wed Oct 6 13:38:26 2010
+From: Manuel Lauss <manuel.lauss@googlemail.com>
+To: linux-serial@vger.kernel.org
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Greg KH <greg@kroah.com>,
+ Manuel Lauss <manuel.lauss@googlemail.com>
+Subject: 8250: allow platforms to override PM hook.
+Date: Sat, 25 Sep 2010 15:13:45 +0200
+Message-Id: <1285420426-8510-1-git-send-email-manuel.lauss@googlemail.com>
+
+Add a hook for platforms to specify custom pm methods.
+
+Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com>
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250.c | 27 ++++++++++++++++-----------
+ include/linux/serial_8250.h | 4 ++++
+ include/linux/serial_core.h | 2 ++
+ 3 files changed, 22 insertions(+), 11 deletions(-)
+
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -154,12 +154,6 @@ struct uart_8250_port {
+ unsigned char lsr_saved_flags;
+ #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
+ unsigned char msr_saved_flags;
+-
+- /*
+- * We provide a per-port pm hook.
+- */
+- void (*pm)(struct uart_port *port,
+- unsigned int state, unsigned int old);
+ };
+
+ struct irq_info {
+@@ -2436,16 +2430,24 @@ serial8250_set_ldisc(struct uart_port *p
+ port->flags &= ~UPF_HARDPPS_CD;
+ }
+
+-static void
+-serial8250_pm(struct uart_port *port, unsigned int state,
+- unsigned int oldstate)
++
++void serial8250_do_pm(struct uart_port *port, unsigned int state,
++ unsigned int oldstate)
+ {
+ struct uart_8250_port *p = (struct uart_8250_port *)port;
+
+ serial8250_set_sleep(p, state != 0);
++}
++EXPORT_SYMBOL(serial8250_do_pm);
+
+- if (p->pm)
+- p->pm(port, state, oldstate);
++static void
++serial8250_pm(struct uart_port *port, unsigned int state,
++ unsigned int oldstate)
++{
++ if (port->pm)
++ port->pm(port, state, oldstate);
++ else
++ serial8250_do_pm(port, state, oldstate);
+ }
+
+ static unsigned int serial8250_port_size(struct uart_8250_port *pt)
+@@ -3006,6 +3008,7 @@ static int __devinit serial8250_probe(st
+ port.serial_in = p->serial_in;
+ port.serial_out = p->serial_out;
+ port.set_termios = p->set_termios;
++ port.pm = p->pm;
+ port.dev = &dev->dev;
+ port.irqflags |= irqflag;
+ ret = serial8250_register_port(&port);
+@@ -3172,6 +3175,8 @@ int serial8250_register_port(struct uart
+ /* Possibly override set_termios call */
+ if (port->set_termios)
+ uart->port.set_termios = port->set_termios;
++ if (port->pm)
++ uart->port.pm = port->pm;
+
+ ret = uart_add_one_port(&serial8250_reg, &uart->port);
+ if (ret == 0)
+--- a/include/linux/serial_8250.h
++++ b/include/linux/serial_8250.h
+@@ -35,6 +35,8 @@ struct plat_serial8250_port {
+ void (*set_termios)(struct uart_port *,
+ struct ktermios *new,
+ struct ktermios *old);
++ void (*pm)(struct uart_port *, unsigned int state,
++ unsigned old);
+ };
+
+ /*
+@@ -76,5 +78,7 @@ extern int serial8250_find_port_for_earl
+ extern int setup_early_serial8250_console(char *cmdline);
+ extern void serial8250_do_set_termios(struct uart_port *port,
+ struct ktermios *termios, struct ktermios *old);
++extern void serial8250_do_pm(struct uart_port *port, unsigned int state,
++ unsigned int oldstate);
+
+ #endif
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -289,6 +289,8 @@ struct uart_port {
+ void (*set_termios)(struct uart_port *,
+ struct ktermios *new,
+ struct ktermios *old);
++ void (*pm)(struct uart_port *, unsigned int state,
++ unsigned int old);
+ unsigned int irq; /* irq number */
+ unsigned long irqflags; /* irq flags */
+ unsigned int uartclk; /* base uart clock */
diff --git a/tty/alchemy-add-uart-pm-methods.patch b/tty/alchemy-add-uart-pm-methods.patch
new file mode 100644
index 00000000000000..8a46a9c1670331
--- /dev/null
+++ b/tty/alchemy-add-uart-pm-methods.patch
@@ -0,0 +1,128 @@
+From manuel.lauss@googlemail.com Wed Oct 6 13:38:47 2010
+From: Manuel Lauss <manuel.lauss@googlemail.com>
+To: linux-serial@vger.kernel.org
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Greg KH <greg@kroah.com>,
+ Manuel Lauss <manuel.lauss@googlemail.com>
+Subject: Alchemy: Add UART PM methods.
+Date: Sat, 25 Sep 2010 15:13:46 +0200
+Message-Id: <1285420426-8510-2-git-send-email-manuel.lauss@googlemail.com>
+
+Custom UART PM hook for Alchemy chips: do standard UART pm and
+additionally en/disable uart block clocks as needed.
+This allows to get rid of a debug port PM hack in the Alchemy pm code.
+
+Tested on Db1200.
+
+Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com>
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/mips/alchemy/common/platform.c | 28 ++++++++++++++++++++++++++++
+ arch/mips/alchemy/common/power.c | 35 -----------------------------------
+ 2 files changed, 28 insertions(+), 35 deletions(-)
+
+--- a/arch/mips/alchemy/common/platform.c
++++ b/arch/mips/alchemy/common/platform.c
+@@ -24,6 +24,33 @@
+
+ #include <prom.h>
+
++static void alchemy_8250_pm(struct uart_port *port, unsigned int state,
++ unsigned int old_state)
++{
++ switch (state) {
++ case 0:
++ if ((__raw_readl(port->membase + UART_MOD_CNTRL) & 3) != 3) {
++ /* power-on sequence as suggested in the databooks */
++ __raw_writel(0, port->membase + UART_MOD_CNTRL);
++ wmb();
++ __raw_writel(1, port->membase + UART_MOD_CNTRL);
++ wmb();
++ }
++ __raw_writel(3, port->membase + UART_MOD_CNTRL); /* full on */
++ wmb();
++ serial8250_do_pm(port, state, old_state);
++ break;
++ case 3: /* power off */
++ serial8250_do_pm(port, state, old_state);
++ __raw_writel(0, port->membase + UART_MOD_CNTRL);
++ wmb();
++ break;
++ default:
++ serial8250_do_pm(port, state, old_state);
++ break;
++ }
++}
++
+ #define PORT(_base, _irq) \
+ { \
+ .mapbase = _base, \
+@@ -33,6 +60,7 @@
+ .flags = UPF_SKIP_TEST | UPF_IOREMAP | \
+ UPF_FIXED_TYPE, \
+ .type = PORT_16550A, \
++ .pm = alchemy_8250_pm, \
+ }
+
+ static struct plat_serial8250_port au1x00_uart_data[] = {
+--- a/arch/mips/alchemy/common/power.c
++++ b/arch/mips/alchemy/common/power.c
+@@ -49,11 +49,6 @@
+ * We only have to save/restore registers that aren't otherwise
+ * done as part of a driver pm_* function.
+ */
+-static unsigned int sleep_uart0_inten;
+-static unsigned int sleep_uart0_fifoctl;
+-static unsigned int sleep_uart0_linectl;
+-static unsigned int sleep_uart0_clkdiv;
+-static unsigned int sleep_uart0_enable;
+ static unsigned int sleep_usb[2];
+ static unsigned int sleep_sys_clocks[5];
+ static unsigned int sleep_sys_pinfunc;
+@@ -62,22 +57,6 @@ static unsigned int sleep_static_memctlr
+
+ static void save_core_regs(void)
+ {
+- extern void save_au1xxx_intctl(void);
+- extern void pm_eth0_shutdown(void);
+-
+- /*
+- * Do the serial ports.....these really should be a pm_*
+- * registered function by the driver......but of course the
+- * standard serial driver doesn't understand our Au1xxx
+- * unique registers.
+- */
+- sleep_uart0_inten = au_readl(UART0_ADDR + UART_IER);
+- sleep_uart0_fifoctl = au_readl(UART0_ADDR + UART_FCR);
+- sleep_uart0_linectl = au_readl(UART0_ADDR + UART_LCR);
+- sleep_uart0_clkdiv = au_readl(UART0_ADDR + UART_CLK);
+- sleep_uart0_enable = au_readl(UART0_ADDR + UART_MOD_CNTRL);
+- au_sync();
+-
+ #ifndef CONFIG_SOC_AU1200
+ /* Shutdown USB host/device. */
+ sleep_usb[0] = au_readl(USB_HOST_CONFIG);
+@@ -175,20 +154,6 @@ static void restore_core_regs(void)
+ au_writel(sleep_static_memctlr[3][0], MEM_STCFG3);
+ au_writel(sleep_static_memctlr[3][1], MEM_STTIME3);
+ au_writel(sleep_static_memctlr[3][2], MEM_STADDR3);
+-
+- /*
+- * Enable the UART if it was enabled before sleep.
+- * I guess I should define module control bits........
+- */
+- if (sleep_uart0_enable & 0x02) {
+- au_writel(0, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+- au_writel(1, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+- au_writel(3, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+- au_writel(sleep_uart0_inten, UART0_ADDR + UART_IER); au_sync();
+- au_writel(sleep_uart0_fifoctl, UART0_ADDR + UART_FCR); au_sync();
+- au_writel(sleep_uart0_linectl, UART0_ADDR + UART_LCR); au_sync();
+- au_writel(sleep_uart0_clkdiv, UART0_ADDR + UART_CLK); au_sync();
+- }
+ }
+
+ void au_sleep(void)
diff --git a/tty/altera_uart-add-support-for-different-address-strides.patch b/tty/altera_uart-add-support-for-different-address-strides.patch
new file mode 100644
index 00000000000000..938c4da17ebd9e
--- /dev/null
+++ b/tty/altera_uart-add-support-for-different-address-strides.patch
@@ -0,0 +1,223 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:32:58 2010
+Date: Fri, 1 Oct 2010 17:21:54 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Add support for different address strides
+Message-ID: <20101001132154.GD25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+Some controllers implement registers with a stride, to support
+those we must implement the proper IO accessors.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/altera_uart.c | 58 +++++++++++++++++++++++++++----------------
+ include/linux/altera_uart.h | 1
+ 2 files changed, 38 insertions(+), 21 deletions(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -82,9 +82,23 @@ struct altera_uart {
+ unsigned short imr; /* Local IMR mirror */
+ };
+
++static u32 altera_uart_readl(struct uart_port *port, int reg)
++{
++ struct altera_uart_platform_uart *platp = port->private_data;
++
++ return readl(port->membase + (reg << platp->bus_shift));
++}
++
++static void altera_uart_writel(struct uart_port *port, u32 dat, int reg)
++{
++ struct altera_uart_platform_uart *platp = port->private_data;
++
++ writel(dat, port->membase + (reg << platp->bus_shift));
++}
++
+ static unsigned int altera_uart_tx_empty(struct uart_port *port)
+ {
+- return (readl(port->membase + ALTERA_UART_STATUS_REG) &
++ return (altera_uart_readl(port, ALTERA_UART_STATUS_REG) &
+ ALTERA_UART_STATUS_TMT_MSK) ? TIOCSER_TEMT : 0;
+ }
+
+@@ -93,8 +107,7 @@ static unsigned int altera_uart_get_mctr
+ struct altera_uart *pp = container_of(port, struct altera_uart, port);
+ unsigned int sigs;
+
+- sigs =
+- (readl(port->membase + ALTERA_UART_STATUS_REG) &
++ sigs = (altera_uart_readl(port, ALTERA_UART_STATUS_REG) &
+ ALTERA_UART_STATUS_CTS_MSK) ? TIOCM_CTS : 0;
+ sigs |= (pp->sigs & TIOCM_RTS);
+
+@@ -110,7 +123,7 @@ static void altera_uart_set_mctrl(struct
+ pp->imr |= ALTERA_UART_CONTROL_RTS_MSK;
+ else
+ pp->imr &= ~ALTERA_UART_CONTROL_RTS_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ }
+
+ static void altera_uart_start_tx(struct uart_port *port)
+@@ -118,7 +131,7 @@ static void altera_uart_start_tx(struct
+ struct altera_uart *pp = container_of(port, struct altera_uart, port);
+
+ pp->imr |= ALTERA_UART_CONTROL_TRDY_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ }
+
+ static void altera_uart_stop_tx(struct uart_port *port)
+@@ -126,7 +139,7 @@ static void altera_uart_stop_tx(struct u
+ struct altera_uart *pp = container_of(port, struct altera_uart, port);
+
+ pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ }
+
+ static void altera_uart_stop_rx(struct uart_port *port)
+@@ -134,7 +147,7 @@ static void altera_uart_stop_rx(struct u
+ struct altera_uart *pp = container_of(port, struct altera_uart, port);
+
+ pp->imr &= ~ALTERA_UART_CONTROL_RRDY_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ }
+
+ static void altera_uart_break_ctl(struct uart_port *port, int break_state)
+@@ -147,7 +160,7 @@ static void altera_uart_break_ctl(struct
+ pp->imr |= ALTERA_UART_CONTROL_TRBK_MSK;
+ else
+ pp->imr &= ~ALTERA_UART_CONTROL_TRBK_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ spin_unlock_irqrestore(&port->lock, flags);
+ }
+
+@@ -171,7 +184,7 @@ static void altera_uart_set_termios(stru
+
+ spin_lock_irqsave(&port->lock, flags);
+ uart_update_timeout(port, termios->c_cflag, baud);
+- writel(baudclk, port->membase + ALTERA_UART_DIVISOR_REG);
++ altera_uart_writel(port, baudclk, ALTERA_UART_DIVISOR_REG);
+ spin_unlock_irqrestore(&port->lock, flags);
+ }
+
+@@ -181,14 +194,15 @@ static void altera_uart_rx_chars(struct
+ unsigned char ch, flag;
+ unsigned short status;
+
+- while ((status = readl(port->membase + ALTERA_UART_STATUS_REG)) &
++ while ((status = altera_uart_readl(port, ALTERA_UART_STATUS_REG)) &
+ ALTERA_UART_STATUS_RRDY_MSK) {
+- ch = readl(port->membase + ALTERA_UART_RXDATA_REG);
++ ch = altera_uart_readl(port, ALTERA_UART_RXDATA_REG);
+ flag = TTY_NORMAL;
+ port->icount.rx++;
+
+ if (status & ALTERA_UART_STATUS_E_MSK) {
+- writel(status, port->membase + ALTERA_UART_STATUS_REG);
++ altera_uart_writel(port, status,
++ ALTERA_UART_STATUS_REG);
+
+ if (status & ALTERA_UART_STATUS_BRK_MSK) {
+ port->icount.brk++;
+@@ -228,18 +242,18 @@ static void altera_uart_tx_chars(struct
+
+ if (port->x_char) {
+ /* Send special char - probably flow control */
+- writel(port->x_char, port->membase + ALTERA_UART_TXDATA_REG);
++ altera_uart_writel(port, port->x_char, ALTERA_UART_TXDATA_REG);
+ port->x_char = 0;
+ port->icount.tx++;
+ return;
+ }
+
+- while (readl(port->membase + ALTERA_UART_STATUS_REG) &
++ while (altera_uart_readl(port, ALTERA_UART_STATUS_REG) &
+ ALTERA_UART_STATUS_TRDY_MSK) {
+ if (xmit->head == xmit->tail)
+ break;
+- writel(xmit->buf[xmit->tail],
+- port->membase + ALTERA_UART_TXDATA_REG);
++ altera_uart_writel(port, xmit->buf[xmit->tail],
++ ALTERA_UART_TXDATA_REG);
+ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+ port->icount.tx++;
+ }
+@@ -249,7 +263,7 @@ static void altera_uart_tx_chars(struct
+
+ if (xmit->head == xmit->tail) {
+ pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK;
+- writel(pp->imr, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, pp->imr, ALTERA_UART_CONTROL_REG);
+ }
+ }
+
+@@ -259,7 +273,7 @@ static irqreturn_t altera_uart_interrupt
+ struct altera_uart *pp = container_of(port, struct altera_uart, port);
+ unsigned int isr;
+
+- isr = readl(port->membase + ALTERA_UART_STATUS_REG) & pp->imr;
++ isr = altera_uart_readl(port, ALTERA_UART_STATUS_REG) & pp->imr;
+
+ spin_lock(&port->lock);
+ if (isr & ALTERA_UART_STATUS_RRDY_MSK)
+@@ -285,9 +299,9 @@ static void altera_uart_config_port(stru
+ port->type = PORT_ALTERA_UART;
+
+ /* Clear mask, so no surprise interrupts. */
+- writel(0, port->membase + ALTERA_UART_CONTROL_REG);
++ altera_uart_writel(port, 0, ALTERA_UART_CONTROL_REG);
+ /* Clear status register */
+- writel(0, port->membase + ALTERA_UART_STATUS_REG);
++ altera_uart_writel(port, 0, ALTERA_UART_STATUS_REG);
+ }
+
+ static int altera_uart_startup(struct uart_port *port)
+@@ -407,6 +421,7 @@ int __init early_altera_uart_setup(struc
+ port->uartclk = platp[i].uartclk;
+ port->flags = ASYNC_BOOT_AUTOCONF;
+ port->ops = &altera_uart_ops;
++ port->private_data = platp;
+ }
+
+ return 0;
+@@ -414,7 +429,7 @@ int __init early_altera_uart_setup(struc
+
+ static void altera_uart_console_putc(struct uart_port *port, const char c)
+ {
+- while (!(readl(port->membase + ALTERA_UART_STATUS_REG) &
++ while (!(altera_uart_readl(port, ALTERA_UART_STATUS_REG) &
+ ALTERA_UART_STATUS_TRDY_MSK))
+ cpu_relax();
+
+@@ -535,6 +550,7 @@ static int __devinit altera_uart_probe(s
+ port->uartclk = platp->uartclk;
+ port->ops = &altera_uart_ops;
+ port->flags = ASYNC_BOOT_AUTOCONF;
++ port->private_data = platp;
+
+ uart_add_one_port(&altera_uart_driver, port);
+
+--- a/include/linux/altera_uart.h
++++ b/include/linux/altera_uart.h
+@@ -9,6 +9,7 @@ struct altera_uart_platform_uart {
+ unsigned long mapbase; /* Physical address base */
+ unsigned int irq; /* Interrupt vector */
+ unsigned int uartclk; /* UART clock rate */
++ unsigned int bus_shift; /* Bus shift (address stride) */
+ };
+
+ #endif /* __ALTUART_H */
diff --git a/tty/altera_uart-add-support-for-getting-mapbase-and-irq-from-resources.patch b/tty/altera_uart-add-support-for-getting-mapbase-and-irq-from-resources.patch
new file mode 100644
index 00000000000000..ca6035a8eef3fe
--- /dev/null
+++ b/tty/altera_uart-add-support-for-getting-mapbase-and-irq-from-resources.patch
@@ -0,0 +1,111 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:32:37 2010
+Date: Fri, 1 Oct 2010 17:21:42 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Add support for getting mapbase and IRQ from resources
+Message-ID: <20101001132142.GC25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+This makes it much easier to integrate the driver with the rest of
+the Linux (e.g. MFD subsystem).
+
+The old method is still supported though.
+
+Also, from now on, there is one platform device per port (no
+changes are needed for the platform code, as no one registers
+the devices anywhere in-tree yet).
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>,
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/altera_uart.c | 64 ++++++++++++++++++++++++++-----------------
+ 1 file changed, 40 insertions(+), 24 deletions(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -498,38 +498,54 @@ static int __devinit altera_uart_probe(s
+ {
+ struct altera_uart_platform_uart *platp = pdev->dev.platform_data;
+ struct uart_port *port;
+- int i;
++ struct resource *res_mem;
++ struct resource *res_irq;
++ int i = pdev->id;
++
++ /* -1 emphasizes that the platform must have one port, no .N suffix */
++ if (i == -1)
++ i = 0;
++
++ if (i >= CONFIG_SERIAL_ALTERA_UART_MAXPORTS)
++ return -EINVAL;
++
++ port = &altera_uart_ports[i].port;
++
++ res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (res_mem)
++ port->mapbase = res_mem->start;
++ else if (platp->mapbase)
++ port->mapbase = platp->mapbase;
++ else
++ return -EINVAL;
++
++ res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
++ if (res_irq)
++ port->irq = res_irq->start;
++ else if (platp->irq)
++ port->irq = platp->irq;
++
++ port->membase = ioremap(port->mapbase, ALTERA_UART_SIZE);
++ if (!port->membase)
++ return -ENOMEM;
++
++ port->line = i;
++ port->type = PORT_ALTERA_UART;
++ port->iotype = SERIAL_IO_MEM;
++ port->uartclk = platp->uartclk;
++ port->ops = &altera_uart_ops;
++ port->flags = ASYNC_BOOT_AUTOCONF;
+
+- for (i = 0; i < CONFIG_SERIAL_ALTERA_UART_MAXPORTS && platp[i].mapbase; i++) {
+- port = &altera_uart_ports[i].port;
+-
+- port->line = i;
+- port->type = PORT_ALTERA_UART;
+- port->mapbase = platp[i].mapbase;
+- port->membase = ioremap(port->mapbase, ALTERA_UART_SIZE);
+- port->iotype = SERIAL_IO_MEM;
+- port->irq = platp[i].irq;
+- port->uartclk = platp[i].uartclk;
+- port->ops = &altera_uart_ops;
+- port->flags = ASYNC_BOOT_AUTOCONF;
+-
+- uart_add_one_port(&altera_uart_driver, port);
+- }
++ uart_add_one_port(&altera_uart_driver, port);
+
+ return 0;
+ }
+
+ static int __devexit altera_uart_remove(struct platform_device *pdev)
+ {
+- struct uart_port *port;
+- int i;
+-
+- for (i = 0; i < CONFIG_SERIAL_ALTERA_UART_MAXPORTS; i++) {
+- port = &altera_uart_ports[i].port;
+- if (port)
+- uart_remove_one_port(&altera_uart_driver, port);
+- }
++ struct uart_port *port = &altera_uart_ports[pdev->id].port;
+
++ uart_remove_one_port(&altera_uart_driver, port);
+ return 0;
+ }
+
diff --git a/tty/altera_uart-add-support-for-polling-mode-irq-less.patch b/tty/altera_uart-add-support-for-polling-mode-irq-less.patch
new file mode 100644
index 00000000000000..54cda053ba5f1e
--- /dev/null
+++ b/tty/altera_uart-add-support-for-polling-mode-irq-less.patch
@@ -0,0 +1,92 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:32:20 2010
+Date: Fri, 1 Oct 2010 17:21:33 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Add support for polling mode (IRQ-less)
+Message-ID: <20101001132133.GB25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+Some Altera UART implementations doesn't route the IRQ line, so we have
+to work in polling mode.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/serial/altera_uart.c | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -15,6 +15,7 @@
+
+ #include <linux/kernel.h>
+ #include <linux/init.h>
++#include <linux/timer.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/console.h>
+@@ -76,6 +77,7 @@
+ */
+ struct altera_uart {
+ struct uart_port port;
++ struct timer_list tmr;
+ unsigned int sigs; /* Local copy of line sigs */
+ unsigned short imr; /* Local IMR mirror */
+ };
+@@ -168,6 +170,7 @@ static void altera_uart_set_termios(stru
+ tty_termios_encode_baud_rate(termios, baud, baud);
+
+ spin_lock_irqsave(&port->lock, flags);
++ uart_update_timeout(port, termios->c_cflag, baud);
+ writel(baudclk, port->membase + ALTERA_UART_DIVISOR_REG);
+ spin_unlock_irqrestore(&port->lock, flags);
+ }
+@@ -268,6 +271,15 @@ static irqreturn_t altera_uart_interrupt
+ return IRQ_RETVAL(isr);
+ }
+
++static void altera_uart_timer(unsigned long data)
++{
++ struct uart_port *port = (void *)data;
++ struct altera_uart *pp = container_of(port, struct altera_uart, port);
++
++ altera_uart_interrupt(0, port);
++ mod_timer(&pp->tmr, jiffies + uart_poll_timeout(port));
++}
++
+ static void altera_uart_config_port(struct uart_port *port, int flags)
+ {
+ port->type = PORT_ALTERA_UART;
+@@ -284,6 +296,12 @@ static int altera_uart_startup(struct ua
+ unsigned long flags;
+ int ret;
+
++ if (!port->irq) {
++ setup_timer(&pp->tmr, altera_uart_timer, (unsigned long)port);
++ mod_timer(&pp->tmr, jiffies + uart_poll_timeout(port));
++ return 0;
++ }
++
+ ret = request_irq(port->irq, altera_uart_interrupt, IRQF_DISABLED,
+ DRV_NAME, port);
+ if (ret) {
+@@ -316,7 +334,10 @@ static void altera_uart_shutdown(struct
+
+ spin_unlock_irqrestore(&port->lock, flags);
+
+- free_irq(port->irq, port);
++ if (port->irq)
++ free_irq(port->irq, port);
++ else
++ del_timer_sync(&pp->tmr);
+ }
+
+ static const char *altera_uart_type(struct uart_port *port)
diff --git a/tty/altera_uart-don-t-use-plain-integer-as-null-pointer.patch b/tty/altera_uart-don-t-use-plain-integer-as-null-pointer.patch
new file mode 100644
index 00000000000000..a48a760f9d74fd
--- /dev/null
+++ b/tty/altera_uart-don-t-use-plain-integer-as-null-pointer.patch
@@ -0,0 +1,33 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:34:27 2010
+Date: Fri, 1 Oct 2010 17:23:13 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Don't use plain integer as NULL pointer
+Message-ID: <20101001132313.GH25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+Fixes sparse warning.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Cc: Alan Cox <alan@linux.intel.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+
+---
+ drivers/serial/altera_uart.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -461,7 +461,7 @@ static int __init altera_uart_console_se
+ if (co->index < 0 || co->index >= CONFIG_SERIAL_ALTERA_UART_MAXPORTS)
+ return -EINVAL;
+ port = &altera_uart_ports[co->index].port;
+- if (port->membase == 0)
++ if (!port->membase)
+ return -ENODEV;
+
+ if (options)
diff --git a/tty/altera_uart-fix-missing-prototype-for-registering-an-early-console.patch b/tty/altera_uart-fix-missing-prototype-for-registering-an-early-console.patch
new file mode 100644
index 00000000000000..40f8e89da7b0ff
--- /dev/null
+++ b/tty/altera_uart-fix-missing-prototype-for-registering-an-early-console.patch
@@ -0,0 +1,42 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:34:04 2010
+Date: Fri, 1 Oct 2010 17:22:55 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Fix missing prototype for registering an early console
+Message-ID: <20101001132255.GG25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+Simply add an early_altera_uart_setup() prototype declaration, otherwise
+platform code have to do it in .c files, which is ugly.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/linux/altera_uart.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/include/linux/altera_uart.h
++++ b/include/linux/altera_uart.h
+@@ -5,6 +5,8 @@
+ #ifndef __ALTUART_H
+ #define __ALTUART_H
+
++#include <linux/init.h>
++
+ struct altera_uart_platform_uart {
+ unsigned long mapbase; /* Physical address base */
+ unsigned int irq; /* Interrupt vector */
+@@ -12,4 +14,6 @@ struct altera_uart_platform_uart {
+ unsigned int bus_shift; /* Bus shift (address stride) */
+ };
+
++int __init early_altera_uart_setup(struct altera_uart_platform_uart *platp);
++
+ #endif /* __ALTUART_H */
diff --git a/tty/altera_uart-fixup-type-usage-of-port-flags.patch b/tty/altera_uart-fixup-type-usage-of-port-flags.patch
new file mode 100644
index 00000000000000..b0868cdf7d8e3f
--- /dev/null
+++ b/tty/altera_uart-fixup-type-usage-of-port-flags.patch
@@ -0,0 +1,46 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:33:41 2010
+Date: Fri, 1 Oct 2010 17:22:37 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Fixup type usage of port flags
+Message-ID: <20101001132237.GF25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+port->flags is of type upf_t, which corresponds to UPF_* flags.
+
+ASYNC_BOOT_AUTOCONF is an unsigned integer, which happen to
+be the same as UPF_BOOT_AUTOCONF.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/altera_uart.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -421,7 +421,7 @@ int __init early_altera_uart_setup(struc
+ port->iotype = SERIAL_IO_MEM;
+ port->irq = platp[i].irq;
+ port->uartclk = platp[i].uartclk;
+- port->flags = ASYNC_BOOT_AUTOCONF;
++ port->flags = UPF_BOOT_AUTOCONF;
+ port->ops = &altera_uart_ops;
+ port->private_data = platp;
+ }
+@@ -551,7 +551,7 @@ static int __devinit altera_uart_probe(s
+ port->iotype = SERIAL_IO_MEM;
+ port->uartclk = platp->uartclk;
+ port->ops = &altera_uart_ops;
+- port->flags = ASYNC_BOOT_AUTOCONF;
++ port->flags = UPF_BOOT_AUTOCONF;
+ port->private_data = platp;
+
+ uart_add_one_port(&altera_uart_driver, port);
diff --git a/tty/altera_uart-make-it-possible-to-use-altera-uart-and-8250-ports-together.patch b/tty/altera_uart-make-it-possible-to-use-altera-uart-and-8250-ports-together.patch
new file mode 100644
index 00000000000000..82370d70d262ba
--- /dev/null
+++ b/tty/altera_uart-make-it-possible-to-use-altera-uart-and-8250-ports-together.patch
@@ -0,0 +1,63 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:33:16 2010
+Date: Fri, 1 Oct 2010 18:23:24 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: altera_uart: Make it possible to use Altera UART and 8250 ports together
+Message-ID: <20101001142324.GA4517@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+This fixes tty name, major and minor numbers. The major number
+204 is used across many platform-specific serial drivers, so we
+use that.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Acked-by: Tobias Klauser <tklauser@distanz.ch>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/altera_uart.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+--- a/drivers/serial/altera_uart.c
++++ b/drivers/serial/altera_uart.c
+@@ -28,6 +28,8 @@
+ #include <linux/altera_uart.h>
+
+ #define DRV_NAME "altera_uart"
++#define SERIAL_ALTERA_MAJOR 204
++#define SERIAL_ALTERA_MINOR 213
+
+ /*
+ * Altera UART register definitions according to the Nios UART datasheet:
+@@ -471,7 +473,7 @@ static int __init altera_uart_console_se
+ static struct uart_driver altera_uart_driver;
+
+ static struct console altera_uart_console = {
+- .name = "ttyS",
++ .name = "ttyAL",
+ .write = altera_uart_console_write,
+ .device = uart_console_device,
+ .setup = altera_uart_console_setup,
+@@ -502,9 +504,9 @@ console_initcall(altera_uart_console_ini
+ static struct uart_driver altera_uart_driver = {
+ .owner = THIS_MODULE,
+ .driver_name = DRV_NAME,
+- .dev_name = "ttyS",
+- .major = TTY_MAJOR,
+- .minor = 64,
++ .dev_name = "ttyAL",
++ .major = SERIAL_ALTERA_MAJOR,
++ .minor = SERIAL_ALTERA_MINOR,
+ .nr = CONFIG_SERIAL_ALTERA_UART_MAXPORTS,
+ .cons = ALTERA_UART_CONSOLE,
+ };
+@@ -603,3 +605,4 @@ MODULE_DESCRIPTION("Altera UART driver")
+ MODULE_AUTHOR("Thomas Chou <thomas@wytron.com.tw>");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS("platform:" DRV_NAME);
++MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_ALTERA_MAJOR);
diff --git a/tty/serial-8250-don-t-delay-after-transmitter-is-ready.patch b/tty/serial-8250-don-t-delay-after-transmitter-is-ready.patch
new file mode 100644
index 00000000000000..76cc960d869b85
--- /dev/null
+++ b/tty/serial-8250-don-t-delay-after-transmitter-is-ready.patch
@@ -0,0 +1,42 @@
+From David.Daney@caviumnetworks.com Wed Oct 6 13:21:08 2010
+From: David Daney <ddaney@caviumnetworks.com>
+To: linux-serial@vger.kernel.org, gregkh@suse.de,
+ linux-kernel@vger.kernel.org
+Cc: David Daney <ddaney@caviumnetworks.com>
+Subject: serial: 8250: Don't delay after transmitter is ready.
+Date: Tue, 5 Oct 2010 11:40:07 -0700
+Message-Id: <1286304007-4715-1-git-send-email-ddaney@caviumnetworks.com>
+
+The loop in wait_for_xmitr() is delaying one extra uS after the ready
+condition has been met. Rewrite the loop to only delay if the
+transmitter is not ready.
+
+Signed-off-by: David Daney <ddaney@caviumnetworks.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -1867,15 +1867,17 @@ static void wait_for_xmitr(struct uart_8
+ unsigned int status, tmout = 10000;
+
+ /* Wait up to 10ms for the character(s) to be sent. */
+- do {
++ for (;;) {
+ status = serial_in(up, UART_LSR);
+
+ up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
+
++ if ((status & bits) == bits)
++ break;
+ if (--tmout == 0)
+ break;
+ udelay(1);
+- } while ((status & bits) != bits);
++ }
+
+ /* Wait up to 1s for flow control if necessary */
+ if (up->port.flags & UPF_CONS_FLOW) {
diff --git a/tty/serial-factor-out-uart_poll_timeout-from-8250-driver.patch b/tty/serial-factor-out-uart_poll_timeout-from-8250-driver.patch
new file mode 100644
index 00000000000000..670fb4b5d72c19
--- /dev/null
+++ b/tty/serial-factor-out-uart_poll_timeout-from-8250-driver.patch
@@ -0,0 +1,91 @@
+From cbouatmailru@gmail.com Wed Oct 6 13:31:58 2010
+Date: Fri, 1 Oct 2010 17:21:25 +0400
+From: Anton Vorontsov <cbouatmailru@gmail.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Alan Cox <alan@linux.intel.com>,
+ Andrew Morton <akpm@linux-foundation.org>,
+ Tobias Klauser <tklauser@distanz.ch>, linux-serial@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: serial: Factor out uart_poll_timeout() from 8250 driver
+Message-ID: <20101001132125.GA25897@oksana.dev.rtsoft.ru>
+Content-Disposition: inline
+
+Soon we will use that handy function in the altera_uart driver.
+
+Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250.c | 14 ++++----------
+ include/linux/serial_core.h | 8 ++++++++
+ 2 files changed, 12 insertions(+), 10 deletions(-)
+
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -1722,12 +1722,6 @@ static void serial_unlink_irq_chain(stru
+ mutex_unlock(&hash_mutex);
+ }
+
+-/* Base timer interval for polling */
+-static inline int poll_timeout(int timeout)
+-{
+- return timeout > 6 ? (timeout / 2 - 2) : 1;
+-}
+-
+ /*
+ * This function is used to handle ports that do not have an
+ * interrupt. This doesn't work very well for 16450's, but gives
+@@ -1742,7 +1736,7 @@ static void serial8250_timeout(unsigned
+ iir = serial_in(up, UART_IIR);
+ if (!(iir & UART_IIR_NO_INT))
+ serial8250_handle_port(up);
+- mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout));
++ mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
+ }
+
+ static void serial8250_backup_timeout(unsigned long data)
+@@ -1787,7 +1781,7 @@ static void serial8250_backup_timeout(un
+
+ /* Standard timer interval plus 0.2s to keep the port running */
+ mod_timer(&up->timer,
+- jiffies + poll_timeout(up->port.timeout) + HZ / 5);
++ jiffies + uart_poll_timeout(&up->port) + HZ / 5);
+ }
+
+ static unsigned int serial8250_tx_empty(struct uart_port *port)
+@@ -2071,7 +2065,7 @@ static int serial8250_startup(struct uar
+ up->timer.function = serial8250_backup_timeout;
+ up->timer.data = (unsigned long)up;
+ mod_timer(&up->timer, jiffies +
+- poll_timeout(up->port.timeout) + HZ / 5);
++ uart_poll_timeout(port) + HZ / 5);
+ }
+
+ /*
+@@ -2081,7 +2075,7 @@ static int serial8250_startup(struct uar
+ */
+ if (!is_real_interrupt(up->port.irq)) {
+ up->timer.data = (unsigned long)up;
+- mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout));
++ mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
+ } else {
+ retval = serial_link_irq_chain(up);
+ if (retval)
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -411,6 +411,14 @@ unsigned int uart_get_baud_rate(struct u
+ unsigned int max);
+ unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
+
++/* Base timer interval for polling */
++static inline int uart_poll_timeout(struct uart_port *port)
++{
++ int timeout = port->timeout;
++
++ return timeout > 6 ? (timeout / 2 - 2) : 1;
++}
++
+ /*
+ * Console helpers.
+ */
diff --git a/tty/serial-mark-the-8250-driver-as-maintained.patch b/tty/serial-mark-the-8250-driver-as-maintained.patch
new file mode 100644
index 00000000000000..9bca005b5afcd7
--- /dev/null
+++ b/tty/serial-mark-the-8250-driver-as-maintained.patch
@@ -0,0 +1,29 @@
+From foo@baz Wed Oct 6 13:29:44 PDT 2010
+Date: Wed, 06 Oct 2010 13:29:44 -0700
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: serial: mark the 8250 driver as maintained
+
+Clearly I have gone insane, so I might as well tell the world about it.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ MAINTAINERS | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -157,9 +157,11 @@ S: Maintained
+ F: drivers/net/r8169.c
+
+ 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
++M: Greg Kroah-Hartman <gregkh@suse.de>
+ L: linux-serial@vger.kernel.org
+ W: http://serial.sourceforge.net
+-S: Orphan
++S: Maintained
++T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
+ F: drivers/serial/8250*
+ F: include/linux/serial_8250.h
+
diff --git a/tty/tty-maintainers-add-drivers-serial-jsm-as-maintained-driver.patch b/tty/tty-maintainers-add-drivers-serial-jsm-as-maintained-driver.patch
new file mode 100644
index 00000000000000..bc9680276c11c7
--- /dev/null
+++ b/tty/tty-maintainers-add-drivers-serial-jsm-as-maintained-driver.patch
@@ -0,0 +1,35 @@
+From linux-serial-owner@vger.kernel.org Wed Oct 6 13:16:43 2010
+From: Breno Leitao <leitao@linux.vnet.ibm.com>
+To: greg@kroah.com
+Cc: Scott.Kilau@digi.com, linux-kernel@vger.kernel.org,
+ linux-serial@vger.kernel.org,
+ Breno Leitao <leitao@linux.vnet.ibm.com>
+Subject: tty: MAINTAINERS: add drivers/serial/jsm/ as maintained driver
+Date: Wed, 6 Oct 2010 13:04:48 -0300
+Message-Id: <1286381088-7614-1-git-send-email-leitao@linux.vnet.ibm.com>
+
+Soott Kilau is handing off the maintainership of the jsm serial
+driver to me, and this patch just add the driver as maintained.
+
+Signed-off-by: Breno Leitao <leitao@linux.vnet.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ MAINTAINERS | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -3311,6 +3311,12 @@ F: fs/jbd*/
+ F: include/linux/ext*jbd*.h
+ F: include/linux/jbd*.h
+
++JSM Neo PCI based serial card
++M: Breno Leitao <leitao@linux.vnet.ibm.com>
++L: linux-serial@vger.kernel.org
++S: Maintained
++F: drivers/serial/jsm/
++
+ K8TEMP HARDWARE MONITORING DRIVER
+ M: Rudolf Marek <r.marek@assembler.cz>
+ L: lm-sensors@lm-sensors.org
diff --git a/usb/scsi-sd-add-a-no_read_capacity_16-scsi_device-flag.patch b/usb/scsi-sd-add-a-no_read_capacity_16-scsi_device-flag.patch
new file mode 100644
index 00000000000000..b614be5cb3a298
--- /dev/null
+++ b/usb/scsi-sd-add-a-no_read_capacity_16-scsi_device-flag.patch
@@ -0,0 +1,85 @@
+From akpm@linux-foundation.org Wed Oct 6 13:35:58 2010
+Message-Id: <201010012120.o91LKAdl021407@imap1.linux-foundation.org>
+From: Hans de Goede <hdegoede@redhat.com>
+Subject: scsi/sd: add a no_read_capacity_16 scsi_device flag
+To: greg@kroah.com
+Cc: linux-usb@vger.kernel.org, akpm@linux-foundation.org, hdegoede@redhat.com,
+ James.Bottomley@HansenPartnership.com, mdharm-usb@one-eyed-alien.net,
+ stern@rowland.harvard.edu
+Date: Fri, 01 Oct 2010 14:20:10 -0700
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+I seem to have a knack for digging up buggy usb devices which don't work
+with Linux, and I'm crazy enough to try to make them work. So this time a
+friend of mine asked me to get an mp4 player (an mp3 player which can play
+videos on a small screen) to work with Linux.
+
+It is based on the well known rockbox chipset for which we already have an
+unusual devs entries to work around some of its bugs. But this model
+comes with an additional twist.
+
+This model chokes on read_capacity_16 calls. Now normally we don't make
+those calls, but this model comes with an sdcard slot and when there is no
+card in there (and shipped from the factory there is none), it reports a
+size of 0. However this time the programmers actually got the
+read_capacity_10 response right! So they substract one from the size as
+stored internally in the mp3 player before reporting it back, resulting in
+an answer of ... 0xffffffff sectors, causing sd.c to try a
+read_capacity_16, on which the device crashes.
+
+This patch adds a flag to scsi_device to indicate that a a device cannot
+handle read_capacity_16, and when this flag is set if a device reports an
+lba of 0xffffffff as answer to a read_capacity_10, assumes it tries to
+report a size of 0.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/scsi/sd.c | 12 ++++++++++++
+ include/scsi/scsi_device.h | 1 +
+ 2 files changed, 13 insertions(+)
+
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1498,6 +1498,9 @@ static int read_capacity_16(struct scsi_
+ unsigned long long lba;
+ unsigned sector_size;
+
++ if (sdp->no_read_capacity_16)
++ return -EINVAL;
++
+ do {
+ memset(cmd, 0, 16);
+ cmd[0] = SERVICE_ACTION_IN;
+@@ -1626,6 +1629,15 @@ static int read_capacity_10(struct scsi_
+ sector_size = get_unaligned_be32(&buffer[4]);
+ lba = get_unaligned_be32(&buffer[0]);
+
++ if (sdp->no_read_capacity_16 && (lba == 0xffffffff)) {
++ /* Some buggy (usb cardreader) devices return an lba of
++ 0xffffffff when the want to report a size of 0 (with
++ which they really mean no media is present) */
++ sdkp->capacity = 0;
++ sdkp->hw_sector_size = sector_size;
++ return sector_size;
++ }
++
+ if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
+ sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
+ "kernel compiled with support for large block "
+--- a/include/scsi/scsi_device.h
++++ b/include/scsi/scsi_device.h
+@@ -149,6 +149,7 @@ struct scsi_device {
+ unsigned last_sector_bug:1; /* do not use multisector accesses on
+ SD_LAST_BUGGY_SECTORS */
+ unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */
++ unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */
+ unsigned is_visible:1; /* is the device visible in sysfs */
+
+ DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
diff --git a/usb/scsi-sr-add-no_read_disc_info-scsi_device-flag.patch b/usb/scsi-sr-add-no_read_disc_info-scsi_device-flag.patch
new file mode 100644
index 00000000000000..eaeea14f38480e
--- /dev/null
+++ b/usb/scsi-sr-add-no_read_disc_info-scsi_device-flag.patch
@@ -0,0 +1,72 @@
+From linux-usb-owner@vger.kernel.org Wed Oct 6 13:35:11 2010
+Message-Id: <201010012120.o91LK84M021399@imap1.linux-foundation.org>
+From: Hans de Goede <hdegoede@redhat.com>
+Subject: scsi/sr: add no_read_disc_info scsi_device flag
+To: greg@kroah.com
+Cc: linux-usb@vger.kernel.org, akpm@linux-foundation.org,
+ hdegoede@redhat.com, James.Bottomley@HansenPartnership.com,
+ mdharm-usb@one-eyed-alien.net, stern@rowland.harvard.edu
+Date: Fri, 01 Oct 2010 14:20:08 -0700
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+Some USB devices emulate a usb-mass-storage attached (scsi) cdrom device,
+usually this fake cdrom contains the windows software for the device.
+While working on supporting Appotech ax3003 based photoframes, which do
+this I discovered that they will go of into lala land when ever they see a
+READ_DISC_INFO scsi command.
+
+Thus this patch adds a scsi_device flag (which can then be set by the
+usb-storage driver through an unsual-devs entry), to indicate this, and
+makes the sr driver honor this flag.
+
+I know this sucks, but as discussed on linux-scsi list there is no other
+way to make this device work properly.
+
+Looking at usb traces made under windows, windows never sends a
+READ_DISC_INFO during normal interactions with a usb cdrom device. So as
+this cdrom emulation thingie becomes more common we might see more of this
+problem.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/scsi/sr.c | 8 +++++++-
+ include/scsi/scsi_device.h | 1 +
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -862,10 +862,16 @@ static void get_capabilities(struct scsi
+ static int sr_packet(struct cdrom_device_info *cdi,
+ struct packet_command *cgc)
+ {
++ struct scsi_cd *cd = cdi->handle;
++ struct scsi_device *sdev = cd->device;
++
++ if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)
++ return -EDRIVE_CANT_DO_THIS;
++
+ if (cgc->timeout <= 0)
+ cgc->timeout = IOCTL_TIMEOUT;
+
+- sr_do_ioctl(cdi->handle, cgc);
++ sr_do_ioctl(cd, cgc);
+
+ return cgc->stat;
+ }
+--- a/include/scsi/scsi_device.h
++++ b/include/scsi/scsi_device.h
+@@ -148,6 +148,7 @@ struct scsi_device {
+ unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */
+ unsigned last_sector_bug:1; /* do not use multisector accesses on
+ SD_LAST_BUGGY_SECTORS */
++ unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */
+ unsigned is_visible:1; /* is the device visible in sysfs */
+
+ DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
diff --git a/usb/usb-add-uas-driver.patch b/usb/usb-add-uas-driver.patch
index 77c6313c870283..5980c54ce0a9ef 100644
--- a/usb/usb-add-uas-driver.patch
+++ b/usb/usb-add-uas-driver.patch
@@ -25,7 +25,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/MAINTAINERS
+++ b/MAINTAINERS
-@@ -5908,6 +5908,14 @@ S: Maintained
+@@ -5916,6 +5916,14 @@ S: Maintained
F: Documentation/usb/acm.txt
F: drivers/usb/class/cdc-acm.*
diff --git a/usb/usb-do-not-print-eshutdown-message-if-usb-at-otg-device-mode.patch b/usb/usb-do-not-print-eshutdown-message-if-usb-at-otg-device-mode.patch
new file mode 100644
index 00000000000000..c317a6f5fb7a40
--- /dev/null
+++ b/usb/usb-do-not-print-eshutdown-message-if-usb-at-otg-device-mode.patch
@@ -0,0 +1,36 @@
+From linux-usb-owner@vger.kernel.org Wed Oct 6 13:37:13 2010
+From: Peter Chen <peter.chen@freescale.com>
+To: linux-usb@vger.kernel.org
+CC: Peter Chen <peter.chen@freescale.com>
+Subject: USB: do not print -ESHUTDOWN message if usb at otg device mode
+Date: Mon, 27 Sep 2010 16:43:25 +0800
+Message-ID: <1285577005-24081-1-git-send-email-peter.chen@freescale.com>
+
+From: Peter Chen <peter.chen@freescale.com>
+
+At otg device mode, the otg host resume should do no-op during
+system resume, otherwise, the otg device will be treated as a
+host for enumeration.
+
+So, the otg host driver returns -ESHUTDOWN if it detects the
+current usb mode is device mode. The host driver has to return
+-ESHUTDOWN, otherwise, the usb_hc_died will be called.
+
+Signed-off-by: Peter Chen <peter.chen@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/driver.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/core/driver.c
++++ b/drivers/usb/core/driver.c
+@@ -1337,7 +1337,7 @@ int usb_resume(struct device *dev, pm_me
+ /* Avoid PM error messages for devices disconnected while suspended
+ * as we'll display regular disconnect messages just a bit later.
+ */
+- if (status == -ENODEV)
++ if (status == -ENODEV || status == -ESHUTDOWN)
+ status = 0;
+ return status;
+ }
diff --git a/usb/usb-gadget-goku_udc-fix-error-path.patch b/usb/usb-gadget-goku_udc-fix-error-path.patch
new file mode 100644
index 00000000000000..9572c8a99d53e8
--- /dev/null
+++ b/usb/usb-gadget-goku_udc-fix-error-path.patch
@@ -0,0 +1,117 @@
+From linux-usb-owner@vger.kernel.org Wed Oct 6 13:25:09 2010
+Date: Tue, 5 Oct 2010 18:55:34 +0200
+From: Dan Carpenter <error27@gmail.com>
+To: Greg KH <gregkh@suse.de>
+Cc: Rahul Ruikar <rahul.ruikar@gmail.com>,
+ David Brownell <dbrownell@users.sourceforge.net>,
+ nm127@freemail.hu, linux-usb@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Subject: usb: gadget: goku_udc: Fix error path
+Message-ID: <20101005165534.GJ5692@bicker>
+Content-Disposition: inline
+
+This is based on an initial patch by Rahul Ruikar.
+
+The goku_remove() function can be called before device_register() so it
+can call device_unregister() improperly. Also if the call to
+device_register() fails we need to call put_device().
+
+As I was changing the error handling in goku_probe(), I noticed that
+the label was "done" but actually if the function succeeds we return
+earlier. I renamed the error path to "err" instead of "done."
+
+Reported-by: Rahul Ruikar <rahul.ruikar@gmail.com>
+Signed-off-by: Dan Carpenter <error27@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/goku_udc.c | 26 +++++++++++++++-----------
+ 1 file changed, 15 insertions(+), 11 deletions(-)
+
+--- a/drivers/usb/gadget/goku_udc.c
++++ b/drivers/usb/gadget/goku_udc.c
+@@ -1745,7 +1745,8 @@ static void goku_remove(struct pci_dev *
+ pci_resource_len (pdev, 0));
+ if (dev->enabled)
+ pci_disable_device(pdev);
+- device_unregister(&dev->gadget.dev);
++ if (dev->registered)
++ device_unregister(&dev->gadget.dev);
+
+ pci_set_drvdata(pdev, NULL);
+ dev->regs = NULL;
+@@ -1775,7 +1776,7 @@ static int goku_probe(struct pci_dev *pd
+ if (!pdev->irq) {
+ printk(KERN_ERR "Check PCI %s IRQ setup!\n", pci_name(pdev));
+ retval = -ENODEV;
+- goto done;
++ goto err;
+ }
+
+ /* alloc, and start init */
+@@ -1783,7 +1784,7 @@ static int goku_probe(struct pci_dev *pd
+ if (dev == NULL){
+ pr_debug("enomem %s\n", pci_name(pdev));
+ retval = -ENOMEM;
+- goto done;
++ goto err;
+ }
+
+ spin_lock_init(&dev->lock);
+@@ -1801,7 +1802,7 @@ static int goku_probe(struct pci_dev *pd
+ retval = pci_enable_device(pdev);
+ if (retval < 0) {
+ DBG(dev, "can't enable, %d\n", retval);
+- goto done;
++ goto err;
+ }
+ dev->enabled = 1;
+
+@@ -1810,7 +1811,7 @@ static int goku_probe(struct pci_dev *pd
+ if (!request_mem_region(resource, len, driver_name)) {
+ DBG(dev, "controller already in use\n");
+ retval = -EBUSY;
+- goto done;
++ goto err;
+ }
+ dev->got_region = 1;
+
+@@ -1818,7 +1819,7 @@ static int goku_probe(struct pci_dev *pd
+ if (base == NULL) {
+ DBG(dev, "can't map memory\n");
+ retval = -EFAULT;
+- goto done;
++ goto err;
+ }
+ dev->regs = (struct goku_udc_regs __iomem *) base;
+
+@@ -1834,7 +1835,7 @@ static int goku_probe(struct pci_dev *pd
+ driver_name, dev) != 0) {
+ DBG(dev, "request interrupt %d failed\n", pdev->irq);
+ retval = -EBUSY;
+- goto done;
++ goto err;
+ }
+ dev->got_irq = 1;
+ if (use_dma)
+@@ -1845,13 +1846,16 @@ static int goku_probe(struct pci_dev *pd
+ create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev);
+ #endif
+
+- /* done */
+ the_controller = dev;
+ retval = device_register(&dev->gadget.dev);
+- if (retval == 0)
+- return 0;
++ if (retval) {
++ put_device(&dev->gadget.dev);
++ goto err;
++ }
++ dev->registered = 1;
++ return 0;
+
+-done:
++err:
+ if (dev)
+ goku_remove (pdev);
+ return retval;
diff --git a/usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch b/usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch
index 712e90c8a2c824..8a825f1dc953ed 100644
--- a/usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch
+++ b/usb/usb-musb-gadget-fix-zlp-sending-in-musb_g_tx-v1.patch
@@ -37,7 +37,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
-@@ -522,40 +522,39 @@ void musb_g_tx(struct musb *musb, u8 epn
+@@ -477,40 +477,39 @@ void musb_g_tx(struct musb *musb, u8 epn
epnum, csr, musb_ep->dma->actual_len, request);
}
diff --git a/usb/usb-musb-gadget-kill-duplicate-code-in-musb_gadget_queue.patch b/usb/usb-musb-gadget-kill-duplicate-code-in-musb_gadget_queue.patch
deleted file mode 100644
index 58719014989f62..00000000000000
--- a/usb/usb-musb-gadget-kill-duplicate-code-in-musb_gadget_queue.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From linux-usb-owner@vger.kernel.org Tue Oct 5 13:30:26 2010
-From: Felipe Balbi <balbi@ti.com>
-To: Greg KH <greg@kroah.com>
-Cc: Linux USB Mailing List <linux-usb@vger.kernel.org>,
- Sergei Shtylyov <sshtylyov@ru.mvista.com>,
- Felipe Balbi <balbi@ti.com>
-Subject: usb: musb: gadget: kill duplicate code in musb_gadget_queue()
-Date: Fri, 24 Sep 2010 13:44:11 +0300
-Message-Id: <1285325055-1247-11-git-send-email-balbi@ti.com>
-
-From: Sergei Shtylyov <sshtylyov@ru.mvista.com>
-
-I've noticed that musb_gadget_queue() checks for '!req->buf' condition twice:
-in the second case the code is both duplicate and unreachable as the first
-check returns early.
-
-Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
-Signed-off-by: Felipe Balbi <balbi@ti.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
----
- drivers/usb/musb/musb_gadget.c | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/drivers/usb/musb/musb_gadget.c
-+++ b/drivers/usb/musb/musb_gadget.c
-@@ -1214,8 +1214,6 @@ static int musb_gadget_queue(struct usb_
-
- if (is_dma_capable() && musb_ep->dma)
- map_dma_buffer(request, musb);
-- else if (!req->buf)
-- return -ENODATA;
- else
- request->mapped = 0;
-
diff --git a/usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch b/usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch
index 685cd9b5d7ca55..b08eeb8763f2f3 100644
--- a/usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch
+++ b/usb/usb-musb-gadget-kill-unreachable-code-in-musb_g_rx.patch
@@ -24,7 +24,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
-@@ -834,7 +834,7 @@ void musb_g_rx(struct musb *musb, u8 epn
+@@ -775,7 +775,7 @@ void musb_g_rx(struct musb *musb, u8 epn
musb_writew(epio, MUSB_RXCSR, csr);
DBG(3, "%s iso overrun on %p\n", musb_ep->name, request);
@@ -33,7 +33,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
request->status = -EOVERFLOW;
}
if (csr & MUSB_RXCSR_INCOMPRX) {
-@@ -887,14 +887,8 @@ void musb_g_rx(struct musb *musb, u8 epn
+@@ -828,14 +828,8 @@ void musb_g_rx(struct musb *musb, u8 epn
return;
}
diff --git a/usb/usb-musb-gadget-only-enable-autoclear-in-double-buffered-case.patch b/usb/usb-musb-gadget-only-enable-autoclear-in-double-buffered-case.patch
index 4376a184cdc118..913896651078a3 100644
--- a/usb/usb-musb-gadget-only-enable-autoclear-in-double-buffered-case.patch
+++ b/usb/usb-musb-gadget-only-enable-autoclear-in-double-buffered-case.patch
@@ -28,7 +28,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
-@@ -689,7 +689,8 @@ static void rxstate(struct musb *musb, s
+@@ -644,7 +644,8 @@ static void rxstate(struct musb *musb, s
*/
csr |= MUSB_RXCSR_DMAENAB;
diff --git a/usb/usb-musb-gadget-unmapping-the-dma-buffer-when-switching-to-pio-mode.patch b/usb/usb-musb-gadget-unmapping-the-dma-buffer-when-switching-to-pio-mode.patch
deleted file mode 100644
index 2b44fc1afdcb62..00000000000000
--- a/usb/usb-musb-gadget-unmapping-the-dma-buffer-when-switching-to-pio-mode.patch
+++ /dev/null
@@ -1,190 +0,0 @@
-From balbi@ti.com Tue Oct 5 13:29:53 2010
-From: Felipe Balbi <balbi@ti.com>
-To: Greg KH <greg@kroah.com>
-Cc: Linux USB Mailing List <linux-usb@vger.kernel.org>,
- Hema HK <hemahk@ti.com>, Felipe Balbi <balbi@ti.com>
-Subject: usb: musb: gadget: Unmapping the dma buffer when switching to PIO mode
-Date: Fri, 24 Sep 2010 13:44:08 +0300
-Message-Id: <1285325055-1247-8-git-send-email-balbi@ti.com>
-
-From: Hema HK <hemahk@ti.com>
-
-Buffer is mapped to dma when dma channel is allocated. buffer needs
-to be unmapped when fallback to PIO mode if dma channel_program
-fails.
-
-Signed-off-by: Hema HK <hemahk@ti.com>
-Signed-off-by: Felipe Balbi <balbi@ti.com>
-Reviewed-by: Ming Lei <tom.leiming@gmail.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
----
- drivers/usb/musb/musb_gadget.c | 122 +++++++++++++++++++++++++++--------------
- 1 file changed, 82 insertions(+), 40 deletions(-)
-
---- a/drivers/usb/musb/musb_gadget.c
-+++ b/drivers/usb/musb/musb_gadget.c
-@@ -92,6 +92,60 @@
-
- /* ----------------------------------------------------------------------- */
-
-+/* Maps the buffer to dma */
-+
-+static inline void map_dma_buffer(struct musb_request *request,
-+ struct musb *musb)
-+{
-+ if (request->request.dma == DMA_ADDR_INVALID) {
-+ request->request.dma = dma_map_single(
-+ musb->controller,
-+ request->request.buf,
-+ request->request.length,
-+ request->tx
-+ ? DMA_TO_DEVICE
-+ : DMA_FROM_DEVICE);
-+ request->mapped = 1;
-+ } else {
-+ dma_sync_single_for_device(musb->controller,
-+ request->request.dma,
-+ request->request.length,
-+ request->tx
-+ ? DMA_TO_DEVICE
-+ : DMA_FROM_DEVICE);
-+ request->mapped = 0;
-+ }
-+}
-+
-+/* Unmap the buffer from dma and maps it back to cpu */
-+static inline void unmap_dma_buffer(struct musb_request *request,
-+ struct musb *musb)
-+{
-+ if (request->request.dma == DMA_ADDR_INVALID) {
-+ DBG(20, "not unmapping a never mapped buffer\n");
-+ return;
-+ }
-+
-+ if (request->mapped) {
-+ dma_unmap_single(musb->controller,
-+ request->request.dma,
-+ request->request.length,
-+ request->tx
-+ ? DMA_TO_DEVICE
-+ : DMA_FROM_DEVICE);
-+ request->request.dma = DMA_ADDR_INVALID;
-+ request->mapped = 0;
-+ } else {
-+ dma_sync_single_for_cpu(musb->controller,
-+ request->request.dma,
-+ request->request.length,
-+ request->tx
-+ ? DMA_TO_DEVICE
-+ : DMA_FROM_DEVICE);
-+
-+ }
-+}
-+
- /*
- * Immediately complete a request.
- *
-@@ -119,24 +173,8 @@ __acquires(ep->musb->lock)
-
- ep->busy = 1;
- spin_unlock(&musb->lock);
-- if (is_dma_capable()) {
-- if (req->mapped) {
-- dma_unmap_single(musb->controller,
-- req->request.dma,
-- req->request.length,
-- req->tx
-- ? DMA_TO_DEVICE
-- : DMA_FROM_DEVICE);
-- req->request.dma = DMA_ADDR_INVALID;
-- req->mapped = 0;
-- } else if (req->request.dma != DMA_ADDR_INVALID)
-- dma_sync_single_for_cpu(musb->controller,
-- req->request.dma,
-- req->request.length,
-- req->tx
-- ? DMA_TO_DEVICE
-- : DMA_FROM_DEVICE);
-- }
-+ if (is_dma_capable() && ep->dma)
-+ unmap_dma_buffer(req, musb);
- if (request->status == 0)
- DBG(5, "%s done request %p, %d/%d\n",
- ep->end_point.name, request,
-@@ -298,7 +336,7 @@ static void txstate(struct musb *musb, s
- csr);
-
- #ifndef CONFIG_MUSB_PIO_ONLY
-- if (is_dma_capable() && musb_ep->dma) {
-+ if (is_dma_capable() && !musb_ep->dma && musb->dma_controller) {
- struct dma_controller *c = musb->dma_controller;
- size_t request_size;
-
-@@ -395,6 +433,13 @@ static void txstate(struct musb *musb, s
- #endif
-
- if (!use_dma) {
-+ /*
-+ * Unmap the dma buffer back to cpu if dma channel
-+ * programming fails
-+ */
-+ if (is_dma_capable() && musb_ep->dma)
-+ unmap_dma_buffer(req, musb);
-+
- musb_write_fifo(musb_ep->hw_ep, fifo_count,
- (u8 *) (request->buf + request->actual));
- request->actual += fifo_count;
-@@ -711,6 +756,20 @@ static void rxstate(struct musb *musb, s
- return;
- }
- #endif
-+ /*
-+ * Unmap the dma buffer back to cpu if dma channel
-+ * programming fails. This buffer is mapped if the
-+ * channel allocation is successful
-+ */
-+ if (is_dma_capable() && musb_ep->dma) {
-+ unmap_dma_buffer(req, musb);
-+
-+ /* Clear DMAENAB for the
-+ * PIO mode transfer
-+ */
-+ csr &= ~MUSB_RXCSR_DMAENAB;
-+ musb_writew(epio, MUSB_RXCSR, csr);
-+ }
-
- musb_read_fifo(musb_ep->hw_ep, fifo_count, (u8 *)
- (request->buf + request->actual));
-@@ -1153,28 +1212,11 @@ static int musb_gadget_queue(struct usb_
- request->epnum = musb_ep->current_epnum;
- request->tx = musb_ep->is_in;
-
-- if (is_dma_capable() && musb_ep->dma) {
-- if (request->request.dma == DMA_ADDR_INVALID) {
-- request->request.dma = dma_map_single(
-- musb->controller,
-- request->request.buf,
-- request->request.length,
-- request->tx
-- ? DMA_TO_DEVICE
-- : DMA_FROM_DEVICE);
-- request->mapped = 1;
-- } else {
-- dma_sync_single_for_device(musb->controller,
-- request->request.dma,
-- request->request.length,
-- request->tx
-- ? DMA_TO_DEVICE
-- : DMA_FROM_DEVICE);
-- request->mapped = 0;
-- }
-- } else if (!req->buf) {
-+ if (is_dma_capable() && musb_ep->dma)
-+ map_dma_buffer(request, musb);
-+ else if (!req->buf)
- return -ENODATA;
-- } else
-+ else
- request->mapped = 0;
-
- spin_lock_irqsave(&musb->lock, lockflags);
diff --git a/usb/usb-storage-add-new-no_read_capacity_16-quirk.patch b/usb/usb-storage-add-new-no_read_capacity_16-quirk.patch
new file mode 100644
index 00000000000000..4d9a25da2c766e
--- /dev/null
+++ b/usb/usb-storage-add-new-no_read_capacity_16-quirk.patch
@@ -0,0 +1,67 @@
+From akpm@linux-foundation.org Wed Oct 6 13:36:21 2010
+Message-Id: <201010012120.o91LKBQp021410@imap1.linux-foundation.org>
+From: Hans de Goede <hdegoede@redhat.com>
+Subject: usb-storage: add new no_read_capacity_16 quirk
+To: greg@kroah.com
+Cc: linux-usb@vger.kernel.org, akpm@linux-foundation.org, hdegoede@redhat.com,
+ James.Bottomley@HansenPartnership.com, mdharm-usb@one-eyed-alien.net,
+ stern@rowland.harvard.edu
+Date: Fri, 01 Oct 2010 14:20:11 -0700
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+Some Rockbox based mp4 players will crash when ever they see a
+read_capacity_16 scsi command. So add a new US_FL which tells the scsi sd
+driver to not issue any read_capacity_16 scsi commands.
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/storage/scsiglue.c | 4 ++++
+ drivers/usb/storage/unusual_devs.h | 3 ++-
+ include/linux/usb_usual.h | 4 +++-
+ 3 files changed, 9 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/storage/scsiglue.c
++++ b/drivers/usb/storage/scsiglue.c
+@@ -209,6 +209,10 @@ static int slave_configure(struct scsi_d
+ if (us->fflags & US_FL_CAPACITY_HEURISTICS)
+ sdev->guess_capacity = 1;
+
++ /* Some devices cannot handle READ_CAPACITY_16 */
++ if (us->fflags & US_FL_NO_READ_CAPACITY_16)
++ sdev->no_read_capacity_16 = 1;
++
+ /* assume SPC3 or latter devices support sense size > 18 */
+ if (sdev->scsi_level > SCSI_SPC_2)
+ us->fflags |= US_FL_SANE_SENSE;
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -877,7 +877,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x
+ "RockChip",
+ "MP3",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+- US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64),
++ US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 |
++ US_FL_NO_READ_CAPACITY_16),
+
+ /* Reported by Jean-Baptiste Onofre <jb@nanthrax.net>
+ * Support the following product :
+--- a/include/linux/usb_usual.h
++++ b/include/linux/usb_usual.h
+@@ -60,7 +60,9 @@
+ US_FLAG(BAD_SENSE, 0x00020000) \
+ /* Bad Sense (never more than 18 bytes) */ \
+ US_FLAG(NO_READ_DISC_INFO, 0x00040000) \
+- /* cannot handle READ_DISC_INFO */
++ /* cannot handle READ_DISC_INFO */ \
++ US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \
++ /* cannot handle READ_CAPACITY_16 */
+
+ #define US_FLAG(name, value) US_FL_##name = value ,
+ enum { US_DO_ALL_FLAGS };
diff --git a/usb/usb-storage-add-new-no_read_disc_info-quirk.patch b/usb/usb-storage-add-new-no_read_disc_info-quirk.patch
new file mode 100644
index 00000000000000..77dbd5499dde74
--- /dev/null
+++ b/usb/usb-storage-add-new-no_read_disc_info-quirk.patch
@@ -0,0 +1,71 @@
+From linux-usb-owner@vger.kernel.org Wed Oct 6 13:35:39 2010
+Message-Id: <201010012120.o91LKASf021404@imap1.linux-foundation.org>
+From: Hans de Goede <hdegoede@redhat.com>
+Subject: usb-storage: add new no_read_disc_info quirk
+To: greg@kroah.com
+Cc: linux-usb@vger.kernel.org, akpm@linux-foundation.org,
+ hdegoede@redhat.com, James.Bottomley@HansenPartnership.com,
+ mdharm-usb@one-eyed-alien.net, stern@rowland.harvard.edu
+Date: Fri, 01 Oct 2010 14:20:10 -0700
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+Appotech ax3003 (the larger brother of the ax203) based devices are even
+more buggy then the ax203. They will go of into lala land when ever they
+see a READ_DISC_INFO scsi command. So add a new US_FL which tells the
+scsi sr driver to not issue any READ_DISC_INFO scsi commands.
+
+[akpm@linux-foundation.org: fix build]
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/storage/scsiglue.c | 4 ++++
+ drivers/usb/storage/unusual_devs.h | 5 +++++
+ include/linux/usb_usual.h | 4 +++-
+ 3 files changed, 12 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/storage/scsiglue.c
++++ b/drivers/usb/storage/scsiglue.c
+@@ -253,6 +253,10 @@ static int slave_configure(struct scsi_d
+ * or to force 192-byte transfer lengths for MODE SENSE.
+ * But they do need to use MODE SENSE(10). */
+ sdev->use_10_for_ms = 1;
++
++ /* Some (fake) usb cdrom devices don't like READ_DISC_INFO */
++ if (us->fflags & US_FL_NO_READ_DISC_INFO)
++ sdev->no_read_disc_info = 1;
+ }
+
+ /* The CB and CBI transports have no way to pass LUN values
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1858,6 +1858,11 @@ UNUSUAL_DEV( 0x1908, 0x1320, 0x0000, 0x0
+ "Photo Frame",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_BAD_SENSE ),
++UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
++ "BUILDWIN",
++ "Photo Frame",
++ US_SC_DEVICE, US_PR_DEVICE, NULL,
++ US_FL_NO_READ_DISC_INFO ),
+
+ UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
+ "ST",
+--- a/include/linux/usb_usual.h
++++ b/include/linux/usb_usual.h
+@@ -58,7 +58,9 @@
+ US_FLAG(CAPACITY_OK, 0x00010000) \
+ /* READ CAPACITY response is correct */ \
+ US_FLAG(BAD_SENSE, 0x00020000) \
+- /* Bad Sense (never more than 18 bytes) */
++ /* Bad Sense (never more than 18 bytes) */ \
++ US_FLAG(NO_READ_DISC_INFO, 0x00040000) \
++ /* cannot handle READ_DISC_INFO */
+
+ #define US_FLAG(name, value) US_FL_##name = value ,
+ enum { US_DO_ALL_FLAGS };
diff --git a/usb/usb-usbtest-support-gadget-zero-isochronous-configurations.patch b/usb/usb-usbtest-support-gadget-zero-isochronous-configurations.patch
new file mode 100644
index 00000000000000..99e41f3748016d
--- /dev/null
+++ b/usb/usb-usbtest-support-gadget-zero-isochronous-configurations.patch
@@ -0,0 +1,31 @@
+From mfuzzey@gmail.com Wed Oct 6 13:39:37 2010
+From: Martin Fuzzey <mfuzzey@gmail.com>
+Subject: USB: usbtest: Support gadget zero isochronous configurations
+To: Greg KH <greg@kroah.com>
+Cc: linux-usb@vger.kernel.org
+Date: Wed, 06 Oct 2010 17:43:46 +0200
+Message-ID: <20101006154346.26831.55484.stgit@srv002.fuzzey.net>
+
+Gadget zero now provides isochronous endpoints via f_iso;
+add support for this to usbtest.
+
+Signed-off-by: Martin Fuzzey <mfuzzey@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/misc/usbtest.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/misc/usbtest.c
++++ b/drivers/usb/misc/usbtest.c
+@@ -2083,7 +2083,8 @@ static struct usbtest_info gz_info = {
+ .name = "Linux gadget zero",
+ .autoconf = 1,
+ .ctrl_out = 1,
+- .alt = 0,
++ .alt = -1,
++ .iso = 1,
+ };
+
+ static struct usbtest_info um_info = {