<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.linux.serial">
    <title>gmane.linux.serial</title>
    <link>http://blog.gmane.org/gmane.linux.serial</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11856"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11819"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11696"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11686"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11587"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11567"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11563"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11558"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11555"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11552"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11547"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11535"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11534"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11533"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11525"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11524"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11523"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11521"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11520"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.serial/11517"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11856">
    <title>(unknown)</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11856</link>
    <description>&lt;pre&gt;


Loan Syndicacion

Am AFG Guaranty Trust Bank, zu strukturieren wir Kreditlinien treffen Sie
unsere
Kunden spezifischen geschäftlichen Anforderungen und einen deutlichen
Mehrwert für unsere
Kunden Unternehmen.
eine Division der AFG Finance und Private Bank plc.

Wenn Sie erwägen, eine große Akquisition oder ein Großprojekt sind, können
Sie
brauchen eine erhebliche Menge an Kredit. AFG Guaranty Trust Bank setzen
können
zusammen das Syndikat, das die gesamte Kredit schnürt für
Sie.


Als Bank mit internationaler Reichweite, sind wir gekommen, um Darlehen zu
identifizieren
Syndizierungen als Teil unseres Kerngeschäfts und durch spitzte diese Zeile
aggressiv sind wir an einem Punkt, wo wir kommen, um als erkannt haben
Hauptakteur in diesem Bereich.


öffnen Sie ein Girokonto heute mit einem Minimum Bankguthaben von 500 £ und
Getup zu £ 10.000 als Darlehen und auch den Hauch einer Chance und gewann
die Sterne
Preis von £ 500.000 in die sparen und gewinnen promo in may.aply jetzt.


mit dem Folowing Informationen über Rechtsanwalt steven lee das Konto
Offizier.


FULL NAME;


Wohnadresse;


E-MAIL-ADRESSE;

Telefonnummer;

Nächsten KINS;

MUTTER MAIDEN NAME;


Familienstand;


BÜROADRESSE;

ALTERNATIVE Telefonnummer;

TO &amp;lt; at &amp;gt; yahoo.com bar.stevenlee
NOTE; ALLE Darlehen sind für 10JAHRE RATE VALID
ANGEBOT ENDET BALD SO JETZT HURRY

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo&amp;lt; at &amp;gt;vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>AFG GTBANK LOAN</dc:creator>
    <dc:date>2013-06-17T19:28:00</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11819">
    <title>[PATCH 0/2] serial: sh-sci: HSCIF support</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11819</link>
    <description>&lt;pre&gt;Hi Greg, Hi All,

this short series adds HSCIF support to the sh-sci driver
and enhances the r8a7790 SoC to not use external clocks for SCIF.

I have included these two patches in a single series as the second
patch has a build-time dependency on the first.

Greg, would it be possible for you to review at least the first patch and
if it is ok either:
* Ack the first patch so I can merge it through the renesas tree or;
* Take both patches, I have supplied Acks.

In the case of the latter I can supply a pull request if you like.

Ulrich Hecht (2):
  serial: sh-sci: HSCIF support
  ARM: shmobile: r8a7790: don't use external clock for SCIFs

 arch/arm/mach-shmobile/setup-r8a7790.c |   16 ++++-
 drivers/tty/serial/sh-sci.c            |  102 +++++++++++++++++++++++++++++---
 include/linux/serial_sci.h             |   12 +++-
 include/uapi/linux/serial_core.h       |    3 +
 4 files changed, 120 insertions(+), 13 deletions(-)

&lt;/pre&gt;</description>
    <dc:creator>Simon Horman</dc:creator>
    <dc:date>2013-06-17T02:42:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11696">
    <title>[PATCH] serial: mfd: Add sysrq support</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11696</link>
    <description>&lt;pre&gt;When using MFD HSU based console, sometime we need the sysrq function
to help debugging kernel. The sysrq code is basically there, this
patch just simply enable it.

Signed-off-by: Feng Tang &amp;lt;feng.tang&amp;lt; at &amp;gt;intel.com&amp;gt;
---
 drivers/tty/serial/mfd.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/tty/serial/mfd.c b/drivers/tty/serial/mfd.c
index 5f4765a..e266eca 100644
--- a/drivers/tty/serial/mfd.c
+++ b/drivers/tty/serial/mfd.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,6 +21,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  *    be triggered
  */
 
+#if defined(CONFIG_SERIAL_MFD_HSU_CONSOLE) &amp;amp;&amp;amp; defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
 #include &amp;lt;linux/module.h&amp;gt;
 #include &amp;lt;linux/init.h&amp;gt;
 #include &amp;lt;linux/console.h&amp;gt;
&lt;/pre&gt;</description>
    <dc:creator>Feng Tang</dc:creator>
    <dc:date>2013-06-14T10:11:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11686">
    <title>API to flush rx fifo?</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11686</link>
    <description>&lt;pre&gt;I see the uart_ops.flush_buffer method which is used to flush the
UART's tx fifo (presumably when the user calls tcflush(TCOFLUSH)).

How does the rx fifo get flushed when the user calls tcflush(TCIFLUSH)?

&lt;/pre&gt;</description>
    <dc:creator>Grant Edwards</dc:creator>
    <dc:date>2013-06-12T20:03:50</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11587">
    <title>[GIT PATCH] TTY/Serial fixes for 3.10-rc5</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11587</link>
    <description>&lt;pre&gt;The following changes since commit e4aa937ec75df0eea0bee03bffa3303ad36c986b:

  Linux 3.10-rc3 (2013-05-26 16:00:47 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git/ tags/tty-3.10-rc4

for you to fetch changes up to 317a68427d4b0a302ecff252fd83a00557947db8:

  Revert "serial: 8250: Make SERIAL_8250_RUNTIME_UARTS work correctly" (2013-06-03 10:08:28 -0700)

----------------------------------------------------------------
TTY/Serial driver fixes for 3.10-rc4

Here are some small bugfixes, and one revert, of serial driver issues
that have been reported.

Signed-off-by: Greg Kroah-Hartman &amp;lt;gregkh&amp;lt; at &amp;gt;linuxfoundation.org&amp;gt;

----------------------------------------------------------------
Chander Kashyap (1):
      serial: samsung: enable clock before clearing pending interrupts during init

Kyle McMartin (1):
      Revert "serial: 8250: Make SERIAL_8250_RUNTIME_UARTS work correctly"

Lucas Stach (1):
      serial/imx: disable hardware flow control at startup

 drivers/tty/serial/8250/8250_core.c | 14 +++++++-------
 drivers/tty/serial/imx.c            |  2 ++
 drivers/tty/serial/samsung.c        | 13 +++++++++++++
 3 files changed, 22 insertions(+), 7 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo&amp;lt; at &amp;gt;vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>Greg KH</dc:creator>
    <dc:date>2013-06-06T17:58:05</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11567">
    <title>[PATCH 01/13] ARM: Exynos: initialize l2x0 cache controller only for cortex-a9 based SoCs</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11567</link>
    <description>&lt;pre&gt;Only cortex-a9 based Exynos SoCs have l2x0 cache controller. Hence instead of
checking for every SoC with soc_is_xxx, just check for cpu part number and
initialize the cache controller for cortex-a9 based SoCs.

Signed-off-by: Chander Kashyap &amp;lt;chander.kashyap&amp;lt; at &amp;gt;linaro.org&amp;gt;
---
 arch/arm/mach-exynos/common.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 8ce2db4..bad000e 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +35,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include &amp;lt;asm/mach/map.h&amp;gt;
 #include &amp;lt;asm/mach/irq.h&amp;gt;
 #include &amp;lt;asm/cacheflush.h&amp;gt;
+#include &amp;lt;asm/cputype.h&amp;gt;
 
 #include &amp;lt;mach/regs-irq.h&amp;gt;
 #include &amp;lt;mach/regs-pmu.h&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -520,7 +521,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __init exynos4_l2x0_cache_init(void)
 {
 int ret;
 
-if (soc_is_exynos5250() || soc_is_exynos5440())
+if (read_cpuid_part_number() != ARM_CPU_PART_CORTEX_A9)
 return 0;
 
 ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK);
&lt;/pre&gt;</description>
    <dc:creator>Chander Kashyap</dc:creator>
    <dc:date>2013-06-06T11:01:15</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11563">
    <title>[PATCH] tty/serial/sirf: fix error propagation in sirfsoc_uart_probe()</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11563</link>
    <description>&lt;pre&gt;If pinctrl_get_select_default() fails, sirfsoc_uart_probe()
returns IS_ERR(result) instead of PTR_ERR(result).

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov &amp;lt;khoroshilov&amp;lt; at &amp;gt;ispras.ru&amp;gt;
---
 drivers/tty/serial/sirfsoc_uart.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/sirfsoc_uart.c b/drivers/tty/serial/sirfsoc_uart.c
index 03465b6..1fd564b 100644
--- a/drivers/tty/serial/sirfsoc_uart.c
+++ b/drivers/tty/serial/sirfsoc_uart.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -687,9 +687,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int sirfsoc_uart_probe(struct platform_device *pdev)
 
 if (sirfport-&amp;gt;hw_flow_ctrl) {
 sirfport-&amp;gt;p = pinctrl_get_select_default(&amp;amp;pdev-&amp;gt;dev);
-ret = IS_ERR(sirfport-&amp;gt;p);
-if (ret)
+if (IS_ERR(sirfport-&amp;gt;p)) {
+ret = PTR_ERR(sirfport-&amp;gt;p);
 goto err;
+}
 }
 
 sirfport-&amp;gt;clk = clk_get(&amp;amp;pdev-&amp;gt;dev, NULL);
&lt;/pre&gt;</description>
    <dc:creator>Alexey Khoroshilov</dc:creator>
    <dc:date>2013-06-05T21:28:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11558">
    <title>[PATCH v3 1/3] serial: imx: Fix warning when !CONFIG_SERIAL_IMX_CONSOLE</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11558</link>
    <description>&lt;pre&gt;From: Fabio Estevam &amp;lt;fabio.estevam&amp;lt; at &amp;gt;freescale.com&amp;gt;

When CONFIG_SERIAL_IMX_CONSOLE is not selected the following build warnings
appear:

drivers/tty/serial/imx.c:274:13: warning: 'imx_port_ucrs_save' defined but not used [-Wunused-function]
drivers/tty/serial/imx.c:283:13: warning: 'imx_port_ucrs_restore' defined but not used [-Wunused-function]

imx_port_ucrs_save() and imx_port_ucrs_restore() are only used when 
CONFIG_CONSOLE_POLL or CONFIG_SERIAL_IMX_CONSOLE are selected, so protect these
functions declaration with a proper ifdef.

Signed-off-by: Fabio Estevam &amp;lt;fabio.estevam&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
Changes since v2:
- Do the same as in v1
 drivers/tty/serial/imx.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index a07e94f..981749f 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -272,6 +272,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline int is_imx21_uart(struct imx_port *sport)
 /*
  * Save and restore functions for UCR1, UCR2 and UCR3 registers
  */
+#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_IMX_CONSOLE)
 static void imx_port_ucrs_save(struct uart_port *port,
        struct imx_port_ucrs *ucr)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -289,6 +290,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void imx_port_ucrs_restore(struct uart_port *port,
 writel(ucr-&amp;gt;ucr2, port-&amp;gt;membase + UCR2);
 writel(ucr-&amp;gt;ucr3, port-&amp;gt;membase + UCR3);
 }
+#endif
 
 /*
  * Handle any change of modem status signal since we were last called.
&lt;/pre&gt;</description>
    <dc:creator>Fabio Estevam</dc:creator>
    <dc:date>2013-06-05T03:58:46</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11555">
    <title>[PATCH -next] serial: omap: fix potential NULL pointer dereference in serial_omap_runtime_suspend()</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11555</link>
    <description>&lt;pre&gt;From: Wei Yongjun &amp;lt;yongjun_wei&amp;lt; at &amp;gt;trendmicro.com.cn&amp;gt;

The dereference to 'up' should be moved below the NULL test.
Introduced by commit ddd85e225c8885b5e4419b0499ab27100e7c366a
(serial: omap: prevent runtime PM for "no_console_suspend")

Signed-off-by: Wei Yongjun &amp;lt;yongjun_wei&amp;lt; at &amp;gt;trendmicro.com.cn&amp;gt;
---
 drivers/tty/serial/omap-serial.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 1aaeca8..156b5aa 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1613,6 +1613,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int serial_omap_runtime_suspend(struct device *dev)
 struct uart_omap_port *up = dev_get_drvdata(dev);
 struct omap_uart_port_info *pdata = dev-&amp;gt;platform_data;
 
+if (!up)
+return -EINVAL;
+
 /*
 * When using 'no_console_suspend', the console UART must not be
 * suspended. Since driver suspend is managed by runtime suspend,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1623,9 +1626,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int serial_omap_runtime_suspend(struct device *dev)
     uart_console(&amp;amp;up-&amp;gt;port))
 return -EBUSY;
 
-if (!up)
-return -EINVAL;
-
 if (!pdata)
 return 0;
 

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo&amp;lt; at &amp;gt;vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>Wei Yongjun</dc:creator>
    <dc:date>2013-06-05T02:04:49</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11552">
    <title>[PATCH v2 1/2] serial: imx: Remove SERIAL_IMX_CONSOLE</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11552</link>
    <description>&lt;pre&gt;When CONFIG_SERIAL_IMX_CONSOLE is not selected the following build warnings
appear:

drivers/tty/serial/imx.c:274:13: warning: 'imx_port_ucrs_save' defined but not used [-Wunused-function]
drivers/tty/serial/imx.c:283:13: warning: 'imx_port_ucrs_restore' defined but not used [-Wunused-function]

Instead of fixing the warning by protecting mx_port_ucrs_save() and 
imx_port_ucrs_restore() with an "ifdef", let's get rid of the SERIAL_IMX_CONSOLE
option and make the console support always present.

While at it, change the CPU vendor name to Freescale. 

Suggested-by: Sascha Hauer &amp;lt;s.hauer&amp;lt; at &amp;gt;pengutronix.de&amp;gt;
Signed-off-by: Fabio Estevam &amp;lt;fabio.estevam&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
Changes since v1:
- Fix the warning by removing SERIAL_IMX_CONSOLE

 drivers/tty/serial/Kconfig | 18 ++----------------
 drivers/tty/serial/imx.c   | 10 ++--------
 2 files changed, 4 insertions(+), 24 deletions(-)

diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 7e7006f..a9ae1cd 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -554,26 +554,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; config SERIAL_IMX
 bool "IMX serial port support"
 depends on ARCH_MXC
 select SERIAL_CORE
+select SERIAL_CORE_CONSOLE
 select RATIONAL
 help
-  If you have a machine based on a Motorola IMX CPU you
+  If you have a machine based on a Freescale IMX CPU you
   can enable its onboard serial port by enabling this option.
 
-config SERIAL_IMX_CONSOLE
-bool "Console on IMX serial port"
-depends on SERIAL_IMX
-select SERIAL_CORE_CONSOLE
-help
-  If you have enabled the serial port on the Motorola IMX
-  CPU you can make it the console by answering Y to this option.
-
-  Even if you say Y here, the currently visible virtual console
-  (/dev/tty0) will still be used as the system console by default, but
-  you can alter that using a kernel command line option such as
-  "console=ttySA0". (Try "man bootparam" or see the documentation of
-  your boot loader (lilo or loadlin) about how to pass options to the
-  kernel at boot time.)
-
 config SERIAL_UARTLITE
 tristate "Xilinx uartlite serial port support"
 depends on PPC32 || MICROBLAZE || MFD_TIMBERDALE
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index a07e94f..d0fcd5e 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -27,7 +27,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  * Added hardware handshake
  */
 
-#if defined(CONFIG_SERIAL_IMX_CONSOLE) &amp;amp;&amp;amp; defined(CONFIG_MAGIC_SYSRQ)
+#if defined(CONFIG_MAGIC_SYSRQ)
 #define SUPPORT_SYSRQ
 #endif
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1211,7 +1211,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct uart_ops imx_pops = {
 
 static struct imx_port *imx_ports[UART_NR];
 
-#ifdef CONFIG_SERIAL_IMX_CONSOLE
 static void imx_console_putchar(struct uart_port *port, int ch)
 {
 struct imx_port *sport = (struct imx_port *)port;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1374,11 +1373,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct console imx_console = {
 .data= &amp;amp;imx_reg,
 };
 
-#define IMX_CONSOLE&amp;amp;imx_console
-#else
-#define IMX_CONSOLENULL
-#endif
-
 static struct uart_driver imx_reg = {
 .owner          = THIS_MODULE,
 .driver_name    = DRIVER_NAME,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1386,7 +1380,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct uart_driver imx_reg = {
 .major          = SERIAL_IMX_MAJOR,
 .minor          = MINOR_START,
 .nr             = ARRAY_SIZE(imx_ports),
-.cons           = IMX_CONSOLE,
+.cons           = &amp;amp;imx_console,
 };
 
 static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
&lt;/pre&gt;</description>
    <dc:creator>Fabio Estevam</dc:creator>
    <dc:date>2013-06-04T17:08:37</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11547">
    <title>[PATCH] tty: serial: Enable uartlite for ARM zynq</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11547</link>
    <description>&lt;pre&gt;Enable it in Kconfig.

Signed-off-by: Michal Simek &amp;lt;michal.simek&amp;lt; at &amp;gt;xilinx.com&amp;gt;
---
 drivers/tty/serial/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 7e7006f..64250b1 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -576,7 +576,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; config SERIAL_IMX_CONSOLE

 config SERIAL_UARTLITE
 tristate "Xilinx uartlite serial port support"
-depends on PPC32 || MICROBLAZE || MFD_TIMBERDALE
+depends on PPC32 || MICROBLAZE || MFD_TIMBERDALE || ARCH_ZYNQ
 select SERIAL_CORE
 help
   Say Y here if you want to use the Xilinx uartlite serial controller.
--
1.8.2.3

&lt;/pre&gt;</description>
    <dc:creator>Michal Simek</dc:creator>
    <dc:date>2013-06-04T12:20:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11535">
    <title>[PATCH 1/3] serial: imx: Fix warning when !CONFIG_SERIAL_IMX_CONSOLE</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11535</link>
    <description>&lt;pre&gt;From: Fabio Estevam &amp;lt;fabio.estevam&amp;lt; at &amp;gt;freescale.com&amp;gt;

When CONFIG_SERIAL_IMX_CONSOLE is not selected the following build warnings
appear:

drivers/tty/serial/imx.c:274:13: warning: 'imx_port_ucrs_save' defined but not used [-Wunused-function]
drivers/tty/serial/imx.c:283:13: warning: 'imx_port_ucrs_restore' defined but not used [-Wunused-function]

imx_port_ucrs_save() and imx_port_ucrs_restore() are only used when 
CONFIG_CONSOLE_POLL or CONFIG_SERIAL_IMX_CONSOLE are selected, so protect these
functions declaration with a proper ifdef.

Signed-off-by: Fabio Estevam &amp;lt;fabio.estevam&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
 drivers/tty/serial/imx.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 72bc1db..90eba78 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -271,6 +271,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline int is_imx21_uart(struct imx_port *sport)
 /*
  * Save and restore functions for UCR1, UCR2 and UCR3 registers
  */
+#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_IMX_CONSOLE)
 static void imx_port_ucrs_save(struct uart_port *port,
        struct imx_port_ucrs *ucr)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -288,6 +289,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void imx_port_ucrs_restore(struct uart_port *port,
 writel(ucr-&amp;gt;ucr2, port-&amp;gt;membase + UCR2);
 writel(ucr-&amp;gt;ucr3, port-&amp;gt;membase + UCR3);
 }
+#endif
 
 /*
  * Handle any change of modem status signal since we were last called.
&lt;/pre&gt;</description>
    <dc:creator>Fabio Estevam</dc:creator>
    <dc:date>2013-06-04T02:51:46</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11534">
    <title>[PATCH V2] serial: imx: enable the clocks only when the uart is used</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11534</link>
    <description>&lt;pre&gt;Current code opens the clocks when the uart driver is probed.
This will wastes some power if several uarts are enabled, but not really
used.

So close these clocks for uart, and enable the clocks only when
the uart is used.

Signed-off-by: Huang Shijie &amp;lt;b32955&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
v1 --&amp;gt; v2:
check the return value of clk_prepare_enable().
---
 drivers/tty/serial/imx.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 72bc1db..7cc4810 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -699,6 +699,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int imx_startup(struct uart_port *port)
 int retval;
 unsigned long flags, temp;
 
+retval = clk_prepare_enable(sport-&amp;gt;clk_per);
+if (retval)
+goto error_out1;
+
+retval = clk_prepare_enable(sport-&amp;gt;clk_ipg);
+if (retval)
+goto error_out1;
+
 imx_setup_ufcr(sport, 0);
 
 /* disable the DREN bit (Data Ready interrupt enable) before
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -884,6 +892,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void imx_shutdown(struct uart_port *port)
 
 writel(temp, sport-&amp;gt;port.membase + UCR1);
 spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+clk_disable_unprepare(sport-&amp;gt;clk_per);
+clk_disable_unprepare(sport-&amp;gt;clk_ipg);
 }
 
 static void
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1557,6 +1568,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int serial_imx_probe(struct platform_device *pdev)
 goto deinit;
 platform_set_drvdata(pdev, sport);
 
+clk_disable_unprepare(sport-&amp;gt;clk_per);
+clk_disable_unprepare(sport-&amp;gt;clk_ipg);
+
 return 0;
 deinit:
 if (pdata &amp;amp;&amp;amp; pdata-&amp;gt;exit)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1578,9 +1592,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int serial_imx_remove(struct platform_device *pdev)
 
 uart_remove_one_port(&amp;amp;imx_reg, &amp;amp;sport-&amp;gt;port);
 
-clk_disable_unprepare(sport-&amp;gt;clk_per);
-clk_disable_unprepare(sport-&amp;gt;clk_ipg);
-
 if (pdata &amp;amp;&amp;amp; pdata-&amp;gt;exit)
 pdata-&amp;gt;exit(pdev);
 
&lt;/pre&gt;</description>
    <dc:creator>Huang Shijie</dc:creator>
    <dc:date>2013-06-04T01:59:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11533">
    <title>[PATCH v6] tty: serial: add Freescale lpuart driver support</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11533</link>
    <description>&lt;pre&gt;Add Freescale lpuart driver support. The lpuart device
can be found on Vybrid VF610 and Layerscape LS-1 SoCs.

Signed-off-by: Jingchang Lu &amp;lt;b35083&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
changes in v6:
  Enable being built as a module support.

changes in v5:
 Coding style fix, remove redundant code.
 Checking clk_prepare_enable return value.
 Using devm_ioremap_resource instead of devm_request_and_ioremap.

changes in v4:
 Change Vybrid VF610 SoC compatible string to "fsl,vf610-lpuart"

changes in v3:
 Use general driver name lpuart instead of mvf for further share between SoCs.
 Add bind doc in Documentation/devicetree/bindings/tty/serial.
 Remove unused #include header lines and clean up code.

changes in v2:
 Remove unused variables and clean up the code.

 .../devicetree/bindings/tty/serial/fsl-lpuart.txt  |  14 +
 drivers/tty/serial/Kconfig                         |  14 +
 drivers/tty/serial/Makefile                        |   1 +
 drivers/tty/serial/fsl_lpuart.c                    | 873 +++++++++++++++++++++
 include/uapi/linux/serial_core.h                   |   3 +
 5 files changed, 905 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
 create mode 100644 drivers/tty/serial/fsl_lpuart.c

diff --git a/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt b/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
new file mode 100644
index 0000000..6fd1dd1
--- /dev/null
+++ b/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+* Freescale low power universal asynchronous receiver/transmitter (lpuart)
+
+Required properties:
+- compatible : Should be "fsl,&amp;lt;soc&amp;gt;-lpuart"
+- reg : Address and length of the register set for the device
+- interrupts : Should contain uart interrupt
+
+Example:
+
+uart0: serial&amp;lt; at &amp;gt;40027000 {
+       compatible = "fsl,vf610-lpuart";
+       reg = &amp;lt;0x40027000 0x1000&amp;gt;;
+       interrupts = &amp;lt;0 61 0x00&amp;gt;;
+       };
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 7e7006f..8b756a8 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1484,6 +1484,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; config SERIAL_RP2_NR_UARTS
   If multiple cards are present, the default limit of 32 ports may
   need to be increased.
 
+config SERIAL_FSL_LPUART
+tristate "Freescale lpuart serial port support"
+select SERIAL_CORE
+help
+  Support for the on-chip lpuart on some Freescale SOCs.
+
+config SERIAL_FSL_LPUART_CONSOLE
+bool "Console on Freescale lpuart serial port"
+depends on SERIAL_FSL_LPUART=y
+select SERIAL_CORE_CONSOLE
+help
+  If you have enabled the lpuart serial port on the Freescale SoCs,
+  you can make it the console by answering Y to this option.
+
 endmenu
 
 endif # TTY
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile
index eedfec4..cf650f0 100644
--- a/drivers/tty/serial/Makefile
+++ b/drivers/tty/serial/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,3 +85,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; obj-$(CONFIG_SERIAL_AR933X)   += ar933x_uart.o
 obj-$(CONFIG_SERIAL_EFM32_UART) += efm32-uart.o
 obj-$(CONFIG_SERIAL_ARC)+= arc_uart.o
 obj-$(CONFIG_SERIAL_RP2)+= rp2.o
+obj-$(CONFIG_SERIAL_FSL_LPUART)+= fsl_lpuart.o
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
new file mode 100644
index 0000000..267718c
--- /dev/null
+++ b/drivers/tty/serial/fsl_lpuart.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,873 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ *  Freescale lpuart serial port driver
+ *
+ *  Copyright 2012-2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#if defined(CONFIG_SERIAL_FSL_LPUART_CONSOLE) &amp;amp;&amp;amp; defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include &amp;lt;linux/module.h&amp;gt;
+#include &amp;lt;linux/io.h&amp;gt;
+#include &amp;lt;linux/irq.h&amp;gt;
+#include &amp;lt;linux/clk.h&amp;gt;
+#include &amp;lt;linux/of_device.h&amp;gt;
+#include &amp;lt;linux/console.h&amp;gt;
+#include &amp;lt;linux/serial_core.h&amp;gt;
+#include &amp;lt;linux/tty_flip.h&amp;gt;
+
+/* All registers are 8-bit width */
+#define UARTBDH0x00
+#define UARTBDL0x01
+#define UARTCR10x02
+#define UARTCR20x03
+#define UARTSR10x04
+#define UARTCR30x06
+#define UARTDR0x07
+#define UARTCR40x0a
+#define UARTCR50x0b
+#define UARTMODEM0x0d
+#define UARTPFIFO0x10
+#define UARTCFIFO0x11
+#define UARTSFIFO0x12
+#define UARTTWFIFO0x13
+#define UARTTCFIFO0x14
+#define UARTRWFIFO0x15
+
+#define UARTBDH_LBKDIE0x80
+#define UARTBDH_RXEDGIE0x40
+#define UARTBDH_SBR_MASK0x1f
+
+#define UARTCR1_LOOPS0x80
+#define UARTCR1_RSRC0x20
+#define UARTCR1_M0x10
+#define UARTCR1_WAKE0x08
+#define UARTCR1_ILT0x04
+#define UARTCR1_PE0x02
+#define UARTCR1_PT0x01
+
+#define UARTCR2_TIE0x80
+#define UARTCR2_TCIE0x40
+#define UARTCR2_RIE0x20
+#define UARTCR2_ILIE0x10
+#define UARTCR2_TE0x08
+#define UARTCR2_RE0x04
+#define UARTCR2_RWU0x02
+#define UARTCR2_SBK0x01
+
+#define UARTSR1_TDRE0x80
+#define UARTSR1_TC0x40
+#define UARTSR1_RDRF0x20
+#define UARTSR1_IDLE0x10
+#define UARTSR1_OR0x08
+#define UARTSR1_NF0x04
+#define UARTSR1_FE0x02
+#define UARTSR1_PE0x01
+
+#define UARTCR3_R80x80
+#define UARTCR3_T80x40
+#define UARTCR3_TXDIR0x20
+#define UARTCR3_TXINV0x10
+#define UARTCR3_ORIE0x08
+#define UARTCR3_NEIE0x04
+#define UARTCR3_FEIE0x02
+#define UARTCR3_PEIE0x01
+
+#define UARTCR4_MAEN10x80
+#define UARTCR4_MAEN20x40
+#define UARTCR4_M100x20
+#define UARTCR4_BRFA_MASK0x1f
+#define UARTCR4_BRFA_OFF0
+
+#define UARTCR5_TDMAS0x80
+#define UARTCR5_RDMAS0x20
+
+#define UARTMODEM_RXRTSE0x08
+#define UARTMODEM_TXRTSPOL0x04
+#define UARTMODEM_TXRTSE0x02
+#define UARTMODEM_TXCTSE0x01
+
+#define UARTPFIFO_TXFE0x80
+#define UARTPFIFO_FIFOSIZE_MASK0x7
+#define UARTPFIFO_TXSIZE_OFF4
+#define UARTPFIFO_RXFE0x08
+#define UARTPFIFO_RXSIZE_OFF0
+
+#define UARTCFIFO_TXFLUSH0x80
+#define UARTCFIFO_RXFLUSH0x40
+#define UARTCFIFO_RXOFE0x04
+#define UARTCFIFO_TXOFE0x02
+#define UARTCFIFO_RXUFE0x01
+
+#define UARTSFIFO_TXEMPT0x80
+#define UARTSFIFO_RXEMPT0x40
+#define UARTSFIFO_RXOF0x04
+#define UARTSFIFO_TXOF0x02
+#define UARTSFIFO_RXUF0x01
+
+#define DRIVER_NAME"fsl-lpuart"
+#define DEV_NAME"ttyLP"
+#define UART_NR6
+
+struct lpuart_port {
+struct uart_portport;
+struct clk*clk;
+unsigned inttxfifo_size;
+unsigned intrxfifo_size;
+};
+
+static struct of_device_id lpuart_dt_ids[] = {
+{
+.compatible = "fsl,vf610-lpuart",
+},
+{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
+
+static void lpuart_stop_tx(struct uart_port *port)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+temp &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE);
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_stop_rx(struct uart_port *port)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+writeb(temp &amp;amp; ~UARTCR2_RE, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_enable_ms(struct uart_port *port)
+{
+}
+
+static inline void lpuart_transmit_buffer(struct lpuart_port *sport)
+{
+struct circ_buf *xmit = &amp;amp;sport-&amp;gt;port.state-&amp;gt;xmit;
+
+while (!uart_circ_empty(xmit) &amp;amp;&amp;amp;
+(readb(sport-&amp;gt;port.membase + UARTTCFIFO) &amp;lt; sport-&amp;gt;txfifo_size)) {
+writeb(xmit-&amp;gt;buf[xmit-&amp;gt;tail], sport-&amp;gt;port.membase + UARTDR);
+xmit-&amp;gt;tail = (xmit-&amp;gt;tail + 1) &amp;amp; (UART_XMIT_SIZE - 1);
+sport-&amp;gt;port.icount.tx++;
+}
+
+if (uart_circ_chars_pending(xmit) &amp;lt; WAKEUP_CHARS)
+uart_write_wakeup(&amp;amp;sport-&amp;gt;port);
+
+if (uart_circ_empty(xmit))
+lpuart_stop_tx(&amp;amp;sport-&amp;gt;port);
+}
+
+static void lpuart_start_tx(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+writeb(temp | UARTCR2_TIE, port-&amp;gt;membase + UARTCR2);
+
+if (readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TDRE)
+lpuart_transmit_buffer(sport);
+}
+
+static irqreturn_t lpuart_txint(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+struct circ_buf *xmit = &amp;amp;sport-&amp;gt;port.state-&amp;gt;xmit;
+unsigned long flags;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+if (sport-&amp;gt;port.x_char) {
+writeb(sport-&amp;gt;port.x_char, sport-&amp;gt;port.membase + UARTDR);
+goto out;
+}
+
+if (uart_circ_empty(xmit) || uart_tx_stopped(&amp;amp;sport-&amp;gt;port)) {
+lpuart_stop_tx(&amp;amp;sport-&amp;gt;port);
+goto out;
+}
+
+lpuart_transmit_buffer(sport);
+
+if (uart_circ_chars_pending(xmit) &amp;lt; WAKEUP_CHARS)
+uart_write_wakeup(&amp;amp;sport-&amp;gt;port);
+
+out:
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+return IRQ_HANDLED;
+}
+
+static irqreturn_t lpuart_rxint(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+unsigned int flg, ignored = 0;
+struct tty_port *port = &amp;amp;sport-&amp;gt;port.state-&amp;gt;port;
+unsigned long flags;
+unsigned char rx, sr;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+while (!(readb(sport-&amp;gt;port.membase + UARTSFIFO) &amp;amp; UARTSFIFO_RXEMPT)) {
+flg = TTY_NORMAL;
+sport-&amp;gt;port.icount.rx++;
+/*
+ * to clear the FE, OR, NF, FE, PE flags,
+ * read SR1 then read DR
+ */
+sr = readb(sport-&amp;gt;port.membase + UARTSR1);
+rx = readb(sport-&amp;gt;port.membase + UARTDR);
+
+if (uart_handle_sysrq_char(&amp;amp;sport-&amp;gt;port, (unsigned char)rx))
+continue;
+
+if (sr &amp;amp; (UARTSR1_PE | UARTSR1_OR | UARTSR1_FE)) {
+if (sr &amp;amp; UARTSR1_PE)
+sport-&amp;gt;port.icount.parity++;
+else if (sr &amp;amp; UARTSR1_FE)
+sport-&amp;gt;port.icount.frame++;
+
+if (sr &amp;amp; UARTSR1_OR)
+sport-&amp;gt;port.icount.overrun++;
+
+if (sr &amp;amp; sport-&amp;gt;port.ignore_status_mask) {
+if (++ignored &amp;gt; 100)
+goto out;
+continue;
+}
+
+sr &amp;amp;= sport-&amp;gt;port.read_status_mask;
+
+if (sr &amp;amp; UARTSR1_PE)
+flg = TTY_PARITY;
+else if (sr &amp;amp; UARTSR1_FE)
+flg = TTY_FRAME;
+
+if (sr &amp;amp; UARTSR1_OR)
+flg = TTY_OVERRUN;
+
+#ifdef SUPPORT_SYSRQ
+sport-&amp;gt;port.sysrq = 0;
+#endif
+}
+
+tty_insert_flip_char(port, rx, flg);
+}
+
+out:
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+tty_flip_buffer_push(port);
+return IRQ_HANDLED;
+}
+
+static irqreturn_t lpuart_int(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+unsigned char sts;
+
+sts = readb(sport-&amp;gt;port.membase + UARTSR1);
+
+if (sts &amp;amp; UARTSR1_RDRF)
+lpuart_rxint(irq, dev_id);
+
+if (sts &amp;amp; UARTSR1_TDRE &amp;amp;&amp;amp;
+!(readb(sport-&amp;gt;port.membase + UARTCR5) &amp;amp; UARTCR5_TDMAS))
+lpuart_txint(irq, dev_id);
+
+return IRQ_HANDLED;
+}
+
+/* return TIOCSER_TEMT when transmitter is not busy */
+static unsigned int lpuart_tx_empty(struct uart_port *port)
+{
+return (readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TC) ?
+TIOCSER_TEMT : 0;
+}
+
+static unsigned int lpuart_get_mctrl(struct uart_port *port)
+{
+unsigned int temp = 0;
+unsigned char reg;
+
+reg = readb(port-&amp;gt;membase + UARTMODEM);
+if (reg &amp;amp; UARTMODEM_TXCTSE)
+temp |= TIOCM_CTS;
+
+if (reg &amp;amp; UARTMODEM_RXRTSE)
+temp |= TIOCM_RTS;
+
+return temp;
+}
+
+static void lpuart_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTMODEM) &amp;amp;
+~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+
+if (mctrl &amp;amp; TIOCM_RTS)
+temp |= UARTMODEM_RXRTSE;
+
+if (mctrl &amp;amp; TIOCM_CTS)
+temp |= UARTMODEM_TXCTSE;
+
+writeb(temp, port-&amp;gt;membase + UARTMODEM);
+}
+
+static void lpuart_break_ctl(struct uart_port *port, int break_state)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2) &amp;amp; ~UARTCR2_SBK;
+
+if (break_state != 0)
+temp |= UARTCR2_SBK;
+
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_setup_watermark(struct lpuart_port *sport)
+{
+unsigned char val, cr2;
+
+cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr2 &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_TE |
+UARTCR2_RIE | UARTCR2_RE);
+writeb(cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+/* determine FIFO size and enable FIFO mode */
+val = readb(sport-&amp;gt;port.membase + UARTPFIFO);
+
+sport-&amp;gt;txfifo_size = 0x1 &amp;lt;&amp;lt; (((val &amp;gt;&amp;gt; UARTPFIFO_TXSIZE_OFF) &amp;amp;
+UARTPFIFO_FIFOSIZE_MASK) + 1);
+
+sport-&amp;gt;rxfifo_size = 0x1 &amp;lt;&amp;lt; (((val &amp;gt;&amp;gt; UARTPFIFO_RXSIZE_OFF) &amp;amp;
+UARTPFIFO_FIFOSIZE_MASK) + 1);
+
+writeb(val | UARTPFIFO_TXFE | UARTPFIFO_RXFE,
+sport-&amp;gt;port.membase + UARTPFIFO);
+
+/* flush Tx and Rx FIFO */
+writeb(UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH,
+sport-&amp;gt;port.membase + UARTCFIFO);
+
+writeb(2, sport-&amp;gt;port.membase + UARTTWFIFO);
+writeb(1, sport-&amp;gt;port.membase + UARTRWFIFO);
+}
+
+static int lpuart_startup(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+int ret;
+unsigned long flags;
+unsigned char temp;
+
+ret = devm_request_irq(port-&amp;gt;dev, port-&amp;gt;irq, lpuart_int, 0,
+DRIVER_NAME, sport);
+if (ret)
+return ret;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+lpuart_setup_watermark(sport);
+
+temp = readb(sport-&amp;gt;port.membase + UARTCR2);
+temp |= (UARTCR2_RIE | UARTCR2_TIE | UARTCR2_RE | UARTCR2_TE);
+writeb(temp, sport-&amp;gt;port.membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+return 0;
+}
+
+static void lpuart_shutdown(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned char temp;
+unsigned long flags;
+
+spin_lock_irqsave(&amp;amp;port-&amp;gt;lock, flags);
+
+/* disable Rx/Tx and interrupts */
+temp = readb(port-&amp;gt;membase + UARTCR2);
+temp &amp;amp;= ~(UARTCR2_TE | UARTCR2_RE |
+UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;port-&amp;gt;lock, flags);
+
+devm_free_irq(port-&amp;gt;dev, port-&amp;gt;irq, sport);
+}
+
+static void
+lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
+   struct ktermios *old)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned long flags;
+unsigned char cr1, old_cr1, old_cr2, cr4, bdh, modem;
+unsigned int  baud;
+unsigned int old_csize = old ? old-&amp;gt;c_cflag &amp;amp; CSIZE : CS8;
+unsigned int sbr, brfa;
+
+cr1 = old_cr1 = readb(sport-&amp;gt;port.membase + UARTCR1);
+old_cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr4 = readb(sport-&amp;gt;port.membase + UARTCR4);
+bdh = readb(sport-&amp;gt;port.membase + UARTBDH);
+modem = readb(sport-&amp;gt;port.membase + UARTMODEM);
+/*
+ * only support CS8 and CS7, and for CS7 must enable PE.
+ * supported mode:
+ *  - (7,e/o,1)
+ *  - (8,n,1)
+ *  - (8,m/s,1)
+ *  - (8,e/o,1)
+ */
+while ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS8 &amp;amp;&amp;amp;
+(termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS7) {
+termios-&amp;gt;c_cflag &amp;amp;= ~CSIZE;
+termios-&amp;gt;c_cflag |= old_csize;
+old_csize = CS8;
+}
+
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS8 ||
+(termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS7)
+cr1 = old_cr1 &amp;amp; ~UARTCR1_M;
+
+if (termios-&amp;gt;c_cflag &amp;amp; CMSPAR) {
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS8) {
+termios-&amp;gt;c_cflag &amp;amp;= ~CSIZE;
+termios-&amp;gt;c_cflag |= CS8;
+}
+cr1 |= UARTCR1_M;
+}
+
+if (termios-&amp;gt;c_cflag &amp;amp; CRTSCTS) {
+modem |= (UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+} else {
+termios-&amp;gt;c_cflag &amp;amp;= ~CRTSCTS;
+modem &amp;amp;= ~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+}
+
+if (termios-&amp;gt;c_cflag &amp;amp; CSTOPB)
+termios-&amp;gt;c_cflag &amp;amp;= ~CSTOPB;
+
+/* parity must be enabled when CS7 to match 8-bits format */
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS7)
+termios-&amp;gt;c_cflag |= PARENB;
+
+if ((termios-&amp;gt;c_cflag &amp;amp; PARENB)) {
+if (termios-&amp;gt;c_cflag &amp;amp; CMSPAR) {
+cr1 &amp;amp;= ~UARTCR1_PE;
+cr1 |= UARTCR1_M;
+} else {
+cr1 |= UARTCR1_PE;
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS8)
+cr1 |= UARTCR1_M;
+if (termios-&amp;gt;c_cflag &amp;amp; PARODD)
+cr1 |= UARTCR1_PT;
+else
+cr1 &amp;amp;= ~UARTCR1_PT;
+}
+}
+
+/* ask the core to calculate the divisor */
+baud = uart_get_baud_rate(port, termios, old, 50, port-&amp;gt;uartclk / 16);
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+sport-&amp;gt;port.read_status_mask = 0;
+if (termios-&amp;gt;c_iflag &amp;amp; INPCK)
+sport-&amp;gt;port.read_status_mask |=(UARTSR1_FE | UARTSR1_PE);
+if (termios-&amp;gt;c_iflag &amp;amp; (BRKINT | PARMRK))
+sport-&amp;gt;port.read_status_mask |= UARTSR1_FE;
+
+/* characters to ignore */
+sport-&amp;gt;port.ignore_status_mask = 0;
+if (termios-&amp;gt;c_iflag &amp;amp; IGNPAR)
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_PE;
+if (termios-&amp;gt;c_iflag &amp;amp; IGNBRK) {
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_FE;
+/*
+ * if we're ignoring parity and break indicators,
+ * ignore overruns too (for real raw support).
+ */
+if (termios-&amp;gt;c_iflag &amp;amp; IGNPAR)
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_OR;
+}
+
+/* update the per-port timeout */
+uart_update_timeout(port, termios-&amp;gt;c_cflag, baud);
+
+/* wait transmit engin complete */
+while (!(readb(sport-&amp;gt;port.membase + UARTSR1) &amp;amp; UARTSR1_TC))
+barrier();
+
+/* disable transmit and receive */
+writeb(old_cr2 &amp;amp; ~(UARTCR2_TE | UARTCR2_RE),
+sport-&amp;gt;port.membase + UARTCR2);
+
+sbr = sport-&amp;gt;port.uartclk / (16 * baud);
+brfa = ((sport-&amp;gt;port.uartclk - (16 * sbr * baud)) * 2) / baud;
+bdh &amp;amp;= ~UARTBDH_SBR_MASK;
+bdh |= (sbr &amp;gt;&amp;gt; 8) &amp;amp; 0x1F;
+cr4 &amp;amp;= ~UARTCR4_BRFA_MASK;
+brfa &amp;amp;= UARTCR4_BRFA_MASK;
+writeb(cr4 | brfa, sport-&amp;gt;port.membase + UARTCR4);
+writeb(bdh, sport-&amp;gt;port.membase + UARTBDH);
+writeb(sbr &amp;amp; 0xFF, sport-&amp;gt;port.membase + UARTBDL);
+writeb(cr1, sport-&amp;gt;port.membase + UARTCR1);
+writeb(modem, sport-&amp;gt;port.membase + UARTMODEM);
+
+/* restore control register */
+writeb(old_cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+}
+
+static const char *lpuart_type(struct uart_port *port)
+{
+return "FSL_LPUART";
+}
+
+static void lpuart_release_port(struct uart_port *port)
+{
+/* nothing to do */
+}
+
+static int lpuart_request_port(struct uart_port *port)
+{
+return  0;
+}
+
+/* configure/autoconfigure the port */
+static void lpuart_config_port(struct uart_port *port, int flags)
+{
+if (flags &amp;amp; UART_CONFIG_TYPE)
+port-&amp;gt;type = PORT_LPUART;
+}
+
+static int lpuart_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+int ret = 0;
+
+if (ser-&amp;gt;type != PORT_UNKNOWN &amp;amp;&amp;amp; ser-&amp;gt;type != PORT_LPUART)
+ret = -EINVAL;
+if (port-&amp;gt;irq != ser-&amp;gt;irq)
+ret = -EINVAL;
+if (ser-&amp;gt;io_type != UPIO_MEM)
+ret = -EINVAL;
+if (port-&amp;gt;uartclk / 16 != ser-&amp;gt;baud_base)
+ret = -EINVAL;
+if (port-&amp;gt;iobase != ser-&amp;gt;port)
+ret = -EINVAL;
+if (ser-&amp;gt;hub6 != 0)
+ret = -EINVAL;
+return ret;
+}
+
+static struct uart_ops lpuart_pops = {
+.tx_empty= lpuart_tx_empty,
+.set_mctrl= lpuart_set_mctrl,
+.get_mctrl= lpuart_get_mctrl,
+.stop_tx= lpuart_stop_tx,
+.start_tx= lpuart_start_tx,
+.stop_rx= lpuart_stop_rx,
+.enable_ms= lpuart_enable_ms,
+.break_ctl= lpuart_break_ctl,
+.startup= lpuart_startup,
+.shutdown= lpuart_shutdown,
+.set_termios= lpuart_set_termios,
+.type= lpuart_type,
+.request_port= lpuart_request_port,
+.release_port= lpuart_release_port,
+.config_port= lpuart_config_port,
+.verify_port= lpuart_verify_port,
+};
+
+static struct lpuart_port *lpuart_ports[UART_NR];
+
+#ifdef CONFIG_SERIAL_FSL_LPUART_CONSOLE
+static void lpuart_console_putchar(struct uart_port *port, int ch)
+{
+while (!(readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TDRE))
+barrier();
+
+writeb(ch, port-&amp;gt;membase + UARTDR);
+}
+
+static void
+lpuart_console_write(struct console *co, const char *s, unsigned int count)
+{
+struct lpuart_port *sport = lpuart_ports[co-&amp;gt;index];
+unsigned char  old_cr2, cr2;
+
+/* first save CR2 and then disable interrupts */
+cr2 = old_cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr2 |= (UARTCR2_TE |  UARTCR2_RE);
+cr2 &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
+writeb(cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+uart_console_write(&amp;amp;sport-&amp;gt;port, s, count, lpuart_console_putchar);
+
+/* wait for transmitter finish complete and restore CR2 */
+while (!(readb(sport-&amp;gt;port.membase + UARTSR1) &amp;amp; UARTSR1_TC))
+barrier();
+
+writeb(old_cr2, sport-&amp;gt;port.membase + UARTCR2);
+}
+
+/*
+ * if the port was already initialised (eg, by a boot loader),
+ * try to determine the current setup.
+ */
+static void __init
+lpuart_console_get_options(struct lpuart_port *sport, int *baud,
+   int *parity, int *bits)
+{
+unsigned char cr, bdh, bdl, brfa;
+unsigned int sbr, uartclk, baud_raw;
+
+cr = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr &amp;amp;= UARTCR2_TE | UARTCR2_RE;
+if (!cr)
+return;
+
+/* ok, the port was enabled */
+
+cr = readb(sport-&amp;gt;port.membase + UARTCR1);
+
+*parity = 'n';
+if (cr &amp;amp; UARTCR1_PE) {
+if (cr &amp;amp; UARTCR1_PT)
+*parity = 'o';
+else
+*parity = 'e';
+}
+
+if (cr &amp;amp; UARTCR1_M)
+*bits = 9;
+else
+*bits = 8;
+
+bdh = readb(sport-&amp;gt;port.membase + UARTBDH);
+bdh &amp;amp;= UARTBDH_SBR_MASK;
+bdl = readb(sport-&amp;gt;port.membase + UARTBDL);
+sbr = bdh;
+sbr &amp;lt;&amp;lt;= 8;
+sbr |= bdl;
+brfa = readb(sport-&amp;gt;port.membase + UARTCR4);
+brfa &amp;amp;= UARTCR4_BRFA_MASK;
+
+uartclk = clk_get_rate(sport-&amp;gt;clk);
+/*
+ * baud = mod_clk/(16*(sbr[13]+(brfa)/32)
+ */
+baud_raw = uartclk / (16 * (sbr + brfa / 32));
+
+if (*baud != baud_raw)
+printk(KERN_INFO "Serial: Console lpuart rounded baud rate"
+"from %d to %d\n", baud_raw, *baud);
+}
+
+static int __init lpuart_console_setup(struct console *co, char *options)
+{
+struct lpuart_port *sport;
+int baud = 115200;
+int bits = 8;
+int parity = 'n';
+int flow = 'n';
+
+/*
+ * check whether an invalid uart number has been specified, and
+ * if so, search for the first available port that does have
+ * console support.
+ */
+if (co-&amp;gt;index == -1 || co-&amp;gt;index &amp;gt;= ARRAY_SIZE(lpuart_ports))
+co-&amp;gt;index = 0;
+
+sport = lpuart_ports[co-&amp;gt;index];
+if (sport == NULL)
+return -ENODEV;
+
+if (options)
+uart_parse_options(options, &amp;amp;baud, &amp;amp;parity, &amp;amp;bits, &amp;amp;flow);
+else
+lpuart_console_get_options(sport, &amp;amp;baud, &amp;amp;parity, &amp;amp;bits);
+
+lpuart_setup_watermark(sport);
+
+return uart_set_options(&amp;amp;sport-&amp;gt;port, co, baud, parity, bits, flow);
+}
+
+static struct uart_driver lpuart_reg;
+static struct console lpuart_console = {
+.name= DEV_NAME,
+.write= lpuart_console_write,
+.device= uart_console_device,
+.setup= lpuart_console_setup,
+.flags= CON_PRINTBUFFER,
+.index= -1,
+.data= &amp;amp;lpuart_reg,
+};
+
+#define LPUART_CONSOLE(&amp;amp;lpuart_console)
+#else
+#define LPUART_CONSOLENULL
+#endif
+
+static struct uart_driver lpuart_reg = {
+.owner= THIS_MODULE,
+.driver_name= DRIVER_NAME,
+.dev_name= DEV_NAME,
+.nr= ARRAY_SIZE(lpuart_ports),
+.cons= LPUART_CONSOLE,
+};
+
+static int lpuart_probe(struct platform_device *pdev)
+{
+struct device_node *np = pdev-&amp;gt;dev.of_node;
+struct lpuart_port *sport;
+struct resource *res;
+int ret;
+
+sport = devm_kzalloc(&amp;amp;pdev-&amp;gt;dev, sizeof(*sport), GFP_KERNEL);
+if (!sport)
+return -ENOMEM;
+
+pdev-&amp;gt;dev.coherent_dma_mask = 0;
+
+ret = of_alias_get_id(np, "serial");
+if (ret &amp;lt; 0) {
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to get alias id, errno %d\n", ret);
+return ret;
+}
+sport-&amp;gt;port.line = ret;
+
+res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+if (!res)
+return -ENODEV;
+
+sport-&amp;gt;port.mapbase = res-&amp;gt;start;
+sport-&amp;gt;port.membase = devm_ioremap_resource(&amp;amp;pdev-&amp;gt;dev, res);
+if (IS_ERR(sport-&amp;gt;port.membase))
+return PTR_ERR(sport-&amp;gt;port.membase);
+
+sport-&amp;gt;port.dev = &amp;amp;pdev-&amp;gt;dev;
+sport-&amp;gt;port.type = PORT_LPUART;
+sport-&amp;gt;port.iotype = UPIO_MEM;
+sport-&amp;gt;port.irq = platform_get_irq(pdev, 0);
+sport-&amp;gt;port.ops = &amp;amp;lpuart_pops;
+sport-&amp;gt;port.flags = UPF_BOOT_AUTOCONF;
+
+sport-&amp;gt;clk = devm_clk_get(&amp;amp;pdev-&amp;gt;dev, "ipg");
+if (IS_ERR(sport-&amp;gt;clk)) {
+ret = PTR_ERR(sport-&amp;gt;clk);
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to get uart clk: %d\n", ret);
+return ret;
+}
+
+ret = clk_prepare_enable(sport-&amp;gt;clk);
+if (ret) {
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to enable uart clk: %d\n", ret);
+return ret;
+}
+
+sport-&amp;gt;port.uartclk = clk_get_rate(sport-&amp;gt;clk);
+
+lpuart_ports[sport-&amp;gt;port.line] = sport;
+
+platform_set_drvdata(pdev, &amp;amp;sport-&amp;gt;port);
+
+ret = uart_add_one_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+if (ret) {
+clk_disable_unprepare(sport-&amp;gt;clk);
+return ret;
+}
+
+return 0;
+}
+
+static int lpuart_remove(struct platform_device *pdev)
+{
+struct lpuart_port *sport = platform_get_drvdata(pdev);
+
+uart_remove_one_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+clk_disable_unprepare(sport-&amp;gt;clk);
+
+return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int lpuart_suspend(struct device *dev)
+{
+struct lpuart_port *sport = dev_get_drvdata(dev);
+
+uart_suspend_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+return 0;
+}
+
+static int lpuart_resume(struct device *dev)
+{
+struct lpuart_port *sport = dev_get_drvdata(dev);
+
+uart_resume_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(lpuart_pm_ops, lpuart_suspend, lpuart_resume);
+
+static struct platform_driver lpuart_driver = {
+.probe= lpuart_probe,
+.remove= lpuart_remove,
+.driver= {
+.name= "fsl-lpuart",
+.owner= THIS_MODULE,
+.of_match_table = lpuart_dt_ids,
+.pm= &amp;amp;lpuart_pm_ops,
+},
+};
+
+static int __init lpuart_serial_init(void)
+{
+int ret;
+
+pr_info("serial: Freescale lpuart driver\n");
+
+ret = uart_register_driver(&amp;amp;lpuart_reg);
+if (ret)
+return ret;
+
+ret = platform_driver_register(&amp;amp;lpuart_driver);
+if (ret)
+uart_unregister_driver(&amp;amp;lpuart_reg);
+
+return 0;
+}
+
+static void __exit lpuart_serial_exit(void)
+{
+platform_driver_unregister(&amp;amp;lpuart_driver);
+uart_unregister_driver(&amp;amp;lpuart_reg);
+}
+
+module_init(lpuart_serial_init);
+module_exit(lpuart_serial_exit);
+
+MODULE_DESCRIPTION("Freescale lpuart serial port driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index 74c2bf7..c8eaeb5 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -226,4 +226,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /* Rocketport EXPRESS/INFINITY */
 #define PORT_RP2102
 
+/* Freescale lpuart */
+#define PORT_LPUART103
+
 #endif /* _UAPILINUX_SERIAL_CORE_H */
&lt;/pre&gt;</description>
    <dc:creator>Jingchang Lu</dc:creator>
    <dc:date>2013-06-04T01:27:50</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11525">
    <title>MAX14830 serial driver</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11525</link>
    <description>&lt;pre&gt;Hello All.

For all who ask me about MAX14830 support in the max310x driver,
support is completed, preliminary version I can send to test.
Once driver is being tested, patch for this chip will be posted
for apply in the kernel. So if you want to test initial version,
please mail me.
Thanks.

&lt;/pre&gt;</description>
    <dc:creator>Alexander Shiyan</dc:creator>
    <dc:date>2013-06-01T18:37:01</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11524">
    <title>[PATCH] serial/imx: disable hardware flow control at startup</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11524</link>
    <description>&lt;pre&gt;From: Lucas Stach &amp;lt;l.stach&amp;lt; at &amp;gt;pengutronix.de&amp;gt;

We only want to enable hardware flow control if RTS/CTS pins
are connected.

Signed-off-by: Lucas Stach &amp;lt;l.stach&amp;lt; at &amp;gt;pengutronix.de&amp;gt;
Signed-off-by: Markus Pargmann &amp;lt;mpa&amp;lt; at &amp;gt;pengutronix.de&amp;gt;
---

 drivers/tty/serial/imx.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 147c9e1..8cdfbd3 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -761,6 +761,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int imx_startup(struct uart_port *port)
 
 temp = readl(sport-&amp;gt;port.membase + UCR2);
 temp |= (UCR2_RXEN | UCR2_TXEN);
+if (!sport-&amp;gt;have_rtscts)
+temp |= UCR2_IRTS;
 writel(temp, sport-&amp;gt;port.membase + UCR2);
 
 if (USE_IRDA(sport)) {
&lt;/pre&gt;</description>
    <dc:creator>Markus Pargmann</dc:creator>
    <dc:date>2013-05-30T13:47:04</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11523">
    <title>Connection to a 3G USB Module using USB-Serial</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11523</link>
    <description>&lt;pre&gt;I'm struggling with this issue since a while and as the author of the
USB-Serial module I thought experts here might provide some help... As
it's a USB-serail issue, I've posted on both USB and Serial lists.
thanks in advance!

The problem is about connecting with a 3G USB modem, a ZTE MF-210
mini-pci board; plugged as a daughter board inside an Android tablet.
I have posted already on a couple forums, but got no useful feedback
yet.

As soon as I power up the module I get the expected /dev/ttyUSB0-3 and
that's fine, so far:

&amp;lt;6&amp;gt;usb 1-1.1: new high speed USB device using emxx-ehci-driver and address 3
&amp;lt;6&amp;gt;option 1-1.1:1.0: GSM modem (1-port) converter detected
&amp;lt;6&amp;gt;usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB0
&amp;lt;6&amp;gt;option 1-1.1:1.1: GSM modem (1-port) converter detected
&amp;lt;6&amp;gt;usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1
&amp;lt;6&amp;gt;option 1-1.1:1.2: GSM modem (1-port) converter detected
&amp;lt;6&amp;gt;usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB2
&amp;lt;6&amp;gt;option 1-1.1:1.3: GSM modem (1-port) converter detected
&amp;lt;6&amp;gt;usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB3

Issue is when I try to communicate with any of these ports. I can
connect using picocom to all but can't receive any feedback from AT
commands sent over to them. I made some partial progress only after
using the "-i" option (i.e. "no port init"), but below you can find
what I get if I simply type A + T + Z + &amp;lt;enter&amp;gt;, for example.

As you can see, characters and commands are repeated several times.
That's what I can't understand.

Without the -i option, I don't even get any feedback from the modem
and the same happens using other connection programs, e.g. busybox
microcom. I'm using picocom as it's very small and I succesfully used
it already in a similar case, though on a different Android platform
and kernel.

This Kernel is built including standard usb-serial options below:

CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_WWAN=y
CONFIG_USB_SERIAL_OPTION=y

Is the kernel missing anything, or requiring some special ZTE-specific
customizations in your opinion?

What are the best connection options I could try?

 thanks
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo&amp;lt; at &amp;gt;vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>Fabio Fumi</dc:creator>
    <dc:date>2013-05-30T12:54:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11521">
    <title>[PATCH v5] tty: serial: add Freescale lpuart driver support</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11521</link>
    <description>&lt;pre&gt;Add Freescale lpuart driver support. The lpuart device
can be found on Vybrid VF610 and Layerscape LS-1 SoCs.

Signed-off-by: Jingchang Lu &amp;lt;b35083&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
changes in v5:
 Coding style fix, remove redundant code.
 Checking clk_prepare_enable return value.
 Using devm_ioremap_resource instead of devm_request_and_ioremap.

changes in v4:
 Change Vybrid VF610 SoC compatible string to "fsl,vf610-lpuart"

changes in v3:
 Use general driver name lpuart instead of mvf for further share between SoCs.
 Add bind doc in Documentation/devicetree/bindings/tty/serial.
 Remove unused #include header lines and clean up code.

changes in v2:
 Remove unused variables and clean up the code.

 .../devicetree/bindings/tty/serial/fsl-lpuart.txt  |  14 +
 drivers/tty/serial/Kconfig                         |  14 +
 drivers/tty/serial/Makefile                        |   1 +
 drivers/tty/serial/fsl_lpuart.c                    | 873 +++++++++++++++++++++
 include/uapi/linux/serial_core.h                   |   3 +
 5 files changed, 905 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
 create mode 100644 drivers/tty/serial/fsl_lpuart.c

diff --git a/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt b/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
new file mode 100644
index 0000000..6fd1dd1
--- /dev/null
+++ b/Documentation/devicetree/bindings/tty/serial/fsl-lpuart.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+* Freescale low power universal asynchronous receiver/transmitter (lpuart)
+
+Required properties:
+- compatible : Should be "fsl,&amp;lt;soc&amp;gt;-lpuart"
+- reg : Address and length of the register set for the device
+- interrupts : Should contain uart interrupt
+
+Example:
+
+uart0: serial&amp;lt; at &amp;gt;40027000 {
+       compatible = "fsl,vf610-lpuart";
+       reg = &amp;lt;0x40027000 0x1000&amp;gt;;
+       interrupts = &amp;lt;0 61 0x00&amp;gt;;
+       };
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 7e7006f..aee7030 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1484,6 +1484,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; config SERIAL_RP2_NR_UARTS
   If multiple cards are present, the default limit of 32 ports may
   need to be increased.
 
+config SERIAL_FSL_LPUART
+bool "Freescale lpuart serial port support"
+select SERIAL_CORE
+help
+  Support for the on-chip lpuart on some Freescale SOCs.
+
+config SERIAL_FSL_LPUART_CONSOLE
+bool "Console on Freescale lpuart serial port"
+depends on SERIAL_FSL_LPUART
+select SERIAL_CORE_CONSOLE
+help
+  If you have enabled the lpuart serial port on the Freescale SoCs,
+  you can make it the console by answering Y to this option.
+
 endmenu
 
 endif # TTY
diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile
index eedfec4..cf650f0 100644
--- a/drivers/tty/serial/Makefile
+++ b/drivers/tty/serial/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,3 +85,4 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; obj-$(CONFIG_SERIAL_AR933X)   += ar933x_uart.o
 obj-$(CONFIG_SERIAL_EFM32_UART) += efm32-uart.o
 obj-$(CONFIG_SERIAL_ARC)+= arc_uart.o
 obj-$(CONFIG_SERIAL_RP2)+= rp2.o
+obj-$(CONFIG_SERIAL_FSL_LPUART)+= fsl_lpuart.o
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
new file mode 100644
index 0000000..7fb1681
--- /dev/null
+++ b/drivers/tty/serial/fsl_lpuart.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,873 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ *  Freescale lpuart serial port driver
+ *
+ *  Copyright 2012-2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#if defined(CONFIG_SERIAL_FSL_LPUART_CONSOLE) &amp;amp;&amp;amp; defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include &amp;lt;linux/module.h&amp;gt;
+#include &amp;lt;linux/io.h&amp;gt;
+#include &amp;lt;linux/irq.h&amp;gt;
+#include &amp;lt;linux/clk.h&amp;gt;
+#include &amp;lt;linux/of_device.h&amp;gt;
+#include &amp;lt;linux/console.h&amp;gt;
+#include &amp;lt;linux/serial_core.h&amp;gt;
+#include &amp;lt;linux/tty_flip.h&amp;gt;
+
+/* All registers are 8-bit width */
+#define UARTBDH0x00
+#define UARTBDL0x01
+#define UARTCR10x02
+#define UARTCR20x03
+#define UARTSR10x04
+#define UARTCR30x06
+#define UARTDR0x07
+#define UARTCR40x0a
+#define UARTCR50x0b
+#define UARTMODEM0x0d
+#define UARTPFIFO0x10
+#define UARTCFIFO0x11
+#define UARTSFIFO0x12
+#define UARTTWFIFO0x13
+#define UARTTCFIFO0x14
+#define UARTRWFIFO0x15
+
+#define UARTBDH_LBKDIE0x80
+#define UARTBDH_RXEDGIE0x40
+#define UARTBDH_SBR_MASK0x1f
+
+#define UARTCR1_LOOPS0x80
+#define UARTCR1_RSRC0x20
+#define UARTCR1_M0x10
+#define UARTCR1_WAKE0x08
+#define UARTCR1_ILT0x04
+#define UARTCR1_PE0x02
+#define UARTCR1_PT0x01
+
+#define UARTCR2_TIE0x80
+#define UARTCR2_TCIE0x40
+#define UARTCR2_RIE0x20
+#define UARTCR2_ILIE0x10
+#define UARTCR2_TE0x08
+#define UARTCR2_RE0x04
+#define UARTCR2_RWU0x02
+#define UARTCR2_SBK0x01
+
+#define UARTSR1_TDRE0x80
+#define UARTSR1_TC0x40
+#define UARTSR1_RDRF0x20
+#define UARTSR1_IDLE0x10
+#define UARTSR1_OR0x08
+#define UARTSR1_NF0x04
+#define UARTSR1_FE0x02
+#define UARTSR1_PE0x01
+
+#define UARTCR3_R80x80
+#define UARTCR3_T80x40
+#define UARTCR3_TXDIR0x20
+#define UARTCR3_TXINV0x10
+#define UARTCR3_ORIE0x08
+#define UARTCR3_NEIE0x04
+#define UARTCR3_FEIE0x02
+#define UARTCR3_PEIE0x01
+
+#define UARTCR4_MAEN10x80
+#define UARTCR4_MAEN20x40
+#define UARTCR4_M100x20
+#define UARTCR4_BRFA_MASK0x1f
+#define UARTCR4_BRFA_OFF0
+
+#define UARTCR5_TDMAS0x80
+#define UARTCR5_RDMAS0x20
+
+#define UARTMODEM_RXRTSE0x08
+#define UARTMODEM_TXRTSPOL0x04
+#define UARTMODEM_TXRTSE0x02
+#define UARTMODEM_TXCTSE0x01
+
+#define UARTPFIFO_TXFE0x80
+#define UARTPFIFO_FIFOSIZE_MASK0x7
+#define UARTPFIFO_TXSIZE_OFF4
+#define UARTPFIFO_RXFE0x08
+#define UARTPFIFO_RXSIZE_OFF0
+
+#define UARTCFIFO_TXFLUSH0x80
+#define UARTCFIFO_RXFLUSH0x40
+#define UARTCFIFO_RXOFE0x04
+#define UARTCFIFO_TXOFE0x02
+#define UARTCFIFO_RXUFE0x01
+
+#define UARTSFIFO_TXEMPT0x80
+#define UARTSFIFO_RXEMPT0x40
+#define UARTSFIFO_RXOF0x04
+#define UARTSFIFO_TXOF0x02
+#define UARTSFIFO_RXUF0x01
+
+#define DRIVER_NAME"fsl-lpuart"
+#define DEV_NAME"ttyLP"
+#define UART_NR6
+
+struct lpuart_port {
+struct uart_portport;
+struct clk*clk;
+unsigned inttxfifo_size;
+unsigned intrxfifo_size;
+};
+
+static struct of_device_id lpuart_dt_ids[] = {
+{
+.compatible = "fsl,vf610-lpuart",
+},
+{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
+
+static void lpuart_stop_tx(struct uart_port *port)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+temp &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE);
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_stop_rx(struct uart_port *port)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+writeb(temp &amp;amp; ~UARTCR2_RE, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_enable_ms(struct uart_port *port)
+{
+}
+
+static inline void lpuart_transmit_buffer(struct lpuart_port *sport)
+{
+struct circ_buf *xmit = &amp;amp;sport-&amp;gt;port.state-&amp;gt;xmit;
+
+while (!uart_circ_empty(xmit) &amp;amp;&amp;amp;
+(readb(sport-&amp;gt;port.membase + UARTTCFIFO) &amp;lt; sport-&amp;gt;txfifo_size)) {
+writeb(xmit-&amp;gt;buf[xmit-&amp;gt;tail], sport-&amp;gt;port.membase + UARTDR);
+xmit-&amp;gt;tail = (xmit-&amp;gt;tail + 1) &amp;amp; (UART_XMIT_SIZE - 1);
+sport-&amp;gt;port.icount.tx++;
+}
+
+if (uart_circ_chars_pending(xmit) &amp;lt; WAKEUP_CHARS)
+uart_write_wakeup(&amp;amp;sport-&amp;gt;port);
+
+if (uart_circ_empty(xmit))
+lpuart_stop_tx(&amp;amp;sport-&amp;gt;port);
+}
+
+static void lpuart_start_tx(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2);
+writeb(temp | UARTCR2_TIE, port-&amp;gt;membase + UARTCR2);
+
+if (readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TDRE)
+lpuart_transmit_buffer(sport);
+}
+
+static irqreturn_t lpuart_txint(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+struct circ_buf *xmit = &amp;amp;sport-&amp;gt;port.state-&amp;gt;xmit;
+unsigned long flags;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+if (sport-&amp;gt;port.x_char) {
+writeb(sport-&amp;gt;port.x_char, sport-&amp;gt;port.membase + UARTDR);
+goto out;
+}
+
+if (uart_circ_empty(xmit) || uart_tx_stopped(&amp;amp;sport-&amp;gt;port)) {
+lpuart_stop_tx(&amp;amp;sport-&amp;gt;port);
+goto out;
+}
+
+lpuart_transmit_buffer(sport);
+
+if (uart_circ_chars_pending(xmit) &amp;lt; WAKEUP_CHARS)
+uart_write_wakeup(&amp;amp;sport-&amp;gt;port);
+
+out:
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+return IRQ_HANDLED;
+}
+
+static irqreturn_t lpuart_rxint(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+unsigned int flg, ignored = 0;
+struct tty_port *port = &amp;amp;sport-&amp;gt;port.state-&amp;gt;port;
+unsigned long flags;
+unsigned char rx, sr;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+while (!(readb(sport-&amp;gt;port.membase + UARTSFIFO) &amp;amp; UARTSFIFO_RXEMPT)) {
+flg = TTY_NORMAL;
+sport-&amp;gt;port.icount.rx++;
+/*
+ * to clear the FE, OR, NF, FE, PE flags,
+ * read SR1 then read DR
+ */
+sr = readb(sport-&amp;gt;port.membase + UARTSR1);
+rx = readb(sport-&amp;gt;port.membase + UARTDR);
+
+if (uart_handle_sysrq_char(&amp;amp;sport-&amp;gt;port, (unsigned char)rx))
+continue;
+
+if (sr &amp;amp; (UARTSR1_PE | UARTSR1_OR | UARTSR1_FE)) {
+if (sr &amp;amp; UARTSR1_PE)
+sport-&amp;gt;port.icount.parity++;
+else if (sr &amp;amp; UARTSR1_FE)
+sport-&amp;gt;port.icount.frame++;
+
+if (sr &amp;amp; UARTSR1_OR)
+sport-&amp;gt;port.icount.overrun++;
+
+if (sr &amp;amp; sport-&amp;gt;port.ignore_status_mask) {
+if (++ignored &amp;gt; 100)
+goto out;
+continue;
+}
+
+sr &amp;amp;= sport-&amp;gt;port.read_status_mask;
+
+if (sr &amp;amp; UARTSR1_PE)
+flg = TTY_PARITY;
+else if (sr &amp;amp; UARTSR1_FE)
+flg = TTY_FRAME;
+
+if (sr &amp;amp; UARTSR1_OR)
+flg = TTY_OVERRUN;
+
+#ifdef SUPPORT_SYSRQ
+sport-&amp;gt;port.sysrq = 0;
+#endif
+}
+
+tty_insert_flip_char(port, rx, flg);
+}
+
+out:
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+tty_flip_buffer_push(port);
+return IRQ_HANDLED;
+}
+
+static irqreturn_t lpuart_int(int irq, void *dev_id)
+{
+struct lpuart_port *sport = dev_id;
+unsigned char sts;
+
+sts = readb(sport-&amp;gt;port.membase + UARTSR1);
+
+if (sts &amp;amp; UARTSR1_RDRF)
+lpuart_rxint(irq, dev_id);
+
+if (sts &amp;amp; UARTSR1_TDRE &amp;amp;&amp;amp;
+!(readb(sport-&amp;gt;port.membase + UARTCR5) &amp;amp; UARTCR5_TDMAS))
+lpuart_txint(irq, dev_id);
+
+return IRQ_HANDLED;
+}
+
+/* return TIOCSER_TEMT when transmitter is not busy */
+static unsigned int lpuart_tx_empty(struct uart_port *port)
+{
+return (readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TC) ?
+TIOCSER_TEMT : 0;
+}
+
+static unsigned int lpuart_get_mctrl(struct uart_port *port)
+{
+unsigned int temp = 0;
+unsigned char reg;
+
+reg = readb(port-&amp;gt;membase + UARTMODEM);
+if (reg &amp;amp; UARTMODEM_TXCTSE)
+temp |= TIOCM_CTS;
+
+if (reg &amp;amp; UARTMODEM_RXRTSE)
+temp |= TIOCM_RTS;
+
+return temp;
+}
+
+static void lpuart_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTMODEM) &amp;amp;
+~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+
+if (mctrl &amp;amp; TIOCM_RTS)
+temp |= UARTMODEM_RXRTSE;
+
+if (mctrl &amp;amp; TIOCM_CTS)
+temp |= UARTMODEM_TXCTSE;
+
+writeb(temp, port-&amp;gt;membase + UARTMODEM);
+}
+
+static void lpuart_break_ctl(struct uart_port *port, int break_state)
+{
+unsigned char temp;
+
+temp = readb(port-&amp;gt;membase + UARTCR2) &amp;amp; ~UARTCR2_SBK;
+
+if (break_state != 0)
+temp |= UARTCR2_SBK;
+
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+}
+
+static void lpuart_setup_watermark(struct lpuart_port *sport)
+{
+unsigned char val, cr2;
+
+cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr2 &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_TE |
+UARTCR2_RIE | UARTCR2_RE);
+writeb(cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+/* determine FIFO size and enable FIFO mode */
+val = readb(sport-&amp;gt;port.membase + UARTPFIFO);
+
+sport-&amp;gt;txfifo_size = 0x1 &amp;lt;&amp;lt; (((val &amp;gt;&amp;gt; UARTPFIFO_TXSIZE_OFF) &amp;amp;
+UARTPFIFO_FIFOSIZE_MASK) + 1);
+
+sport-&amp;gt;rxfifo_size = 0x1 &amp;lt;&amp;lt; (((val &amp;gt;&amp;gt; UARTPFIFO_RXSIZE_OFF) &amp;amp;
+UARTPFIFO_FIFOSIZE_MASK) + 1);
+
+writeb(val | UARTPFIFO_TXFE | UARTPFIFO_RXFE,
+sport-&amp;gt;port.membase + UARTPFIFO);
+
+/* flush Tx and Rx FIFO */
+writeb(UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH,
+sport-&amp;gt;port.membase + UARTCFIFO);
+
+writeb(2, sport-&amp;gt;port.membase + UARTTWFIFO);
+writeb(1, sport-&amp;gt;port.membase + UARTRWFIFO);
+}
+
+static int lpuart_startup(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+int ret;
+unsigned long flags;
+unsigned char temp;
+
+ret = devm_request_irq(port-&amp;gt;dev, port-&amp;gt;irq, lpuart_int, 0,
+DRIVER_NAME, sport);
+if (ret)
+return ret;
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+lpuart_setup_watermark(sport);
+
+temp = readb(sport-&amp;gt;port.membase + UARTCR2);
+temp |= (UARTCR2_RIE | UARTCR2_TIE | UARTCR2_RE | UARTCR2_TE);
+writeb(temp, sport-&amp;gt;port.membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+return 0;
+}
+
+static void lpuart_shutdown(struct uart_port *port)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned char temp;
+unsigned long flags;
+
+spin_lock_irqsave(&amp;amp;port-&amp;gt;lock, flags);
+
+/* disable Rx/Tx and interrupts */
+temp = readb(port-&amp;gt;membase + UARTCR2);
+temp &amp;amp;= ~(UARTCR2_TE | UARTCR2_RE |
+UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
+writeb(temp, port-&amp;gt;membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;port-&amp;gt;lock, flags);
+
+devm_free_irq(port-&amp;gt;dev, port-&amp;gt;irq, sport);
+}
+
+static void
+lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
+   struct ktermios *old)
+{
+struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
+unsigned long flags;
+unsigned char cr1, old_cr1, old_cr2, cr4, bdh, modem;
+unsigned int  baud;
+unsigned int old_csize = old ? old-&amp;gt;c_cflag &amp;amp; CSIZE : CS8;
+unsigned int sbr, brfa;
+
+cr1 = old_cr1 = readb(sport-&amp;gt;port.membase + UARTCR1);
+old_cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr4 = readb(sport-&amp;gt;port.membase + UARTCR4);
+bdh = readb(sport-&amp;gt;port.membase + UARTBDH);
+modem = readb(sport-&amp;gt;port.membase + UARTMODEM);
+/*
+ * only support CS8 and CS7, and for CS7 must enable PE.
+ * supported mode:
+ *  - (7,e/o,1)
+ *  - (8,n,1)
+ *  - (8,m/s,1)
+ *  - (8,e/o,1)
+ */
+while ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS8 &amp;amp;&amp;amp;
+(termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS7) {
+termios-&amp;gt;c_cflag &amp;amp;= ~CSIZE;
+termios-&amp;gt;c_cflag |= old_csize;
+old_csize = CS8;
+}
+
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS8 ||
+(termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS7)
+cr1 = old_cr1 &amp;amp; ~UARTCR1_M;
+
+if (termios-&amp;gt;c_cflag &amp;amp; CMSPAR) {
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) != CS8) {
+termios-&amp;gt;c_cflag &amp;amp;= ~CSIZE;
+termios-&amp;gt;c_cflag |= CS8;
+}
+cr1 |= UARTCR1_M;
+}
+
+if (termios-&amp;gt;c_cflag &amp;amp; CRTSCTS) {
+modem |= (UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+} else {
+termios-&amp;gt;c_cflag &amp;amp;= ~CRTSCTS;
+modem &amp;amp;= ~(UARTMODEM_RXRTSE | UARTMODEM_TXCTSE);
+}
+
+if (termios-&amp;gt;c_cflag &amp;amp; CSTOPB)
+termios-&amp;gt;c_cflag &amp;amp;= ~CSTOPB;
+
+/* parity must be enabled when CS7 to match 8-bits format */
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS7)
+termios-&amp;gt;c_cflag |= PARENB;
+
+if ((termios-&amp;gt;c_cflag &amp;amp; PARENB)) {
+if (termios-&amp;gt;c_cflag &amp;amp; CMSPAR) {
+cr1 &amp;amp;= ~UARTCR1_PE;
+cr1 |= UARTCR1_M;
+} else {
+cr1 |= UARTCR1_PE;
+if ((termios-&amp;gt;c_cflag &amp;amp; CSIZE) == CS8)
+cr1 |= UARTCR1_M;
+if (termios-&amp;gt;c_cflag &amp;amp; PARODD)
+cr1 |= UARTCR1_PT;
+else
+cr1 &amp;amp;= ~UARTCR1_PT;
+}
+}
+
+/* ask the core to calculate the divisor */
+baud = uart_get_baud_rate(port, termios, old, 50, port-&amp;gt;uartclk / 16);
+
+spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);
+
+sport-&amp;gt;port.read_status_mask = 0;
+if (termios-&amp;gt;c_iflag &amp;amp; INPCK)
+sport-&amp;gt;port.read_status_mask |=(UARTSR1_FE | UARTSR1_PE);
+if (termios-&amp;gt;c_iflag &amp;amp; (BRKINT | PARMRK))
+sport-&amp;gt;port.read_status_mask |= UARTSR1_FE;
+
+/* characters to ignore */
+sport-&amp;gt;port.ignore_status_mask = 0;
+if (termios-&amp;gt;c_iflag &amp;amp; IGNPAR)
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_PE;
+if (termios-&amp;gt;c_iflag &amp;amp; IGNBRK) {
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_FE;
+/*
+ * if we're ignoring parity and break indicators,
+ * ignore overruns too (for real raw support).
+ */
+if (termios-&amp;gt;c_iflag &amp;amp; IGNPAR)
+sport-&amp;gt;port.ignore_status_mask |= UARTSR1_OR;
+}
+
+/* update the per-port timeout */
+uart_update_timeout(port, termios-&amp;gt;c_cflag, baud);
+
+/* wait transmit engin complete */
+while (!(readb(sport-&amp;gt;port.membase + UARTSR1) &amp;amp; UARTSR1_TC))
+barrier();
+
+/* disable transmit and receive */
+writeb(old_cr2 &amp;amp; ~(UARTCR2_TE | UARTCR2_RE),
+sport-&amp;gt;port.membase + UARTCR2);
+
+sbr = sport-&amp;gt;port.uartclk / (16 * baud);
+brfa = ((sport-&amp;gt;port.uartclk - (16 * sbr * baud)) * 2) / baud;
+bdh &amp;amp;= ~UARTBDH_SBR_MASK;
+bdh |= (sbr &amp;gt;&amp;gt; 8) &amp;amp; 0x1F;
+cr4 &amp;amp;= ~UARTCR4_BRFA_MASK;
+brfa &amp;amp;= UARTCR4_BRFA_MASK;
+writeb(cr4 | brfa, sport-&amp;gt;port.membase + UARTCR4);
+writeb(bdh, sport-&amp;gt;port.membase + UARTBDH);
+writeb(sbr &amp;amp; 0xFF, sport-&amp;gt;port.membase + UARTBDL);
+writeb(cr1, sport-&amp;gt;port.membase + UARTCR1);
+writeb(modem, sport-&amp;gt;port.membase + UARTMODEM);
+
+/* restore control register */
+writeb(old_cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);
+}
+
+static const char *lpuart_type(struct uart_port *port)
+{
+return "FSL_LPUART";
+}
+
+static void lpuart_release_port(struct uart_port *port)
+{
+/* nothing to do */
+}
+
+static int lpuart_request_port(struct uart_port *port)
+{
+return  0;
+}
+
+/* configure/autoconfigure the port */
+static void lpuart_config_port(struct uart_port *port, int flags)
+{
+if (flags &amp;amp; UART_CONFIG_TYPE)
+port-&amp;gt;type = PORT_LPUART;
+}
+
+static int lpuart_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+int ret = 0;
+
+if (ser-&amp;gt;type != PORT_UNKNOWN &amp;amp;&amp;amp; ser-&amp;gt;type != PORT_LPUART)
+ret = -EINVAL;
+if (port-&amp;gt;irq != ser-&amp;gt;irq)
+ret = -EINVAL;
+if (ser-&amp;gt;io_type != UPIO_MEM)
+ret = -EINVAL;
+if (port-&amp;gt;uartclk / 16 != ser-&amp;gt;baud_base)
+ret = -EINVAL;
+if (port-&amp;gt;iobase != ser-&amp;gt;port)
+ret = -EINVAL;
+if (ser-&amp;gt;hub6 != 0)
+ret = -EINVAL;
+return ret;
+}
+
+static struct uart_ops lpuart_pops = {
+.tx_empty= lpuart_tx_empty,
+.set_mctrl= lpuart_set_mctrl,
+.get_mctrl= lpuart_get_mctrl,
+.stop_tx= lpuart_stop_tx,
+.start_tx= lpuart_start_tx,
+.stop_rx= lpuart_stop_rx,
+.enable_ms= lpuart_enable_ms,
+.break_ctl= lpuart_break_ctl,
+.startup= lpuart_startup,
+.shutdown= lpuart_shutdown,
+.set_termios= lpuart_set_termios,
+.type= lpuart_type,
+.request_port= lpuart_request_port,
+.release_port= lpuart_release_port,
+.config_port= lpuart_config_port,
+.verify_port= lpuart_verify_port,
+};
+
+static struct lpuart_port *lpuart_ports[UART_NR];
+
+#ifdef CONFIG_SERIAL_FSL_LPUART_CONSOLE
+static void lpuart_console_putchar(struct uart_port *port, int ch)
+{
+while (!(readb(port-&amp;gt;membase + UARTSR1) &amp;amp; UARTSR1_TDRE))
+barrier();
+
+writeb(ch, port-&amp;gt;membase + UARTDR);
+}
+
+static void
+lpuart_console_write(struct console *co, const char *s, unsigned int count)
+{
+struct lpuart_port *sport = lpuart_ports[co-&amp;gt;index];
+unsigned char  old_cr2, cr2;
+
+/* first save CR2 and then disable interrupts */
+cr2 = old_cr2 = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr2 |= (UARTCR2_TE |  UARTCR2_RE);
+cr2 &amp;amp;= ~(UARTCR2_TIE | UARTCR2_TCIE | UARTCR2_RIE);
+writeb(cr2, sport-&amp;gt;port.membase + UARTCR2);
+
+uart_console_write(&amp;amp;sport-&amp;gt;port, s, count, lpuart_console_putchar);
+
+/* wait for transmitter finish complete and restore CR2 */
+while (!(readb(sport-&amp;gt;port.membase + UARTSR1) &amp;amp; UARTSR1_TC))
+barrier();
+
+writeb(old_cr2, sport-&amp;gt;port.membase + UARTCR2);
+}
+
+/*
+ * if the port was already initialised (eg, by a boot loader),
+ * try to determine the current setup.
+ */
+static void __init
+lpuart_console_get_options(struct lpuart_port *sport, int *baud,
+   int *parity, int *bits)
+{
+unsigned char cr, bdh, bdl, brfa;
+unsigned int sbr, uartclk, baud_raw;
+
+cr = readb(sport-&amp;gt;port.membase + UARTCR2);
+cr &amp;amp;= UARTCR2_TE | UARTCR2_RE;
+if (!cr)
+return;
+
+/* ok, the port was enabled */
+
+cr = readb(sport-&amp;gt;port.membase + UARTCR1);
+
+*parity = 'n';
+if (cr &amp;amp; UARTCR1_PE) {
+if (cr &amp;amp; UARTCR1_PT)
+*parity = 'o';
+else
+*parity = 'e';
+}
+
+if (cr &amp;amp; UARTCR1_M)
+*bits = 9;
+else
+*bits = 8;
+
+bdh = readb(sport-&amp;gt;port.membase + UARTBDH);
+bdh &amp;amp;= UARTBDH_SBR_MASK;
+bdl = readb(sport-&amp;gt;port.membase + UARTBDL);
+sbr = bdh;
+sbr &amp;lt;&amp;lt;= 8;
+sbr |= bdl;
+brfa = readb(sport-&amp;gt;port.membase + UARTCR4);
+brfa &amp;amp;= UARTCR4_BRFA_MASK;
+
+uartclk = clk_get_rate(sport-&amp;gt;clk);
+/*
+ * baud = mod_clk/(16*(sbr[13]+(brfa)/32)
+ */
+baud_raw = uartclk / (16 * (sbr + brfa / 32));
+
+if (*baud != baud_raw)
+printk(KERN_INFO "Serial: Console lpuart rounded baud rate"
+"from %d to %d\n", baud_raw, *baud);
+}
+
+static int __init lpuart_console_setup(struct console *co, char *options)
+{
+struct lpuart_port *sport;
+int baud = 115200;
+int bits = 8;
+int parity = 'n';
+int flow = 'n';
+
+/*
+ * check whether an invalid uart number has been specified, and
+ * if so, search for the first available port that does have
+ * console support.
+ */
+if (co-&amp;gt;index == -1 || co-&amp;gt;index &amp;gt;= ARRAY_SIZE(lpuart_ports))
+co-&amp;gt;index = 0;
+
+sport = lpuart_ports[co-&amp;gt;index];
+if (sport == NULL)
+return -ENODEV;
+
+if (options)
+uart_parse_options(options, &amp;amp;baud, &amp;amp;parity, &amp;amp;bits, &amp;amp;flow);
+else
+lpuart_console_get_options(sport, &amp;amp;baud, &amp;amp;parity, &amp;amp;bits);
+
+lpuart_setup_watermark(sport);
+
+return uart_set_options(&amp;amp;sport-&amp;gt;port, co, baud, parity, bits, flow);
+}
+
+static struct uart_driver lpuart_reg;
+static struct console lpuart_console = {
+.name= DEV_NAME,
+.write= lpuart_console_write,
+.device= uart_console_device,
+.setup= lpuart_console_setup,
+.flags= CON_PRINTBUFFER,
+.index= -1,
+.data= &amp;amp;lpuart_reg,
+};
+
+#define LPUART_CONSOLE(&amp;amp;lpuart_console)
+#else
+#define LPUART_CONSOLENULL
+#endif
+
+static struct uart_driver lpuart_reg = {
+.owner= THIS_MODULE,
+.driver_name= DRIVER_NAME,
+.dev_name= DEV_NAME,
+.nr= ARRAY_SIZE(lpuart_ports),
+.cons= LPUART_CONSOLE,
+};
+
+static int lpuart_probe(struct platform_device *pdev)
+{
+struct device_node *np = pdev-&amp;gt;dev.of_node;
+struct lpuart_port *sport;
+struct resource *res;
+int ret;
+
+sport = devm_kzalloc(&amp;amp;pdev-&amp;gt;dev, sizeof(*sport), GFP_KERNEL);
+if (!sport)
+return -ENOMEM;
+
+pdev-&amp;gt;dev.coherent_dma_mask = 0;
+
+ret = of_alias_get_id(np, "serial");
+if (ret &amp;lt; 0) {
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to get alias id, errno %d\n", ret);
+return ret;
+}
+sport-&amp;gt;port.line = ret;
+
+res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+if (!res)
+return -ENODEV;
+
+sport-&amp;gt;port.mapbase = res-&amp;gt;start;
+sport-&amp;gt;port.membase = devm_ioremap_resource(&amp;amp;pdev-&amp;gt;dev, res);
+if (IS_ERR(sport-&amp;gt;port.membase))
+return PTR_ERR(sport-&amp;gt;port.membase);
+
+sport-&amp;gt;port.dev = &amp;amp;pdev-&amp;gt;dev;
+sport-&amp;gt;port.type = PORT_LPUART;
+sport-&amp;gt;port.iotype = UPIO_MEM;
+sport-&amp;gt;port.irq = platform_get_irq(pdev, 0);
+sport-&amp;gt;port.ops = &amp;amp;lpuart_pops;
+sport-&amp;gt;port.flags = UPF_BOOT_AUTOCONF;
+
+sport-&amp;gt;clk = devm_clk_get(&amp;amp;pdev-&amp;gt;dev, "ipg");
+if (IS_ERR(sport-&amp;gt;clk)) {
+ret = PTR_ERR(sport-&amp;gt;clk);
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to get uart clk: %d\n", ret);
+return ret;
+}
+
+ret = clk_prepare_enable(sport-&amp;gt;clk);
+if (ret) {
+dev_err(&amp;amp;pdev-&amp;gt;dev, "failed to enable uart clk: %d\n", ret);
+return ret;
+}
+
+sport-&amp;gt;port.uartclk = clk_get_rate(sport-&amp;gt;clk);
+
+lpuart_ports[sport-&amp;gt;port.line] = sport;
+
+platform_set_drvdata(pdev, &amp;amp;sport-&amp;gt;port);
+
+ret = uart_add_one_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+if (ret) {
+clk_disable_unprepare(sport-&amp;gt;clk);
+return ret;
+}
+
+return 0;
+}
+
+static int lpuart_remove(struct platform_device *pdev)
+{
+struct lpuart_port *sport = platform_get_drvdata(pdev);
+
+uart_remove_one_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+clk_disable_unprepare(sport-&amp;gt;clk);
+
+return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int lpuart_suspend(struct device *dev)
+{
+struct lpuart_port *sport = dev_get_drvdata(dev);
+
+uart_suspend_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+return 0;
+}
+
+static int lpuart_resume(struct device *dev)
+{
+struct lpuart_port *sport = dev_get_drvdata(dev);
+
+uart_resume_port(&amp;amp;lpuart_reg, &amp;amp;sport-&amp;gt;port);
+
+return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(lpuart_pm_ops, lpuart_suspend, lpuart_resume);
+
+static struct platform_driver lpuart_driver = {
+.probe= lpuart_probe,
+.remove= lpuart_remove,
+.driver= {
+.name= "fsl-lpuart",
+.owner= THIS_MODULE,
+.of_match_table = lpuart_dt_ids,
+.pm= &amp;amp;lpuart_pm_ops,
+},
+};
+
+static int __init lpuart_serial_init(void)
+{
+int ret;
+
+pr_info("serial: Freescale lpuart driver\n");
+
+ret = uart_register_driver(&amp;amp;lpuart_reg);
+if (ret)
+return ret;
+
+ret = platform_driver_register(&amp;amp;lpuart_driver);
+if (ret)
+uart_unregister_driver(&amp;amp;lpuart_reg);
+
+return 0;
+}
+
+static void __exit lpuart_serial_exit(void)
+{
+platform_driver_unregister(&amp;amp;lpuart_driver);
+uart_unregister_driver(&amp;amp;lpuart_reg);
+}
+
+module_init(lpuart_serial_init);
+module_exit(lpuart_serial_exit);
+
+MODULE_DESCRIPTION("Freescale lpuart serial port driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/uapi/linux/serial_core.h b/include/uapi/linux/serial_core.h
index 74c2bf7..c8eaeb5 100644
--- a/include/uapi/linux/serial_core.h
+++ b/include/uapi/linux/serial_core.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -226,4 +226,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 /* Rocketport EXPRESS/INFINITY */
 #define PORT_RP2102
 
+/* Freescale lpuart */
+#define PORT_LPUART103
+
 #endif /* _UAPILINUX_SERIAL_CORE_H */
&lt;/pre&gt;</description>
    <dc:creator>Jingchang Lu</dc:creator>
    <dc:date>2013-05-30T05:53:37</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11520">
    <title>[PATCH] serail: imx: add support for DTE mode</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11520</link>
    <description>&lt;pre&gt;The uart works in the DCE mode by default, but sometime we need it
works at the DTE mode.

This patch adds the support for the DTE mode.

Signed-off-by: Huang Shijie &amp;lt;b32955&amp;lt; at &amp;gt;freescale.com&amp;gt;
---
 .../bindings/tty/serial/fsl-imx-uart.txt           |    3 +++
 drivers/tty/serial/imx.c                           |    6 ++++++
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/Documentation/devicetree/bindings/tty/serial/fsl-imx-uart.txt b/Documentation/devicetree/bindings/tty/serial/fsl-imx-uart.txt
index b462d0c..c662eb3 100644
--- a/Documentation/devicetree/bindings/tty/serial/fsl-imx-uart.txt
+++ b/Documentation/devicetree/bindings/tty/serial/fsl-imx-uart.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Required properties:
 Optional properties:
 - fsl,uart-has-rtscts : Indicate the uart has rts and cts
 - fsl,irda-mode : Indicate the uart supports irda mode
+- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
+                  is DCE mode by default.
 
 Example:
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,4 +18,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; serial&amp;lt; at &amp;gt;73fbc000 {
 reg = &amp;lt;0x73fbc000 0x4000&amp;gt;;
 interrupts = &amp;lt;31&amp;gt;;
 fsl,uart-has-rtscts;
+fsl,dte-mode;
 };
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 72bc1db..381a2d7 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -201,6 +201,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct imx_port {
 unsigned intold_status;
 inttxirq, rxirq, rtsirq;
 unsigned inthave_rtscts:1;
+unsigned intdte_mode:1;
 unsigned intuse_irda:1;
 unsigned intirda_inv_rx:1;
 unsigned intirda_inv_tx:1;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1020,6 +1021,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; imx_set_termios(struct uart_port *port, struct ktermios *termios,
 
 ufcr = readl(sport-&amp;gt;port.membase + UFCR);
 ufcr = (ufcr &amp;amp; (~UFCR_RFDIV)) | UFCR_RFDIV_REG(div);
+if (sport-&amp;gt;dte_mode)
+ufcr |= UFCR_DCEDTE;
 writel(ufcr, sport-&amp;gt;port.membase + UFCR);
 
 writel(num, sport-&amp;gt;port.membase + UBIR);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1444,6 +1447,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int serial_imx_probe_dt(struct imx_port *sport,
 if (of_get_property(np, "fsl,irda-mode", NULL))
 sport-&amp;gt;use_irda = 1;
 
+if (of_get_property(np, "fsl,dte-mode", NULL))
+sport-&amp;gt;dte_mode = 1;
+
 sport-&amp;gt;devdata = of_id-&amp;gt;data;
 
 return 0;
&lt;/pre&gt;</description>
    <dc:creator>Huang Shijie</dc:creator>
    <dc:date>2013-05-30T06:07:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11517">
    <title>[PATCH] serial: samsung: missing uart_unregister_driver() on error in s3c24xx_serial_modinit()</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11517</link>
    <description>&lt;pre&gt;From: Wei Yongjun &amp;lt;yongjun_wei&amp;lt; at &amp;gt;trendmicro.com.cn&amp;gt;

Add the missing uart_unregister_driver() before return from
s3c24xx_serial_modinit() in the error handling case.

Signed-off-by: Wei Yongjun &amp;lt;yongjun_wei&amp;lt; at &amp;gt;trendmicro.com.cn&amp;gt;
---
 drivers/tty/serial/samsung.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index 8942941..1c2b8c3 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1798,7 +1798,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __init s3c24xx_serial_modinit(void)
 return ret;
 }
 
-return platform_driver_register(&amp;amp;samsung_serial_driver);
+ret = platform_driver_register(&amp;amp;samsung_serial_driver);
+if (ret &amp;lt; 0) {
+pr_err("Failed to register platform driver\n");
+uart_unregister_driver(&amp;amp;s3c24xx_uart_drv);
+}
+
+return ret;
 }
 
 static void __exit s3c24xx_serial_modexit(void)

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo&amp;lt; at &amp;gt;vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>Wei Yongjun</dc:creator>
    <dc:date>2013-05-29T05:47:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.serial/11514">
    <title>[PATCH] driver: tty: add missing unregister in err case</title>
    <link>http://comments.gmane.org/gmane.linux.serial/11514</link>
    <description>&lt;pre&gt;
when platform_driver_register broken, we should unregister ucc_uart_driver

Signed-off-by: Libo chen &amp;lt;libo.chen&amp;lt; at &amp;gt;huawei.com&amp;gt;
---
 drivers/tty/serial/ucc_uart.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/drivers/tty/serial/ucc_uart.c b/drivers/tty/serial/ucc_uart.c
index 7355303..f86f447 100644
--- a/drivers/tty/serial/ucc_uart.c
+++ b/drivers/tty/serial/ucc_uart.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1518,9 +1518,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __init ucc_uart_init(void)
 }

 ret = platform_driver_register(&amp;amp;ucc_uart_of_driver);
-if (ret)
+if (ret) {
 printk(KERN_ERR
        "ucc-uart: could not register platform driver\n");
+uart_unregister_driver(&amp;amp;ucc_uart_driver);
+}

 return ret;
 }
&lt;/pre&gt;</description>
    <dc:creator>Libo Chen</dc:creator>
    <dc:date>2013-05-29T02:33:16</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.linux.serial">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.linux.serial</link>
  </textinput>
</rdf:RDF>
