ACPI / LPSS: not using UART RTS override with Auto Flow Control
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Thu, 11 Sep 2014 12:19:33 +0000 (15:19 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 24 Sep 2014 21:06:52 +0000 (23:06 +0200)
Adding a check for UART Auto Flow Control feature and only
enabling the RTS override when it's not supported. RTS
override is not needed when Auto Flow Control is used and
they shouldn't be used together.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_lpss.c

index 1951b5967aa9f758098ad4ed7702434973091391..76cc698055cd7ec8ebee048135762793fd3ff9dc 100644 (file)
@@ -83,18 +83,26 @@ struct lpss_private_data {
        u32 prv_reg_ctx[LPSS_PRV_REG_COUNT];
 };
 
+/* UART Component Parameter Register */
+#define LPSS_UART_CPR                  0xF4
+#define LPSS_UART_CPR_AFCE             BIT(4)
+
 static void lpss_uart_setup(struct lpss_private_data *pdata)
 {
        unsigned int offset;
-       u32 reg;
+       u32 val;
 
        offset = pdata->dev_desc->prv_offset + LPSS_TX_INT;
-       reg = readl(pdata->mmio_base + offset);
-       writel(reg | LPSS_TX_INT_MASK, pdata->mmio_base + offset);
-
-       offset = pdata->dev_desc->prv_offset + LPSS_GENERAL;
-       reg = readl(pdata->mmio_base + offset);
-       writel(reg | LPSS_GENERAL_UART_RTS_OVRD, pdata->mmio_base + offset);
+       val = readl(pdata->mmio_base + offset);
+       writel(val | LPSS_TX_INT_MASK, pdata->mmio_base + offset);
+
+       val = readl(pdata->mmio_base + LPSS_UART_CPR);
+       if (!(val & LPSS_UART_CPR_AFCE)) {
+               offset = pdata->dev_desc->prv_offset + LPSS_GENERAL;
+               val = readl(pdata->mmio_base + offset);
+               val |= LPSS_GENERAL_UART_RTS_OVRD;
+               writel(val, pdata->mmio_base + offset);
+       }
 }
 
 static void byt_i2c_setup(struct lpss_private_data *pdata)