unsigned int            have_rtscts:1;
        unsigned int            have_rtsgpio:1;
        unsigned int            dte_mode:1;
+       unsigned int            inverted_tx:1;
+       unsigned int            inverted_rx:1;
        struct clk              *clk_ipg;
        struct clk              *clk_per;
        const struct imx_uart_data *devdata;
        int retval, i;
        unsigned long flags;
        int dma_is_inited = 0;
-       u32 ucr1, ucr2, ucr4;
+       u32 ucr1, ucr2, ucr3, ucr4;
 
        retval = clk_prepare_enable(sport->clk_per);
        if (retval)
 
        imx_uart_writel(sport, ucr1, UCR1);
 
-       ucr4 = imx_uart_readl(sport, UCR4) & ~UCR4_OREN;
+       ucr4 = imx_uart_readl(sport, UCR4) & ~(UCR4_OREN | UCR4_INVR);
        if (!sport->dma_is_enabled)
                ucr4 |= UCR4_OREN;
+       if (sport->inverted_rx)
+               ucr4 |= UCR4_INVR;
        imx_uart_writel(sport, ucr4, UCR4);
 
+       ucr3 = imx_uart_readl(sport, UCR3) & ~UCR3_INVT;
+       /*
+        * configure tx polarity before enabling tx
+        */
+       if (sport->inverted_tx)
+               ucr3 |= UCR3_INVT;
+
+       if (!imx_uart_is_imx1(sport)) {
+               ucr3 |= UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
+
+               if (sport->dte_mode)
+                       /* disable broken interrupts */
+                       ucr3 &= ~(UCR3_RI | UCR3_DCD);
+       }
+       imx_uart_writel(sport, ucr3, UCR3);
+
        ucr2 = imx_uart_readl(sport, UCR2) & ~UCR2_ATEN;
        ucr2 |= (UCR2_RXEN | UCR2_TXEN);
        if (!sport->have_rtscts)
                ucr2 &= ~UCR2_RTSEN;
        imx_uart_writel(sport, ucr2, UCR2);
 
-       if (!imx_uart_is_imx1(sport)) {
-               u32 ucr3;
-
-               ucr3 = imx_uart_readl(sport, UCR3);
-
-               ucr3 |= UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
-
-               if (sport->dte_mode)
-                       /* disable broken interrupts */
-                       ucr3 &= ~(UCR3_RI | UCR3_DCD);
-
-               imx_uart_writel(sport, ucr3, UCR3);
-       }
-
        /*
         * Enable modem status interrupts
         */
        if (of_get_property(np, "rts-gpios", NULL))
                sport->have_rtsgpio = 1;
 
+       if (of_get_property(np, "fsl,inverted-tx", NULL))
+               sport->inverted_tx = 1;
+
+       if (of_get_property(np, "fsl,inverted-rx", NULL))
+               sport->inverted_rx = 1;
+
        return 0;
 }
 #else