Lines Matching +full:firmware +full:- +full:clocks
1 // SPDX-License-Identifier: GPL-2.0
3 * Defines interfaces for interacting wtih the Raspberry Pi firmware's
9 #include <linux/dma-mapping.h>
15 #include <soc/bcm2835/raspberrypi-firmware.h>
37 complete(&fw->c); in response_callback()
41 * Sends a request to the firmware through the BCM2835 mailbox driver,
53 reinit_completion(&fw->c); in rpi_firmware_transaction()
54 ret = mbox_send_message(fw->chan, &message); in rpi_firmware_transaction()
56 if (wait_for_completion_timeout(&fw->c, HZ)) { in rpi_firmware_transaction()
59 ret = -ETIMEDOUT; in rpi_firmware_transaction()
60 WARN_ONCE(1, "Firmware transaction timeout"); in rpi_firmware_transaction()
63 dev_err(fw->cl.dev, "mbox_send_message returned %d\n", ret); in rpi_firmware_transaction()
71 * rpi_firmware_property_list - Submit firmware property list
72 * @fw: Pointer to firmware structure from rpi_firmware_get().
76 * Submits a set of concatenated tags to the VPU firmware through the
81 * See struct rpi_firmware_property_tag_header for the per-tag
94 return -EINVAL; in rpi_firmware_property_list()
96 buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr, in rpi_firmware_property_list()
99 return -ENOMEM; in rpi_firmware_property_list()
101 /* The firmware will error out without parsing in this case. */ in rpi_firmware_property_list()
107 buf[size / 4 - 1] = RPI_FIRMWARE_PROPERTY_END; in rpi_firmware_property_list()
118 * But single-tag is the most common, so go with it. in rpi_firmware_property_list()
120 dev_err(fw->cl.dev, "Request 0x%08x returned status 0x%08x\n", in rpi_firmware_property_list()
122 ret = -EINVAL; in rpi_firmware_property_list()
125 dma_free_coherent(fw->cl.dev, PAGE_ALIGN(size), buf, bus_addr); in rpi_firmware_property_list()
132 * rpi_firmware_property - Submit single firmware property
133 * @fw: Pointer to firmware structure from rpi_firmware_get().
138 * Submits a single tag to the VPU firmware through the mailbox
159 return -ENOMEM; in rpi_firmware_property()
162 header->tag = tag; in rpi_firmware_property()
163 header->buf_size = buf_size; in rpi_firmware_property()
164 header->req_resp_size = 0; in rpi_firmware_property()
191 dev_info(fw->cl.dev, "Attached to firmware from %ptT\n", &date_and_time); in rpi_firmware_print_firmware_revision()
204 rpi_hwmon = platform_device_register_data(dev, "raspberrypi-hwmon", in rpi_register_hwmon_driver()
205 -1, NULL, 0); in rpi_register_hwmon_driver()
210 struct device_node *firmware; in rpi_register_clk_driver() local
213 * Earlier DTs don't have a node for the firmware clocks but in rpi_register_clk_driver()
215 * have a node for the firmware clocks, just bail out here. in rpi_register_clk_driver()
217 firmware = of_get_compatible_child(dev->of_node, in rpi_register_clk_driver()
218 "raspberrypi,firmware-clocks"); in rpi_register_clk_driver()
219 if (firmware) { in rpi_register_clk_driver()
220 of_node_put(firmware); in rpi_register_clk_driver()
224 rpi_clk = platform_device_register_data(dev, "raspberrypi-clk", in rpi_register_clk_driver()
225 -1, NULL, 0); in rpi_register_clk_driver()
230 struct device *dev = &pdev->dev; in rpi_firmware_probe()
235 return -ENOMEM; in rpi_firmware_probe()
237 fw->cl.dev = dev; in rpi_firmware_probe()
238 fw->cl.rx_callback = response_callback; in rpi_firmware_probe()
239 fw->cl.tx_block = true; in rpi_firmware_probe()
241 fw->chan = mbox_request_channel(&fw->cl, 0); in rpi_firmware_probe()
242 if (IS_ERR(fw->chan)) { in rpi_firmware_probe()
243 int ret = PTR_ERR(fw->chan); in rpi_firmware_probe()
244 if (ret != -EPROBE_DEFER) in rpi_firmware_probe()
249 init_completion(&fw->c); in rpi_firmware_probe()
278 mbox_free_channel(fw->chan); in rpi_firmware_remove()
284 * rpi_firmware_get - Get pointer to rpi_firmware structure.
285 * @firmware_node: Pointer to the firmware Device Tree node.
287 * Returns NULL is the firmware device is not ready.
301 { .compatible = "raspberrypi,bcm2835-firmware", },
308 .name = "raspberrypi-firmware",
318 MODULE_DESCRIPTION("Raspberry Pi firmware driver");