mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-20 17:44:33 +08:00
c2c9c5661a
The EMAC clocks on Stratix10/Agilex/N5X have an additional bypass that
was not being accounted for. The bypass selects between
emaca_clk/emacb_clk and boot_clk.
Because the bypass register offset is different between Stratix10 and
Agilex/N5X, it's best to create a new function to calculate the bypass.
Fixes: 80c6b7a089
("clk: socfpga: agilex: add clock driver for the Agilex platform")
Cc: stable@vger.kernel.org
Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
Link: https://lore.kernel.org/r/20210611025201.118799-3-dinguyen@kernel.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2017, Intel Corporation
|
|
*/
|
|
|
|
#ifndef __STRATIX10_CLK_H
|
|
#define __STRATIX10_CLK_H
|
|
|
|
struct stratix10_clock_data {
|
|
struct clk_hw_onecell_data clk_data;
|
|
void __iomem *base;
|
|
};
|
|
|
|
struct stratix10_pll_clock {
|
|
unsigned int id;
|
|
const char *name;
|
|
const struct clk_parent_data *parent_data;
|
|
u8 num_parents;
|
|
unsigned long flags;
|
|
unsigned long offset;
|
|
};
|
|
|
|
struct stratix10_perip_c_clock {
|
|
unsigned int id;
|
|
const char *name;
|
|
const char *parent_name;
|
|
const struct clk_parent_data *parent_data;
|
|
u8 num_parents;
|
|
unsigned long flags;
|
|
unsigned long offset;
|
|
};
|
|
|
|
struct n5x_perip_c_clock {
|
|
unsigned int id;
|
|
const char *name;
|
|
const char *parent_name;
|
|
const char *const *parent_names;
|
|
u8 num_parents;
|
|
unsigned long flags;
|
|
unsigned long offset;
|
|
unsigned long shift;
|
|
};
|
|
|
|
struct stratix10_perip_cnt_clock {
|
|
unsigned int id;
|
|
const char *name;
|
|
const char *parent_name;
|
|
const struct clk_parent_data *parent_data;
|
|
u8 num_parents;
|
|
unsigned long flags;
|
|
unsigned long offset;
|
|
u8 fixed_divider;
|
|
unsigned long bypass_reg;
|
|
unsigned long bypass_shift;
|
|
};
|
|
|
|
struct stratix10_gate_clock {
|
|
unsigned int id;
|
|
const char *name;
|
|
const char *parent_name;
|
|
const struct clk_parent_data *parent_data;
|
|
u8 num_parents;
|
|
unsigned long flags;
|
|
unsigned long gate_reg;
|
|
u8 gate_idx;
|
|
unsigned long div_reg;
|
|
u8 div_offset;
|
|
u8 div_width;
|
|
unsigned long bypass_reg;
|
|
u8 bypass_shift;
|
|
u8 fixed_div;
|
|
};
|
|
|
|
struct clk_hw *s10_register_pll(const struct stratix10_pll_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *agilex_register_pll(const struct stratix10_pll_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *n5x_register_pll(const struct stratix10_pll_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *s10_register_periph(const struct stratix10_perip_c_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *n5x_register_periph(const struct n5x_perip_c_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *s10_register_cnt_periph(const struct stratix10_perip_cnt_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *s10_register_gate(const struct stratix10_gate_clock *clks,
|
|
void __iomem *reg);
|
|
struct clk_hw *agilex_register_gate(const struct stratix10_gate_clock *clks,
|
|
void __iomem *reg);
|
|
#endif /* __STRATIX10_CLK_H */
|