Re: [PATCH v8 11/20] OMAP2+: UART: Move errata handling from serial.c to omap-serial

2011-11-16 Thread Jon Hunter

Hi Govindraj,

On 11/16/2011 4:13, Govindraj wrote:

On Tue, Nov 15, 2011 at 1:20 AM, Jon Hunter  wrote:

Hi Govindraj,


[...]



oh = uart->oh;
-   uart->dma_enabled = 0;
name = DRIVER_NAME;

omap_up.dma_enabled = uart->dma_enabled;
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
omap_up.flags = UPF_BOOT_AUTOCONF;
omap_up.get_context_loss_count =
omap_pm_get_dev_context_loss_count;
+   omap_up.set_forceidle = omap_uart_set_forceidle;
+   omap_up.set_noidle = omap_uart_set_noidle;
+
+   /* Enable the MDR1 errata for OMAP2/3/4 */
+   if ((cpu_is_omap2430() || cpu_is_omap34xx() ||
cpu_is_omap44xx())&&
+   !cpu_is_ti816x())
+   omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;


I am not sure that this will apply the errata for OMAP3630 devices. I think
we need cpu_is_omap36xx() above too. Or you may wish to do
!cpu_class_is_omap1 and !cpu_is_omap2420.



Yes correct, I have updated this patch as here [1].


Thanks! Looks good.


btw, omap-serial is applicable only for omap2+ so
I think cpu_class_is omap1 not applicable here
need to be handled in /mach-omap1/serial.c.


Duh! I missed that. We are good then.

Cheers
Jon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v8 11/20] OMAP2+: UART: Move errata handling from serial.c to omap-serial

2011-11-16 Thread Govindraj
On Tue, Nov 15, 2011 at 1:20 AM, Jon Hunter  wrote:
> Hi Govindraj,

[...]

>>
>>        oh = uart->oh;
>> -       uart->dma_enabled = 0;
>>        name = DRIVER_NAME;
>>
>>        omap_up.dma_enabled = uart->dma_enabled;
>>        omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
>>        omap_up.flags = UPF_BOOT_AUTOCONF;
>>        omap_up.get_context_loss_count =
>> omap_pm_get_dev_context_loss_count;
>> +       omap_up.set_forceidle = omap_uart_set_forceidle;
>> +       omap_up.set_noidle = omap_uart_set_noidle;
>> +
>> +       /* Enable the MDR1 errata for OMAP2/3/4 */
>> +       if ((cpu_is_omap2430() || cpu_is_omap34xx() ||
>> cpu_is_omap44xx())&&
>> +                                               !cpu_is_ti816x())
>> +               omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;
>
> I am not sure that this will apply the errata for OMAP3630 devices. I think
> we need cpu_is_omap36xx() above too. Or you may wish to do
> !cpu_class_is_omap1 and !cpu_is_omap2420.
>

Yes correct, I have updated this patch as here [1].

btw, omap-serial is applicable only for omap2+ so
I think cpu_class_is omap1 not applicable here
need to be handled in /mach-omap1/serial.c.

>>        pdata =&omap_up;
>>        pdata_size = sizeof(struct omap_uart_port_info);
>> @@ -519,10 +481,6 @@ void __init omap_serial_init_port(struct
>> omap_board_data *bdata)
>>        if (((cpu_is_omap34xx() || cpu_is_omap44xx())&&  bdata->pads) ||
>>                (pdata->wk_en&&  pdata->wk_mask))
>>                device_init_wakeup(&pdev->dev, true);
>> -
>> -       /* Enable the MDR1 errata for OMAP3 */
>> -       if (cpu_is_omap34xx()&&  !cpu_is_ti816x())
>> -               uart->errata |= UART_ERRATA_i202_MDR1_ACCESS;
>>  }
>>
>>  /**

[...]

>>
>> +       /* Errata i291 */
>> +       if (up->use_dma&&  pdata->set_forceidle)
>> +               pdata->set_forceidle(up->pdev);
>> +
>
> So it does appear that you are applying this to all devices. I think that
> this should only impact omap3.
>

Yes correct,  new one is has here [1].

--
Thanks,
Govindraj.R


[1]:

same is updated in here
(v8 uart runtime patches hosted in gitorious)
git://gitorious.org/runtime_3-0/runtime_3-0.git 3.2-rc1_uart_runtime.

>From e7ac07903a813f624c4a19d93131d40a09eb8f81 Mon Sep 17 00:00:00 2001
From: Govindraj.R 
Date: Mon, 7 Nov 2011 19:00:33 +0530
Subject: [PATCH v8 11/20] OMAP2+: UART: Move errata handling from
serial.c to omap-serial

Move the errata handling mechanism from serial.c to omap-serial file
and utilise the same func in driver file.

Errata i202, i291 are moved to be handled with omap-serial
Moving the errata macro from serial.c file to driver header file
as from on errata will be handled in driver file itself.
Corrected errata id from chapter reference 2.15 to errata id i291.

Removed errata and dma_enabled fields from omap_uart_state struct
as they are no more needed with errata handling done within omap-serial.

Acked-by: Alan Cox 
Signed-off-by: Govindraj.R 
---
 arch/arm/mach-omap2/serial.c  |  101 -
 arch/arm/plat-omap/include/plat/omap-serial.h |7 ++
 drivers/tty/serial/omap-serial.c  |   68 -
 3 files changed, 102 insertions(+), 74 deletions(-)

diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
index 98e2666..9cbf230 100644
--- a/arch/arm/mach-omap2/serial.c
+++ b/arch/arm/mach-omap2/serial.c
@@ -42,8 +42,6 @@
 #include "control.h"
 #include "mux.h"

-#define UART_ERRATA_i202_MDR1_ACCESS   (0x1 << 1)
-
 /*
  * NOTE: By default the serial timeout is disabled as it causes lost characters
  * over the serial ports. This means that the UART clocks will stay on until
@@ -61,59 +59,17 @@ struct omap_uart_state {
void __iomem *wk_st;
void __iomem *wk_en;
u32 wk_mask;
-   u32 dma_enabled;

int clocked;

struct list_head node;
struct omap_hwmod *oh;
struct platform_device *pdev;
-
-   u32 errata;
 };

 static LIST_HEAD(uart_list);
 static u8 num_uarts;

-#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3)
-
-/*
- * Work Around for Errata i202 (3430 - 1.12, 3630 - 1.6)
- * The access to uart register after MDR1 Access
- * causes UART to corrupt data.
- *
- * Need a delay =
- * 5 L4 clock cycles + 5 UART functional clock cycle (@48MHz = ~0.2uS)
- * give 10 times as much
- */
-static void omap_uart_mdr1_errataset(struct omap_uart_state *uart, u8 mdr1_val,
-   u8 fcr_val)
-{
-   u8 timeout = 255;
-
-   serial_write_reg(uart, UART_OMAP_MDR1, mdr1_val);
-   udelay(2);
-   serial_write_reg(uart, UART_FCR, fcr_val | UART_FCR_CLEAR_XMIT |
-   UART_FCR_CLEAR_RCVR);
-   /*
-* Wait for FIFO to empty: when empty, RX_FIFO_E bit is 0 and
-* TX_FIFO_E bit is 1.
-*/
-   while (UART_LSR_THRE != (serial_read_reg(uart, UART_LSR) &
-   (UART_LSR_THRE | UART_LSR_DR))) {
-   timeout--;
-  

Re: [PATCH v8 11/20] OMAP2+: UART: Move errata handling from serial.c to omap-serial

2011-11-14 Thread Jon Hunter

Hi Govindraj,

On 11/11/2011 3:59, Govindraj.R wrote:

Move the errata handling mechanism from serial.c to omap-serial file
and utilise the same func in driver file.

Errata i202, i291 are moved to be handled with omap-serial
Moving the errata macro from serial.c file to driver header file
as from on errata will be handled in driver file itself.
Corrected errata id from chapter reference 2.15 to errata id i291.

Removed errata and dma_enabled fields from omap_uart_state struct
as they are no more needed with errata handling done within omap-serial.

Acked-by: Alan Cox
Signed-off-by: Govindraj.R
---
  arch/arm/mach-omap2/serial.c  |   98 +++--
  arch/arm/plat-omap/include/plat/omap-serial.h |6 ++
  drivers/tty/serial/omap-serial.c  |   66 -
  3 files changed, 96 insertions(+), 74 deletions(-)


[snip]


+/*
+ * Errata i291: [UART]:Cannot Acknowledge Idle Requests
+ * in Smartidle Mode When Configured for DMA Operations.
+ * WA: configure uart in force idle mode.
+ */


Sorry, I should have checked this on the last version. However, this 
errata only appears to impact OMAP3 devices not OMAP1, OMAP2 or OMAP4. 
Can we add the devices impacted by this in the above comment? I believe 
it is just OMAP3430 and OMAP3630.



+static void omap_uart_set_noidle(struct platform_device *pdev)
+{
+   struct omap_device *od = to_omap_device(pdev);
+
+   omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);
+}
+
+static void omap_uart_set_forceidle(struct platform_device *pdev)
+{
+   struct omap_device *od = to_omap_device(pdev);
+
+   omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_FORCE);
+}
+
  #else
+static void omap_uart_set_noidle(struct platform_device *pdev) {}
+static void omap_uart_set_forceidle(struct platform_device *pdev) {}
  static void omap_uart_block_sleep(struct omap_uart_state *uart)
  {
/* Needed to enable UART clocks when built without CONFIG_PM */
@@ -473,13 +429,19 @@ void __init omap_serial_init_port(struct omap_board_data 
*bdata)
break;

oh = uart->oh;
-   uart->dma_enabled = 0;
name = DRIVER_NAME;

omap_up.dma_enabled = uart->dma_enabled;
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
omap_up.flags = UPF_BOOT_AUTOCONF;
omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
+   omap_up.set_forceidle = omap_uart_set_forceidle;
+   omap_up.set_noidle = omap_uart_set_noidle;
+
+   /* Enable the MDR1 errata for OMAP2/3/4 */
+   if ((cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx())&&
+   !cpu_is_ti816x())
+   omap_up.errata |= UART_ERRATA_i202_MDR1_ACCESS;


I am not sure that this will apply the errata for OMAP3630 devices. I 
think we need cpu_is_omap36xx() above too. Or you may wish to do 
!cpu_class_is_omap1 and !cpu_is_omap2420.



pdata =&omap_up;
pdata_size = sizeof(struct omap_uart_port_info);
@@ -519,10 +481,6 @@ void __init omap_serial_init_port(struct omap_board_data 
*bdata)
if (((cpu_is_omap34xx() || cpu_is_omap44xx())&&  bdata->pads) ||
(pdata->wk_en&&  pdata->wk_mask))
device_init_wakeup(&pdev->dev, true);
-
-   /* Enable the MDR1 errata for OMAP3 */
-   if (cpu_is_omap34xx()&&  !cpu_is_ti816x())
-   uart->errata |= UART_ERRATA_i202_MDR1_ACCESS;
  }

  /**
diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h 
b/arch/arm/plat-omap/include/plat/omap-serial.h
index 348c9ea..fd3d2f7 100644
--- a/arch/arm/plat-omap/include/plat/omap-serial.h
+++ b/arch/arm/plat-omap/include/plat/omap-serial.h
@@ -58,12 +58,17 @@

  #define MSR_SAVE_FLAGSUART_MSR_ANY_DELTA

+#define UART_ERRATA_i202_MDR1_ACCESS   (0x1<<  1)
+
  struct omap_uart_port_info {
booldma_enabled;/* To specify DMA Mode */
unsigned intuartclk;/* UART clock rate */
upf_t   flags;  /* UPF_* flags */
+   u32 errata;

int (*get_context_loss_count)(struct device *);
+   void (*set_forceidle)(struct platform_device *);
+   void (*set_noidle)(struct platform_device *);
  };

  struct uart_omap_dma {
@@ -117,6 +122,7 @@ struct uart_omap_port {
charname[20];
unsigned long   port_activity;
u32 context_loss_cnt;
+   u32 errata;
  };

  #endif /* __OMAP_SERIAL_H__ */
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index ea4c24a..77f0829 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -51,6 +51,7 @@ static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
  static void uart_tx_dma_callback(int lch, u16 ch_status, void *data);
  static void serial_omap_rx_timeout(unsigned long