@@ -87,25 +87,51 @@ static int dw8250_handle_irq(struct uart_port *p)
87
87
return 0 ;
88
88
}
89
89
90
+ static int dw8250_probe_of (struct uart_port * p )
91
+ {
92
+ struct device_node * np = p -> dev -> of_node ;
93
+ u32 val ;
94
+
95
+ if (!of_property_read_u32 (np , "reg-io-width" , & val )) {
96
+ switch (val ) {
97
+ case 1 :
98
+ break ;
99
+ case 4 :
100
+ p -> iotype = UPIO_MEM32 ;
101
+ p -> serial_in = dw8250_serial_in32 ;
102
+ p -> serial_out = dw8250_serial_out32 ;
103
+ break ;
104
+ default :
105
+ dev_err (p -> dev , "unsupported reg-io-width (%u)\n" , val );
106
+ return - EINVAL ;
107
+ }
108
+ }
109
+
110
+ if (!of_property_read_u32 (np , "reg-shift" , & val ))
111
+ p -> regshift = val ;
112
+
113
+ if (of_property_read_u32 (np , "clock-frequency" , & val )) {
114
+ dev_err (p -> dev , "no clock-frequency property set\n" );
115
+ return - EINVAL ;
116
+ }
117
+ p -> uartclk = val ;
118
+
119
+ return 0 ;
120
+ }
121
+
90
122
static int dw8250_probe (struct platform_device * pdev )
91
123
{
92
124
struct uart_8250_port uart = {};
93
125
struct resource * regs = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
94
126
struct resource * irq = platform_get_resource (pdev , IORESOURCE_IRQ , 0 );
95
- struct device_node * np = pdev -> dev .of_node ;
96
- u32 val ;
97
127
struct dw8250_data * data ;
128
+ int err ;
98
129
99
130
if (!regs || !irq ) {
100
131
dev_err (& pdev -> dev , "no registers/irq defined\n" );
101
132
return - EINVAL ;
102
133
}
103
134
104
- data = devm_kzalloc (& pdev -> dev , sizeof (* data ), GFP_KERNEL );
105
- if (!data )
106
- return - ENOMEM ;
107
- uart .port .private_data = data ;
108
-
109
135
spin_lock_init (& uart .port .lock );
110
136
uart .port .mapbase = regs -> start ;
111
137
uart .port .irq = irq -> start ;
@@ -121,30 +147,20 @@ static int dw8250_probe(struct platform_device *pdev)
121
147
uart .port .iotype = UPIO_MEM ;
122
148
uart .port .serial_in = dw8250_serial_in ;
123
149
uart .port .serial_out = dw8250_serial_out ;
124
- if (!of_property_read_u32 (np , "reg-io-width" , & val )) {
125
- switch (val ) {
126
- case 1 :
127
- break ;
128
- case 4 :
129
- uart .port .iotype = UPIO_MEM32 ;
130
- uart .port .serial_in = dw8250_serial_in32 ;
131
- uart .port .serial_out = dw8250_serial_out32 ;
132
- break ;
133
- default :
134
- dev_err (& pdev -> dev , "unsupported reg-io-width (%u)\n" ,
135
- val );
136
- return - EINVAL ;
137
- }
150
+
151
+ if (pdev -> dev .of_node ) {
152
+ err = dw8250_probe_of (& uart .port );
153
+ if (err )
154
+ return err ;
155
+ } else {
156
+ return - ENODEV ;
138
157
}
139
158
140
- if (!of_property_read_u32 (np , "reg-shift" , & val ))
141
- uart .port .regshift = val ;
159
+ data = devm_kzalloc (& pdev -> dev , sizeof (* data ), GFP_KERNEL );
160
+ if (!data )
161
+ return - ENOMEM ;
142
162
143
- if (of_property_read_u32 (np , "clock-frequency" , & val )) {
144
- dev_err (& pdev -> dev , "no clock-frequency property set\n" );
145
- return - EINVAL ;
146
- }
147
- uart .port .uartclk = val ;
163
+ uart .port .private_data = data ;
148
164
149
165
data -> line = serial8250_register_8250_port (& uart );
150
166
if (data -> line < 0 )
@@ -187,17 +203,17 @@ static int dw8250_resume(struct platform_device *pdev)
187
203
#define dw8250_resume NULL
188
204
#endif /* CONFIG_PM */
189
205
190
- static const struct of_device_id dw8250_match [] = {
206
+ static const struct of_device_id dw8250_of_match [] = {
191
207
{ .compatible = "snps,dw-apb-uart" },
192
208
{ /* Sentinel */ }
193
209
};
194
- MODULE_DEVICE_TABLE (of , dw8250_match );
210
+ MODULE_DEVICE_TABLE (of , dw8250_of_match );
195
211
196
212
static struct platform_driver dw8250_platform_driver = {
197
213
.driver = {
198
214
.name = "dw-apb-uart" ,
199
215
.owner = THIS_MODULE ,
200
- .of_match_table = dw8250_match ,
216
+ .of_match_table = dw8250_of_match ,
201
217
},
202
218
.probe = dw8250_probe ,
203
219
.remove = dw8250_remove ,
0 commit comments