mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 17:27:11 -04:00
Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
Pull clk fixes from Stephen Boyd: "Second collection of clk fixes for the next release. This one includes a fix for PM on TI SoCs with sysc devices and fixes a bunch of clks that are stuck always enabled on Qualcomm SDM845 SoCs. Allwinner SoCs get the usual set of fixes too, mostly correcting drivers to have the right bits that match the hardware. There's also a Samsung and Tegra fix in here to mark a clk critical and avoid a double free. And finally there's a fix for critical clks that silences a big warning splat about trying to enable a clk that couldn't even be prepared" * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: clk: ti: dra7-atl: Remove pm_runtime_irq_safe() clk: qcom: gcc-sdm845: Add missing flag to votable GDSCs clk: sunxi-ng: h6-r: Fix AR100/R_APB2 parent order clk: sunxi-ng: h6-r: Simplify R_APB1 clock definition clk: sunxi-ng: sun8i-r: Fix divider on APB0 clock clk: Don't try to enable critical clocks if prepare failed clk: tegra: Fix double-free in tegra_clk_init() clk: samsung: exynos5420: Keep top G3D clocks enabled clk: sunxi-ng: r40: Allow setting parent rate for external clock outputs clk: sunxi-ng: v3s: Fix incorrect number of hw_clks.
This commit is contained in:
@@ -3426,11 +3426,17 @@ static int __clk_core_init(struct clk_core *core)
|
||||
if (core->flags & CLK_IS_CRITICAL) {
|
||||
unsigned long flags;
|
||||
|
||||
clk_core_prepare(core);
|
||||
ret = clk_core_prepare(core);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
flags = clk_enable_lock();
|
||||
clk_core_enable(core);
|
||||
ret = clk_core_enable(core);
|
||||
clk_enable_unlock(flags);
|
||||
if (ret) {
|
||||
clk_core_unprepare(core);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
clk_core_reparent_orphans_nolock();
|
||||
|
||||
@@ -3255,6 +3255,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = {
|
||||
.name = "hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = {
|
||||
@@ -3263,6 +3264,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = {
|
||||
.name = "hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = {
|
||||
@@ -3271,6 +3273,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = {
|
||||
.name = "hlos1_vote_aggre_noc_mmu_tbu1_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = {
|
||||
@@ -3279,6 +3282,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = {
|
||||
.name = "hlos1_vote_aggre_noc_mmu_tbu2_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
|
||||
@@ -3287,6 +3291,7 @@ static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
|
||||
.name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = {
|
||||
@@ -3295,6 +3300,7 @@ static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = {
|
||||
.name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
|
||||
@@ -3303,6 +3309,7 @@ static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
|
||||
.name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gcc_sdm845_clocks[] = {
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include "clk.h"
|
||||
#include "clk-cpu.h"
|
||||
@@ -1646,6 +1647,13 @@ static void __init exynos5x_clk_init(struct device_node *np,
|
||||
exynos5x_subcmus);
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep top part of G3D clock path enabled permanently to ensure
|
||||
* that the internal busses get their clock regardless of the
|
||||
* main G3D clock enablement status.
|
||||
*/
|
||||
clk_prepare_enable(__clk_lookup("mout_sw_aclk_g3d"));
|
||||
|
||||
samsung_clk_of_add_provider(np, ctx);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
*/
|
||||
|
||||
static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k",
|
||||
"pll-periph0", "iosc" };
|
||||
"iosc", "pll-periph0" };
|
||||
static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = {
|
||||
{ .index = 2, .shift = 0, .width = 5 },
|
||||
{ .index = 3, .shift = 0, .width = 5 },
|
||||
};
|
||||
|
||||
static struct ccu_div ar100_clk = {
|
||||
@@ -51,17 +51,7 @@ static struct ccu_div ar100_clk = {
|
||||
|
||||
static CLK_FIXED_FACTOR_HW(r_ahb_clk, "r-ahb", &ar100_clk.common.hw, 1, 1, 0);
|
||||
|
||||
static struct ccu_div r_apb1_clk = {
|
||||
.div = _SUNXI_CCU_DIV(0, 2),
|
||||
|
||||
.common = {
|
||||
.reg = 0x00c,
|
||||
.hw.init = CLK_HW_INIT("r-apb1",
|
||||
"r-ahb",
|
||||
&ccu_div_ops,
|
||||
0),
|
||||
},
|
||||
};
|
||||
static SUNXI_CCU_M(r_apb1_clk, "r-apb1", "r-ahb", 0x00c, 0, 2, 0);
|
||||
|
||||
static struct ccu_div r_apb2_clk = {
|
||||
.div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO),
|
||||
|
||||
@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = {
|
||||
|
||||
static CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0);
|
||||
|
||||
static struct ccu_div apb0_clk = {
|
||||
.div = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO),
|
||||
|
||||
.common = {
|
||||
.reg = 0x0c,
|
||||
.hw.init = CLK_HW_INIT_HW("apb0",
|
||||
&ahb0_clk.hw,
|
||||
&ccu_div_ops,
|
||||
0),
|
||||
},
|
||||
};
|
||||
|
||||
static SUNXI_CCU_M(a83t_apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0);
|
||||
static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0);
|
||||
|
||||
/*
|
||||
* Define the parent as an array that can be reused to save space
|
||||
@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = {
|
||||
|
||||
static struct ccu_common *sun8i_a83t_r_ccu_clks[] = {
|
||||
&ar100_clk.common,
|
||||
&a83t_apb0_clk.common,
|
||||
&apb0_clk.common,
|
||||
&apb0_pio_clk.common,
|
||||
&apb0_ir_clk.common,
|
||||
&apb0_timer_clk.common,
|
||||
@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = {
|
||||
.hws = {
|
||||
[CLK_AR100] = &ar100_clk.common.hw,
|
||||
[CLK_AHB0] = &ahb0_clk.hw,
|
||||
[CLK_APB0] = &a83t_apb0_clk.common.hw,
|
||||
[CLK_APB0] = &apb0_clk.common.hw,
|
||||
[CLK_APB0_PIO] = &apb0_pio_clk.common.hw,
|
||||
[CLK_APB0_IR] = &apb0_ir_clk.common.hw,
|
||||
[CLK_APB0_TIMER] = &apb0_timer_clk.common.hw,
|
||||
@@ -282,9 +270,6 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
|
||||
|
||||
static void __init sun8i_a83t_r_ccu_setup(struct device_node *node)
|
||||
{
|
||||
/* Fix apb0 bus gate parents here */
|
||||
apb0_gate_parent[0] = &a83t_apb0_clk.common.hw;
|
||||
|
||||
sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc);
|
||||
}
|
||||
CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu",
|
||||
|
||||
@@ -761,7 +761,8 @@ static struct ccu_mp outa_clk = {
|
||||
.reg = 0x1f0,
|
||||
.features = CCU_FEATURE_FIXED_PREDIV,
|
||||
.hw.init = CLK_HW_INIT_PARENTS("outa", out_parents,
|
||||
&ccu_mp_ops, 0),
|
||||
&ccu_mp_ops,
|
||||
CLK_SET_RATE_PARENT),
|
||||
}
|
||||
};
|
||||
|
||||
@@ -779,7 +780,8 @@ static struct ccu_mp outb_clk = {
|
||||
.reg = 0x1f4,
|
||||
.features = CCU_FEATURE_FIXED_PREDIV,
|
||||
.hw.init = CLK_HW_INIT_PARENTS("outb", out_parents,
|
||||
&ccu_mp_ops, 0),
|
||||
&ccu_mp_ops,
|
||||
CLK_SET_RATE_PARENT),
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = {
|
||||
[CLK_MBUS] = &mbus_clk.common.hw,
|
||||
[CLK_MIPI_CSI] = &mipi_csi_clk.common.hw,
|
||||
},
|
||||
.num = CLK_NUMBER,
|
||||
.num = CLK_PLL_DDR1 + 1,
|
||||
};
|
||||
|
||||
static struct clk_hw_onecell_data sun8i_v3_hw_clks = {
|
||||
@@ -700,7 +700,7 @@ static struct clk_hw_onecell_data sun8i_v3_hw_clks = {
|
||||
[CLK_MBUS] = &mbus_clk.common.hw,
|
||||
[CLK_MIPI_CSI] = &mipi_csi_clk.common.hw,
|
||||
},
|
||||
.num = CLK_NUMBER,
|
||||
.num = CLK_I2S0 + 1,
|
||||
};
|
||||
|
||||
static struct ccu_reset_map sun8i_v3s_ccu_resets[] = {
|
||||
|
||||
@@ -51,6 +51,4 @@
|
||||
|
||||
#define CLK_PLL_DDR1 74
|
||||
|
||||
#define CLK_NUMBER (CLK_I2S0 + 1)
|
||||
|
||||
#endif /* _CCU_SUN8I_H3_H_ */
|
||||
|
||||
@@ -231,8 +231,10 @@ struct clk ** __init tegra_clk_init(void __iomem *regs, int num, int banks)
|
||||
periph_banks = banks;
|
||||
|
||||
clks = kcalloc(num, sizeof(struct clk *), GFP_KERNEL);
|
||||
if (!clks)
|
||||
if (!clks) {
|
||||
kfree(periph_clk_enb_refcnt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
clk_num = num;
|
||||
|
||||
|
||||
@@ -233,7 +233,6 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev)
|
||||
cinfo->iobase = of_iomap(node, 0);
|
||||
cinfo->dev = &pdev->dev;
|
||||
pm_runtime_enable(cinfo->dev);
|
||||
pm_runtime_irq_safe(cinfo->dev);
|
||||
|
||||
pm_runtime_get_sync(cinfo->dev);
|
||||
atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX);
|
||||
|
||||
Reference in New Issue
Block a user