Message ID | cb8203b862e386ac6c3df3eff0bb5a238b6ec97a.1592210452.git-series.maxime@cerno.tech (mailing list archive) |
---|---|
State | Mainlined |
Commit | fbac2e7787ac6fd2226a5935c80c0ff80d607bce |
Headers | show |
Series | clk: bcm: rpi: Add support for BCM2711 firmware clocks | expand |
Quoting Maxime Ripard (2020-06-15 01:40:44) > The current firmware clock driver for the RaspberryPi can only be probed by > manually registering an associated platform_device. > > While this works fine for cpufreq where the device gets attached a clkdev > lookup, it would be tedious to maintain a table of all the devices using > one of the clocks exposed by the firmware. > > Since the DT on the other hand is the perfect place to store those > associations, make the firmware clocks driver probe-able through the device > tree so that we can represent it as a node. > > Cc: Michael Turquette <mturquette@baylibre.com> > Cc: linux-clk@vger.kernel.org > Reviewed-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> > Reviewed-by: Stephen Boyd <sboyd@kernel.org> > Tested-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> > Signed-off-by: Maxime Ripard <maxime@cerno.tech> > --- Applied to clk-next
diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c index 1654fd0eedc9..8610355bda47 100644 --- a/drivers/clk/bcm/clk-raspberrypi.c +++ b/drivers/clk/bcm/clk-raspberrypi.c @@ -255,8 +255,16 @@ static int raspberrypi_clk_probe(struct platform_device *pdev) struct raspberrypi_clk *rpi; int ret; - firmware_node = of_find_compatible_node(NULL, NULL, - "raspberrypi,bcm2835-firmware"); + /* + * We can be probed either through the an old-fashioned + * platform device registration or through a DT node that is a + * child of the firmware node. Handle both cases. + */ + if (dev->of_node) + firmware_node = of_get_parent(dev->of_node); + else + firmware_node = of_find_compatible_node(NULL, NULL, + "raspberrypi,bcm2835-firmware"); if (!firmware_node) { dev_err(dev, "Missing firmware node\n"); return -ENOENT; @@ -300,9 +308,16 @@ static int raspberrypi_clk_remove(struct platform_device *pdev) return 0; } +static const struct of_device_id raspberrypi_clk_match[] = { + { .compatible = "raspberrypi,firmware-clocks" }, + { }, +}; +MODULE_DEVICE_TABLE(of, raspberrypi_clk_match); + static struct platform_driver raspberrypi_clk_driver = { .driver = { .name = "raspberrypi-clk", + .of_match_table = raspberrypi_clk_match, }, .probe = raspberrypi_clk_probe, .remove = raspberrypi_clk_remove,