On Tue, 21 Jul 2020 23:55:30 -0700, Amit Sunil Dhamne wrote:
> From: Rajan Vaja <[email protected]>
>
> Currently firmware passes CCF specific flags to ZynqMP clock driver.
> So firmware needs to be updated if CCF flags are changed. The firmware
> should have its own 'flag number space' that is distinct from the
> common clk framework's 'flag number space'. So define and use ZynqMP
> specific common clock flags instead of using CCF flags.
>
> Signed-off-by: Rajan Vaja <[email protected]>
> Signed-off-by: Tejas Patel <[email protected]>
> Signed-off-by: Amit Sunil Dhamne <[email protected]>
> ---
> drivers/clk/zynqmp/clk-gate-zynqmp.c | 4 +++-
> drivers/clk/zynqmp/clk-mux-zynqmp.c | 4 +++-
> drivers/clk/zynqmp/clk-zynqmp.h | 25 +++++++++++++++++++++++++
> drivers/clk/zynqmp/clkc.c | 31 ++++++++++++++++++++++++++++++-
> drivers/clk/zynqmp/divider.c | 5 +++--
> drivers/clk/zynqmp/pll.c | 4 +++-
> 6 files changed, 67 insertions(+), 6 deletions(-)
>
[snip]
> diff --git a/drivers/clk/zynqmp/clkc.c b/drivers/clk/zynqmp/clkc.c
> index db8d0d7..11351f6 100644
> --- a/drivers/clk/zynqmp/clkc.c
> +++ b/drivers/clk/zynqmp/clkc.c
> @@ -271,6 +271,32 @@ static int zynqmp_pm_clock_get_topology(u32 clock_id,
> u32 index,
> return ret;
> }
>
> +void zynqmp_clk_map_common_ccf_flags(const u32 zynqmp_flag,
> + unsigned long *ccf_flag)
> +{
> + *ccf_flag = 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_SET_RATE_GATE) ?
> + CLK_SET_RATE_GATE : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_SET_PARENT_GATE) ?
> + CLK_SET_PARENT_GATE : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_SET_RATE_PARENT) ?
> + CLK_SET_RATE_PARENT : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_IGNORE_UNUSED) ?
> + CLK_IGNORE_UNUSED : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_GET_RATE_NOCACHE) ?
> + CLK_GET_RATE_NOCACHE : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_SET_RATE_NO_REPARENT) ?
> + CLK_SET_RATE_NO_REPARENT : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_GET_ACCURACY_NOCACHE) ?
> + CLK_GET_ACCURACY_NOCACHE : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_RECALC_NEW_RATES) ?
> + CLK_RECALC_NEW_RATES : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_SET_RATE_UNGATE) ?
> + CLK_SET_RATE_UNGATE : 0;
> + *ccf_flag |= (zynqmp_flag & ZYNQMP_CLK_IS_CRITICAL) ?
> + CLK_IS_CRITICAL : 0;
> +}
What is the reason for returning the resulting flags via pointer? I would have
expected something like the following function:
unsigned long zynqmp_clk_flags_to_clk_flags(const u32 zyqnmp_flags)
{
unsigned long flags = 0;
if (zynqmp_flag & ZYNQMP_CLK_SET_RATE_GATE)
flags |= CLK_SET_RATE_GATE;
/* ... */
return flags;
}
Michael
> +
> /**
> * zynqmp_clk_register_fixed_factor() - Register fixed factor with the
> * clock framework
> @@ -292,6 +318,7 @@ struct clk_hw *zynqmp_clk_register_fixed_factor(const
> char *name, u32 clk_id,
> struct zynqmp_pm_query_data qdata = {0};
> u32 ret_payload[PAYLOAD_ARG_CNT];
> int ret;
> + unsigned long flag;
>
> qdata.qid = PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS;
> qdata.arg1 = clk_id;
> @@ -303,9 +330,11 @@ struct clk_hw *zynqmp_clk_register_fixed_factor(const
> char *name, u32 clk_id,
> mult = ret_payload[1];
> div = ret_payload[2];
>
> + zynqmp_clk_map_common_ccf_flags(nodes->flag, &flag);
> +
> hw = clk_hw_register_fixed_factor(NULL, name,
> parents[0],
> - nodes->flag, mult,
> + flag, mult,
> div);
>
> return hw;
> diff --git a/drivers/clk/zynqmp/divider.c b/drivers/clk/zynqmp/divider.c
> index 66da02b..3ab57d9 100644
> --- a/drivers/clk/zynqmp/divider.c
> +++ b/drivers/clk/zynqmp/divider.c
> @@ -311,8 +311,9 @@ struct clk_hw *zynqmp_clk_register_divider(const char
> *name,
>
> init.name = name;
> init.ops = &zynqmp_clk_divider_ops;
> - /* CLK_FRAC is not defined in the common clk framework */
> - init.flags = nodes->flag & ~CLK_FRAC;
> +
> + zynqmp_clk_map_common_ccf_flags(nodes->flag, &init.flags);
> +
> init.parent_names = parents;
> init.num_parents = 1;
>
> diff --git a/drivers/clk/zynqmp/pll.c b/drivers/clk/zynqmp/pll.c
> index 92f449e..1b7e231 100644
> --- a/drivers/clk/zynqmp/pll.c
> +++ b/drivers/clk/zynqmp/pll.c
> @@ -302,7 +302,9 @@ struct clk_hw *zynqmp_clk_register_pll(const char *name,
> u32 clk_id,
>
> init.name = name;
> init.ops = &zynqmp_pll_ops;
> - init.flags = nodes->flag;
> +
> + zynqmp_clk_map_common_ccf_flags(nodes->flag, &init.flags);
> +
> init.parent_names = parents;
> init.num_parents = 1;
>
> --
> 2.7.4
>
> This email and any attachments are intended for the sole use of the named
> recipient(s) and contain(s) confidential information that may be proprietary,
> privileged or copyrighted under applicable law. If you are not the intended
> recipient, do not read, copy, or forward this email message or any
> attachments. Delete this email message and any attachments immediately.
>