OMAP2+: UART: Enable tx wakeup + remove cpu checks
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
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
@@ -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
@@ -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
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.
Cc Paul Walmsley<[email protected]>Cc Kevin Hilman<[email protected]>Signed-off-by Felipe Balbi<[email protected]>Signed-off-by Govindraj.R<[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 | 62 ++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 10 deletions(-)arch/arm/mach-omap2/serial.c +0
-8@@ -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@@ -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@@ -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);
PATCH 1/3 OMAP2+: UART: Remove cpu checks for populating errata flags
In reply to Govindraj.RHi 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.
Cc Paul Walmsley<[email protected]>Cc Kevin Hilman<[email protected]>Signed-off-by Felipe Balbi<[email protected]>Signed-off-by Govindraj.R<[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 | 62 ++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 10 deletions(-)arch/arm/mach-omap2/serial.c +0
-8@@ -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@@ -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@@ -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
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.
Cc Paul Walmsley<[email protected]>Cc Kevin Hilman<[email protected]>Signed-off-by Felipe Balbi<[email protected]>Signed-off-by Govindraj.R<[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 ? ? ? ? ? ? ?| ? 62++++++++++++++++++++++++-
?3 files changed, 61 insertions(+), 10 deletions(-)arch/arm/mach-omap2/serial.c +0
-8@@ -357,14 +357,6 @@ void __init omap_serial_init_port(structomap_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@@ -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@@ -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_SPEED48000000 /* 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.cmach-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
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.
Cc Paul Walmsley<[email protected]>Cc Kevin Hilman<[email protected]>Signed-off-by Felipe Balbi<[email protected]>Signed-off-by Govindraj.R<[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 | 62 ++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 10 deletions(-)arch/arm/mach-omap2/serial.c +0
-8@@ -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@@ -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@@ -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.cmach-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
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.cmach-omap2/serial.c=> ?omap-serial.cGot 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
PATCH v2 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags
In reply to Govindraj.RFrom: "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 | 75 ++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
@@ -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
@@ -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
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]>Signed-off-by Felipe Balbi <[email protected]>Signed-off-by Govindraj.R <[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@@ -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@@ -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@@ -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
-0static 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
PATCH v3 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags
In reply to Govindraj.RFrom: "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 | 74 ++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/serial.c +0 -8
@@ -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
@@ -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
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]>Signed-off-by Felipe Balbi<[email protected]>Signed-off-by Govindraj.R<[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@@ -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@@ -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@@ -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
PATCH v3 1/1 OMAP2+: UART: Remove cpu checks for populating errata flags
In reply to Govindraj.RHi 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]>Signed-off-by Felipe Balbi <[email protected]>Signed-off-by Govindraj.R <[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
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@@ -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
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);
PATCH 2/3 OMAP2+: UART: enable tx wakeup bit for wer reg
In reply to Govindraj.RFrom: "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.
--- 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
@@ -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
@@ -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
PATCH 3/3 OMAP2+: UART: replace omap34xx/omap4xx cpu checks with not omap24xx
In reply to Govindraj.RFrom: "Govindraj.R" <[email protected]>
Minor cleanup, replace all omap34xx/omap44xx cpu checks with cpu is not omap24xx check.
--- arch/arm/mach-omap2/serial.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
arch/arm/mach-omap2/serial.c +2 -3
@@ -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
cover OMAP2+: UART: Enable tx wakeup + remove cpu checks
In reply to Govindraj.RQuoted 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 omap24xxarch/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(-)
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'sAs 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(-)
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
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
cover OMAP2+: UART: Enable tx wakeup + remove cpu checks
In reply to Govindraj.RQuoted 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'sGovindraj.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
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'sGovindraj.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 omap24xxQuoted 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
Greg KH
maintainercover 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'sGovindraj.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: