A handful of Sunxi and Rockchip clk driver fixes and a core framework
one where we need to copy a string because we can't guarantee it isn't freed sometime later. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJY1cCaAAoJEK0CiJfG5JUlXxMQALaln2IpE+TnXxYtbxY474mg FUlgLoMO4Oolpn30ilcMrOlMh0dFijI+Qp/t3Ly6BnyYs3IXec684ZRT10LG6j1F 55Uqy/emFaeiCQqoic2ZO7EmP1EUIRinrEM6T71pjuuomnsgf/35xvtdG2umvZ1m Cd3yDEP+LLgbprf1teki+IVuGRUvPfm8LXfNNf60Lu/fqAm3mTHxJbR6OsTbBeI8 RGJcZXreTUnIUPyo9ejtL9tnCnFzv/1b5MgZcpX0FDywH6roMVEAWmFWQmiPuFcs EAyc8DwhRU8PYUJel0Q6W1LReAqnGdwcvQc7Y7KmtAd8f38cobeshR/xNKhsqLbA Le3BIzqldaDnUtKz+AQESodzUMnhW7Uuq2GRrg8N9jKMbWKMz2c+ImVLv4iE7YKn HUvw7P/ozfSfFkYGw3K7P1pXwWyibbUeU4ybBHSswJ2dS7sxU4EGHiB1U6XsstGj lFwTnRGGmZhxSlF+wyZDn8xHYnl/VYLRXGTqZgkrcHqDtvMDwf4358GCYT6FVp4r uZYtGuUiktYqnZA73rJBuKDrcHC6MSoG0mQMyOMXQaXLMpXc5auVaK+y6b+sIQRM E9JDO76ViAghkZ9ECKDmKZMpfLSsrK4ZTtPBAvnR65HjcdMYkMXj9UiIMaMMefqO YvBNtYg5z1eoWCJyh0nV =8q6a -----END PGP SIGNATURE----- Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux Pull clk fixes from Stephen Boyd: "A handful of Sunxi and Rockchip clk driver fixes and a core framework one where we need to copy a string because we can't guarantee it isn't freed sometime later" * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: clk: sunxi-ng: fix recalc_rate formula of NKMP clocks clk: sunxi-ng: Fix div/mult settings for osc12M on A64 clk: rockchip: Make uartpll a child of the gpll on rk3036 clk: rockchip: add "," to mux_pll_src_apll_dpll_gpll_usb480m_p on rk3036 clk: core: Copy connection id dt-bindings: arm: update Armada CP110 system controller binding clk: sunxi-ng: sun6i: Fix enable bit offset for hdmi-ddc module clock clk: sunxi: ccu-sun5i needs nkmp clk: sunxi-ng: mp: Adjust parent rate for pre-dividers
This commit is contained in:
commit
424b6898c8
|
@ -45,7 +45,7 @@ The following clocks are available:
|
|||
- 1 15 SATA
|
||||
- 1 16 SATA USB
|
||||
- 1 17 Main
|
||||
- 1 18 SD/MMC
|
||||
- 1 18 SD/MMC/GOP
|
||||
- 1 21 Slow IO (SPI, NOR, BootROM, I2C, UART)
|
||||
- 1 22 USB3H0
|
||||
- 1 23 USB3H1
|
||||
|
@ -65,7 +65,7 @@ Required properties:
|
|||
"cpm-audio", "cpm-communit", "cpm-nand", "cpm-ppv2", "cpm-sdio",
|
||||
"cpm-mg-domain", "cpm-mg-core", "cpm-xor1", "cpm-xor0", "cpm-gop-dp", "none",
|
||||
"cpm-pcie_x10", "cpm-pcie_x11", "cpm-pcie_x4", "cpm-pcie-xor", "cpm-sata",
|
||||
"cpm-sata-usb", "cpm-main", "cpm-sd-mmc", "none", "none", "cpm-slow-io",
|
||||
"cpm-sata-usb", "cpm-main", "cpm-sd-mmc-gop", "none", "none", "cpm-slow-io",
|
||||
"cpm-usb3h0", "cpm-usb3h1", "cpm-usb3dev", "cpm-eip150", "cpm-eip197";
|
||||
|
||||
Example:
|
||||
|
@ -78,6 +78,6 @@ Example:
|
|||
gate-clock-output-names = "cpm-audio", "cpm-communit", "cpm-nand", "cpm-ppv2", "cpm-sdio",
|
||||
"cpm-mg-domain", "cpm-mg-core", "cpm-xor1", "cpm-xor0", "cpm-gop-dp", "none",
|
||||
"cpm-pcie_x10", "cpm-pcie_x11", "cpm-pcie_x4", "cpm-pcie-xor", "cpm-sata",
|
||||
"cpm-sata-usb", "cpm-main", "cpm-sd-mmc", "none", "none", "cpm-slow-io",
|
||||
"cpm-sata-usb", "cpm-main", "cpm-sd-mmc-gop", "none", "none", "cpm-slow-io",
|
||||
"cpm-usb3h0", "cpm-usb3h1", "cpm-usb3dev", "cpm-eip150", "cpm-eip197";
|
||||
};
|
||||
|
|
|
@ -2502,7 +2502,7 @@ struct clk *__clk_create_clk(struct clk_hw *hw, const char *dev_id,
|
|||
|
||||
clk->core = hw->core;
|
||||
clk->dev_id = dev_id;
|
||||
clk->con_id = con_id;
|
||||
clk->con_id = kstrdup_const(con_id, GFP_KERNEL);
|
||||
clk->max_rate = ULONG_MAX;
|
||||
|
||||
clk_prepare_lock();
|
||||
|
@ -2518,6 +2518,7 @@ void __clk_free_clk(struct clk *clk)
|
|||
hlist_del(&clk->clks_node);
|
||||
clk_prepare_unlock();
|
||||
|
||||
kfree_const(clk->con_id);
|
||||
kfree(clk);
|
||||
}
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ PNAME(mux_ddrphy_p) = { "dpll_ddr", "gpll_ddr" };
|
|||
PNAME(mux_pll_src_3plls_p) = { "apll", "dpll", "gpll" };
|
||||
PNAME(mux_timer_p) = { "xin24m", "pclk_peri_src" };
|
||||
|
||||
PNAME(mux_pll_src_apll_dpll_gpll_usb480m_p) = { "apll", "dpll", "gpll" "usb480m" };
|
||||
PNAME(mux_pll_src_apll_dpll_gpll_usb480m_p) = { "apll", "dpll", "gpll", "usb480m" };
|
||||
|
||||
PNAME(mux_mmc_src_p) = { "apll", "dpll", "gpll", "xin24m" };
|
||||
PNAME(mux_i2s_pre_p) = { "i2s_src", "i2s_frac", "ext_i2s", "xin12m" };
|
||||
|
@ -450,6 +450,13 @@ static void __init rk3036_clk_init(struct device_node *np)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make uart_pll_clk a child of the gpll, as all other sources are
|
||||
* not that usable / stable.
|
||||
*/
|
||||
writel_relaxed(HIWORD_UPDATE(0x2, 0x3, 10),
|
||||
reg_base + RK2928_CLKSEL_CON(13));
|
||||
|
||||
ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (IS_ERR(ctx)) {
|
||||
pr_err("%s: rockchip clk init failed\n", __func__);
|
||||
|
|
|
@ -80,6 +80,7 @@ config SUN6I_A31_CCU
|
|||
select SUNXI_CCU_DIV
|
||||
select SUNXI_CCU_NK
|
||||
select SUNXI_CCU_NKM
|
||||
select SUNXI_CCU_NKMP
|
||||
select SUNXI_CCU_NM
|
||||
select SUNXI_CCU_MP
|
||||
select SUNXI_CCU_PHASE
|
||||
|
|
|
@ -566,7 +566,7 @@ static SUNXI_CCU_M_WITH_GATE(gpu_clk, "gpu", "pll-gpu",
|
|||
0x1a0, 0, 3, BIT(31), CLK_SET_RATE_PARENT);
|
||||
|
||||
/* Fixed Factor clocks */
|
||||
static CLK_FIXED_FACTOR(osc12M_clk, "osc12M", "osc24M", 1, 2, 0);
|
||||
static CLK_FIXED_FACTOR(osc12M_clk, "osc12M", "osc24M", 2, 1, 0);
|
||||
|
||||
/* We hardcode the divider to 4 for now */
|
||||
static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio",
|
||||
|
|
|
@ -608,7 +608,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", lcd_ch1_parents,
|
|||
0x150, 0, 4, 24, 2, BIT(31),
|
||||
CLK_SET_RATE_PARENT);
|
||||
|
||||
static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(31), 0);
|
||||
static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(30), 0);
|
||||
|
||||
static SUNXI_CCU_GATE(ps_clk, "ps", "lcd1-ch1", 0x140, BIT(31), 0);
|
||||
|
||||
|
|
|
@ -85,6 +85,10 @@ static unsigned long ccu_mp_recalc_rate(struct clk_hw *hw,
|
|||
unsigned int m, p;
|
||||
u32 reg;
|
||||
|
||||
/* Adjust parent_rate according to pre-dividers */
|
||||
ccu_mux_helper_adjust_parent_for_prediv(&cmp->common, &cmp->mux,
|
||||
-1, &parent_rate);
|
||||
|
||||
reg = readl(cmp->common.base + cmp->common.reg);
|
||||
|
||||
m = reg >> cmp->m.shift;
|
||||
|
@ -117,6 +121,10 @@ static int ccu_mp_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
unsigned int m, p;
|
||||
u32 reg;
|
||||
|
||||
/* Adjust parent_rate according to pre-dividers */
|
||||
ccu_mux_helper_adjust_parent_for_prediv(&cmp->common, &cmp->mux,
|
||||
-1, &parent_rate);
|
||||
|
||||
max_m = cmp->m.max ?: 1 << cmp->m.width;
|
||||
max_p = cmp->p.max ?: 1 << ((1 << cmp->p.width) - 1);
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ static unsigned long ccu_nkmp_recalc_rate(struct clk_hw *hw,
|
|||
p = reg >> nkmp->p.shift;
|
||||
p &= (1 << nkmp->p.width) - 1;
|
||||
|
||||
return parent_rate * n * k >> p / m;
|
||||
return (parent_rate * n * k >> p) / m;
|
||||
}
|
||||
|
||||
static long ccu_nkmp_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
|
Loading…
Reference in New Issue