On Wed, Aug 18, 2021 at 06:05:21PM +0300, Dmitry Osipenko wrote:
18.08.2021 17:07, Thierry Reding пишет:
quoted
On Tue, Aug 17, 2021 at 04:27:27AM +0300, Dmitry Osipenko wrote:
[...]
quoted
+struct clk *tegra_clk_register(struct clk_hw *hw)
+{
+ struct platform_device *pdev;
+ struct device *dev = NULL;
+ struct device_node *np;
+ const char *dev_name;
+
+ np = tegra_clk_get_of_node(hw);
+
+ if (!of_device_is_available(np))
+ goto put_node;
+
+ dev_name = kasprintf(GFP_KERNEL, "tegra_clk_%s", hw->init->name);
+ if (!dev_name)
+ goto put_node;
+
+ pdev = of_platform_device_create(np, dev_name, NULL);
+ if (!pdev) {
+ pr_err("%s: failed to create device for %pOF\n", __func__, np);
+ kfree(dev_name);
+ goto put_node;
+ }
+
+ dev = &pdev->dev;
+ pm_runtime_enable(dev);
+put_node:
+ of_node_put(np);
+
+ return clk_register(dev, hw);
+}
This looks wrong. Why do we need struct platform_device objects for each
of these clocks? That's going to be a massive amount of platform devices
and they will completely mess up sysfs.
RPM works with a device. It's not a massive amount of devices, it's one
device for T20 and four devices for T30.
I'm still not sure I understand why we need to call RPM functions on a
clock. And even if they are few, it seems wrong to make these platform
devices.
Perhaps they can be simple struct device:s instead? Ideally they would
also be parented to the CAR so that they appear in the right place in
the sysfs hierarchy.
Thierry