2022-02-08 20:40:15 +08:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright ( c ) 2014 MediaTek Inc .
* Author : James Liao < jamesjj . liao @ mediatek . com >
*/
# ifndef __DRV_CLK_MTK_PLL_H
# define __DRV_CLK_MTK_PLL_H
2022-11-21 20:29:54 +08:00
# include <linux/clk-provider.h>
2022-02-08 20:40:15 +08:00
# include <linux/types.h>
struct clk_ops ;
clk: mediatek: Replace 'struct clk' with 'struct clk_hw'
As part of the effort to improve the MediaTek clk drivers, the next step
is to switch from the old 'struct clk' clk prodivder APIs to the new
'struct clk_hw' ones.
Instead of adding new APIs to the MediaTek clk driver library mirroring
the existing ones, moving all drivers to the new APIs, and then removing
the old ones, just migrate everything at the same time. This involves
replacing 'struct clk' with 'struct clk_hw', and 'struct clk_onecell_data'
with 'struct clk_hw_onecell_data', and fixing up all usages.
For now, the clk_register() and co. usage is retained, with __clk_get_hw()
and (struct clk_hw *)->clk used to bridge the difference between the APIs.
These will be replaced in subsequent patches.
Fix up mtk_{alloc,free}_clk_data to use 'struct clk_hw' by hand. Fix up
all other affected call sites with the following coccinelle script.
// Replace type
@@
@@
- struct clk_onecell_data
+ struct clk_hw_onecell_data
// Replace of_clk_add_provider() & of_clk_src_simple_get()
@@
expression NP, DATA;
symbol of_clk_src_onecell_get;
@@
- of_clk_add_provider(
+ of_clk_add_hw_provider(
NP,
- of_clk_src_onecell_get,
+ of_clk_hw_onecell_get,
DATA
)
// Fix register/unregister
@@
identifier CD;
expression E;
identifier fn =~ "unregister";
@@
fn(...,
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
// Fix calls to clk_prepare_enable()
@@
identifier CD;
expression E;
@@
clk_prepare_enable(
- CD->clks[E]
+ CD->hws[E]->clk
);
// Fix pointer assignment
@@
identifier CD;
identifier CLK;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
=
(
- CLK
+ __clk_get_hw(CLK)
|
ERR_PTR(...)
)
;
// Fix pointer usage
@@
identifier CD;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
// Fix mtk_clk_pll_get_base()
@@
symbol clk, hw, data;
@@
mtk_clk_pll_get_base(
- struct clk *clk,
+ struct clk_hw *hw,
const struct mtk_pll_data *data
) {
- struct clk_hw *hw = __clk_get_hw(clk);
...
}
// Fix mtk_clk_pll_get_base() usage
@@
identifier CD;
expression E;
@@
mtk_clk_pll_get_base(
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Miles Chen <miles.chen@mediatek.com>
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tested-by: Miles Chen <miles.chen@mediatek.com>
Link: https://lore.kernel.org/r/20220519071610.423372-4-wenst@chromium.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
2022-05-19 15:16:08 +08:00
struct clk_hw_onecell_data ;
2022-02-08 20:40:15 +08:00
struct device_node ;
struct mtk_pll_div_table {
u32 div ;
unsigned long freq ;
} ;
# define HAVE_RST_BAR BIT(0)
# define PLL_AO BIT(1)
2022-11-21 20:29:54 +08:00
# define POSTDIV_MASK GENMASK(2, 0)
2022-02-08 20:40:15 +08:00
struct mtk_pll_data {
int id ;
const char * name ;
u32 reg ;
u32 pwr_reg ;
u32 en_mask ;
u32 pd_reg ;
u32 tuner_reg ;
u32 tuner_en_reg ;
u8 tuner_en_bit ;
int pd_shift ;
unsigned int flags ;
const struct clk_ops * ops ;
u32 rst_bar_mask ;
unsigned long fmin ;
unsigned long fmax ;
int pcwbits ;
int pcwibits ;
u32 pcw_reg ;
int pcw_shift ;
u32 pcw_chg_reg ;
const struct mtk_pll_div_table * div_table ;
const char * parent_name ;
u32 en_reg ;
u8 pll_en_bit ; /* Assume 0, indicates BIT(0) by default */
} ;
2022-11-21 20:29:54 +08:00
/*
* MediaTek PLLs are configured through their pcw value . The pcw value describes
* a divider in the PLL feedback loop which consists of 7 bits for the integer
* part and the remaining bits ( if present ) for the fractional part . Also they
* have a 3 bit power - of - two post divider .
*/
struct mtk_clk_pll {
struct clk_hw hw ;
void __iomem * base_addr ;
void __iomem * pd_addr ;
void __iomem * pwr_addr ;
void __iomem * tuner_addr ;
void __iomem * tuner_en_addr ;
void __iomem * pcw_addr ;
void __iomem * pcw_chg_addr ;
void __iomem * en_addr ;
const struct mtk_pll_data * data ;
} ;
2022-02-08 20:40:28 +08:00
int mtk_clk_register_plls ( struct device_node * node ,
const struct mtk_pll_data * plls , int num_plls ,
clk: mediatek: Replace 'struct clk' with 'struct clk_hw'
As part of the effort to improve the MediaTek clk drivers, the next step
is to switch from the old 'struct clk' clk prodivder APIs to the new
'struct clk_hw' ones.
Instead of adding new APIs to the MediaTek clk driver library mirroring
the existing ones, moving all drivers to the new APIs, and then removing
the old ones, just migrate everything at the same time. This involves
replacing 'struct clk' with 'struct clk_hw', and 'struct clk_onecell_data'
with 'struct clk_hw_onecell_data', and fixing up all usages.
For now, the clk_register() and co. usage is retained, with __clk_get_hw()
and (struct clk_hw *)->clk used to bridge the difference between the APIs.
These will be replaced in subsequent patches.
Fix up mtk_{alloc,free}_clk_data to use 'struct clk_hw' by hand. Fix up
all other affected call sites with the following coccinelle script.
// Replace type
@@
@@
- struct clk_onecell_data
+ struct clk_hw_onecell_data
// Replace of_clk_add_provider() & of_clk_src_simple_get()
@@
expression NP, DATA;
symbol of_clk_src_onecell_get;
@@
- of_clk_add_provider(
+ of_clk_add_hw_provider(
NP,
- of_clk_src_onecell_get,
+ of_clk_hw_onecell_get,
DATA
)
// Fix register/unregister
@@
identifier CD;
expression E;
identifier fn =~ "unregister";
@@
fn(...,
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
// Fix calls to clk_prepare_enable()
@@
identifier CD;
expression E;
@@
clk_prepare_enable(
- CD->clks[E]
+ CD->hws[E]->clk
);
// Fix pointer assignment
@@
identifier CD;
identifier CLK;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
=
(
- CLK
+ __clk_get_hw(CLK)
|
ERR_PTR(...)
)
;
// Fix pointer usage
@@
identifier CD;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
// Fix mtk_clk_pll_get_base()
@@
symbol clk, hw, data;
@@
mtk_clk_pll_get_base(
- struct clk *clk,
+ struct clk_hw *hw,
const struct mtk_pll_data *data
) {
- struct clk_hw *hw = __clk_get_hw(clk);
...
}
// Fix mtk_clk_pll_get_base() usage
@@
identifier CD;
expression E;
@@
mtk_clk_pll_get_base(
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Miles Chen <miles.chen@mediatek.com>
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tested-by: Miles Chen <miles.chen@mediatek.com>
Link: https://lore.kernel.org/r/20220519071610.423372-4-wenst@chromium.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
2022-05-19 15:16:08 +08:00
struct clk_hw_onecell_data * clk_data ) ;
2022-02-08 20:40:16 +08:00
void mtk_clk_unregister_plls ( const struct mtk_pll_data * plls , int num_plls ,
clk: mediatek: Replace 'struct clk' with 'struct clk_hw'
As part of the effort to improve the MediaTek clk drivers, the next step
is to switch from the old 'struct clk' clk prodivder APIs to the new
'struct clk_hw' ones.
Instead of adding new APIs to the MediaTek clk driver library mirroring
the existing ones, moving all drivers to the new APIs, and then removing
the old ones, just migrate everything at the same time. This involves
replacing 'struct clk' with 'struct clk_hw', and 'struct clk_onecell_data'
with 'struct clk_hw_onecell_data', and fixing up all usages.
For now, the clk_register() and co. usage is retained, with __clk_get_hw()
and (struct clk_hw *)->clk used to bridge the difference between the APIs.
These will be replaced in subsequent patches.
Fix up mtk_{alloc,free}_clk_data to use 'struct clk_hw' by hand. Fix up
all other affected call sites with the following coccinelle script.
// Replace type
@@
@@
- struct clk_onecell_data
+ struct clk_hw_onecell_data
// Replace of_clk_add_provider() & of_clk_src_simple_get()
@@
expression NP, DATA;
symbol of_clk_src_onecell_get;
@@
- of_clk_add_provider(
+ of_clk_add_hw_provider(
NP,
- of_clk_src_onecell_get,
+ of_clk_hw_onecell_get,
DATA
)
// Fix register/unregister
@@
identifier CD;
expression E;
identifier fn =~ "unregister";
@@
fn(...,
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
// Fix calls to clk_prepare_enable()
@@
identifier CD;
expression E;
@@
clk_prepare_enable(
- CD->clks[E]
+ CD->hws[E]->clk
);
// Fix pointer assignment
@@
identifier CD;
identifier CLK;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
=
(
- CLK
+ __clk_get_hw(CLK)
|
ERR_PTR(...)
)
;
// Fix pointer usage
@@
identifier CD;
expression E;
@@
- CD->clks[E]
+ CD->hws[E]
// Fix mtk_clk_pll_get_base()
@@
symbol clk, hw, data;
@@
mtk_clk_pll_get_base(
- struct clk *clk,
+ struct clk_hw *hw,
const struct mtk_pll_data *data
) {
- struct clk_hw *hw = __clk_get_hw(clk);
...
}
// Fix mtk_clk_pll_get_base() usage
@@
identifier CD;
expression E;
@@
mtk_clk_pll_get_base(
- CD->clks[E]
+ CD->hws[E]->clk
,...
);
Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Miles Chen <miles.chen@mediatek.com>
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tested-by: Miles Chen <miles.chen@mediatek.com>
Link: https://lore.kernel.org/r/20220519071610.423372-4-wenst@chromium.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
2022-05-19 15:16:08 +08:00
struct clk_hw_onecell_data * clk_data ) ;
2022-02-08 20:40:15 +08:00
2022-11-21 20:29:54 +08:00
extern const struct clk_ops mtk_pll_ops ;
static inline struct mtk_clk_pll * to_mtk_clk_pll ( struct clk_hw * hw )
{
return container_of ( hw , struct mtk_clk_pll , hw ) ;
}
int mtk_pll_is_prepared ( struct clk_hw * hw ) ;
int mtk_pll_prepare ( struct clk_hw * hw ) ;
void mtk_pll_unprepare ( struct clk_hw * hw ) ;
unsigned long mtk_pll_recalc_rate ( struct clk_hw * hw , unsigned long parent_rate ) ;
void mtk_pll_calc_values ( struct mtk_clk_pll * pll , u32 * pcw , u32 * postdiv ,
u32 freq , u32 fin ) ;
int mtk_pll_set_rate ( struct clk_hw * hw , unsigned long rate ,
unsigned long parent_rate ) ;
long mtk_pll_round_rate ( struct clk_hw * hw , unsigned long rate ,
unsigned long * prate ) ;
struct clk_hw * mtk_clk_register_pll_ops ( struct mtk_clk_pll * pll ,
const struct mtk_pll_data * data ,
void __iomem * base ,
const struct clk_ops * pll_ops ) ;
struct clk_hw * mtk_clk_register_pll ( const struct mtk_pll_data * data ,
void __iomem * base ) ;
void mtk_clk_unregister_pll ( struct clk_hw * hw ) ;
__iomem void * mtk_clk_pll_get_base ( struct clk_hw * hw ,
const struct mtk_pll_data * data ) ;
2022-02-08 20:40:15 +08:00
# endif /* __DRV_CLK_MTK_PLL_H */