|
@@ -238,6 +238,26 @@ static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
|
|
|
pdata->enable_wakeup(up->dev, enable);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Calculate the absolute difference between the desired and actual baud
|
|
|
+ * rate for the given mode.
|
|
|
+ */
|
|
|
+static inline int calculate_baud_abs_diff(struct uart_port *port,
|
|
|
+ unsigned int baud, unsigned int mode)
|
|
|
+{
|
|
|
+ unsigned int n = port->uartclk / (mode * baud);
|
|
|
+ int abs_diff;
|
|
|
+
|
|
|
+ if (n == 0)
|
|
|
+ n = 1;
|
|
|
+
|
|
|
+ abs_diff = baud - (port->uartclk / (mode * n));
|
|
|
+ if (abs_diff < 0)
|
|
|
+ abs_diff = -abs_diff;
|
|
|
+
|
|
|
+ return abs_diff;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* serial_omap_baud_is_mode16 - check if baud rate is MODE16X
|
|
|
* @port: uart port info
|
|
@@ -252,24 +272,10 @@ static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
|
|
|
static bool
|
|
|
serial_omap_baud_is_mode16(struct uart_port *port, unsigned int baud)
|
|
|
{
|
|
|
- unsigned int n13 = port->uartclk / (13 * baud);
|
|
|
- unsigned int n16 = port->uartclk / (16 * baud);
|
|
|
- int baudAbsDiff13;
|
|
|
- int baudAbsDiff16;
|
|
|
-
|
|
|
- if (n13 == 0)
|
|
|
- n13 = 1;
|
|
|
- if (n16 == 0)
|
|
|
- n16 = 1;
|
|
|
-
|
|
|
- baudAbsDiff13 = baud - (port->uartclk / (13 * n13));
|
|
|
- baudAbsDiff16 = baud - (port->uartclk / (16 * n16));
|
|
|
- if (baudAbsDiff13 < 0)
|
|
|
- baudAbsDiff13 = -baudAbsDiff13;
|
|
|
- if (baudAbsDiff16 < 0)
|
|
|
- baudAbsDiff16 = -baudAbsDiff16;
|
|
|
-
|
|
|
- return (baudAbsDiff13 >= baudAbsDiff16);
|
|
|
+ int abs_diff_13 = calculate_baud_abs_diff(port, baud, 13);
|
|
|
+ int abs_diff_16 = calculate_baud_abs_diff(port, baud, 16);
|
|
|
+
|
|
|
+ return (abs_diff_13 >= abs_diff_16);
|
|
|
}
|
|
|
|
|
|
/*
|