* [PATCH v5 0/2] Add helper function to get and enable all bulk clocks [not found] <CGME20240213132759epcas5p4896fd9d0b1af7762ff98ae9e586492dc@epcas5p4.samsung.com> @ 2024-02-13 13:27 ` Shradha Todi 2024-02-13 13:27 ` [PATCH v5 1/2] clk: Provide managed helper to get and enable " Shradha Todi 2024-02-13 13:27 ` [PATCH v5 2/2] PCI: exynos: Adapt to clk_bulk_* APIs Shradha Todi 0 siblings, 2 replies; 5+ messages in thread From: Shradha Todi @ 2024-02-13 13:27 UTC (permalink / raw) To: linux-clk, linux-kernel, linux-pci, linux-arm-kernel, linux-samsung-soc Cc: mturquette, sboyd, jingoohan1, lpieralisi, kw, robh, bhelgaas, krzysztof.kozlowski, alim.akhtar, linux, m.szyprowski, manivannan.sadhasivam, pankaj.dubey, gost.dev, Shradha Todi Create a managed API wrapper to get all the bulk clocks and enable them as it is a very common practice in many drivers. The second patch uses this API to adapt to clk_bulk_* APIs in the exynos driver. v1: - https://lore.kernel.org/lkml/20231009062216.6729-1-shradha.t@samsung.com/ v2: - https://lore.kernel.org/lkml/20231115065621.27014-1-shradha.t@samsung.com/ - Addressed Manivannan's comments to improve patch v3: - https://lore.kernel.org/all/20240110110115.56270-1-shradha.t@samsung.com/ - Took Marek's suggestion to make a common bulk clk wrapper and use it in the exynos driver v4: - https://lore.kernel.org/all/20240124103838.32478-1-shradha.t@samsung.com/ - Addressed Alim and Manivannan's comments - Changed enabled->enable and disabled->disable in function name - Remove num_clks out parameter as it is not required by user - Removed exit callback and used function name directly in release v5: - Rephrased comments for better readability Shradha Todi (2): clk: Provide managed helper to get and enable bulk clocks PCI: exynos: Adapt to clk_bulk_* APIs drivers/clk/clk-devres.c | 40 ++++++++++++++++++ drivers/pci/controller/dwc/pci-exynos.c | 54 ++----------------------- include/linux/clk.h | 23 +++++++++++ 3 files changed, 67 insertions(+), 50 deletions(-) -- 2.17.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 1/2] clk: Provide managed helper to get and enable bulk clocks 2024-02-13 13:27 ` [PATCH v5 0/2] Add helper function to get and enable all bulk clocks Shradha Todi @ 2024-02-13 13:27 ` Shradha Todi 2024-02-16 11:31 ` Manivannan Sadhasivam 2024-02-13 13:27 ` [PATCH v5 2/2] PCI: exynos: Adapt to clk_bulk_* APIs Shradha Todi 1 sibling, 1 reply; 5+ messages in thread From: Shradha Todi @ 2024-02-13 13:27 UTC (permalink / raw) To: linux-clk, linux-kernel, linux-pci, linux-arm-kernel, linux-samsung-soc Cc: mturquette, sboyd, jingoohan1, lpieralisi, kw, robh, bhelgaas, krzysztof.kozlowski, alim.akhtar, linux, m.szyprowski, manivannan.sadhasivam, pankaj.dubey, gost.dev, Shradha Todi Provide a managed devm_clk_bulk* wrapper to get and enable all bulk clocks in order to simplify drivers that keeps all clocks enabled for the time of driver operation. Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> Signed-off-by: Shradha Todi <shradha.t@samsung.com> --- drivers/clk/clk-devres.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/linux/clk.h | 23 +++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c index 4fb4fd4b06bd..cbbd2cc339c3 100644 --- a/drivers/clk/clk-devres.c +++ b/drivers/clk/clk-devres.c @@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev, } EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all); +static void devm_clk_bulk_release_all_enable(struct device *dev, void *res) +{ + struct clk_bulk_devres *devres = res; + + clk_bulk_disable_unprepare(devres->num_clks, devres->clks); + clk_bulk_put_all(devres->num_clks, devres->clks); +} + +int __must_check devm_clk_bulk_get_all_enable(struct device *dev, + struct clk_bulk_data **clks) +{ + struct clk_bulk_devres *devres; + int ret; + + devres = devres_alloc(devm_clk_bulk_release_all_enable, + sizeof(*devres), GFP_KERNEL); + if (!devres) + return -ENOMEM; + + ret = clk_bulk_get_all(dev, &devres->clks); + if (ret > 0) { + *clks = devres->clks; + devres->num_clks = ret; + } else { + devres_free(devres); + return ret; + } + + ret = clk_bulk_prepare_enable(devres->num_clks, *clks); + if (!ret) { + devres_add(dev, devres); + } else { + clk_bulk_put_all(devres->num_clks, devres->clks); + devres_free(devres); + } + + return ret; +} +EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable); + static int devm_clk_match(struct device *dev, void *res, void *data) { struct clk **c = res; diff --git a/include/linux/clk.h b/include/linux/clk.h index 1ef013324237..85a9330d5a5a 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h @@ -438,6 +438,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks, int __must_check devm_clk_bulk_get_all(struct device *dev, struct clk_bulk_data **clks); +/** + * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed) + * @dev: device for clock "consumer" + * @clks: pointer to the clk_bulk_data table of consumer + * + * Returns success (0) or negative errno. + * + * This helper function allows drivers to get all clocks of the + * consumer and enables them in one operation with management. + * The clks will automatically be disabled and freed when the device + * is unbound. + */ + +int __must_check devm_clk_bulk_get_all_enable(struct device *dev, + struct clk_bulk_data **clks); + /** * devm_clk_get - lookup and obtain a managed reference to a clock producer. * @dev: device for clock "consumer" @@ -960,6 +976,13 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev, return 0; } +static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev, + struct clk_bulk_data **clks) +{ + + return 0; +} + static inline struct clk *devm_get_clk_from_child(struct device *dev, struct device_node *np, const char *con_id) { -- 2.17.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/2] clk: Provide managed helper to get and enable bulk clocks 2024-02-13 13:27 ` [PATCH v5 1/2] clk: Provide managed helper to get and enable " Shradha Todi @ 2024-02-16 11:31 ` Manivannan Sadhasivam 2024-02-16 11:33 ` Manivannan Sadhasivam 0 siblings, 1 reply; 5+ messages in thread From: Manivannan Sadhasivam @ 2024-02-16 11:31 UTC (permalink / raw) To: Shradha Todi Cc: linux-clk, linux-kernel, linux-pci, linux-arm-kernel, linux-samsung-soc, mturquette, sboyd, jingoohan1, lpieralisi, kw, robh, bhelgaas, krzysztof.kozlowski, alim.akhtar, linux, m.szyprowski, pankaj.dubey, gost.dev On Tue, Feb 13, 2024 at 06:57:50PM +0530, Shradha Todi wrote: > Provide a managed devm_clk_bulk* wrapper to get and enable all > bulk clocks in order to simplify drivers that keeps all clocks > enabled for the time of driver operation. > > Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com> > Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> > Signed-off-by: Shradha Todi <shradha.t@samsung.com> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> - Mani > --- > drivers/clk/clk-devres.c | 40 ++++++++++++++++++++++++++++++++++++++++ > include/linux/clk.h | 23 +++++++++++++++++++++++ > 2 files changed, 63 insertions(+) > > diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c > index 4fb4fd4b06bd..cbbd2cc339c3 100644 > --- a/drivers/clk/clk-devres.c > +++ b/drivers/clk/clk-devres.c > @@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev, > } > EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all); > > +static void devm_clk_bulk_release_all_enable(struct device *dev, void *res) > +{ > + struct clk_bulk_devres *devres = res; > + > + clk_bulk_disable_unprepare(devres->num_clks, devres->clks); > + clk_bulk_put_all(devres->num_clks, devres->clks); > +} > + > +int __must_check devm_clk_bulk_get_all_enable(struct device *dev, > + struct clk_bulk_data **clks) > +{ > + struct clk_bulk_devres *devres; > + int ret; > + > + devres = devres_alloc(devm_clk_bulk_release_all_enable, > + sizeof(*devres), GFP_KERNEL); > + if (!devres) > + return -ENOMEM; > + > + ret = clk_bulk_get_all(dev, &devres->clks); > + if (ret > 0) { > + *clks = devres->clks; > + devres->num_clks = ret; > + } else { > + devres_free(devres); > + return ret; > + } > + > + ret = clk_bulk_prepare_enable(devres->num_clks, *clks); > + if (!ret) { > + devres_add(dev, devres); > + } else { > + clk_bulk_put_all(devres->num_clks, devres->clks); > + devres_free(devres); > + } > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable); > + > static int devm_clk_match(struct device *dev, void *res, void *data) > { > struct clk **c = res; > diff --git a/include/linux/clk.h b/include/linux/clk.h > index 1ef013324237..85a9330d5a5a 100644 > --- a/include/linux/clk.h > +++ b/include/linux/clk.h > @@ -438,6 +438,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks, > int __must_check devm_clk_bulk_get_all(struct device *dev, > struct clk_bulk_data **clks); > > +/** > + * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed) > + * @dev: device for clock "consumer" > + * @clks: pointer to the clk_bulk_data table of consumer > + * > + * Returns success (0) or negative errno. > + * > + * This helper function allows drivers to get all clocks of the > + * consumer and enables them in one operation with management. > + * The clks will automatically be disabled and freed when the device > + * is unbound. > + */ > + > +int __must_check devm_clk_bulk_get_all_enable(struct device *dev, > + struct clk_bulk_data **clks); > + > /** > * devm_clk_get - lookup and obtain a managed reference to a clock producer. > * @dev: device for clock "consumer" > @@ -960,6 +976,13 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev, > return 0; > } > > +static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev, > + struct clk_bulk_data **clks) > +{ > + > + return 0; > +} > + > static inline struct clk *devm_get_clk_from_child(struct device *dev, > struct device_node *np, const char *con_id) > { > -- > 2.17.1 > -- மணிவண்ணன் சதாசிவம் _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/2] clk: Provide managed helper to get and enable bulk clocks 2024-02-16 11:31 ` Manivannan Sadhasivam @ 2024-02-16 11:33 ` Manivannan Sadhasivam 0 siblings, 0 replies; 5+ messages in thread From: Manivannan Sadhasivam @ 2024-02-16 11:33 UTC (permalink / raw) To: Shradha Todi Cc: linux-clk, linux-kernel, linux-pci, linux-arm-kernel, linux-samsung-soc, mturquette, sboyd, jingoohan1, lpieralisi, kw, robh, bhelgaas, krzysztof.kozlowski, alim.akhtar, linux, m.szyprowski, pankaj.dubey, gost.dev On Fri, Feb 16, 2024 at 05:01:47PM +0530, Manivannan Sadhasivam wrote: > On Tue, Feb 13, 2024 at 06:57:50PM +0530, Shradha Todi wrote: > > Provide a managed devm_clk_bulk* wrapper to get and enable all > > bulk clocks in order to simplify drivers that keeps all clocks > > enabled for the time of driver operation. > > > > Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com> > > Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> > > Signed-off-by: Shradha Todi <shradha.t@samsung.com> > > Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> > > - Mani > > > --- > > drivers/clk/clk-devres.c | 40 ++++++++++++++++++++++++++++++++++++++++ > > include/linux/clk.h | 23 +++++++++++++++++++++++ > > 2 files changed, 63 insertions(+) > > [...] > > diff --git a/include/linux/clk.h b/include/linux/clk.h > > index 1ef013324237..85a9330d5a5a 100644 > > --- a/include/linux/clk.h > > +++ b/include/linux/clk.h > > @@ -438,6 +438,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks, > > int __must_check devm_clk_bulk_get_all(struct device *dev, > > struct clk_bulk_data **clks); > > > > +/** > > + * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed) > > + * @dev: device for clock "consumer" > > + * @clks: pointer to the clk_bulk_data table of consumer > > + * > > + * Returns success (0) or negative errno. > > + * > > + * This helper function allows drivers to get all clocks of the > > + * consumer and enables them in one operation with management. > > + * The clks will automatically be disabled and freed when the device > > + * is unbound. > > + */ > > + > > +int __must_check devm_clk_bulk_get_all_enable(struct device *dev, > > + struct clk_bulk_data **clks); > > + > > /** > > * devm_clk_get - lookup and obtain a managed reference to a clock producer. > > * @dev: device for clock "consumer" > > @@ -960,6 +976,13 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev, > > return 0; > > } > > > > +static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev, > > + struct clk_bulk_data **clks) > > +{ > > + Just noticed this extra newline after sending my r-b tag. Please remove it in next iteration. - Mani -- மணிவண்ணன் சதாசிவம் _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 2/2] PCI: exynos: Adapt to clk_bulk_* APIs 2024-02-13 13:27 ` [PATCH v5 0/2] Add helper function to get and enable all bulk clocks Shradha Todi 2024-02-13 13:27 ` [PATCH v5 1/2] clk: Provide managed helper to get and enable " Shradha Todi @ 2024-02-13 13:27 ` Shradha Todi 1 sibling, 0 replies; 5+ messages in thread From: Shradha Todi @ 2024-02-13 13:27 UTC (permalink / raw) To: linux-clk, linux-kernel, linux-pci, linux-arm-kernel, linux-samsung-soc Cc: mturquette, sboyd, jingoohan1, lpieralisi, kw, robh, bhelgaas, krzysztof.kozlowski, alim.akhtar, linux, m.szyprowski, manivannan.sadhasivam, pankaj.dubey, gost.dev, Shradha Todi There is no need to hardcode the clock info in the driver as driver can rely on the devicetree to supply the clocks required for the functioning of the peripheral. Get rid of the static clock info and obtain the platform supplied clocks. All the clocks supplied is obtained and enabled using the devm_clk_bulk_get_all_enable() API. Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> Signed-off-by: Shradha Todi <shradha.t@samsung.com> --- drivers/pci/controller/dwc/pci-exynos.c | 54 ++----------------------- 1 file changed, 4 insertions(+), 50 deletions(-) diff --git a/drivers/pci/controller/dwc/pci-exynos.c b/drivers/pci/controller/dwc/pci-exynos.c index ec5611005566..3234eb5be1fb 100644 --- a/drivers/pci/controller/dwc/pci-exynos.c +++ b/drivers/pci/controller/dwc/pci-exynos.c @@ -54,43 +54,11 @@ struct exynos_pcie { struct dw_pcie pci; void __iomem *elbi_base; - struct clk *clk; - struct clk *bus_clk; + struct clk_bulk_data *clks; struct phy *phy; struct regulator_bulk_data supplies[2]; }; -static int exynos_pcie_init_clk_resources(struct exynos_pcie *ep) -{ - struct device *dev = ep->pci.dev; - int ret; - - ret = clk_prepare_enable(ep->clk); - if (ret) { - dev_err(dev, "cannot enable pcie rc clock"); - return ret; - } - - ret = clk_prepare_enable(ep->bus_clk); - if (ret) { - dev_err(dev, "cannot enable pcie bus clock"); - goto err_bus_clk; - } - - return 0; - -err_bus_clk: - clk_disable_unprepare(ep->clk); - - return ret; -} - -static void exynos_pcie_deinit_clk_resources(struct exynos_pcie *ep) -{ - clk_disable_unprepare(ep->bus_clk); - clk_disable_unprepare(ep->clk); -} - static void exynos_pcie_writel(void __iomem *base, u32 val, u32 reg) { writel(val, base + reg); @@ -332,17 +300,9 @@ static int exynos_pcie_probe(struct platform_device *pdev) if (IS_ERR(ep->elbi_base)) return PTR_ERR(ep->elbi_base); - ep->clk = devm_clk_get(dev, "pcie"); - if (IS_ERR(ep->clk)) { - dev_err(dev, "Failed to get pcie rc clock\n"); - return PTR_ERR(ep->clk); - } - - ep->bus_clk = devm_clk_get(dev, "pcie_bus"); - if (IS_ERR(ep->bus_clk)) { - dev_err(dev, "Failed to get pcie bus clock\n"); - return PTR_ERR(ep->bus_clk); - } + ret = devm_clk_bulk_get_all_enable(dev, &ep->clks); + if (ret < 0) + return ret; ep->supplies[0].supply = "vdd18"; ep->supplies[1].supply = "vdd10"; @@ -351,10 +311,6 @@ static int exynos_pcie_probe(struct platform_device *pdev) if (ret) return ret; - ret = exynos_pcie_init_clk_resources(ep); - if (ret) - return ret; - ret = regulator_bulk_enable(ARRAY_SIZE(ep->supplies), ep->supplies); if (ret) return ret; @@ -369,7 +325,6 @@ static int exynos_pcie_probe(struct platform_device *pdev) fail_probe: phy_exit(ep->phy); - exynos_pcie_deinit_clk_resources(ep); regulator_bulk_disable(ARRAY_SIZE(ep->supplies), ep->supplies); return ret; @@ -383,7 +338,6 @@ static int __exit exynos_pcie_remove(struct platform_device *pdev) exynos_pcie_assert_core_reset(ep); phy_power_off(ep->phy); phy_exit(ep->phy); - exynos_pcie_deinit_clk_resources(ep); regulator_bulk_disable(ARRAY_SIZE(ep->supplies), ep->supplies); return 0; -- 2.17.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-02-16 11:34 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20240213132759epcas5p4896fd9d0b1af7762ff98ae9e586492dc@epcas5p4.samsung.com>
2024-02-13 13:27 ` [PATCH v5 0/2] Add helper function to get and enable all bulk clocks Shradha Todi
2024-02-13 13:27 ` [PATCH v5 1/2] clk: Provide managed helper to get and enable " Shradha Todi
2024-02-16 11:31 ` Manivannan Sadhasivam
2024-02-16 11:33 ` Manivannan Sadhasivam
2024-02-13 13:27 ` [PATCH v5 2/2] PCI: exynos: Adapt to clk_bulk_* APIs Shradha Todi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).