@@ -68,6 +68,7 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
68
68
unsigned long param )
69
69
{
70
70
struct aspeed_lpc_ctrl * lpc_ctrl = file_aspeed_lpc_ctrl (file );
71
+ struct device * dev = file -> private_data ;
71
72
void __user * p = (void __user * )param ;
72
73
struct aspeed_lpc_ctrl_mapping map ;
73
74
u32 addr ;
@@ -90,6 +91,12 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
90
91
if (map .window_id != 0 )
91
92
return - EINVAL ;
92
93
94
+ /* If memory-region is not described in device tree */
95
+ if (!lpc_ctrl -> mem_size ) {
96
+ dev_dbg (dev , "Didn't find reserved memory\n" );
97
+ return - ENXIO ;
98
+ }
99
+
93
100
map .size = lpc_ctrl -> mem_size ;
94
101
95
102
return copy_to_user (p , & map , sizeof (map )) ? - EFAULT : 0 ;
@@ -126,9 +133,18 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
126
133
return - EINVAL ;
127
134
128
135
if (map .window_type == ASPEED_LPC_CTRL_WINDOW_FLASH ) {
136
+ if (!lpc_ctrl -> pnor_size ) {
137
+ dev_dbg (dev , "Didn't find host pnor flash\n" );
138
+ return - ENXIO ;
139
+ }
129
140
addr = lpc_ctrl -> pnor_base ;
130
141
size = lpc_ctrl -> pnor_size ;
131
142
} else if (map .window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY ) {
143
+ /* If memory-region is not described in device tree */
144
+ if (!lpc_ctrl -> mem_size ) {
145
+ dev_dbg (dev , "Didn't find reserved memory\n" );
146
+ return - ENXIO ;
147
+ }
132
148
addr = lpc_ctrl -> mem_base ;
133
149
size = lpc_ctrl -> mem_size ;
134
150
} else {
@@ -196,40 +212,40 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
196
212
if (!lpc_ctrl )
197
213
return - ENOMEM ;
198
214
215
+ /* If flash is described in device tree then store */
199
216
node = of_parse_phandle (dev -> of_node , "flash" , 0 );
200
217
if (!node ) {
201
- dev_err (dev , "Didn't find host pnor flash node\n" );
202
- return - ENODEV ;
203
- }
204
-
205
- rc = of_address_to_resource (node , 1 , & resm );
206
- of_node_put (node );
207
- if (rc ) {
208
- dev_err (dev , "Couldn't address to resource for flash\n" );
209
- return rc ;
218
+ dev_dbg (dev , "Didn't find host pnor flash node\n" );
219
+ } else {
220
+ rc = of_address_to_resource (node , 1 , & resm );
221
+ of_node_put (node );
222
+ if (rc ) {
223
+ dev_err (dev , "Couldn't address to resource for flash\n" );
224
+ return rc ;
225
+ }
210
226
}
211
227
212
228
lpc_ctrl -> pnor_size = resource_size (& resm );
213
229
lpc_ctrl -> pnor_base = resm .start ;
214
230
215
231
dev_set_drvdata (& pdev -> dev , lpc_ctrl );
216
232
233
+ /* If memory-region is described in device tree then store */
217
234
node = of_parse_phandle (dev -> of_node , "memory-region" , 0 );
218
235
if (!node ) {
219
- dev_err (dev , "Didn't find reserved memory\n" );
220
- return - EINVAL ;
221
- }
236
+ dev_dbg (dev , "Didn't find reserved memory\n" );
237
+ } else {
238
+ rc = of_address_to_resource (node , 0 , & resm );
239
+ of_node_put (node );
240
+ if (rc ) {
241
+ dev_err (dev , "Couldn't address to resource for reserved memory\n" );
242
+ return - ENXIO ;
243
+ }
222
244
223
- rc = of_address_to_resource (node , 0 , & resm );
224
- of_node_put (node );
225
- if (rc ) {
226
- dev_err (dev , "Couldn't address to resource for reserved memory\n" );
227
- return - ENOMEM ;
245
+ lpc_ctrl -> mem_size = resource_size (& resm );
246
+ lpc_ctrl -> mem_base = resm .start ;
228
247
}
229
248
230
- lpc_ctrl -> mem_size = resource_size (& resm );
231
- lpc_ctrl -> mem_base = resm .start ;
232
-
233
249
lpc_ctrl -> regmap = syscon_node_to_regmap (
234
250
pdev -> dev .parent -> of_node );
235
251
if (IS_ERR (lpc_ctrl -> regmap )) {
@@ -258,8 +274,6 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
258
274
goto err ;
259
275
}
260
276
261
- dev_info (dev , "Loaded at %pr\n" , & resm );
262
-
263
277
return 0 ;
264
278
265
279
err :
0 commit comments