@@ -69,37 +69,22 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
69
69
struct device * dev = & ofdev -> dev ;
70
70
struct device_node * np = dev -> of_node ;
71
71
struct uart_port * port = & up -> port ;
72
- u32 clk , spd , prop ;
73
- int ret , irq ;
72
+ u32 spd ;
73
+ int ret ;
74
74
75
75
memset (port , 0 , sizeof * port );
76
76
77
77
pm_runtime_enable (& ofdev -> dev );
78
78
pm_runtime_get_sync (& ofdev -> dev );
79
79
80
- if (of_property_read_u32 (np , "clock-frequency" , & clk )) {
81
-
82
- /* Get clk rate through clk driver if present */
83
- info -> clk = devm_clk_get_enabled (dev , NULL );
84
- if (IS_ERR (info -> clk )) {
85
- ret = dev_err_probe (dev , PTR_ERR (info -> clk ), "failed to get clock\n" );
86
- goto err_pmruntime ;
87
- }
88
-
89
- clk = clk_get_rate (info -> clk );
90
- }
91
- /* If current-speed was set, then try not to change it. */
92
- if (of_property_read_u32 (np , "current-speed" , & spd ) == 0 )
93
- port -> custom_divisor = clk / (16 * spd );
94
-
95
80
ret = of_address_to_resource (np , 0 , & resource );
96
81
if (ret ) {
97
82
dev_err_probe (dev , ret , "invalid address\n" );
98
83
goto err_pmruntime ;
99
84
}
100
85
101
- port -> flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_FIXED_PORT |
102
- UPF_FIXED_TYPE ;
86
+ port -> dev = & ofdev -> dev ;
87
+ port -> flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_FIXED_TYPE ;
103
88
spin_lock_init (& port -> lock );
104
89
105
90
if (resource_type (& resource ) == IORESOURCE_IO ) {
@@ -108,70 +93,31 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
108
93
} else {
109
94
port -> mapbase = resource .start ;
110
95
port -> mapsize = resource_size (& resource );
96
+ port -> flags |= UPF_IOREMAP ;
97
+ }
111
98
112
- /* Check for shifted address mapping */
113
- if (of_property_read_u32 (np , "reg-offset" , & prop ) == 0 ) {
114
- if (prop >= port -> mapsize ) {
115
- ret = dev_err_probe (dev , - EINVAL , "reg-offset %u exceeds region size %pa\n" ,
116
- prop , & port -> mapsize );
117
- goto err_pmruntime ;
118
- }
99
+ ret = uart_read_and_validate_port_properties (port );
100
+ if (ret )
101
+ goto err_pmruntime ;
119
102
120
- port -> mapbase += prop ;
121
- port -> mapsize -= prop ;
103
+ /* Get clk rate through clk driver if present */
104
+ if (!port -> uartclk ) {
105
+ info -> clk = devm_clk_get_enabled (dev , NULL );
106
+ if (IS_ERR (info -> clk )) {
107
+ ret = dev_err_probe (dev , PTR_ERR (info -> clk ), "failed to get clock\n" );
108
+ goto err_pmruntime ;
122
109
}
123
110
124
- port -> iotype = UPIO_MEM ;
125
- if (of_property_read_u32 (np , "reg-io-width" , & prop ) == 0 ) {
126
- switch (prop ) {
127
- case 1 :
128
- port -> iotype = UPIO_MEM ;
129
- break ;
130
- case 2 :
131
- port -> iotype = UPIO_MEM16 ;
132
- break ;
133
- case 4 :
134
- port -> iotype = of_device_is_big_endian (np ) ?
135
- UPIO_MEM32BE : UPIO_MEM32 ;
136
- break ;
137
- default :
138
- ret = dev_err_probe (dev , - EINVAL , "unsupported reg-io-width (%u)\n" ,
139
- prop );
140
- goto err_pmruntime ;
141
- }
142
- }
143
- port -> flags |= UPF_IOREMAP ;
111
+ port -> uartclk = clk_get_rate (info -> clk );
144
112
}
113
+ /* If current-speed was set, then try not to change it. */
114
+ if (of_property_read_u32 (np , "current-speed" , & spd ) == 0 )
115
+ port -> custom_divisor = port -> uartclk / (16 * spd );
145
116
146
117
/* Compatibility with the deprecated pxa driver and 8250_pxa drivers. */
147
118
if (of_device_is_compatible (np , "mrvl,mmp-uart" ))
148
119
port -> regshift = 2 ;
149
120
150
- /* Check for registers offset within the devices address range */
151
- if (of_property_read_u32 (np , "reg-shift" , & prop ) == 0 )
152
- port -> regshift = prop ;
153
-
154
- /* Check for fifo size */
155
- if (of_property_read_u32 (np , "fifo-size" , & prop ) == 0 )
156
- port -> fifosize = prop ;
157
-
158
- /* Check for a fixed line number */
159
- ret = of_alias_get_id (np , "serial" );
160
- if (ret >= 0 )
161
- port -> line = ret ;
162
-
163
- irq = of_irq_get (np , 0 );
164
- if (irq < 0 ) {
165
- if (irq == - EPROBE_DEFER ) {
166
- ret = - EPROBE_DEFER ;
167
- goto err_pmruntime ;
168
- }
169
- /* IRQ support not mandatory */
170
- irq = 0 ;
171
- }
172
-
173
- port -> irq = irq ;
174
-
175
121
info -> rst = devm_reset_control_get_optional_shared (& ofdev -> dev , NULL );
176
122
if (IS_ERR (info -> rst )) {
177
123
ret = PTR_ERR (info -> rst );
@@ -183,12 +129,6 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
183
129
goto err_pmruntime ;
184
130
185
131
port -> type = type ;
186
- port -> uartclk = clk ;
187
-
188
- if (of_property_read_bool (np , "no-loopback-test" ))
189
- port -> flags |= UPF_SKIP_TEST ;
190
-
191
- port -> dev = & ofdev -> dev ;
192
132
port -> rs485_config = serial8250_em485_config ;
193
133
port -> rs485_supported = serial8250_em485_supported ;
194
134
up -> rs485_start_tx = serial8250_em485_start_tx ;
@@ -280,7 +220,6 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
280
220
platform_set_drvdata (ofdev , info );
281
221
return 0 ;
282
222
err_dispose :
283
- irq_dispose_mapping (port8250 .port .irq );
284
223
pm_runtime_put_sync (& ofdev -> dev );
285
224
pm_runtime_disable (& ofdev -> dev );
286
225
err_free :
0 commit comments