浏览代码

ACPI / LPSS: not using UART RTS override with Auto Flow Control

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>
Heikki Krogerus 11 年之前
父节点
当前提交
1f47a77c4e
共有 1 个文件被更改,包括 15 次插入7 次删除
  1. 15 7
      drivers/acpi/acpi_lpss.c

+ 15 - 7
drivers/acpi/acpi_lpss.c

@@ -83,18 +83,26 @@ struct lpss_private_data {
 	u32 prv_reg_ctx[LPSS_PRV_REG_COUNT];
 	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)
 static void lpss_uart_setup(struct lpss_private_data *pdata)
 {
 {
 	unsigned int offset;
 	unsigned int offset;
-	u32 reg;
+	u32 val;
 
 
 	offset = pdata->dev_desc->prv_offset + LPSS_TX_INT;
 	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)
 static void byt_i2c_setup(struct lpss_private_data *pdata)