| .. | .. |
|---|
| 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 | {}, |
|---|