Commit ef64753c authored by Linus Torvalds's avatar Linus Torvalds

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.
parents f4353c3e a0af2742
...@@ -3426,11 +3426,17 @@ static int __clk_core_init(struct clk_core *core) ...@@ -3426,11 +3426,17 @@ static int __clk_core_init(struct clk_core *core)
if (core->flags & CLK_IS_CRITICAL) { if (core->flags & CLK_IS_CRITICAL) {
unsigned long flags; unsigned long flags;
clk_core_prepare(core); ret = clk_core_prepare(core);
if (ret)
goto out;
flags = clk_enable_lock(); flags = clk_enable_lock();
clk_core_enable(core); ret = clk_core_enable(core);
clk_enable_unlock(flags); clk_enable_unlock(flags);
if (ret) {
clk_core_unprepare(core);
goto out;
}
} }
clk_core_reparent_orphans_nolock(); clk_core_reparent_orphans_nolock();
......
...@@ -3255,6 +3255,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = { ...@@ -3255,6 +3255,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = {
.name = "hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc", .name = "hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = { 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 = { ...@@ -3263,6 +3264,7 @@ static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = {
.name = "hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc", .name = "hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = { static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = {
...@@ -3271,6 +3273,7 @@ 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", .name = "hlos1_vote_aggre_noc_mmu_tbu1_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = { static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = {
...@@ -3279,6 +3282,7 @@ 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", .name = "hlos1_vote_aggre_noc_mmu_tbu2_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
...@@ -3287,6 +3291,7 @@ 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", .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = { static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = {
...@@ -3295,6 +3300,7 @@ 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", .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = { static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
...@@ -3303,6 +3309,7 @@ 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", .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc",
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = VOTABLE,
}; };
static struct clk_regmap *gcc_sdm845_clocks[] = { static struct clk_regmap *gcc_sdm845_clocks[] = {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/clk.h>
#include "clk.h" #include "clk.h"
#include "clk-cpu.h" #include "clk-cpu.h"
...@@ -1646,6 +1647,13 @@ static void __init exynos5x_clk_init(struct device_node *np, ...@@ -1646,6 +1647,13 @@ static void __init exynos5x_clk_init(struct device_node *np,
exynos5x_subcmus); 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); samsung_clk_of_add_provider(np, ctx);
} }
......
...@@ -23,9 +23,9 @@ ...@@ -23,9 +23,9 @@
*/ */
static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", 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[] = { 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 = { static struct ccu_div ar100_clk = {
...@@ -51,17 +51,7 @@ 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 CLK_FIXED_FACTOR_HW(r_ahb_clk, "r-ahb", &ar100_clk.common.hw, 1, 1, 0);
static struct ccu_div r_apb1_clk = { static SUNXI_CCU_M(r_apb1_clk, "r-apb1", "r-ahb", 0x00c, 0, 2, 0);
.div = _SUNXI_CCU_DIV(0, 2),
.common = {
.reg = 0x00c,
.hw.init = CLK_HW_INIT("r-apb1",
"r-ahb",
&ccu_div_ops,
0),
},
};
static struct ccu_div r_apb2_clk = { static struct ccu_div r_apb2_clk = {
.div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO), .div = _SUNXI_CCU_DIV_FLAGS(8, 2, CLK_DIVIDER_POWER_OF_TWO),
......
...@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = { ...@@ -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 CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0);
static struct ccu_div apb0_clk = { static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0);
.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);
/* /*
* Define the parent as an array that can be reused to save space * Define the parent as an array that can be reused to save space
...@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = { ...@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = {
static struct ccu_common *sun8i_a83t_r_ccu_clks[] = { static struct ccu_common *sun8i_a83t_r_ccu_clks[] = {
&ar100_clk.common, &ar100_clk.common,
&a83t_apb0_clk.common, &apb0_clk.common,
&apb0_pio_clk.common, &apb0_pio_clk.common,
&apb0_ir_clk.common, &apb0_ir_clk.common,
&apb0_timer_clk.common, &apb0_timer_clk.common,
...@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = { ...@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = {
.hws = { .hws = {
[CLK_AR100] = &ar100_clk.common.hw, [CLK_AR100] = &ar100_clk.common.hw,
[CLK_AHB0] = &ahb0_clk.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_PIO] = &apb0_pio_clk.common.hw,
[CLK_APB0_IR] = &apb0_ir_clk.common.hw, [CLK_APB0_IR] = &apb0_ir_clk.common.hw,
[CLK_APB0_TIMER] = &apb0_timer_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, ...@@ -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) 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); sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc);
} }
CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu", CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu",
......
...@@ -761,7 +761,8 @@ static struct ccu_mp outa_clk = { ...@@ -761,7 +761,8 @@ static struct ccu_mp outa_clk = {
.reg = 0x1f0, .reg = 0x1f0,
.features = CCU_FEATURE_FIXED_PREDIV, .features = CCU_FEATURE_FIXED_PREDIV,
.hw.init = CLK_HW_INIT_PARENTS("outa", out_parents, .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 = { ...@@ -779,7 +780,8 @@ static struct ccu_mp outb_clk = {
.reg = 0x1f4, .reg = 0x1f4,
.features = CCU_FEATURE_FIXED_PREDIV, .features = CCU_FEATURE_FIXED_PREDIV,
.hw.init = CLK_HW_INIT_PARENTS("outb", out_parents, .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 = { ...@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = {
[CLK_MBUS] = &mbus_clk.common.hw, [CLK_MBUS] = &mbus_clk.common.hw,
[CLK_MIPI_CSI] = &mipi_csi_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 = { static struct clk_hw_onecell_data sun8i_v3_hw_clks = {
...@@ -700,7 +700,7 @@ 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_MBUS] = &mbus_clk.common.hw,
[CLK_MIPI_CSI] = &mipi_csi_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[] = { static struct ccu_reset_map sun8i_v3s_ccu_resets[] = {
......
...@@ -51,6 +51,4 @@ ...@@ -51,6 +51,4 @@
#define CLK_PLL_DDR1 74 #define CLK_PLL_DDR1 74
#define CLK_NUMBER (CLK_I2S0 + 1)
#endif /* _CCU_SUN8I_H3_H_ */ #endif /* _CCU_SUN8I_H3_H_ */
...@@ -231,8 +231,10 @@ struct clk ** __init tegra_clk_init(void __iomem *regs, int num, int banks) ...@@ -231,8 +231,10 @@ struct clk ** __init tegra_clk_init(void __iomem *regs, int num, int banks)
periph_banks = banks; periph_banks = banks;
clks = kcalloc(num, sizeof(struct clk *), GFP_KERNEL); clks = kcalloc(num, sizeof(struct clk *), GFP_KERNEL);
if (!clks) if (!clks) {
kfree(periph_clk_enb_refcnt); kfree(periph_clk_enb_refcnt);
return NULL;
}
clk_num = num; clk_num = num;
......
...@@ -233,7 +233,6 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) ...@@ -233,7 +233,6 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev)
cinfo->iobase = of_iomap(node, 0); cinfo->iobase = of_iomap(node, 0);
cinfo->dev = &pdev->dev; cinfo->dev = &pdev->dev;
pm_runtime_enable(cinfo->dev); pm_runtime_enable(cinfo->dev);
pm_runtime_irq_safe(cinfo->dev);
pm_runtime_get_sync(cinfo->dev); pm_runtime_get_sync(cinfo->dev);
atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX); atl_write(cinfo, DRA7_ATL_PCLKMUX_REG(0), DRA7_ATL_PCLKMUX);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment