Hi Partha, Benoît, On Tue, 21 Sep 2010, Benoit Cousson wrote: > From: Basak, Partha <p-basak2@xxxxxx> > > For every optional clock present per hwmod per omap-device, this function > adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role>, > if an entry is already present in the list of the form <dev-id=NULL, con-id=role>. > > The function is called from within the framework inside omap_device_build_ss(), > after omap_device_register. > > This allows drivers to get a pointer to its optional clocks based on its role > by calling clk_get(<dev*>, <role>). > > Link to discussions related to this patch: > http://www.spinics.net/lists/linux-omap/msg34809.html I've queued a modified version of this patch for 2.6.37 with a few changes. The modified version is below. Could you please test it at your earliest opportunity and also comment as to your opinion on the changes? The major changes are: - Remove the secondary index in the for() and convert to an array index in the loop body (I once was bit by a difficult-to-find bug with pointer arithmetic with a secondary index, so am a little gun-shy of such code; plus I think the array index is easier to read) - Walk the omap_hwmod_opt_clks in order, rather than in reverse - Remove the clk_get() test, since clk_add_alias() does it for us if the 'dev' parameter is supplied - Supply a 'dev' parameter for clk_add_alias() (see the above) - Continue iterating the loop even if one of the opt clks was not resolved during init, rather than bailing out immediately - Paul From: Basak, Partha <p-basak2@xxxxxx> Date: Tue, 21 Sep 2010 19:23:04 +0200 Subject: [PATCH] OMAP: hwmod: Handle opt clocks node using clk_add_alias For every optional clock present per hwmod per omap-device, this function adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role>, if an entry is already present in the list of the form <dev-id=NULL, con-id=role>. The function is called from within the framework inside omap_device_build_ss(), after omap_device_register. This allows drivers to get a pointer to its optional clocks based on its role by calling clk_get(<dev*>, <role>). Link to discussions related to this patch: http://www.spinics.net/lists/linux-omap/msg34809.html Signed-off-by: Charulatha V <charu@xxxxxx> Signed-off-by: Basak, Partha <p-basak2@xxxxxx> Signed-off-by: Benoit Cousson <b-cousson@xxxxxx> Signed-off-by: Rajendra Nayak <rnayak@xxxxxx> [paul@xxxxxxxxx: simplified loop iterator; removed the superfluous clk_get(), using the clk_get() in clk_add_alias() instead] Signed-off-by: Paul Walmsley <paul@xxxxxxxxx> Acked-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> --- arch/arm/plat-omap/omap_device.c | 43 +++++++++++++++++++++++++++++++++++++- 1 files changed, 42 insertions(+), 1 deletions(-) diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index d2b1609..ceba58a 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c @@ -82,6 +82,7 @@ #include <linux/slab.h> #include <linux/err.h> #include <linux/io.h> +#include <linux/clk.h> #include <plat/omap_device.h> #include <plat/omap_hwmod.h> @@ -243,6 +244,44 @@ static inline struct omap_device *_find_by_pdev(struct platform_device *pdev) return container_of(pdev, struct omap_device, pdev); } +/** + * _add_optional_clock_alias - Add clock alias for hwmod optional clocks + * @od: struct omap_device *od + * + * For every optional clock present per hwmod per omap_device, this function + * adds an entry in the clocks list of the form <dev-id=dev_name, con-id=role> + * if an entry is already present in it with the form <dev-id=NULL, con-id=role> + * + * The function is called from inside omap_device_build_ss(), after + * omap_device_register. + * + * This allows drivers to get a pointer to its optional clocks based on its role + * by calling clk_get(<dev*>, <role>). + * + * No return value. + */ +static void _add_optional_clock_alias(struct omap_device *od, + struct omap_hwmod *oh) +{ + int i; + + for (i = 0; i < oh->opt_clks_cnt; i++) { + struct omap_hwmod_opt_clk *oc; + int r; + + oc = &oh->opt_clks[i]; + + if (!oc->_clk) + continue; + + r = clk_add_alias(oc->role, dev_name(&od->pdev.dev), + (char *)oc->clk, &od->pdev.dev); + if (r) + pr_err("omap_device: %s: clk_add_alias for %s failed\n", + dev_name(&od->pdev.dev), oc->role); + } +} + /* Public functions for use by core code */ @@ -421,8 +460,10 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, else ret = omap_device_register(od); - for (i = 0; i < oh_cnt; i++) + for (i = 0; i < oh_cnt; i++) { hwmods[i]->od = od; + _add_optional_clock_alias(od, hwmods[i]); + } if (ret) goto odbs_exit4; -- 1.7.1