lkml.org 
[lkml]   [2016]   [Aug]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 3/6] clk: sunxi-ng: mux: support fixed pre-dividers on multiple parents
    Date
    Some clocks on the A31 have fixed pre-dividers on multiple parents.
    Add support for them.

    Signed-off-by: Chen-Yu Tsai <wens@csie.org>
    ---
    Changes since v2:

    - Fixed up H3 changes for number of fixed pre-dividers.

    Changes since v1:

    - Add field for number of fixed pre-dividers.
    ---
    drivers/clk/sunxi-ng/ccu-sun8i-h3.c | 10 +++++-----
    drivers/clk/sunxi-ng/ccu_mux.c | 6 ++++--
    drivers/clk/sunxi-ng/ccu_mux.h | 11 +++++++----
    3 files changed, 16 insertions(+), 11 deletions(-)

    diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
    index 9af359544110..4fa9374c2959 100644
    --- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
    +++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
    @@ -184,15 +184,15 @@ static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", apb2_parents, 0x058,
    0);

    static const char * const ahb2_parents[] = { "ahb1" , "pll-periph0" };
    +static const struct ccu_mux_fixed_prediv ahb2_fixed_predivs[] = {
    + { .index = 1, .div = 2 },
    +};
    static struct ccu_mux ahb2_clk = {
    .mux = {
    .shift = 0,
    .width = 1,
    -
    - .fixed_prediv = {
    - .index = 1,
    - .div = 2,
    - },
    + .fixed_predivs = ahb2_fixed_predivs,
    + .n_predivs = ARRAY_SIZE(ahb2_fixed_predivs),
    },

    .common = {
    diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c
    index 68b32f168a74..7b17e0c26b01 100644
    --- a/drivers/clk/sunxi-ng/ccu_mux.c
    +++ b/drivers/clk/sunxi-ng/ccu_mux.c
    @@ -20,6 +20,7 @@ void ccu_mux_helper_adjust_parent_for_prediv(struct ccu_common *common,
    {
    u16 prediv = 1;
    u32 reg;
    + int i;

    if (!((common->features & CCU_FEATURE_FIXED_PREDIV) ||
    (common->features & CCU_FEATURE_VARIABLE_PREDIV)))
    @@ -32,8 +33,9 @@ void ccu_mux_helper_adjust_parent_for_prediv(struct ccu_common *common,
    }

    if (common->features & CCU_FEATURE_FIXED_PREDIV)
    - if (parent_index == cm->fixed_prediv.index)
    - prediv = cm->fixed_prediv.div;
    + for (i = 0; i < cm->n_predivs; i++)
    + if (parent_index == cm->fixed_predivs[i].index)
    + prediv = cm->fixed_predivs[i].div;

    if (common->features & CCU_FEATURE_VARIABLE_PREDIV)
    if (parent_index == cm->variable_prediv.index) {
    diff --git a/drivers/clk/sunxi-ng/ccu_mux.h b/drivers/clk/sunxi-ng/ccu_mux.h
    index b1e085612e5e..8eab1733eeac 100644
    --- a/drivers/clk/sunxi-ng/ccu_mux.h
    +++ b/drivers/clk/sunxi-ng/ccu_mux.h
    @@ -5,15 +5,18 @@

    #include "ccu_common.h"

    +struct ccu_mux_fixed_prediv {
    + u8 index;
    + u16 div;
    +};
    +
    struct ccu_mux_internal {
    u8 shift;
    u8 width;
    const u8 *table;

    - struct {
    - u8 index;
    - u16 div;
    - } fixed_prediv;
    + const struct ccu_mux_fixed_prediv *fixed_predivs;
    + u8 n_predivs;

    struct {
    u8 index;
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-09-17 09:57    [W:2.535 / U:1.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site