mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge branches 'clk-doc', 'clk-more-critical', 'clk-meson' and 'clk-basic-be' into clk-next
- Remove clk_readl() and introduce BE versions of basic clk types
* clk-doc:
clk: Drop duplicate clk_register() documentation
clk: Document and simplify clk_core_get_rate_nolock()
clk: Remove 'flags' member of struct clk_fixed_rate
clk: nxp: Drop 'flags' on fixed_rate clk macro
clk: Document __clk_mux_determine_rate()
clk: Document CLK_MUX_READ_ONLY mux flag
clk: Document deprecated things
clk: Collapse gpio clk kerneldoc
* clk-more-critical:
clk: highbank: Convert to CLK_IS_CRITICAL
* clk-meson: (21 commits)
clk: meson: axg-audio: add g12a support
clk: meson: axg-audio: don't register inputs in the onecell data
clk: meson: axg_audio: replace prefix axg by aud
dt-bindings: clk: axg-audio: add g12a support
clk: meson: meson8b: add the video decoder clock trees
clk: meson: meson8b: add the VPU clock trees
clk: meson: meson8b: add support for the GP_PLL clock on Meson8m2
clk: meson: meson8b: use a separate clock table for Meson8m2
dt-bindings: clock: meson8b: export the video decoder clocks
clk: meson-g12a: add video decoder clocks
dt-bindings: clock: meson8b: export the VPU clock
clk: meson-g12a: add PCIE PLL clocks
dt-bindings: clock: g12a-aoclk: expose CLKID_AO_CTS_OSCIN
clk: meson-pll: add reduced specific clk_ops for G12A PCIe PLL
dt-bindings: clock: meson8b: drop the "ABP" clock definition
clk: meson: g12a: add cpu clocks
dt-bindings: clk: g12a-clkc: add VDEC clock IDs
dt-bindings: clock: axg-audio: unexpose controller inputs
dt-bindings: clk: g12a-clkc: add PCIE PLL clock ID
clk: g12a-aoclk: re-export CLKID_AO_SAR_ADC_SEL clock id
...
* clk-basic-be:
clk: core: replace clk_{readl,writel} with {readl,writel}
clk: core: remove powerpc special handling
powerpc/512x: mark clocks as big endian
clk: mux: add explicit big endian support
clk: multiplier: add explicit big endian support
clk: gate: add explicit big endian support
clk: fractional-divider: add explicit big endian support
clk: divider: add explicit big endian support
This commit is contained in:
@@ -6,7 +6,8 @@ devices.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible : should be "amlogic,axg-audio-clkc" for the A113X and A113D
|
||||
- compatible : should be "amlogic,axg-audio-clkc" for the A113X and A113D,
|
||||
"amlogic,g12a-audio-clkc" for G12A.
|
||||
- reg : physical base address of the clock controller and length of
|
||||
memory mapped region.
|
||||
- clocks : a list of phandle + clock-specifier pairs for the clocks listed
|
||||
|
||||
@@ -239,6 +239,7 @@ static inline struct clk *mpc512x_clk_divider(
|
||||
const char *name, const char *parent_name, u8 clkflags,
|
||||
u32 __iomem *reg, u8 pos, u8 len, int divflags)
|
||||
{
|
||||
divflags |= CLK_DIVIDER_BIG_ENDIAN;
|
||||
return clk_register_divider(NULL, name, parent_name, clkflags,
|
||||
reg, pos, len, divflags, &clklock);
|
||||
}
|
||||
@@ -250,7 +251,7 @@ static inline struct clk *mpc512x_clk_divtable(
|
||||
{
|
||||
u8 divflags;
|
||||
|
||||
divflags = 0;
|
||||
divflags = CLK_DIVIDER_BIG_ENDIAN;
|
||||
return clk_register_divider_table(NULL, name, parent_name, 0,
|
||||
reg, pos, len, divflags,
|
||||
divtab, &clklock);
|
||||
@@ -261,10 +262,12 @@ static inline struct clk *mpc512x_clk_gated(
|
||||
u32 __iomem *reg, u8 pos)
|
||||
{
|
||||
int clkflags;
|
||||
u8 gateflags;
|
||||
|
||||
clkflags = CLK_SET_RATE_PARENT;
|
||||
gateflags = CLK_GATE_BIG_ENDIAN;
|
||||
return clk_register_gate(NULL, name, parent_name, clkflags,
|
||||
reg, pos, 0, &clklock);
|
||||
reg, pos, gateflags, &clklock);
|
||||
}
|
||||
|
||||
static inline struct clk *mpc512x_clk_muxed(const char *name,
|
||||
@@ -275,7 +278,7 @@ static inline struct clk *mpc512x_clk_muxed(const char *name,
|
||||
u8 muxflags;
|
||||
|
||||
clkflags = CLK_SET_RATE_PARENT;
|
||||
muxflags = 0;
|
||||
muxflags = CLK_MUX_BIG_ENDIAN;
|
||||
return clk_register_mux(NULL, name,
|
||||
parent_names, parent_count, clkflags,
|
||||
reg, pos, len, muxflags, &clklock);
|
||||
|
||||
@@ -25,6 +25,22 @@
|
||||
* parent - fixed parent. No clk_set_parent support
|
||||
*/
|
||||
|
||||
static inline u32 clk_div_readl(struct clk_divider *divider)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_BIG_ENDIAN)
|
||||
return ioread32be(divider->reg);
|
||||
|
||||
return readl(divider->reg);
|
||||
}
|
||||
|
||||
static inline void clk_div_writel(struct clk_divider *divider, u32 val)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_BIG_ENDIAN)
|
||||
iowrite32be(val, divider->reg);
|
||||
else
|
||||
writel(val, divider->reg);
|
||||
}
|
||||
|
||||
static unsigned int _get_table_maxdiv(const struct clk_div_table *table,
|
||||
u8 width)
|
||||
{
|
||||
@@ -135,7 +151,7 @@ static unsigned long clk_divider_recalc_rate(struct clk_hw *hw,
|
||||
struct clk_divider *divider = to_clk_divider(hw);
|
||||
unsigned int val;
|
||||
|
||||
val = clk_readl(divider->reg) >> divider->shift;
|
||||
val = clk_div_readl(divider) >> divider->shift;
|
||||
val &= clk_div_mask(divider->width);
|
||||
|
||||
return divider_recalc_rate(hw, parent_rate, val, divider->table,
|
||||
@@ -370,7 +386,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
if (divider->flags & CLK_DIVIDER_READ_ONLY) {
|
||||
u32 val;
|
||||
|
||||
val = clk_readl(divider->reg) >> divider->shift;
|
||||
val = clk_div_readl(divider) >> divider->shift;
|
||||
val &= clk_div_mask(divider->width);
|
||||
|
||||
return divider_ro_round_rate(hw, rate, prate, divider->table,
|
||||
@@ -420,11 +436,11 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
if (divider->flags & CLK_DIVIDER_HIWORD_MASK) {
|
||||
val = clk_div_mask(divider->width) << (divider->shift + 16);
|
||||
} else {
|
||||
val = clk_readl(divider->reg);
|
||||
val = clk_div_readl(divider);
|
||||
val &= ~(clk_div_mask(divider->width) << divider->shift);
|
||||
}
|
||||
val |= (u32)value << divider->shift;
|
||||
clk_writel(val, divider->reg);
|
||||
clk_div_writel(divider, val);
|
||||
|
||||
if (divider->lock)
|
||||
spin_unlock_irqrestore(divider->lock, flags);
|
||||
|
||||
@@ -13,6 +13,22 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rational.h>
|
||||
|
||||
static inline u32 clk_fd_readl(struct clk_fractional_divider *fd)
|
||||
{
|
||||
if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
|
||||
return ioread32be(fd->reg);
|
||||
|
||||
return readl(fd->reg);
|
||||
}
|
||||
|
||||
static inline void clk_fd_writel(struct clk_fractional_divider *fd, u32 val)
|
||||
{
|
||||
if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
|
||||
iowrite32be(val, fd->reg);
|
||||
else
|
||||
writel(val, fd->reg);
|
||||
}
|
||||
|
||||
static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
@@ -27,7 +43,7 @@ static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
|
||||
else
|
||||
__acquire(fd->lock);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
val = clk_fd_readl(fd);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
@@ -115,10 +131,10 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
else
|
||||
__acquire(fd->lock);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
val = clk_fd_readl(fd);
|
||||
val &= ~(fd->mmask | fd->nmask);
|
||||
val |= (m << fd->mshift) | (n << fd->nshift);
|
||||
clk_writel(val, fd->reg);
|
||||
clk_fd_writel(fd, val);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
|
||||
@@ -23,6 +23,22 @@
|
||||
* parent - fixed parent. No clk_set_parent support
|
||||
*/
|
||||
|
||||
static inline u32 clk_gate_readl(struct clk_gate *gate)
|
||||
{
|
||||
if (gate->flags & CLK_GATE_BIG_ENDIAN)
|
||||
return ioread32be(gate->reg);
|
||||
|
||||
return readl(gate->reg);
|
||||
}
|
||||
|
||||
static inline void clk_gate_writel(struct clk_gate *gate, u32 val)
|
||||
{
|
||||
if (gate->flags & CLK_GATE_BIG_ENDIAN)
|
||||
iowrite32be(val, gate->reg);
|
||||
else
|
||||
writel(val, gate->reg);
|
||||
}
|
||||
|
||||
/*
|
||||
* It works on following logic:
|
||||
*
|
||||
@@ -55,7 +71,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable)
|
||||
if (set)
|
||||
reg |= BIT(gate->bit_idx);
|
||||
} else {
|
||||
reg = clk_readl(gate->reg);
|
||||
reg = clk_gate_readl(gate);
|
||||
|
||||
if (set)
|
||||
reg |= BIT(gate->bit_idx);
|
||||
@@ -63,7 +79,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable)
|
||||
reg &= ~BIT(gate->bit_idx);
|
||||
}
|
||||
|
||||
clk_writel(reg, gate->reg);
|
||||
clk_gate_writel(gate, reg);
|
||||
|
||||
if (gate->lock)
|
||||
spin_unlock_irqrestore(gate->lock, flags);
|
||||
@@ -88,7 +104,7 @@ int clk_gate_is_enabled(struct clk_hw *hw)
|
||||
u32 reg;
|
||||
struct clk_gate *gate = to_clk_gate(hw);
|
||||
|
||||
reg = clk_readl(gate->reg);
|
||||
reg = clk_gate_readl(gate);
|
||||
|
||||
/* if a set bit disables this clk, flip it before masking */
|
||||
if (gate->flags & CLK_GATE_SET_TO_DISABLE)
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
@@ -272,7 +271,7 @@ static const struct clk_ops periclk_ops = {
|
||||
.set_rate = clk_periclk_set_rate,
|
||||
};
|
||||
|
||||
static __init struct clk *hb_clk_init(struct device_node *node, const struct clk_ops *ops)
|
||||
static void __init hb_clk_init(struct device_node *node, const struct clk_ops *ops, unsigned long clkflags)
|
||||
{
|
||||
u32 reg;
|
||||
struct hb_clk *hb_clk;
|
||||
@@ -284,11 +283,11 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk
|
||||
|
||||
rc = of_property_read_u32(node, "reg", ®);
|
||||
if (WARN_ON(rc))
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
hb_clk = kzalloc(sizeof(*hb_clk), GFP_KERNEL);
|
||||
if (WARN_ON(!hb_clk))
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
/* Map system registers */
|
||||
srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs");
|
||||
@@ -301,7 +300,7 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk
|
||||
|
||||
init.name = clk_name;
|
||||
init.ops = ops;
|
||||
init.flags = 0;
|
||||
init.flags = clkflags;
|
||||
parent_name = of_clk_get_parent_name(node, 0);
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
@@ -311,33 +310,31 @@ static __init struct clk *hb_clk_init(struct device_node *node, const struct clk
|
||||
rc = clk_hw_register(NULL, &hb_clk->hw);
|
||||
if (WARN_ON(rc)) {
|
||||
kfree(hb_clk);
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
rc = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &hb_clk->hw);
|
||||
return hb_clk->hw.clk;
|
||||
of_clk_add_hw_provider(node, of_clk_hw_simple_get, &hb_clk->hw);
|
||||
}
|
||||
|
||||
static void __init hb_pll_init(struct device_node *node)
|
||||
{
|
||||
hb_clk_init(node, &clk_pll_ops);
|
||||
hb_clk_init(node, &clk_pll_ops, 0);
|
||||
}
|
||||
CLK_OF_DECLARE(hb_pll, "calxeda,hb-pll-clock", hb_pll_init);
|
||||
|
||||
static void __init hb_a9periph_init(struct device_node *node)
|
||||
{
|
||||
hb_clk_init(node, &a9periphclk_ops);
|
||||
hb_clk_init(node, &a9periphclk_ops, 0);
|
||||
}
|
||||
CLK_OF_DECLARE(hb_a9periph, "calxeda,hb-a9periph-clock", hb_a9periph_init);
|
||||
|
||||
static void __init hb_a9bus_init(struct device_node *node)
|
||||
{
|
||||
struct clk *clk = hb_clk_init(node, &a9bclk_ops);
|
||||
clk_prepare_enable(clk);
|
||||
hb_clk_init(node, &a9bclk_ops, CLK_IS_CRITICAL);
|
||||
}
|
||||
CLK_OF_DECLARE(hb_a9bus, "calxeda,hb-a9bus-clock", hb_a9bus_init);
|
||||
|
||||
static void __init hb_emmc_init(struct device_node *node)
|
||||
{
|
||||
hb_clk_init(node, &periclk_ops);
|
||||
hb_clk_init(node, &periclk_ops, 0);
|
||||
}
|
||||
CLK_OF_DECLARE(hb_emmc, "calxeda,hb-emmc-clock", hb_emmc_init);
|
||||
|
||||
@@ -11,6 +11,22 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
static inline u32 clk_mult_readl(struct clk_multiplier *mult)
|
||||
{
|
||||
if (mult->flags & CLK_MULTIPLIER_BIG_ENDIAN)
|
||||
return ioread32be(mult->reg);
|
||||
|
||||
return readl(mult->reg);
|
||||
}
|
||||
|
||||
static inline void clk_mult_writel(struct clk_multiplier *mult, u32 val)
|
||||
{
|
||||
if (mult->flags & CLK_MULTIPLIER_BIG_ENDIAN)
|
||||
iowrite32be(val, mult->reg);
|
||||
else
|
||||
writel(val, mult->reg);
|
||||
}
|
||||
|
||||
static unsigned long __get_mult(struct clk_multiplier *mult,
|
||||
unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
@@ -27,7 +43,7 @@ static unsigned long clk_multiplier_recalc_rate(struct clk_hw *hw,
|
||||
struct clk_multiplier *mult = to_clk_multiplier(hw);
|
||||
unsigned long val;
|
||||
|
||||
val = clk_readl(mult->reg) >> mult->shift;
|
||||
val = clk_mult_readl(mult) >> mult->shift;
|
||||
val &= GENMASK(mult->width - 1, 0);
|
||||
|
||||
if (!val && mult->flags & CLK_MULTIPLIER_ZERO_BYPASS)
|
||||
@@ -118,10 +134,10 @@ static int clk_multiplier_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
else
|
||||
__acquire(mult->lock);
|
||||
|
||||
val = clk_readl(mult->reg);
|
||||
val = clk_mult_readl(mult);
|
||||
val &= ~GENMASK(mult->width + mult->shift - 1, mult->shift);
|
||||
val |= factor << mult->shift;
|
||||
clk_writel(val, mult->reg);
|
||||
clk_mult_writel(mult, val);
|
||||
|
||||
if (mult->lock)
|
||||
spin_unlock_irqrestore(mult->lock, flags);
|
||||
|
||||
@@ -23,6 +23,22 @@
|
||||
* parent - parent is adjustable through clk_set_parent
|
||||
*/
|
||||
|
||||
static inline u32 clk_mux_readl(struct clk_mux *mux)
|
||||
{
|
||||
if (mux->flags & CLK_MUX_BIG_ENDIAN)
|
||||
return ioread32be(mux->reg);
|
||||
|
||||
return readl(mux->reg);
|
||||
}
|
||||
|
||||
static inline void clk_mux_writel(struct clk_mux *mux, u32 val)
|
||||
{
|
||||
if (mux->flags & CLK_MUX_BIG_ENDIAN)
|
||||
iowrite32be(val, mux->reg);
|
||||
else
|
||||
writel(val, mux->reg);
|
||||
}
|
||||
|
||||
int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags,
|
||||
unsigned int val)
|
||||
{
|
||||
@@ -73,7 +89,7 @@ static u8 clk_mux_get_parent(struct clk_hw *hw)
|
||||
struct clk_mux *mux = to_clk_mux(hw);
|
||||
u32 val;
|
||||
|
||||
val = clk_readl(mux->reg) >> mux->shift;
|
||||
val = clk_mux_readl(mux) >> mux->shift;
|
||||
val &= mux->mask;
|
||||
|
||||
return clk_mux_val_to_index(hw, mux->table, mux->flags, val);
|
||||
@@ -94,12 +110,12 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
if (mux->flags & CLK_MUX_HIWORD_MASK) {
|
||||
reg = mux->mask << (mux->shift + 16);
|
||||
} else {
|
||||
reg = clk_readl(mux->reg);
|
||||
reg = clk_mux_readl(mux);
|
||||
reg &= ~(mux->mask << mux->shift);
|
||||
}
|
||||
val = val << mux->shift;
|
||||
reg |= val;
|
||||
clk_writel(reg, mux->reg);
|
||||
clk_mux_writel(mux, reg);
|
||||
|
||||
if (mux->lock)
|
||||
spin_unlock_irqrestore(mux->lock, flags);
|
||||
|
||||
@@ -262,7 +262,7 @@ static unsigned long xgene_clk_pmd_recalc_rate(struct clk_hw *hw,
|
||||
else
|
||||
__acquire(fd->lock);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
val = readl(fd->reg);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
@@ -333,10 +333,10 @@ static int xgene_clk_pmd_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
else
|
||||
__acquire(fd->lock);
|
||||
|
||||
val = clk_readl(fd->reg);
|
||||
val = readl(fd->reg);
|
||||
val &= ~fd->mask;
|
||||
val |= (scale << fd->shift);
|
||||
clk_writel(val, fd->reg);
|
||||
writel(val, fd->reg);
|
||||
|
||||
if (fd->lock)
|
||||
spin_unlock_irqrestore(fd->lock, flags);
|
||||
|
||||
@@ -347,23 +347,18 @@ unsigned int __clk_get_enable_count(struct clk *clk)
|
||||
|
||||
static unsigned long clk_core_get_rate_nolock(struct clk_core *core)
|
||||
{
|
||||
unsigned long ret;
|
||||
if (!core)
|
||||
return 0;
|
||||
|
||||
if (!core) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
if (!core->num_parents || core->parent)
|
||||
return core->rate;
|
||||
|
||||
ret = core->rate;
|
||||
|
||||
if (!core->num_parents)
|
||||
goto out;
|
||||
|
||||
if (!core->parent)
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
/*
|
||||
* Clk must have a parent because num_parents > 0 but the parent isn't
|
||||
* known yet. Best to return 0 as the rate of this clk until we can
|
||||
* properly recalc the rate based on the parent's rate.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long clk_hw_get_rate(const struct clk_hw *hw)
|
||||
@@ -524,9 +519,15 @@ void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate,
|
||||
EXPORT_SYMBOL_GPL(clk_hw_set_rate_range);
|
||||
|
||||
/*
|
||||
* __clk_mux_determine_rate - clk_ops::determine_rate implementation for a mux type clk
|
||||
* @hw: mux type clk to determine rate on
|
||||
* @req: rate request, also used to return preferred parent and frequencies
|
||||
*
|
||||
* Helper for finding best parent to provide a given frequency. This can be used
|
||||
* directly as a determine_rate callback (e.g. for a mux), or from a more
|
||||
* complex clock that may combine a mux with other operations.
|
||||
*
|
||||
* Returns: 0 on success, -EERROR value on error
|
||||
*/
|
||||
int __clk_mux_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
@@ -3318,8 +3319,10 @@ struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw,
|
||||
* @dev: device that is registering this clock
|
||||
* @hw: link to hardware-specific clock data
|
||||
*
|
||||
* clk_register is the primary interface for populating the clock tree with new
|
||||
* clock nodes. It returns a pointer to the newly allocated struct clk which
|
||||
* clk_register is the *deprecated* interface for populating the clock tree with
|
||||
* new clock nodes. Use clk_hw_register() instead.
|
||||
*
|
||||
* Returns: a pointer to the newly allocated struct clk which
|
||||
* cannot be dereferenced by driver code but may be used in conjunction with the
|
||||
* rest of the clock API. In the event of an error clk_register will return an
|
||||
* error code; drivers must test for an error code after calling clk_register.
|
||||
@@ -3575,9 +3578,10 @@ static void devm_clk_hw_release(struct device *dev, void *res)
|
||||
* @dev: device that is registering this clock
|
||||
* @hw: link to hardware-specific clock data
|
||||
*
|
||||
* Managed clk_register(). Clocks returned from this function are
|
||||
* automatically clk_unregister()ed on driver detach. See clk_register() for
|
||||
* more information.
|
||||
* Managed clk_register(). This function is *deprecated*, use devm_clk_hw_register() instead.
|
||||
*
|
||||
* Clocks returned from this function are automatically clk_unregister()ed on
|
||||
* driver detach. See clk_register() for more information.
|
||||
*/
|
||||
struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw)
|
||||
{
|
||||
@@ -3895,6 +3899,8 @@ EXPORT_SYMBOL_GPL(of_clk_hw_onecell_get);
|
||||
* @np: Device node pointer associated with clock provider
|
||||
* @clk_src_get: callback for decoding clock
|
||||
* @data: context pointer for @clk_src_get callback.
|
||||
*
|
||||
* This function is *deprecated*. Use of_clk_add_hw_provider() instead.
|
||||
*/
|
||||
int of_clk_add_provider(struct device_node *np,
|
||||
struct clk *(*clk_src_get)(struct of_phandle_args *clkspec,
|
||||
|
||||
@@ -75,10 +75,10 @@ static int hisi_clk_set_phase(struct clk_hw *hw, int degrees)
|
||||
|
||||
spin_lock_irqsave(phase->lock, flags);
|
||||
|
||||
val = clk_readl(phase->reg);
|
||||
val = readl(phase->reg);
|
||||
val &= ~phase->mask;
|
||||
val |= regval << phase->shift;
|
||||
clk_writel(val, phase->reg);
|
||||
writel(val, phase->reg);
|
||||
|
||||
spin_unlock_irqrestore(phase->lock, flags);
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ static unsigned long clk_divider_gate_recalc_rate_ro(struct clk_hw *hw,
|
||||
struct clk_divider *div = to_clk_divider(hw);
|
||||
unsigned int val;
|
||||
|
||||
val = clk_readl(div->reg) >> div->shift;
|
||||
val = readl(div->reg) >> div->shift;
|
||||
val &= clk_div_mask(div->width);
|
||||
if (!val)
|
||||
return 0;
|
||||
@@ -51,7 +51,7 @@ static unsigned long clk_divider_gate_recalc_rate(struct clk_hw *hw,
|
||||
if (!clk_hw_is_enabled(hw)) {
|
||||
val = div_gate->cached_val;
|
||||
} else {
|
||||
val = clk_readl(div->reg) >> div->shift;
|
||||
val = readl(div->reg) >> div->shift;
|
||||
val &= clk_div_mask(div->width);
|
||||
}
|
||||
|
||||
@@ -87,10 +87,10 @@ static int clk_divider_gate_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
spin_lock_irqsave(div->lock, flags);
|
||||
|
||||
if (clk_hw_is_enabled(hw)) {
|
||||
val = clk_readl(div->reg);
|
||||
val = readl(div->reg);
|
||||
val &= ~(clk_div_mask(div->width) << div->shift);
|
||||
val |= (u32)value << div->shift;
|
||||
clk_writel(val, div->reg);
|
||||
writel(val, div->reg);
|
||||
} else {
|
||||
div_gate->cached_val = value;
|
||||
}
|
||||
@@ -114,9 +114,9 @@ static int clk_divider_enable(struct clk_hw *hw)
|
||||
|
||||
spin_lock_irqsave(div->lock, flags);
|
||||
/* restore div val */
|
||||
val = clk_readl(div->reg);
|
||||
val = readl(div->reg);
|
||||
val |= div_gate->cached_val << div->shift;
|
||||
clk_writel(val, div->reg);
|
||||
writel(val, div->reg);
|
||||
|
||||
spin_unlock_irqrestore(div->lock, flags);
|
||||
|
||||
@@ -133,10 +133,10 @@ static void clk_divider_disable(struct clk_hw *hw)
|
||||
spin_lock_irqsave(div->lock, flags);
|
||||
|
||||
/* store the current div val */
|
||||
val = clk_readl(div->reg) >> div->shift;
|
||||
val = readl(div->reg) >> div->shift;
|
||||
val &= clk_div_mask(div->width);
|
||||
div_gate->cached_val = val;
|
||||
clk_writel(0, div->reg);
|
||||
writel(0, div->reg);
|
||||
|
||||
spin_unlock_irqrestore(div->lock, flags);
|
||||
}
|
||||
@@ -146,7 +146,7 @@ static int clk_divider_is_enabled(struct clk_hw *hw)
|
||||
struct clk_divider *div = to_clk_divider(hw);
|
||||
u32 val;
|
||||
|
||||
val = clk_readl(div->reg) >> div->shift;
|
||||
val = readl(div->reg) >> div->shift;
|
||||
val &= clk_div_mask(div->width);
|
||||
|
||||
return val ? 1 : 0;
|
||||
@@ -206,7 +206,7 @@ struct clk_hw *imx_clk_divider_gate(const char *name, const char *parent_name,
|
||||
div_gate->divider.hw.init = &init;
|
||||
div_gate->divider.flags = CLK_DIVIDER_ONE_BASED | clk_divider_flags;
|
||||
/* cache gate status */
|
||||
val = clk_readl(reg) >> shift;
|
||||
val = readl(reg) >> shift;
|
||||
val &= clk_div_mask(width);
|
||||
div_gate->cached_val = val;
|
||||
|
||||
|
||||
@@ -348,7 +348,7 @@ static unsigned long clk_sccg_pll_recalc_rate(struct clk_hw *hw,
|
||||
|
||||
temp64 = parent_rate;
|
||||
|
||||
val = clk_readl(pll->base + PLL_CFG0);
|
||||
val = readl(pll->base + PLL_CFG0);
|
||||
if (val & SSCG_PLL_BYPASS2_MASK) {
|
||||
temp64 = parent_rate;
|
||||
} else if (val & SSCG_PLL_BYPASS1_MASK) {
|
||||
@@ -371,10 +371,10 @@ static int clk_sccg_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
u32 val;
|
||||
|
||||
/* set bypass here too since the parent might be the same */
|
||||
val = clk_readl(pll->base + PLL_CFG0);
|
||||
val = readl(pll->base + PLL_CFG0);
|
||||
val &= ~SSCG_PLL_BYPASS_MASK;
|
||||
val |= FIELD_PREP(SSCG_PLL_BYPASS_MASK, setup->bypass);
|
||||
clk_writel(val, pll->base + PLL_CFG0);
|
||||
writel(val, pll->base + PLL_CFG0);
|
||||
|
||||
val = readl_relaxed(pll->base + PLL_CFG2);
|
||||
val &= ~(PLL_DIVF1_MASK | PLL_DIVF2_MASK);
|
||||
@@ -395,7 +395,7 @@ static u8 clk_sccg_pll_get_parent(struct clk_hw *hw)
|
||||
u32 val;
|
||||
u8 ret = pll->parent;
|
||||
|
||||
val = clk_readl(pll->base + PLL_CFG0);
|
||||
val = readl(pll->base + PLL_CFG0);
|
||||
if (val & SSCG_PLL_BYPASS2_MASK)
|
||||
ret = pll->bypass2;
|
||||
else if (val & SSCG_PLL_BYPASS1_MASK)
|
||||
@@ -408,10 +408,10 @@ static int clk_sccg_pll_set_parent(struct clk_hw *hw, u8 index)
|
||||
struct clk_sccg_pll *pll = to_clk_sccg_pll(hw);
|
||||
u32 val;
|
||||
|
||||
val = clk_readl(pll->base + PLL_CFG0);
|
||||
val = readl(pll->base + PLL_CFG0);
|
||||
val &= ~SSCG_PLL_BYPASS_MASK;
|
||||
val |= FIELD_PREP(SSCG_PLL_BYPASS_MASK, pll->setup.bypass);
|
||||
clk_writel(val, pll->base + PLL_CFG0);
|
||||
writel(val, pll->base + PLL_CFG0);
|
||||
|
||||
return clk_sccg_pll_wait_lock(pll);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,8 @@
|
||||
#define AUDIO_MCLK_D_CTRL 0x010
|
||||
#define AUDIO_MCLK_E_CTRL 0x014
|
||||
#define AUDIO_MCLK_F_CTRL 0x018
|
||||
#define AUDIO_MST_PAD_CTRL0 0x01c
|
||||
#define AUDIO_MST_PAD_CTRL1 0x020
|
||||
#define AUDIO_MST_A_SCLK_CTRL0 0x040
|
||||
#define AUDIO_MST_A_SCLK_CTRL1 0x044
|
||||
#define AUDIO_MST_B_SCLK_CTRL0 0x048
|
||||
@@ -45,21 +47,13 @@
|
||||
#define AUDIO_CLK_LOCKER_CTRL 0x0A8
|
||||
#define AUDIO_CLK_PDMIN_CTRL0 0x0AC
|
||||
#define AUDIO_CLK_PDMIN_CTRL1 0x0B0
|
||||
#define AUDIO_CLK_SPDIFOUT_B_CTRL 0x0B4
|
||||
|
||||
/*
|
||||
* CLKID index values
|
||||
* These indices are entirely contrived and do not map onto the hardware.
|
||||
*/
|
||||
|
||||
#define AUD_CLKID_PCLK 0
|
||||
#define AUD_CLKID_MST0 1
|
||||
#define AUD_CLKID_MST1 2
|
||||
#define AUD_CLKID_MST2 3
|
||||
#define AUD_CLKID_MST3 4
|
||||
#define AUD_CLKID_MST4 5
|
||||
#define AUD_CLKID_MST5 6
|
||||
#define AUD_CLKID_MST6 7
|
||||
#define AUD_CLKID_MST7 8
|
||||
#define AUD_CLKID_MST_A_MCLK_SEL 59
|
||||
#define AUD_CLKID_MST_B_MCLK_SEL 60
|
||||
#define AUD_CLKID_MST_C_MCLK_SEL 61
|
||||
@@ -118,10 +112,12 @@
|
||||
#define AUD_CLKID_TDMOUT_A_SCLK_POST_EN 148
|
||||
#define AUD_CLKID_TDMOUT_B_SCLK_POST_EN 149
|
||||
#define AUD_CLKID_TDMOUT_C_SCLK_POST_EN 150
|
||||
#define AUD_CLKID_SPDIFOUT_B_CLK_SEL 153
|
||||
#define AUD_CLKID_SPDIFOUT_B_CLK_DIV 154
|
||||
|
||||
/* include the CLKIDs which are part of the DT bindings */
|
||||
#include <dt-bindings/clock/axg-audio-clkc.h>
|
||||
|
||||
#define NR_CLKS 151
|
||||
#define NR_CLKS 163
|
||||
|
||||
#endif /*__AXG_AUDIO_CLKC_H */
|
||||
|
||||
@@ -303,6 +303,16 @@ static int meson_clk_pll_is_enabled(struct clk_hw *hw)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int meson_clk_pcie_pll_enable(struct clk_hw *hw)
|
||||
{
|
||||
meson_clk_pll_init(hw);
|
||||
|
||||
if (meson_clk_pll_wait_lock(hw))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_clk_pll_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *clk = to_clk_regmap(hw);
|
||||
@@ -387,6 +397,22 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The Meson G12A PCIE PLL is fined tuned to deliver a very precise
|
||||
* 100MHz reference clock for the PCIe Analog PHY, and thus requires
|
||||
* a strict register sequence to enable the PLL.
|
||||
* To simplify, re-use the _init() op to enable the PLL and keep
|
||||
* the other ops except set_rate since the rate is fixed.
|
||||
*/
|
||||
const struct clk_ops meson_clk_pcie_pll_ops = {
|
||||
.recalc_rate = meson_clk_pll_recalc_rate,
|
||||
.round_rate = meson_clk_pll_round_rate,
|
||||
.is_enabled = meson_clk_pll_is_enabled,
|
||||
.enable = meson_clk_pcie_pll_enable,
|
||||
.disable = meson_clk_pll_disable
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(meson_clk_pcie_pll_ops);
|
||||
|
||||
const struct clk_ops meson_clk_pll_ops = {
|
||||
.init = meson_clk_pll_init,
|
||||
.recalc_rate = meson_clk_pll_recalc_rate,
|
||||
|
||||
@@ -45,5 +45,6 @@ struct meson_clk_pll_data {
|
||||
|
||||
extern const struct clk_ops meson_clk_pll_ro_ops;
|
||||
extern const struct clk_ops meson_clk_pll_ops;
|
||||
extern const struct clk_ops meson_clk_pcie_pll_ops;
|
||||
|
||||
#endif /* __MESON_CLK_PLL_H */
|
||||
|
||||
@@ -16,9 +16,7 @@
|
||||
* to expose, such as the internal muxes and dividers of composite clocks,
|
||||
* will remain defined here.
|
||||
*/
|
||||
#define CLKID_AO_SAR_ADC_SEL 16
|
||||
#define CLKID_AO_SAR_ADC_DIV 17
|
||||
#define CLKID_AO_CTS_OSCIN 19
|
||||
#define CLKID_AO_32K_PRE 20
|
||||
#define CLKID_AO_32K_DIV 21
|
||||
#define CLKID_AO_32K_SEL 22
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -50,6 +50,7 @@
|
||||
#define HHI_GCLK_MPEG2 0x148
|
||||
#define HHI_GCLK_OTHER 0x150
|
||||
#define HHI_GCLK_OTHER2 0x154
|
||||
#define HHI_SYS_CPU_CLK_CNTL1 0x15c
|
||||
#define HHI_VID_CLK_DIV 0x164
|
||||
#define HHI_MPEG_CLK_CNTL 0x174
|
||||
#define HHI_AUD_CLK_CNTL 0x178
|
||||
@@ -166,8 +167,36 @@
|
||||
#define CLKID_MALI_0_DIV 170
|
||||
#define CLKID_MALI_1_DIV 173
|
||||
#define CLKID_MPLL_5OM_DIV 176
|
||||
#define CLKID_SYS_PLL_DIV16_EN 178
|
||||
#define CLKID_SYS_PLL_DIV16 179
|
||||
#define CLKID_CPU_CLK_DYN0_SEL 180
|
||||
#define CLKID_CPU_CLK_DYN0_DIV 181
|
||||
#define CLKID_CPU_CLK_DYN0 182
|
||||
#define CLKID_CPU_CLK_DYN1_SEL 183
|
||||
#define CLKID_CPU_CLK_DYN1_DIV 184
|
||||
#define CLKID_CPU_CLK_DYN1 185
|
||||
#define CLKID_CPU_CLK_DYN 186
|
||||
#define CLKID_CPU_CLK_DIV16_EN 188
|
||||
#define CLKID_CPU_CLK_DIV16 189
|
||||
#define CLKID_CPU_CLK_APB_DIV 190
|
||||
#define CLKID_CPU_CLK_APB 191
|
||||
#define CLKID_CPU_CLK_ATB_DIV 192
|
||||
#define CLKID_CPU_CLK_ATB 193
|
||||
#define CLKID_CPU_CLK_AXI_DIV 194
|
||||
#define CLKID_CPU_CLK_AXI 195
|
||||
#define CLKID_CPU_CLK_TRACE_DIV 196
|
||||
#define CLKID_CPU_CLK_TRACE 197
|
||||
#define CLKID_PCIE_PLL_DCO 198
|
||||
#define CLKID_PCIE_PLL_DCO_DIV2 199
|
||||
#define CLKID_PCIE_PLL_OD 200
|
||||
#define CLKID_VDEC_1_SEL 202
|
||||
#define CLKID_VDEC_1_DIV 203
|
||||
#define CLKID_VDEC_HEVC_SEL 205
|
||||
#define CLKID_VDEC_HEVC_DIV 206
|
||||
#define CLKID_VDEC_HEVCF_SEL 208
|
||||
#define CLKID_VDEC_HEVCF_DIV 209
|
||||
|
||||
#define NR_CLKS 178
|
||||
#define NR_CLKS 211
|
||||
|
||||
/* include the CLKIDs that have been made part of the DT binding */
|
||||
#include <dt-bindings/clock/g12a-clkc.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user