379691597248815bdd18dcbf1f12344422fdf0f9
[oweals/openwrt.git] / target / linux / at91-2.6 / patches / 008-fdl-serial.patch
1 --- linux-2.6.19.2.old/drivers/serial/atmel_serial.c    2007-05-01 13:08:03.000000000 +0200
2 +++ linux-2.6.19.2/drivers/serial/atmel_serial.c        2007-05-09 10:21:45.000000000 +0200
3 @@ -173,6 +173,34 @@
4                                 at91_set_gpio_value(AT91_PIN_PA21, 0);
5                         else
6                                 at91_set_gpio_value(AT91_PIN_PA21, 1);
7 +
8 +                       /* 
9 +                        * FDL VersaLink adds GPIOS to provide full modem control on
10 +                        * USART 0 - Drive DTR and RI pins manually
11 +                        */
12 +                       if (mctrl & TIOCM_DTR)
13 +                               at91_set_gpio_value(AT91_PIN_PB6, 0);
14 +                       else
15 +                               at91_set_gpio_value(AT91_PIN_PB6, 1);
16 +                       if (mctrl & TIOCM_RI)
17 +                               at91_set_gpio_value(AT91_PIN_PB7, 0);
18 +                       else
19 +                               at91_set_gpio_value(AT91_PIN_PB7, 1);
20 +               }
21 +
22 +               /* 
23 +                * FDL VersaLink adds GPIOS to provide full modem control on
24 +                * USART 3 - Drive DTR and RI pins manually
25 +                */
26 +               if (port->mapbase == AT91RM9200_BASE_US3) {
27 +                       if (mctrl & TIOCM_DTR)
28 +                               at91_set_gpio_value(AT91_PIN_PB29, 0);
29 +                       else
30 +                               at91_set_gpio_value(AT91_PIN_PB29, 1);
31 +                       if (mctrl & TIOCM_RI)
32 +                               at91_set_gpio_value(AT91_PIN_PB2, 0);
33 +                       else
34 +                               at91_set_gpio_value(AT91_PIN_PB2, 1);
35                 }
36         }
37  #endif
38 @@ -210,8 +238,14 @@
39         /*
40          * The control signals are active low.
41          */
42 -       if (!(status & ATMEL_US_DCD))
43 -               ret |= TIOCM_CD;
44 +
45 +       /* 
46 +        * Ignore DCD reister for USARTS 0 and 3 as FDL Versalink uses
47 +        * GPIO's for these signals
48 +        */
49 +       if (!(port->mapbase == AT91RM9200_BASE_US0 || port->mapbase == AT91RM9200_BASE_US3))
50 +               if (!(status & ATMEL_US_DCD))
51 +                       ret |= TIOCM_CD;
52         if (!(status & ATMEL_US_CTS))
53                 ret |= TIOCM_CTS;
54         if (!(status & ATMEL_US_DSR))
55 @@ -219,6 +253,16 @@
56         if (!(status & ATMEL_US_RI))
57                 ret |= TIOCM_RI;
58  
59 +       /*
60 +        * Read the GPIO's for the FDL VersaLink special case
61 +        */
62 +       if (port->mapbase == AT91RM9200_BASE_US0)
63 +               if (!(at91_get_gpio_value(AT91_PIN_PA19)))
64 +                       ret |= TIOCM_CD;
65 +       if (port->mapbase == AT91RM9200_BASE_US3)
66 +               if (!(at91_get_gpio_value(AT91_PIN_PA24)))
67 +                       ret |= TIOCM_CD;
68 +
69         return ret;
70  }
71