.. | .. |
---|
243 | 243 | } |
---|
244 | 244 | EXPORT_SYMBOL_GPL(rpi_firmware_put); |
---|
245 | 245 | |
---|
| 246 | +static void devm_rpi_firmware_put(void *data) |
---|
| 247 | +{ |
---|
| 248 | + struct rpi_firmware *fw = data; |
---|
| 249 | + |
---|
| 250 | + rpi_firmware_put(fw); |
---|
| 251 | +} |
---|
| 252 | + |
---|
246 | 253 | static int rpi_firmware_probe(struct platform_device *pdev) |
---|
247 | 254 | { |
---|
248 | 255 | struct device *dev = &pdev->dev; |
---|
.. | .. |
---|
265 | 272 | int ret = PTR_ERR(fw->chan); |
---|
266 | 273 | if (ret != -EPROBE_DEFER) |
---|
267 | 274 | dev_err(dev, "Failed to get mbox channel: %d\n", ret); |
---|
| 275 | + kfree(fw); |
---|
268 | 276 | return ret; |
---|
269 | 277 | } |
---|
270 | 278 | |
---|
.. | .. |
---|
337 | 345 | } |
---|
338 | 346 | EXPORT_SYMBOL_GPL(rpi_firmware_get); |
---|
339 | 347 | |
---|
| 348 | +/** |
---|
| 349 | + * devm_rpi_firmware_get - Get pointer to rpi_firmware structure. |
---|
| 350 | + * @firmware_node: Pointer to the firmware Device Tree node. |
---|
| 351 | + * |
---|
| 352 | + * Returns NULL is the firmware device is not ready. |
---|
| 353 | + */ |
---|
| 354 | +struct rpi_firmware *devm_rpi_firmware_get(struct device *dev, |
---|
| 355 | + struct device_node *firmware_node) |
---|
| 356 | +{ |
---|
| 357 | + struct rpi_firmware *fw; |
---|
| 358 | + |
---|
| 359 | + fw = rpi_firmware_get(firmware_node); |
---|
| 360 | + if (!fw) |
---|
| 361 | + return NULL; |
---|
| 362 | + |
---|
| 363 | + if (devm_add_action_or_reset(dev, devm_rpi_firmware_put, fw)) |
---|
| 364 | + return NULL; |
---|
| 365 | + |
---|
| 366 | + return fw; |
---|
| 367 | +} |
---|
| 368 | +EXPORT_SYMBOL_GPL(devm_rpi_firmware_get); |
---|
| 369 | + |
---|
340 | 370 | static const struct of_device_id rpi_firmware_of_match[] = { |
---|
341 | 371 | { .compatible = "raspberrypi,bcm2835-firmware", }, |
---|
342 | 372 | {}, |
---|