hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/firmware/raspberrypi.c
....@@ -243,6 +243,13 @@
243243 }
244244 EXPORT_SYMBOL_GPL(rpi_firmware_put);
245245
246
+static void devm_rpi_firmware_put(void *data)
247
+{
248
+ struct rpi_firmware *fw = data;
249
+
250
+ rpi_firmware_put(fw);
251
+}
252
+
246253 static int rpi_firmware_probe(struct platform_device *pdev)
247254 {
248255 struct device *dev = &pdev->dev;
....@@ -265,6 +272,7 @@
265272 int ret = PTR_ERR(fw->chan);
266273 if (ret != -EPROBE_DEFER)
267274 dev_err(dev, "Failed to get mbox channel: %d\n", ret);
275
+ kfree(fw);
268276 return ret;
269277 }
270278
....@@ -337,6 +345,28 @@
337345 }
338346 EXPORT_SYMBOL_GPL(rpi_firmware_get);
339347
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
+
340370 static const struct of_device_id rpi_firmware_of_match[] = {
341371 { .compatible = "raspberrypi,bcm2835-firmware", },
342372 {},