Lines Matching +full:bcm2835 +full:- +full:mbox

1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/dma-mapping.h>
18 #include <soc/bcm2835/raspberrypi-firmware.h>
42 complete(&fw->c); in response_callback()
46 * Sends a request to the firmware through the BCM2835 mailbox driver,
58 reinit_completion(&fw->c); in rpi_firmware_transaction()
59 ret = mbox_send_message(fw->chan, &message); in rpi_firmware_transaction()
61 if (wait_for_completion_timeout(&fw->c, HZ)) { in rpi_firmware_transaction()
64 ret = -ETIMEDOUT; in rpi_firmware_transaction()
67 dev_err(fw->cl.dev, "mbox_send_message returned %d\n", ret); in rpi_firmware_transaction()
75 * rpi_firmware_property_list - Submit firmware property list
85 * See struct rpi_firmware_property_tag_header for the per-tag
98 return -EINVAL; in rpi_firmware_property_list()
100 buf = dma_alloc_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size), in rpi_firmware_property_list()
103 return -ENOMEM; in rpi_firmware_property_list()
111 buf[size / 4 - 1] = RPI_FIRMWARE_PROPERTY_END; in rpi_firmware_property_list()
122 * But single-tag is the most common, so go with it. in rpi_firmware_property_list()
124 dev_err(fw->cl.dev, "Request 0x%08x returned status 0x%08x\n", in rpi_firmware_property_list()
126 ret = -EINVAL; in rpi_firmware_property_list()
127 } else if (ret == -ETIMEDOUT) { in rpi_firmware_property_list()
131 dma_free_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size), buf, bus_addr); in rpi_firmware_property_list()
138 * rpi_firmware_property - Submit single firmware property
165 return -ENOMEM; in rpi_firmware_property()
168 header->tag = tag; in rpi_firmware_property()
169 header->buf_size = buf_size; in rpi_firmware_property()
170 header->req_resp_size = 0; in rpi_firmware_property()
197 dev_info(fw->cl.dev, "Attached to firmware from %ptT\n", &date_and_time); in rpi_firmware_print_firmware_revision()
210 rpi_hwmon = platform_device_register_data(dev, "raspberrypi-hwmon", in rpi_register_hwmon_driver()
211 -1, NULL, 0); in rpi_register_hwmon_driver()
223 firmware = of_get_compatible_child(dev->of_node, in rpi_register_clk_driver()
224 "raspberrypi,firmware-clocks"); in rpi_register_clk_driver()
230 rpi_clk = platform_device_register_data(dev, "raspberrypi-clk", in rpi_register_clk_driver()
231 -1, NULL, 0); in rpi_register_clk_driver()
259 mbox_free_channel(fw->chan); in rpi_firmware_delete()
265 kref_put(&fw->consumers, rpi_firmware_delete); in rpi_firmware_put()
278 struct device *dev = &pdev->dev; in rpi_firmware_probe()
287 return -ENOMEM; in rpi_firmware_probe()
289 fw->cl.dev = dev; in rpi_firmware_probe()
290 fw->cl.rx_callback = response_callback; in rpi_firmware_probe()
291 fw->cl.tx_block = true; in rpi_firmware_probe()
293 fw->chan = mbox_request_channel(&fw->cl, 0); in rpi_firmware_probe()
294 if (IS_ERR(fw->chan)) { in rpi_firmware_probe()
295 int ret = PTR_ERR(fw->chan); in rpi_firmware_probe()
297 return dev_err_probe(dev, ret, "Failed to get mbox channel\n"); in rpi_firmware_probe()
300 init_completion(&fw->c); in rpi_firmware_probe()
301 kref_init(&fw->consumers); in rpi_firmware_probe()
335 { .compatible = "raspberrypi,bcm2835-firmware", },
347 * rpi_firmware_get - Get pointer to rpi_firmware structure.
366 if (!kref_get_unless_zero(&fw->consumers)) in rpi_firmware_get()
369 put_device(&pdev->dev); in rpi_firmware_get()
374 put_device(&pdev->dev); in rpi_firmware_get()
380 * devm_rpi_firmware_get - Get pointer to rpi_firmware structure.
404 .name = "raspberrypi-firmware",