54
54
#define ULITE_CONTROL_RST_RX 0x02
55
55
#define ULITE_CONTROL_IE 0x10
56
56
57
+ struct uartlite_data {
58
+ const struct uartlite_reg_ops * reg_ops ;
59
+ };
60
+
57
61
struct uartlite_reg_ops {
58
62
u32 (* in )(void __iomem * addr );
59
63
void (* out )(u32 val , void __iomem * addr );
@@ -91,16 +95,16 @@ static const struct uartlite_reg_ops uartlite_le = {
91
95
92
96
static inline u32 uart_in32 (u32 offset , struct uart_port * port )
93
97
{
94
- const struct uartlite_reg_ops * reg_ops = port -> private_data ;
98
+ struct uartlite_data * pdata = port -> private_data ;
95
99
96
- return reg_ops -> in (port -> membase + offset );
100
+ return pdata -> reg_ops -> in (port -> membase + offset );
97
101
}
98
102
99
103
static inline void uart_out32 (u32 val , u32 offset , struct uart_port * port )
100
104
{
101
- const struct uartlite_reg_ops * reg_ops = port -> private_data ;
105
+ struct uartlite_data * pdata = port -> private_data ;
102
106
103
- reg_ops -> out (val , port -> membase + offset );
107
+ pdata -> reg_ops -> out (val , port -> membase + offset );
104
108
}
105
109
106
110
static struct uart_port ulite_ports [ULITE_NR_UARTS ];
@@ -325,6 +329,7 @@ static void ulite_release_port(struct uart_port *port)
325
329
326
330
static int ulite_request_port (struct uart_port * port )
327
331
{
332
+ struct uartlite_data * pdata = port -> private_data ;
328
333
int ret ;
329
334
330
335
pr_debug ("ulite console: port=%p; port->mapbase=%llx\n" ,
@@ -342,13 +347,13 @@ static int ulite_request_port(struct uart_port *port)
342
347
return - EBUSY ;
343
348
}
344
349
345
- port -> private_data = ( void * ) & uartlite_be ;
350
+ pdata -> reg_ops = & uartlite_be ;
346
351
ret = uart_in32 (ULITE_CONTROL , port );
347
352
uart_out32 (ULITE_CONTROL_RST_TX , ULITE_CONTROL , port );
348
353
ret = uart_in32 (ULITE_STATUS , port );
349
354
/* Endianess detection */
350
355
if ((ret & ULITE_STATUS_TXEMPTY ) != ULITE_STATUS_TXEMPTY )
351
- port -> private_data = ( void * ) & uartlite_le ;
356
+ pdata -> reg_ops = & uartlite_le ;
352
357
353
358
return 0 ;
354
359
}
@@ -585,10 +590,12 @@ static struct uart_driver ulite_uart_driver = {
585
590
* @id: requested id number. Pass -1 for automatic port assignment
586
591
* @base: base address of uartlite registers
587
592
* @irq: irq number for uartlite
593
+ * @pdata: private data for uartlite
588
594
*
589
595
* Returns: 0 on success, <0 otherwise
590
596
*/
591
- static int ulite_assign (struct device * dev , int id , u32 base , int irq )
597
+ static int ulite_assign (struct device * dev , int id , u32 base , int irq ,
598
+ struct uartlite_data * pdata )
592
599
{
593
600
struct uart_port * port ;
594
601
int rc ;
@@ -625,6 +632,7 @@ static int ulite_assign(struct device *dev, int id, u32 base, int irq)
625
632
port -> dev = dev ;
626
633
port -> type = PORT_UNKNOWN ;
627
634
port -> line = id ;
635
+ port -> private_data = pdata ;
628
636
629
637
dev_set_drvdata (dev , port );
630
638
@@ -675,6 +683,7 @@ MODULE_DEVICE_TABLE(of, ulite_of_match);
675
683
static int ulite_probe (struct platform_device * pdev )
676
684
{
677
685
struct resource * res ;
686
+ struct uartlite_data * pdata ;
678
687
int irq ;
679
688
int id = pdev -> id ;
680
689
#ifdef CONFIG_OF
@@ -684,6 +693,10 @@ static int ulite_probe(struct platform_device *pdev)
684
693
if (prop )
685
694
id = be32_to_cpup (prop );
686
695
#endif
696
+ pdata = devm_kzalloc (& pdev -> dev , sizeof (struct uartlite_data ),
697
+ GFP_KERNEL );
698
+ if (!pdata )
699
+ return - ENOMEM ;
687
700
688
701
res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
689
702
if (!res )
@@ -693,7 +706,7 @@ static int ulite_probe(struct platform_device *pdev)
693
706
if (irq <= 0 )
694
707
return - ENXIO ;
695
708
696
- return ulite_assign (& pdev -> dev , id , res -> start , irq );
709
+ return ulite_assign (& pdev -> dev , id , res -> start , irq , pdata );
697
710
}
698
711
699
712
static int ulite_remove (struct platform_device * pdev )
0 commit comments