53
53
#define SPRD_IEN_TX_EMPTY BIT(1)
54
54
#define SPRD_IEN_BREAK_DETECT BIT(7)
55
55
#define SPRD_IEN_TIMEOUT BIT(13)
56
+ #define SPRD_IEN_DATA_TIMEOUT BIT(17)
56
57
57
58
/* interrupt clear register */
58
59
#define SPRD_ICLR 0x0014
59
60
#define SPRD_ICLR_TIMEOUT BIT(13)
61
+ #define SPRD_ICLR_DATA_TIMEOUT BIT(17)
60
62
61
63
/* line control register */
62
64
#define SPRD_LCR 0x0018
102
104
#define SPRD_IMSR_TX_FIFO_EMPTY BIT(1)
103
105
#define SPRD_IMSR_BREAK_DETECT BIT(7)
104
106
#define SPRD_IMSR_TIMEOUT BIT(13)
107
+ #define SPRD_IMSR_DATA_TIMEOUT BIT(17)
105
108
#define SPRD_DEFAULT_SOURCE_CLK 26000000
106
109
107
110
#define SPRD_RX_DMA_STEP 1
@@ -118,6 +121,12 @@ struct sprd_uart_dma {
118
121
bool enable ;
119
122
};
120
123
124
+ struct sprd_uart_data {
125
+ unsigned int timeout_ien ;
126
+ unsigned int timeout_iclr ;
127
+ unsigned int timeout_imsr ;
128
+ };
129
+
121
130
struct sprd_uart_port {
122
131
struct uart_port port ;
123
132
char name [16 ];
@@ -126,6 +135,7 @@ struct sprd_uart_port {
126
135
struct sprd_uart_dma rx_dma ;
127
136
dma_addr_t pos ;
128
137
unsigned char * rx_buf_tail ;
138
+ const struct sprd_uart_data * pdata ;
129
139
};
130
140
131
141
static struct sprd_uart_port * sprd_port [UART_NR_MAX ];
@@ -134,6 +144,18 @@ static int sprd_ports_num;
134
144
static int sprd_start_dma_rx (struct uart_port * port );
135
145
static int sprd_tx_dma_config (struct uart_port * port );
136
146
147
+ static const struct sprd_uart_data sc9836_data = {
148
+ .timeout_ien = SPRD_IEN_TIMEOUT ,
149
+ .timeout_iclr = SPRD_ICLR_TIMEOUT ,
150
+ .timeout_imsr = SPRD_IMSR_TIMEOUT ,
151
+ };
152
+
153
+ static const struct sprd_uart_data sc9632_data = {
154
+ .timeout_ien = SPRD_IEN_DATA_TIMEOUT ,
155
+ .timeout_iclr = SPRD_ICLR_DATA_TIMEOUT ,
156
+ .timeout_imsr = SPRD_IMSR_DATA_TIMEOUT ,
157
+ };
158
+
137
159
static inline unsigned int serial_in (struct uart_port * port ,
138
160
unsigned int offset )
139
161
{
@@ -637,6 +659,8 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
637
659
{
638
660
struct uart_port * port = dev_id ;
639
661
unsigned int ims ;
662
+ struct sprd_uart_port * sp =
663
+ container_of (port , struct sprd_uart_port , port );
640
664
641
665
uart_port_lock (port );
642
666
@@ -647,14 +671,14 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
647
671
return IRQ_NONE ;
648
672
}
649
673
650
- if (ims & SPRD_IMSR_TIMEOUT )
651
- serial_out (port , SPRD_ICLR , SPRD_ICLR_TIMEOUT );
674
+ if (ims & sp -> pdata -> timeout_imsr )
675
+ serial_out (port , SPRD_ICLR , sp -> pdata -> timeout_iclr );
652
676
653
677
if (ims & SPRD_IMSR_BREAK_DETECT )
654
678
serial_out (port , SPRD_ICLR , SPRD_IMSR_BREAK_DETECT );
655
679
656
680
if (ims & (SPRD_IMSR_RX_FIFO_FULL | SPRD_IMSR_BREAK_DETECT |
657
- SPRD_IMSR_TIMEOUT ))
681
+ sp -> pdata -> timeout_imsr ))
658
682
sprd_rx (port );
659
683
660
684
if (ims & SPRD_IMSR_TX_FIFO_EMPTY )
@@ -729,7 +753,7 @@ static int sprd_startup(struct uart_port *port)
729
753
/* enable interrupt */
730
754
uart_port_lock_irqsave (port , & flags );
731
755
ien = serial_in (port , SPRD_IEN );
732
- ien |= SPRD_IEN_BREAK_DETECT | SPRD_IEN_TIMEOUT ;
756
+ ien |= SPRD_IEN_BREAK_DETECT | sp -> pdata -> timeout_ien ;
733
757
if (!sp -> rx_dma .enable )
734
758
ien |= SPRD_IEN_RX_FULL ;
735
759
serial_out (port , SPRD_IEN , ien );
@@ -1184,6 +1208,12 @@ static int sprd_probe(struct platform_device *pdev)
1184
1208
1185
1209
up -> mapbase = res -> start ;
1186
1210
1211
+ sport -> pdata = of_device_get_match_data (& pdev -> dev );
1212
+ if (!sport -> pdata ) {
1213
+ dev_err (& pdev -> dev , "get match data failed!\n" );
1214
+ return - EINVAL ;
1215
+ }
1216
+
1187
1217
irq = platform_get_irq (pdev , 0 );
1188
1218
if (irq < 0 )
1189
1219
return irq ;
@@ -1248,7 +1278,8 @@ static int sprd_resume(struct device *dev)
1248
1278
static SIMPLE_DEV_PM_OPS (sprd_pm_ops , sprd_suspend , sprd_resume ) ;
1249
1279
1250
1280
static const struct of_device_id serial_ids [] = {
1251
- {.compatible = "sprd,sc9836-uart" ,},
1281
+ {.compatible = "sprd,sc9836-uart" , .data = & sc9836_data },
1282
+ {.compatible = "sprd,sc9632-uart" , .data = & sc9632_data },
1252
1283
{}
1253
1284
};
1254
1285
MODULE_DEVICE_TABLE (of , serial_ids );
0 commit comments