@@ -114,7 +114,8 @@ static void rp1_firmware_delete(struct kref *kref)
114
114
115
115
void rp1_firmware_put (struct rp1_firmware * fw )
116
116
{
117
- kref_put (& fw -> consumers , rp1_firmware_delete );
117
+ if (!IS_ERR_OR_NULL (fw ))
118
+ kref_put (& fw -> consumers , rp1_firmware_delete );
118
119
}
119
120
EXPORT_SYMBOL_GPL (rp1_firmware_put );
120
121
@@ -157,7 +158,7 @@ struct rp1_firmware *rp1_firmware_get(struct device_node *client)
157
158
const char * match = rp1_firmware_of_match [0 ].compatible ;
158
159
struct platform_device * pdev ;
159
160
struct device_node * fwnode ;
160
- struct rp1_firmware * fw ;
161
+ struct rp1_firmware * fw = NULL ;
161
162
162
163
if (!client )
163
164
return NULL ;
@@ -166,17 +167,17 @@ struct rp1_firmware *rp1_firmware_get(struct device_node *client)
166
167
return NULL ;
167
168
if (!of_device_is_compatible (fwnode , match )) {
168
169
of_node_put (fwnode );
169
- return NULL ;
170
+ return ERR_PTR ( - ENXIO ) ;
170
171
}
171
172
172
173
pdev = of_find_device_by_node (fwnode );
173
174
of_node_put (fwnode );
174
175
175
176
if (!pdev )
176
- goto err_exit ;
177
+ return ERR_PTR ( - ENXIO ) ;
177
178
178
179
fw = platform_get_drvdata (pdev );
179
- if (! fw )
180
+ if (IS_ERR_OR_NULL ( fw ) )
180
181
goto err_exit ;
181
182
182
183
if (!kref_get_unless_zero (& fw -> consumers ))
@@ -188,7 +189,7 @@ struct rp1_firmware *rp1_firmware_get(struct device_node *client)
188
189
189
190
err_exit :
190
191
put_device (& pdev -> dev );
191
- return NULL ;
192
+ return fw ;
192
193
}
193
194
EXPORT_SYMBOL_GPL (rp1_firmware_get );
194
195
@@ -204,8 +205,8 @@ struct rp1_firmware *devm_rp1_firmware_get(struct device *dev, struct device_nod
204
205
int ret ;
205
206
206
207
fw = rp1_firmware_get (client );
207
- if (! fw )
208
- return NULL ;
208
+ if (IS_ERR_OR_NULL ( fw ) )
209
+ return fw ;
209
210
210
211
ret = devm_add_action_or_reset (dev , devm_rp1_firmware_put , fw );
211
212
if (ret )
@@ -270,19 +271,18 @@ static int rp1_firmware_probe(struct platform_device *pdev)
270
271
init_completion (& fw -> c );
271
272
kref_init (& fw -> consumers );
272
273
273
- platform_set_drvdata (pdev , fw );
274
-
275
274
ret = rp1_firmware_message (fw , GET_FIRMWARE_VERSION ,
276
275
NULL , 0 , & version , sizeof (version ));
277
276
if (ret == sizeof (version )) {
278
277
dev_info (dev , "RP1 Firmware version %08x%08x%08x%08x%08x\n" ,
279
278
version [0 ], version [1 ], version [2 ], version [3 ], version [4 ]);
280
- ret = 0 ;
281
- } else if (ret >= 0 ) {
282
- ret = - EIO ;
279
+ platform_set_drvdata (pdev , fw );
280
+ } else {
281
+ rp1_firmware_put (fw );
282
+ platform_set_drvdata (pdev , ERR_PTR (- ENOENT ));
283
283
}
284
284
285
- return ret ;
285
+ return 0 ;
286
286
}
287
287
288
288
static void rp1_firmware_remove (struct platform_device * pdev )
0 commit comments