Skip to contentSkip to conversation

OMAP2+: UART: Enable tx wakeup + remove cpu checks

PATCH Superseded Govindraj.R 7 participants 21 messages Mar 21, 2012 – Apr 5, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

* Removes the cpu checks wherever possible and use version reg for populating features and errata's
* enable tx wakeup available in wer reg for applicable module revision's

Govindraj.R (3):
OMAP2+: UART: Remove cpu checks for populating errata flags OMAP2+: UART: enable tx wakeup bit for wer reg
OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

 arch/arm/mach-omap2/serial.c                  |   13 +----
 arch/arm/plat-omap/include/plat/omap-serial.h |    8 +++-
 drivers/tty/serial/omap-serial.c              |   71 ++++++++++++++++++++++++-
 3 files changed, 78 insertions(+), 14 deletions(-)
Signature · 1 line
1.7.5.4
#1 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

From: "Govindraj.R" <[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

---
 arch/arm/mach-omap2/serial.c                  |    8 ---
 arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
 drivers/tty/serial/omap-serial.c              |   62 ++++++++++++++++++++++++-
 3 files changed, 61 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index f590afc..330ee04 100644
@@ -357,14 +357,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420() && !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 	pdata = &omap_up;
 	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
 	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
 	unsigned int		dma_rx_buf_size;
 	unsigned int		dma_rx_timeout;
 	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +61 -1

86 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#2 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

Hi Govindraj,

Quoted 71 lines · Govindraj.R

From: "Govindraj.R"<[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

---
  arch/arm/mach-omap2/serial.c                  |    8 ---
  arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
  drivers/tty/serial/omap-serial.c              |   62 ++++++++++++++++++++++++-
  3 files changed, 61 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index f590afc..330ee04 100644
@@ -357,14 +357,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
  	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
  	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420()&&  !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
  	pdata =&omap_up;
  	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
  	bool			dma_enabled;	/* To specify DMA Mode */
  	unsigned int		uartclk;	/* UART clock rate */
  	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
  	unsigned int		dma_rx_buf_size;
  	unsigned int		dma_rx_timeout;
  	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +7 -0
index f809041..c7666d6 100644
@@ -44,6 +44,13 @@
  #include<plat/dmtimer.h>
  #include<plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)	(((x)<<  8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+
  #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
  /* SCR register bitmasks */
@@ -1346,6 +1353,58 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
  	return;
  }
 

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1365

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+	u32 mvr, scheme;
+	u16 revision, major, minor;
+
+	mvr = serial_in(up, UART_OMAP_MVER);
+
+	/* Check revision register scheme */
+	scheme = mvr&  (0x03<<  30);
+	scheme>>= 30;

Minor nit-pick, why not just ...

	scheme = mvr >> 30;

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1369

Quoted 3 lines
drivers/tty/serial/omap-serial.c +3 -0
+	switch (scheme) {
+	case 0: /* Legacy Scheme: OMAP2/3 */
+		/* MINOR_REV[0:4], MAJOR_REV[4:7] */

Same scheme applies to OMAP1 devices too. So maybe we should include in the comment.

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)

Quoted 7 lines
drivers/tty/serial/omap-serial.c +7 -0
+		major = (mvr&  0xf0)>>  4;
+		minor = (mvr&  0x0f);
+		break;
+	case 1:
+		/* New Scheme: OMAP4+ */
+		/* MINOR_REV[0:5], MAJOR_REV[8:10] */
+		major = (mvr&  0x7<<  8)>>  8;

Nit-pick ...

	major = (mvr >> 8) & 0x7;
Quoted 19 lines
drivers/tty/serial/omap-serial.c +19 -0
+		minor = (mvr&  0x3f);
+		break;
+	default:
+		dev_warn(&up->pdev->dev,
+			"Unknown %s revision, defaulting to highest\n",
+			up->name);
+		/* highest possible revision */
+		major = 0xff;
+		minor = 0xff;
+	}
+
+	/* normalize revision for the driver */
+	revision = UART_BUILD_REVISION(major, minor);
+
+	switch (revision) {
+	case OMAP_UART_REV_46:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1405

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+	case OMAP_UART_REV_52:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;
+	case OMAP_UART_REV_63:
+		up->errata |= UART_ERRATA_i202_MDR1_ACCESS;
+		break;
+	default:
+		break;
+	}

Should we also warn on an unknown revision?

Quoted 22 lines
drivers/tty/serial/omap-serial.c +4 -1
+}
+
  static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
  {
  	struct omap_uart_port_info *omap_up_info;
@@ -1443,7 +1502,6 @@ static int serial_omap_probe(struct platform_device *pdev)
  						"%d\n", DEFAULT_CLK_SPEED);
  	}
  	up->uart_dma.uart_base = mem->start;
-	up->errata = omap_up_info->errata;
 
  	if (omap_up_info->dma_enabled) {
  		up->uart_dma.uart_dma_tx = dma_tx->start;
@@ -1473,6 +1531,8 @@ static int serial_omap_probe(struct platform_device *pdev)
  	pm_runtime_enable(&pdev->dev);
  	pm_runtime_get_sync(&pdev->dev);
 
+	omap_serial_fill_features_erratas(up);
+
  	ui[up->port.line] = up;
  	serial_omap_add_console_port(up);
 
#3 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

In reply to Govindraj.R

Hi Govindraj,

Quoted 71 lines · Govindraj.R

From: "Govindraj.R"<[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

---
  arch/arm/mach-omap2/serial.c                  |    8 ---
  arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
  drivers/tty/serial/omap-serial.c              |   62 ++++++++++++++++++++++++-
  3 files changed, 61 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index f590afc..330ee04 100644
@@ -357,14 +357,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
  	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
  	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420()&&  !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
  	pdata =&omap_up;
  	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
  	bool			dma_enabled;	/* To specify DMA Mode */
  	unsigned int		uartclk;	/* UART clock rate */
  	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
  	unsigned int		dma_rx_buf_size;
  	unsigned int		dma_rx_timeout;
  	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +7 -0
index f809041..c7666d6 100644
@@ -44,6 +44,13 @@
  #include<plat/dmtimer.h>
  #include<plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)	(((x)<<  8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+
  #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
  /* SCR register bitmasks */
@@ -1346,6 +1353,58 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
  	return;
  }
 

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1365

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+	u32 mvr, scheme;
+	u16 revision, major, minor;
+
+	mvr = serial_in(up, UART_OMAP_MVER);
+
+	/* Check revision register scheme */
+	scheme = mvr&  (0x03<<  30);
+	scheme>>= 30;

Minor nit-pick, why not ...

	scheme = mvr >> 30;

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1369

Quoted 3 lines
drivers/tty/serial/omap-serial.c +3 -0
+	switch (scheme) {
+	case 0: /* Legacy Scheme: OMAP2/3 */
+		/* MINOR_REV[0:4], MAJOR_REV[4:7] */

This scheme is also true from OMAP1 devices. Maybe we could include in the comment.

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)

Quoted 7 lines
drivers/tty/serial/omap-serial.c +7 -0
+		major = (mvr&  0xf0)>>  4;
+		minor = (mvr&  0x0f);
+		break;
+	case 1:
+		/* New Scheme: OMAP4+ */
+		/* MINOR_REV[0:5], MAJOR_REV[8:10] */
+		major = (mvr&  0x7<<  8)>>  8;

Nit-pick ...

	major = (mvr >> 8) & 0x7;

Cheers
Jon

#4 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

Quoted 96 lines · Jon Hunter

Hi Govindraj,

Quoted 78 lines · Govindraj.R

From: "Govindraj.R"<[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

---

?arch/arm/mach-omap2/serial.c ? ? ? ? ? ? ? ? ?| ? ?8 ---
?arch/arm/plat-omap/include/plat/omap-serial.h | ? ?1 -
?drivers/tty/serial/omap-serial.c ? ? ? ? ? ? ?| ? 62

++++++++++++++++++++++++-
?3 files changed, 61 insertions(+), 10 deletions(-)

arch/arm/mach-omap2/serial.c +0 -8
index f590afc..330ee04 100644
@@ -357,14 +357,6 @@ void __init omap_serial_init_port(struct
 omap_board_data *bdata,
 ? ? ? ?omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 ? ? ? ?omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
- ? ? ? /* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
- ? ? ? if (!cpu_is_omap2420()&& ?!cpu_is_ti816x())
 
- ? ? ? ? ? ? ? omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
- ? ? ? /* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
- ? ? ? if (cpu_is_omap34xx() || cpu_is_omap3630())
- ? ? ? ? ? ? ? omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 ? ? ? ?pdata =&omap_up;

? ? ? ?pdata_size = sizeof(struct omap_uart_port_info);

arch/arm/plat-omap/include/plat/omap-serial.h +0 -0
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {

? ? ? ?bool ? ? ? ? ? ? ? ? ? ?dma_enabled; ? ?/* To specify DMA Mode */ ? ? ? ?unsigned int ? ? ? ? ? ?uartclk; ? ? ? ?/* UART clock rate */ ? ? ? ?upf_t ? ? ? ? ? ? ? ? ? flags; ? ? ? ? ?/* UPF_* flags */
- ? ? ? u32 ? ? ? ? ? ? ? ? ? ? errata;
? ? ? ?unsigned int ? ? ? ? ? ?dma_rx_buf_size;
? ? ? ?unsigned int ? ? ? ? ? ?dma_rx_timeout;
? ? ? ?unsigned int ? ? ? ? ? ?autosuspend_timeout;

drivers/tty/serial/omap-serial.c +0 -0
index f809041..c7666d6 100644
@@ -44,6 +44,13 @@

?#include<plat/dmtimer.h>
?#include<plat/omap-serial.h>

drivers/tty/serial/omap-serial.c +7 -0
+#define UART_BUILD_REVISION(x, y) ? ? ?(((x)<< ?8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+

?#define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/

?/* SCR register bitmasks */

drivers/tty/serial/omap-serial.c +0 -0
@@ -1346,6 +1353,58 @@ static void uart_tx_dma_callback(int lch, u16
 ch_status, void *data)
 ? ? ? ?return;
 ?}
 

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 · line 1366

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+ ? ? ? u32 mvr, scheme;
+ ? ? ? u16 revision, major, minor;
+
+ ? ? ? mvr = serial_in(up, UART_OMAP_MVER);
+
+ ? ? ? /* Check revision register scheme */
+ ? ? ? scheme = mvr& ?(0x03<< ?30);
+ ? ? ? scheme>>= 30;

Minor nit-pick, why not ...

Quoted 2 lines

? ? ? ?scheme = mvr >> 30;

yes will correct it.

Quoted 8 lines

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 · line 1369

Quoted 4 lines
drivers/tty/serial/omap-serial.c +3 -0
+ ? ? ? switch (scheme) {
+ ? ? ? case 0: /* Legacy Scheme: OMAP2/3 */
+ ? ? ? ? ? ? ? /* MINOR_REV[0:4], MAJOR_REV[4:7] */

This scheme is also true from OMAP1 devices. Maybe we could include in the comment.

No omap1 from $SUBJECT also reason,

mach-omap1/serial.c => 8250.c
mach-omap2/serial.c => omap-serial.c

Quoted 11 lines

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 · line 1377

Quoted 9 lines
drivers/tty/serial/omap-serial.c +7 -0
+ ? ? ? ? ? ? ? major = (mvr& ?0xf0)>> ?4;
+ ? ? ? ? ? ? ? minor = (mvr& ?0x0f);
 
+ ? ? ? ? ? ? ? break;
+ ? ? ? case 1:
+ ? ? ? ? ? ? ? /* New Scheme: OMAP4+ */
+ ? ? ? ? ? ? ? /* MINOR_REV[0:5], MAJOR_REV[8:10] */
+ ? ? ? ? ? ? ? major = (mvr& ?0x7<< ?8)>> ?8;
Quoted 3 lines

Nit-pick ...

? ? ? ?major = (mvr >> 8) & 0x7;

yes fine will correct this.

--
Thanks,
Govindraj.R

#5 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

Hi Govindraj,

Quoted 97 lines · Govindraj
Quoted 96 lines · Jon Hunter

Hi Govindraj,

Quoted 78 lines · Govindraj.R

From: "Govindraj.R"<[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

---
  arch/arm/mach-omap2/serial.c                  |    8 ---
  arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
  drivers/tty/serial/omap-serial.c              |   62
++++++++++++++++++++++++-
  3 files changed, 61 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index f590afc..330ee04 100644
@@ -357,14 +357,6 @@ void __init omap_serial_init_port(struct
 omap_board_data *bdata,
        omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
        omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-       /* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-       if (!cpu_is_omap2420()&&    !cpu_is_ti816x())
 
-               omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-       /* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-       if (cpu_is_omap34xx() || cpu_is_omap3630())
-               omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
        pdata =&omap_up;
        pdata_size = sizeof(struct omap_uart_port_info);
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
        bool                    dma_enabled;    /* To specify DMA Mode */
        unsigned int            uartclk;        /* UART clock rate */
        upf_t                   flags;          /* UPF_* flags */
-       u32                     errata;
        unsigned int            dma_rx_buf_size;
        unsigned int            dma_rx_timeout;
        unsigned int            autosuspend_timeout;
drivers/tty/serial/omap-serial.c +7 -0
index f809041..c7666d6 100644
@@ -44,6 +44,13 @@
  #include<plat/dmtimer.h>
  #include<plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)      (((x)<<    8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+
  #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
  /* SCR register bitmasks */
@@ -1346,6 +1353,58 @@ static void uart_tx_dma_callback(int lch, u16
 ch_status, void *data)
        return;
  }
 

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 · line 1366

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+       u32 mvr, scheme;
+       u16 revision, major, minor;
+
+       mvr = serial_in(up, UART_OMAP_MVER);
+
+       /* Check revision register scheme */
+       scheme = mvr&    (0x03<<    30);
+       scheme>>= 30;

Minor nit-pick, why not ...

Quoted 4 lines
Quoted 2 lines
        scheme = mvr>>  30;

yes will correct it.

Thinking some more, could be better to add some #defines for OMAP_MVR_VERSION_MASK/SHIFT here.

Quoted 6 lines
Quoted 6 lines
Quoted 4 lines
drivers/tty/serial/omap-serial.c +3 -0
+       switch (scheme) {
+       case 0: /* Legacy Scheme: OMAP2/3 */
+               /* MINOR_REV[0:4], MAJOR_REV[4:7] */
Quoted 7 lines
Quoted 2 lines

This scheme is also true from OMAP1 devices. Maybe we could include in the comment.

No omap1 from $SUBJECT also reason,

mach-omap1/serial.c => 8250.c
mach-omap2/serial.c => omap-serial.c

Got it! Thanks.

Quoted 10 lines
Quoted 10 lines
Quoted 8 lines
drivers/tty/serial/omap-serial.c +7 -0
+               major = (mvr&    0xf0)>>    4;
+               minor = (mvr&    0x0f);
 
+               break;
+       case 1:
+               /* New Scheme: OMAP4+ */
+               /* MINOR_REV[0:5], MAJOR_REV[8:10] */
+               major = (mvr&    0x7<<    8)>>    8;
Quoted 5 lines
Quoted 3 lines

Nit-pick ...

        major = (mvr>>  8)&  0x7;

yes fine will correct this.

May be we should add #defines here to for OMAP_UART_MVR1_MAJ_MASK/SHIFT, OMAP_UART_MVR1_MIN_MASK/SHIFT, OMAP_UART_MVR2_MAJ_MASK/SHIFT and OMAP_UART_MVR2_MIN_MASK/SHIFT.

Jon

#6 lore raw

PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags

Quoted 10 lines · Jon Hunter

Hi Govindraj,

Quoted 6 lines · Govindraj
Quoted 4 lines · On Wed, Mar 28, 2012 at 2:38 AM, Jon Hunter<[email protected]> ?wrote:

Hi Govindraj,

[...]

Quoted 13 lines
Quoted 13 lines
Quoted 13 lines

Review

Quoted 8 lines

+ ? ? ? u32 mvr, scheme;
+ ? ? ? u16 revision, major, minor;

(quoted diff) +6 -0
+
+ ? ? ? mvr = serial_in(up, UART_OMAP_MVER);
+
+ ? ? ? /* Check revision register scheme */
+ ? ? ? scheme = mvr& ? ?(0x03<< ? ?30);
+ ? ? ? scheme>>= 30;

Minor nit-pick, why not ...

Quoted 9 lines
Quoted 4 lines
Quoted 2 lines

? ? ? ?scheme = mvr>> ?30;

yes will correct it.

Thinking some more, could be better to add some #defines for OMAP_MVR_VERSION_MASK/SHIFT here.

Yes sure.

Quoted 37 lines
Quoted 13 lines
Quoted 11 lines
Quoted 5 lines

+ ? ? ? switch (scheme) {
+ ? ? ? case 0: /* Legacy Scheme: OMAP2/3 */
+ ? ? ? ? ? ? ? /* MINOR_REV[0:4], MAJOR_REV[4:7] */

This scheme is also true from OMAP1 devices. Maybe we could include in the
comment.

Quoted 4 lines

No omap1 from $SUBJECT also reason,

mach-omap1/serial.c => ?8250.c
mach-omap2/serial.c => ?omap-serial.c

Got it! Thanks.

Quoted 16 lines
Quoted 14 lines
Quoted 8 lines

+ ? ? ? ? ? ? ? major = (mvr& ? ?0xf0)>> ? ?4;
+ ? ? ? ? ? ? ? minor = (mvr& ? ?0x0f);

+ ? ? ? ? ? ? ? break;
+ ? ? ? case 1:
+ ? ? ? ? ? ? ? /* New Scheme: OMAP4+ */
+ ? ? ? ? ? ? ? /* MINOR_REV[0:5], MAJOR_REV[8:10] */
+ ? ? ? ? ? ? ? major = (mvr& ? ?0x7<< ? ?8)>> ? ?8;

Nit-pick ...

? ? ? ?major = (mvr>> ?8)& ?0x7;

Quoted 7 lines
Quoted 1 line

yes fine will correct this.

May be we should add #defines here to for OMAP_UART_MVR1_MAJ_MASK/SHIFT, OMAP_UART_MVR1_MIN_MASK/SHIFT, OMAP_UART_MVR2_MAJ_MASK/SHIFT and OMAP_UART_MVR2_MIN_MASK/SHIFT.

okay will add this.

--
Thanks,
Govindraj.R

#7 lore raw

PATCH v2 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags

In reply to Govindraj.R

From: "Govindraj.R" <[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

Cc Paul Walmsley <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Jon Hunter <[email protected]>
---
 arch/arm/mach-omap2/serial.c                  |    8 ---
 arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
 drivers/tty/serial/omap-serial.c              |   75 ++++++++++++++++++++++++-
 3 files changed, 74 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index 0cdd359..6affdd4 100644
@@ -355,14 +355,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420() && !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 	pdata = &omap_up;
 	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
 	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
 	unsigned int		dma_rx_buf_size;
 	unsigned int		dma_rx_timeout;
 	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +74 -1

105 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#8 lore raw

PATCH v2 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags

Hi Govindraj,

Looks good, one minor comment ...

Quoted 70 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

Cc Paul Walmsley <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Jon Hunter <[email protected]>
---
 arch/arm/mach-omap2/serial.c                  |    8 ---
 arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
 drivers/tty/serial/omap-serial.c              |   75 ++++++++++++++++++++++++-
 3 files changed, 74 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index 0cdd359..6affdd4 100644
@@ -355,14 +355,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420() && !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 	pdata = &omap_up;
 	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
 	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
 	unsigned int		dma_rx_buf_size;
 	unsigned int		dma_rx_timeout;
 	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +7 -0
index 0121486..7d218c6 100644
@@ -44,6 +44,13 @@
 #include <plat/dmtimer.h>
 #include <plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)	(((x) << 8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+
 #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
 /* SCR register bitmasks */
@@ -53,6 +60,18 @@
 #define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT		6

drivers/tty/serial/omap-serial.c line 70

Quoted 10 lines
drivers/tty/serial/omap-serial.c +8 -0
 #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK			(0x3 << 6)
 
+/* MVR register bitmasks */
+#define OMAP_UART_MVR_SCHEME_SHIFT	30
+
+#define OMAP_UART_LEGACY_MVR_MAJ_MASK	0xf0
+#define OMAP_UART_LEGACY_MVR_MAJ_SHIFT	4
+#define OMAP_UART_LEGACY_MVR_MIN_MASK	0x0f
+
+#define OMAP_UART_MVR_MAJ_MASK		0x7

I think that you need to be consistent in how you define the mask and shifts here. For Legacy major the mask is the actual bits in the register representing the major number but for non-legacy the mask is simply the bits minus the shift. So may be change the above define to ...

#define OMAP_UART_MVR_MAJ_MASK 0x700

drivers/tty/serial/omap-serial.c line 74

Quoted 4 lines
drivers/tty/serial/omap-serial.c +4 -0
+#define OMAP_UART_MVR_MAJ_SHIFT		8
+#define OMAP_UART_MVR_MIN_MASK		0x3f
+
+

I think you can remove one of the above lines of white space.

Quoted 19 lines
drivers/tty/serial/omap-serial.c +12 -0
 static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
 
 /* Forward declaration of functions */
@@ -1346,6 +1365,59 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
 	return;
 }
 
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+	u32 mvr, scheme;
+	u16 revision, major, minor;
+
+	mvr = serial_in(up, UART_OMAP_MVER);
+
+	/* Check revision register scheme */
+	scheme = mvr >> OMAP_UART_MVR_SCHEME_SHIFT;
+
+	switch (scheme) {
+	case 0: /* Legacy Scheme: OMAP2/3 */

drivers/tty/serial/omap-serial.c static void uart_tx_dma_callback(int lch, u16 ch_status, void *data) · line 1389

Quoted 10 lines
drivers/tty/serial/omap-serial.c +10 -0
+		/* MINOR_REV[0:4], MAJOR_REV[4:7] */
+		major = (mvr & OMAP_UART_LEGACY_MVR_MAJ_MASK) >>
+					OMAP_UART_LEGACY_MVR_MAJ_SHIFT;
+		minor = (mvr & OMAP_UART_LEGACY_MVR_MIN_MASK);
+		break;
+	case 1:
+		/* New Scheme: OMAP4+ */
+		/* MINOR_REV[0:5], MAJOR_REV[8:10] */
+		major = (mvr >> OMAP_UART_MVR_MAJ_SHIFT) &
+					OMAP_UART_MVR_MAJ_MASK;

By changing the mask definition, you can then make the code for extracting the major number consistent between legacy and non-legacy devices too. Easier to read :-)

Cheers
Jon

#9 lore raw

PATCH v3 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags

In reply to Govindraj.R

From: "Govindraj.R" <[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

Cc Jon Hunter <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Kevin Hilman <[email protected]>
---
 arch/arm/mach-omap2/serial.c                  |    8 ---
 arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
 drivers/tty/serial/omap-serial.c              |   74 ++++++++++++++++++++++++-
 3 files changed, 73 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index 0cdd359..6affdd4 100644
@@ -355,14 +355,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420() && !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 	pdata = &omap_up;
 	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
 	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
 	unsigned int		dma_rx_buf_size;
 	unsigned int		dma_rx_timeout;
 	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +73 -1

104 lines not on this page · raw message

Signature · 1 line
1.7.5.4
#10 lore raw

PATCH v3 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags

Hi Govindraj,

Quoted 155 lines · Govindraj.R

From: "Govindraj.R"<[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

Cc Jon Hunter<[email protected]>
Cc Paul Walmsley<[email protected]>
Cc Kevin Hilman<[email protected]>
---
  arch/arm/mach-omap2/serial.c                  |    8 ---
  arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
  drivers/tty/serial/omap-serial.c              |   74 ++++++++++++++++++++++++-
  3 files changed, 73 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
index 0cdd359..6affdd4 100644
@@ -355,14 +355,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
  	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
  	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420()&&  !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
  	pdata =&omap_up;
  	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
  	bool			dma_enabled;	/* To specify DMA Mode */
  	unsigned int		uartclk;	/* UART clock rate */
  	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
  	unsigned int		dma_rx_buf_size;
  	unsigned int		dma_rx_timeout;
  	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +71 -1
index 0121486..0555c96 100644
@@ -44,6 +44,13 @@
  #include<plat/dmtimer.h>
  #include<plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)	(((x)<<  8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603
+
  #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
  /* SCR register bitmasks */
@@ -53,6 +60,17 @@
  #define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT		6
  #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK			(0x3<<  6)
 
+/* MVR register bitmasks */
+#define OMAP_UART_MVR_SCHEME_SHIFT	30
+
+#define OMAP_UART_LEGACY_MVR_MAJ_MASK	0xf0
+#define OMAP_UART_LEGACY_MVR_MAJ_SHIFT	4
+#define OMAP_UART_LEGACY_MVR_MIN_MASK	0x0f
+
+#define OMAP_UART_MVR_MAJ_MASK		0x700
+#define OMAP_UART_MVR_MAJ_SHIFT		8
+#define OMAP_UART_MVR_MIN_MASK		0x3f
+
  static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
 
  /* Forward declaration of functions */
@@ -1346,6 +1364,59 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
  	return;
  }
 
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+	u32 mvr, scheme;
+	u16 revision, major, minor;
+
+	mvr = serial_in(up, UART_OMAP_MVER);
+
+	/* Check revision register scheme */
+	scheme = mvr>>  OMAP_UART_MVR_SCHEME_SHIFT;
+
+	switch (scheme) {
+	case 0: /* Legacy Scheme: OMAP2/3 */
+		/* MINOR_REV[0:4], MAJOR_REV[4:7] */
+		major = (mvr&  OMAP_UART_LEGACY_MVR_MAJ_MASK)>>
+					OMAP_UART_LEGACY_MVR_MAJ_SHIFT;
+		minor = (mvr&  OMAP_UART_LEGACY_MVR_MIN_MASK);
+		break;
+	case 1:
+		/* New Scheme: OMAP4+ */
+		/* MINOR_REV[0:5], MAJOR_REV[8:10] */
+		major = (mvr&  OMAP_UART_MVR_MAJ_MASK)>>
+					OMAP_UART_MVR_MAJ_SHIFT;
+		minor = (mvr&  OMAP_UART_MVR_MIN_MASK);
+		break;
+	default:
+		dev_warn(&up->pdev->dev,
+			"Unknown %s revision, defaulting to highest\n",
+			up->name);
+		/* highest possible revision */
+		major = 0xff;
+		minor = 0xff;
+	}
+
+	/* normalize revision for the driver */
+	revision = UART_BUILD_REVISION(major, minor);
+
+	switch (revision) {
+	case OMAP_UART_REV_46:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;
+	case OMAP_UART_REV_52:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;
+	case OMAP_UART_REV_63:
+		up->errata |= UART_ERRATA_i202_MDR1_ACCESS;
+		break;
+	default:
+		break;
+	}
+}
+
  static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
  {
  	struct omap_uart_port_info *omap_up_info;
@@ -1443,7 +1514,6 @@ static int serial_omap_probe(struct platform_device *pdev)
  						"%d\n", DEFAULT_CLK_SPEED);
  	}
  	up->uart_dma.uart_base = mem->start;
-	up->errata = omap_up_info->errata;
 
  	if (omap_up_info->dma_enabled) {
  		up->uart_dma.uart_dma_tx = dma_tx->start;

drivers/tty/serial/omap-serial.c static int serial_omap_probe(struct platform_device *pdev) · line 1550

Quoted 8 lines
drivers/tty/serial/omap-serial.c +2 -0
@@ -1473,6 +1543,8 @@ static int serial_omap_probe(struct platform_device *pdev)
  	pm_runtime_enable(&pdev->dev);
  	pm_runtime_get_sync(&pdev->dev);
 
+	omap_serial_fill_features_erratas(up);
+
  	ui[up->port.line] = up;
  	serial_omap_add_console_port(up);
 

Thanks!

Cheers
Jon

#11 lore raw

PATCH v3 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags

In reply to Govindraj.R

Hi Govind,

Quoted 24 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Currently the errata is populated based on cpu checks this can be removed and replaced with module version check of uart ip block. MVR reg is provided within the uart reg map use the same to populate the errata and thus now errata population and handling can be managed within the driver itself.

Cc Jon Hunter <[email protected]>
Cc Paul Walmsley <[email protected]>
Cc Kevin Hilman <[email protected]>
---
 arch/arm/mach-omap2/serial.c                  |    8 ---
 arch/arm/plat-omap/include/plat/omap-serial.h |    1 -
 drivers/tty/serial/omap-serial.c              |   74 ++++++++++++++++++++++++-
 3 files changed, 73 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -0
index 0cdd359..6affdd4 100644

arch/arm/mach-omap2/serial.c void __init omap_serial_init_port(struct omap_board_data *bdata, · line 363

Quoted 9 lines
arch/arm/mach-omap2/serial.c +0 -6
@@ -355,14 +355,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 	omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
 	omap_up.autosuspend_timeout = info->autosuspend_timeout;
 
-	/* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */
-	if (!cpu_is_omap2420() && !cpu_is_ti816x())
-		omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
-
-	/* Enable DMA Mode Force Idle Errata i291 for omap34xx/3630 */
-	if (cpu_is_omap34xx() || cpu_is_omap3630())

34xx is true for 3630 also thanks for fixing the unneeded oring. :-)

Quoted 22 lines
arch/arm/mach-omap2/serial.c +0 -2
-		omap_up.errata |= UART_ERRATA_i291_DMA_FORCEIDLE;
-
 	pdata = &omap_up;
 	pdata_size = sizeof(struct omap_uart_port_info);
 
arch/arm/plat-omap/include/plat/omap-serial.h +0 -1
index 9ff4444..1a52725 100644
@@ -65,7 +65,6 @@ struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
 	upf_t			flags;		/* UPF_* flags */
-	u32			errata;
 	unsigned int		dma_rx_buf_size;
 	unsigned int		dma_rx_timeout;
 	unsigned int		autosuspend_timeout;
drivers/tty/serial/omap-serial.c +0 -0
index 0121486..0555c96 100644

drivers/tty/serial/omap-serial.c line 52

Quoted 9 lines
drivers/tty/serial/omap-serial.c +6 -0
@@ -44,6 +44,13 @@
 #include <plat/dmtimer.h>
 #include <plat/omap-serial.h>
 
+#define UART_BUILD_REVISION(x, y)	(((x) << 8) | (y))
+
+#define OMAP_UART_REV_42 0x0402
+#define OMAP_UART_REV_46 0x0406
+#define OMAP_UART_REV_52 0x0502
+#define OMAP_UART_REV_63 0x0603

Maybe a comment can be added or the #define changed to reflect the processor also so that it is easy to map.

A dev_info print could be added so that the bootup logs(probe) could tell what ip rev is booted is running.

Feel free to ignore such trivial comments.

Quoted 91 lines
drivers/tty/serial/omap-serial.c +65 -1
+
 #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
 
 /* SCR register bitmasks */
@@ -53,6 +60,17 @@
 #define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT		6
 #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK			(0x3 << 6)
 
+/* MVR register bitmasks */
+#define OMAP_UART_MVR_SCHEME_SHIFT	30
+
+#define OMAP_UART_LEGACY_MVR_MAJ_MASK	0xf0
+#define OMAP_UART_LEGACY_MVR_MAJ_SHIFT	4
+#define OMAP_UART_LEGACY_MVR_MIN_MASK	0x0f
+
+#define OMAP_UART_MVR_MAJ_MASK		0x700
+#define OMAP_UART_MVR_MAJ_SHIFT		8
+#define OMAP_UART_MVR_MIN_MASK		0x3f
+
 static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
 
 /* Forward declaration of functions */
@@ -1346,6 +1364,59 @@ static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
 	return;
 }
 
+static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+{
+	u32 mvr, scheme;
+	u16 revision, major, minor;
+
+	mvr = serial_in(up, UART_OMAP_MVER);
+
+	/* Check revision register scheme */
+	scheme = mvr >> OMAP_UART_MVR_SCHEME_SHIFT;
+
+	switch (scheme) {
+	case 0: /* Legacy Scheme: OMAP2/3 */
+		/* MINOR_REV[0:4], MAJOR_REV[4:7] */
+		major = (mvr & OMAP_UART_LEGACY_MVR_MAJ_MASK) >>
+					OMAP_UART_LEGACY_MVR_MAJ_SHIFT;
+		minor = (mvr & OMAP_UART_LEGACY_MVR_MIN_MASK);
+		break;
+	case 1:
+		/* New Scheme: OMAP4+ */
+		/* MINOR_REV[0:5], MAJOR_REV[8:10] */
+		major = (mvr & OMAP_UART_MVR_MAJ_MASK) >>
+					OMAP_UART_MVR_MAJ_SHIFT;
+		minor = (mvr & OMAP_UART_MVR_MIN_MASK);
+		break;
+	default:
+		dev_warn(&up->pdev->dev,
+			"Unknown %s revision, defaulting to highest\n",
+			up->name);
+		/* highest possible revision */
+		major = 0xff;
+		minor = 0xff;
+	}
+
+	/* normalize revision for the driver */
+	revision = UART_BUILD_REVISION(major, minor);
+
+	switch (revision) {
+	case OMAP_UART_REV_46:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;
+	case OMAP_UART_REV_52:
+		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
+				UART_ERRATA_i291_DMA_FORCEIDLE);
+		break;
+	case OMAP_UART_REV_63:
+		up->errata |= UART_ERRATA_i202_MDR1_ACCESS;
+		break;
+	default:
+		break;
+	}
+}
+
 static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
 {
 	struct omap_uart_port_info *omap_up_info;
@@ -1443,7 +1514,6 @@ static int serial_omap_probe(struct platform_device *pdev)
 						"%d\n", DEFAULT_CLK_SPEED);
 	}
 	up->uart_dma.uart_base = mem->start;
-	up->errata = omap_up_info->errata;
 
 	if (omap_up_info->dma_enabled) {
 		up->uart_dma.uart_dma_tx = dma_tx->start;

drivers/tty/serial/omap-serial.c static int serial_omap_probe(struct platform_device *pdev) · line 1546

Quoted 4 lines
drivers/tty/serial/omap-serial.c +1 -0
@@ -1473,6 +1543,8 @@ static int serial_omap_probe(struct platform_device *pdev)
 	pm_runtime_enable(&pdev->dev);
 	pm_runtime_get_sync(&pdev->dev);
 
+	omap_serial_fill_features_erratas(up);

Nit : errata ( it is the prural of erratum)

Quoted 4 lines
drivers/tty/serial/omap-serial.c +1 -0
+
 	ui[up->port.line] = up;
 	serial_omap_add_console_port(up);
 
#12 lore raw

PATCH 2/3 OMAP2+: UART: enable tx wakeup bit for wer reg

In reply to Govindraj.R

From: "Govindraj.R" <[email protected]>

Quoted 1 line

From omap36xx onwards the module wakeup enable reg

wer has TX wakeup bit available enable the same by populating the necessary tx wakeup flag for the applicable module ip blocks and use the same while configuaring wer reg.

Also wer is not context restored, restore wer when context is lost.

Cc Paul Walmsley <[email protected]>
Cc Felipe Balbi <balbi at ti.com
Cc Kevin Hilman <[email protected]>
---
 arch/arm/plat-omap/include/plat/omap-serial.h |    7 +++++++
 drivers/tty/serial/omap-serial.c              |    9 ++++++++-
 2 files changed, 15 insertions(+), 1 deletions(-)
arch/arm/plat-omap/include/plat/omap-serial.h +7 -0
index 1a52725..8a4ca5c 100644
@@ -61,6 +61,11 @@
 #define UART_ERRATA_i202_MDR1_ACCESS	BIT(0)
 #define UART_ERRATA_i291_DMA_FORCEIDLE	BIT(1)
 
+#define OMAP_UART_TX_WAKEUP_EN	BIT(7)
+
+/* Feature flags */
+#define OMAP_UART_WER_HAS_TX_WAKEUP	BIT(0)
+
 struct omap_uart_port_info {
 	bool			dma_enabled;	/* To specify DMA Mode */
 	unsigned int		uartclk;	/* UART clock rate */
@@ -116,6 +121,7 @@ struct uart_omap_port {
 	unsigned char		dlh;
 	unsigned char		mdr1;
 	unsigned char		scr;
+	unsigned char		wer;
 
 	int			use_dma;
 	/*
@@ -129,6 +135,7 @@ struct uart_omap_port {
 	unsigned long		port_activity;
 	u32			context_loss_cnt;
 	u32			errata;
+	u32			features;
 	u8			wakeups_enabled;
 
 	struct pm_qos_request	pm_qos_request;
drivers/tty/serial/omap-serial.c +8 -1
index c7666d6..20d568d 100644
@@ -585,7 +585,11 @@ static int serial_omap_startup(struct uart_port *port)
 	serial_out(up, UART_IER, up->ier);
 
 	/* Enable module level wake up */
-	serial_out(up, UART_OMAP_WER, OMAP_UART_WER_MOD_WKUP);
+	up->wer = OMAP_UART_WER_MOD_WKUP;
+	if (up->features & OMAP_UART_WER_HAS_TX_WAKEUP)
+		up->wer |= OMAP_UART_TX_WAKEUP_EN;
+
+	serial_out(up, UART_OMAP_WER, up->wer);
 
 	pm_runtime_mark_last_busy(&up->pdev->dev);
 	pm_runtime_put_autosuspend(&up->pdev->dev);
@@ -1396,9 +1400,11 @@ static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
 	case OMAP_UART_REV_52:
 		up->errata |= (UART_ERRATA_i202_MDR1_ACCESS |
 				UART_ERRATA_i291_DMA_FORCEIDLE);
+		up->features |= OMAP_UART_WER_HAS_TX_WAKEUP;
 		break;
 	case OMAP_UART_REV_63:
 		up->errata |= UART_ERRATA_i202_MDR1_ACCESS;
+		up->features |= OMAP_UART_WER_HAS_TX_WAKEUP;
 		break;
 	default:
 		break;
@@ -1629,6 +1635,7 @@ static void serial_omap_restore_context(struct uart_omap_port *up)
 		serial_omap_mdr1_errataset(up, up->mdr1);
 	else
 		serial_out(up, UART_OMAP_MDR1, up->mdr1);
+	serial_out(up, UART_OMAP_WER, up->wer);
 }
 
 static int serial_omap_runtime_suspend(struct device *dev)
Signature · 1 line
1.7.5.4
#13 lore raw

PATCH 3/3 OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

In reply to Govindraj.R

From: "Govindraj.R" <[email protected]>

Minor cleanup, replace all omap34xx/omap44xx cpu checks with cpu is not omap24xx check.

Cc Paul Walmsley <[email protected]>
Cc Felipe Balbi <balbi at ti.com
Cc Kevin Hilman <[email protected]>
---
 arch/arm/mach-omap2/serial.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)
arch/arm/mach-omap2/serial.c +2 -3
index 330ee04..83ab5a2 100644
@@ -377,8 +377,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 
 	oh->dev_attr = uart;
 
-	if (((cpu_is_omap34xx() || cpu_is_omap44xx()) && bdata->pads)
-			&& !uart_debug)
+	if ((!cpu_is_omap24xx() && bdata->pads)	&& !uart_debug)
 		device_init_wakeup(&pdev->dev, true);
 }
 
@@ -401,7 +400,7 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)
 		bdata.pads = NULL;
 		bdata.pads_cnt = 0;
 
-		if (cpu_is_omap44xx() || cpu_is_omap34xx())
+		if (!cpu_is_omap24xx())
 			omap_serial_fill_default_pads(&bdata);
 
 		if (!info)
Signature · 1 line
1.7.5.4
#14 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

In reply to Govindraj.R
Quoted 10 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

* Removes the cpu checks wherever possible and use version reg for populating features and errata's
* enable tx wakeup available in wer reg for applicable module revision's

As this affects multiple SoCs, please report what SoCs it was tested on as well.

Thanks,

Kevin

Quoted 9 lines

Govindraj.R (3):
OMAP2+: UART: Remove cpu checks for populating errata flags OMAP2+: UART: enable tx wakeup bit for wer reg
OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

 arch/arm/mach-omap2/serial.c                  |   13 +----
 arch/arm/plat-omap/include/plat/omap-serial.h |    8 +++-
 drivers/tty/serial/omap-serial.c              |   71 ++++++++++++++++++++++++-
 3 files changed, 78 insertions(+), 14 deletions(-)
#15 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

Quoted 8 lines · Kevin Hilman
Quoted 6 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

Quoted 7 lines
Quoted 4 lines

* Removes the cpu checks wherever possible and use version reg ? for populating features and errata's
* enable tx wakeup available in wer reg for applicable ? module revision's

As this affects multiple SoCs, please report what SoCs it was tested on as well.

Sorry I for got to add that, here are details on what was tested.

1.) OMAP2430 SDP : Boot tested with uart1 as console.

2.) OMAP3430 SDP: Boot test, suspend/resume tests, retention off mode
(checking retention and off mode count
in cpu idle cases)

3.) OMAP3630 - Beagle XM: Boot test, suspend/resume tests, retention off mode
(checking retention and
off mode count in cpu idle cases)

4.) OMAP4430 - PANDA: Boot test, suspend/resume tests

5.) OMAP4460 - PANDA: Boot test.

--
Thanks,
Govindraj.R

Quoted 14 lines

Thanks,

Kevin

Quoted 9 lines

Govindraj.R (3):
? OMAP2+: UART: Remove cpu checks for populating errata flags ? OMAP2+: UART: enable tx wakeup bit for wer reg
? OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

?arch/arm/mach-omap2/serial.c ? ? ? ? ? ? ? ? ?| ? 13 +----
?arch/arm/plat-omap/include/plat/omap-serial.h | ? ?8 +++-
?drivers/tty/serial/omap-serial.c ? ? ? ? ? ? ?| ? 71 ++++++++++++++++++++++++-

?3 files changed, 78 insertions(+), 14 deletions(-)

#16 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

Hi

Quoted 8 lines · Govindraj

Sorry I for got to add that, here are details on what was tested.

1.) OMAP2430 SDP : Boot tested with uart1 as console.

2.) OMAP3430 SDP: Boot test, suspend/resume tests, retention off mode
(checking retention and off mode count
in cpu idle cases)

Quoted 7 lines

3.) OMAP3630 - Beagle XM: Boot test, suspend/resume tests, retention off mode
(checking retention and
off mode count in cpu idle cases)

4.) OMAP4430 - PANDA: Boot test, suspend/resume tests

5.) OMAP4460 - PANDA: Boot test.

What kernel .config was used for these tests?

- Paul

#17 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

Hi Paul,

Quoted 16 lines · Paul Walmsley

Hi

Quoted 12 lines · Govindraj

Sorry I for got to add that, here are details on what was tested.

1.) OMAP2430 SDP : Boot tested with uart1 as console.

2.) OMAP3430 SDP: Boot test, suspend/resume tests, retention off mode ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(checking retention and off mode count in cpu idle cases)

3.) OMAP3630 - Beagle XM: ?Boot test, suspend/resume tests, retention off mode ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (checking retention and off mode count in cpu idle cases)

Quoted 5 lines
Quoted 3 lines

4.) OMAP4430 - PANDA: Boot test, suspend/resume tests

5.) OMAP4460 - PANDA: Boot test.

What kernel .config was used for these tests?

omap2plus_defconfig was used.

the same kernel image was tested with all these boards. (kernel image was built along with initramfs support using minimal busybox filesystem)

--
Thanks,
Govindraj.R

#18 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

In reply to Govindraj.R
Quoted 16 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

* Removes the cpu checks wherever possible and use version reg ?for populating features and errata's
* enable tx wakeup available in wer reg for applicable ?module revision's

Govindraj.R (3):
?OMAP2+: UART: Remove cpu checks for populating errata flags ?OMAP2+: UART: enable tx wakeup bit for wer reg
?OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

Quoted 4 lines
?arch/arm/mach-omap2/serial.c ? ? ? ? ? ? ? ? ?| ? 13 +----
?arch/arm/plat-omap/include/plat/omap-serial.h | ? ?8 +++-
?drivers/tty/serial/omap-serial.c ? ? ? ? ? ? ?| ? 71 ++++++++++++++++++++++++-

?3 files changed, 78 insertions(+), 14 deletions(-)

Alan / Greg,

With you ack on tty parts can this series be upstreamed from omap tree ?

Tony,

Can you take these series into your uart fixes branch for 3.4-rc (Let me know if you need a pull request with patches based on linux-omap tree uart branch)

--
Thanks,
Govindraj.R

#19 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

Quoted 24 lines · Govindraj
Quoted 16 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

* Removes the cpu checks wherever possible and use version reg for populating features and errata's
* enable tx wakeup available in wer reg for applicable module revision's

Govindraj.R (3):
 OMAP2+: UART: Remove cpu checks for populating errata flags OMAP2+: UART: enable tx wakeup bit for wer reg
 OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

Quoted 5 lines

 arch/arm/mach-omap2/serial.c                  |   13 +---- arch/arm/plat-omap/include/plat/omap-serial.h |    8 +++- drivers/tty/serial/omap-serial.c              |   71 ++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 14 deletions(-)

Quoted 4 lines

Alan / Greg,

With you ack on tty parts can this series be upstreamed from omap tree ?

Fine by me - this seems primarily to be architectural details. --
To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

maintainer
#20 lore raw

cover OMAP2+: UART: Enable tx wakeup + remove cpu checks

Quoted 27 lines · Alan Cox
Quoted 24 lines · Govindraj
Quoted 21 lines · Govindraj.R

From: "Govindraj.R" <[email protected]>

Based on Linux-OMAP tree uart branch.
(git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
remotes/origin/uart)

* Removes the cpu checks wherever possible and use version reg ?for populating features and errata's
* enable tx wakeup available in wer reg for applicable ?module revision's

Govindraj.R (3):
?OMAP2+: UART: Remove cpu checks for populating errata flags ?OMAP2+: UART: enable tx wakeup bit for wer reg
?OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx

?arch/arm/mach-omap2/serial.c ? ? ? ? ? ? ? ? ?| ? 13 +----
?arch/arm/plat-omap/include/plat/omap-serial.h | ? ?8 +++-
?drivers/tty/serial/omap-serial.c ? ? ? ? ? ? ?| ? 71

++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 14 deletions(-)

Quoted 6 lines
Quoted 4 lines

Alan / Greg,

With you ack on tty parts can this series be upstreamed from omap tree ?

Fine by me - this seems primarily to be architectural details.

Fine by me as well: