[PATCH 1/8] clk: sunxi: factors: Add m_start parameters
Chen-Yu Tsai
wens at csie.org
Thu May 14 02:12:07 PDT 2015
On Sat, May 2, 2015 at 7:24 PM, Maxime Ripard
<maxime.ripard at free-electrons.com> wrote:
> Some clocks start incrementing the m factor at 0. Add a parameter to handle
> it just like we did for the N factor.
>
> Since the behaviour until now was to assume that the m factor was starting
> at 1, we also need to fix the other users.
>
> Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>
> ---
> drivers/clk/sunxi/clk-factors.c | 11 ++++++++++-
> drivers/clk/sunxi/clk-factors.h | 2 ++
> drivers/clk/sunxi/clk-mod0.c | 2 ++
> drivers/clk/sunxi/clk-sun8i-mbus.c | 2 ++
> drivers/clk/sunxi/clk-sun9i-core.c | 6 ++++++
> drivers/clk/sunxi/clk-sunxi.c | 10 ++++++++++
> 6 files changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c
> index 8c20190a3e9f..100a711c3e3d 100644
> --- a/drivers/clk/sunxi/clk-factors.c
> +++ b/drivers/clk/sunxi/clk-factors.c
> @@ -56,15 +56,24 @@ static unsigned long clk_factors_recalc_rate(struct clk_hw *hw,
> /* Get each individual factor if applicable */
> if (config->nwidth != SUNXI_FACTORS_NOT_APPLICABLE)
> n = FACTOR_GET(config->nshift, config->nwidth, reg);
> +
> if (config->kwidth != SUNXI_FACTORS_NOT_APPLICABLE)
> k = FACTOR_GET(config->kshift, config->kwidth, reg);
> +
> if (config->mwidth != SUNXI_FACTORS_NOT_APPLICABLE)
> m = FACTOR_GET(config->mshift, config->mwidth, reg);
> + else
> + /* Make sure we don't get a division by zero */
> + m = 1;
What happens when mwidth is valid, m_start = 0, and m = 0?
Other than that, this one looks good.
ChenYu
> +
> if (config->pwidth != SUNXI_FACTORS_NOT_APPLICABLE)
> p = FACTOR_GET(config->pshift, config->pwidth, reg);
>
> /* Calculate the rate */
> - rate = (parent_rate * (n + config->n_start) * (k + 1) >> p) / (m + 1);
> + rate = parent_rate * (n + config->n_start);
> + rate *= k + 1;
> + rate >>= p;
> + rate /= m + config->m_start;
>
> return rate;
> }
> diff --git a/drivers/clk/sunxi/clk-factors.h b/drivers/clk/sunxi/clk-factors.h
> index 171085ab5513..735d756d2923 100644
> --- a/drivers/clk/sunxi/clk-factors.h
> +++ b/drivers/clk/sunxi/clk-factors.h
> @@ -16,6 +16,8 @@ struct clk_factors_config {
> u8 mwidth;
> u8 pshift;
> u8 pwidth;
> +
> + u8 m_start;
> u8 n_start;
> };
>
> diff --git a/drivers/clk/sunxi/clk-mod0.c b/drivers/clk/sunxi/clk-mod0.c
> index ec8f5a1fca09..eefa9be4078b 100644
> --- a/drivers/clk/sunxi/clk-mod0.c
> +++ b/drivers/clk/sunxi/clk-mod0.c
> @@ -66,6 +66,8 @@ static struct clk_factors_config sun4i_a10_mod0_config = {
> .mwidth = 4,
> .pshift = 16,
> .pwidth = 2,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun4i_a10_mod0_data = {
> diff --git a/drivers/clk/sunxi/clk-sun8i-mbus.c b/drivers/clk/sunxi/clk-sun8i-mbus.c
> index 14cd026064bf..66fbf14a0f8a 100644
> --- a/drivers/clk/sunxi/clk-sun8i-mbus.c
> +++ b/drivers/clk/sunxi/clk-sun8i-mbus.c
> @@ -55,6 +55,8 @@ static void sun8i_a23_get_mbus_factors(u32 *freq, u32 parent_rate,
> static struct clk_factors_config sun8i_a23_mbus_config = {
> .mshift = 0,
> .mwidth = 3,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun8i_a23_mbus_data __initconst = {
> diff --git a/drivers/clk/sunxi/clk-sun9i-core.c b/drivers/clk/sunxi/clk-sun9i-core.c
> index d8da77d72861..97e87ca4a8fc 100644
> --- a/drivers/clk/sunxi/clk-sun9i-core.c
> +++ b/drivers/clk/sunxi/clk-sun9i-core.c
> @@ -78,6 +78,8 @@ static struct clk_factors_config sun9i_a80_pll4_config = {
> .nwidth = 8,
> .pshift = 16,
> .pwidth = 1,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun9i_a80_pll4_data __initconst = {
> @@ -137,6 +139,8 @@ static void sun9i_a80_get_gt_factors(u32 *freq, u32 parent_rate,
> static struct clk_factors_config sun9i_a80_gt_config = {
> .mshift = 0,
> .mwidth = 2,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun9i_a80_gt_data __initconst = {
> @@ -294,6 +298,8 @@ static struct clk_factors_config sun9i_a80_apb1_config = {
> .mwidth = 5,
> .pshift = 16,
> .pwidth = 2,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun9i_a80_apb1_data __initconst = {
> diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
> index 7e1e2bd189b6..6df869050986 100644
> --- a/drivers/clk/sunxi/clk-sunxi.c
> +++ b/drivers/clk/sunxi/clk-sunxi.c
> @@ -616,6 +616,8 @@ static struct clk_factors_config sun4i_pll1_config = {
> .mwidth = 2,
> .pshift = 16,
> .pwidth = 2,
> +
> + .m_start = 1,
> };
>
> static struct clk_factors_config sun6i_a31_pll1_config = {
> @@ -625,6 +627,8 @@ static struct clk_factors_config sun6i_a31_pll1_config = {
> .kwidth = 2,
> .mshift = 0,
> .mwidth = 2,
> +
> + .m_start = 1,
> .n_start = 1,
> };
>
> @@ -637,6 +641,8 @@ static struct clk_factors_config sun8i_a23_pll1_config = {
> .mwidth = 2,
> .pshift = 16,
> .pwidth = 2,
> +
> + .m_start = 1,
> .n_start = 1,
> };
>
> @@ -665,6 +671,8 @@ static struct clk_factors_config sun4i_apb1_config = {
> .mwidth = 5,
> .pshift = 16,
> .pwidth = 2,
> +
> + .m_start = 1,
> };
>
> /* user manual says "n" but it's really "p" */
> @@ -673,6 +681,8 @@ static struct clk_factors_config sun7i_a20_out_config = {
> .mwidth = 5,
> .pshift = 20,
> .pwidth = 2,
> +
> + .m_start = 1,
> };
>
> static const struct factors_data sun4i_pll1_data __initconst = {
> --
> 2.3.6
>
More information about the linux-arm-kernel
mailing list