diff options
27 files changed, 1556 insertions, 231 deletions
@@ -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 = { |
