Am Montag, 25. März 2024, 20:33:37 CEST schrieb Sebastian Reichel: > Recent Rockchip SoCs have a new hardware block called Native Interface > Unit (NIU), which gates clocks to devices behind them. These clock > gates will only have a running output clock when all of the following > conditions are met: > > 1. the parent clock is enabled > 2. the enable bit is set correctly > 3. the linked clock is enabled > > To handle them this code registers them as a normal gate type clock, > which takes care of condition 1 + 2. The linked clock is handled by > using runtime PM clocks. Handling it via runtime PM requires setting > up a struct device for each of these clocks with a driver attached > to use the correct runtime PM operations. Thus the complete handling > of these clocks has been moved into its own driver. > > Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxx> > +static void rk_clk_gate_link_remove(struct platform_device *pdev) > +{ > + struct rockchip_gate_link_platdata *pdata; > + struct device *dev = &pdev->dev; > + struct clk *clk, *linked_clk; > + > + pdata = dev_get_platdata(dev); > + clk = rockchip_clk_get_lookup(pdata->ctx, pdata->clkbr->id); > + linked_clk = rockchip_clk_get_lookup(pdata->ctx, pdata->clkbr->linked_clk_id); > + rockchip_clk_set_lookup(pdata->ctx, ERR_PTR(-ENODEV), pdata->clkbr->id); > + clk_unregister_gate(clk); > + pm_clk_remove_clk(dev, linked_clk); > +} > + > +static const struct dev_pm_ops rk_clk_gate_link_pm_ops = { > + SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL) > +}; > + > +struct platform_driver rk_clk_gate_link_driver = { > + .probe = rk_clk_gate_link_probe, > + .remove_new = rk_clk_gate_link_remove, what's the use-case for remove? We don't allow the main clock driver to be unbound, so I guess we might want to do the same here? On a system-level they're getting registered automatically but never unregistered, so the only case here would be a manual unbind - but I'd think that would cause mayhem anyway?