This is the first batch of clk driver fixes for this release. We have a handful
of fixes for the uniphier clk driver that was introduced recently, as well as Kconfig option hiding, module autoloading markings, and a few fixes for clk_hw based registration patches that went in this merge window. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJYDnAWAAoJEK0CiJfG5JUl0swQAIsxEXNsm/IBV5HP6NfFEYdK zPQbHCiHKdvPXJyyTXKnGYq4k/6xCpXgRWX7nxgEqSGZIteBbyQ7vd1++yBUwWTq hJaitk4euoR4XGia1kKsxs4pgzAOAE6V9eMV9Is2P+Mm0c2EDH6yXYlsqCk26aYM M/AG0jMhbvWIL7t34MN8L4cd7o6S5PdFpFGOV+b1aPoTiDijejIj8ew9C2hsotd4 sh6DH9BDVqbJGdLE7gas/7rpO1lNZ5PgVBVOd/RP9cbqgP5BPUmr6SEy0AhC0SHu T+b72eg459gWg8OEvVmLm2aUmyBznQvfYV14Zdkqx3ncI68F+v4TPu2u8m5QIwqF khKqyfdvUQv5orufzHibJLwkd8elEPkxvg0xZPV1EKPVPSQ16Eu/3aWFlhHjMYFR v9zxYGZ5/tmImjaSaEGU2B5Cd6MTmJew+aP6hg9dI4GkR6qtccKfp7T+SMXK7Mja GA6y0GNBq0V+Fpn7LsoJwZoo/r6RbIyzJW00YR1Yr5cJEXffKVP25UTHXr8M/4Uj FqpNoje8vepmO4b+0pEYM5x46U7rXnyEyfznVSK+SRhTujCVJ+WOUM5QxM+4wze9 247JzNEdx0ED5ahYmpWTb+JApQ6rkmnBmhsFjP50aae1zWGqNaE9UbzOmEZmpdjN b2uXD2blbZ93Oqn6vrHh =mWXv -----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: "This is the first batch of clk driver fixes for this release. We have a handful of fixes for the uniphier clk driver that was introduced recently, as well as Kconfig option hiding, module autoloading markings, and a few fixes for clk_hw based registration patches that went in this merge window" * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: clk: at91: Fix a return value in case of error clk: uniphier: rename MIO clock to SD clock for Pro5, PXs2, LD20 SoCs clk: uniphier: fix memory overrun bug clk: hi6220: use CLK_OF_DECLARE_DRIVER for sysctrl and mediactrl clock init clk: mvebu: armada-37xx-periph: Fix the clock gate flag clk: bcm2835: Clamp the PLL's requested rate to the hardware limits. clk: max77686: fix number of clocks setup for clk_hw based registration clk: mvebu: armada-37xx-periph: Fix the clock provider registration clk: core: add __init decoration for CLK_OF_DECLARE_DRIVER function clk: mediatek: Add hardware dependency clk: samsung: clk-exynos-audss: Fix module autoload clk: uniphier: fix type of variable passed to regmap_read() clk: uniphier: add system clock support for sLD3 SoC
This commit is contained in:
commit
b5cd891716
|
@ -24,7 +24,7 @@ Example:
|
||||||
reg = <0x61840000 0x4000>;
|
reg = <0x61840000 0x4000>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-clock";
|
compatible = "socionext,uniphier-ld11-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ Provided clocks:
|
||||||
21: USB3 ch1 PHY1
|
21: USB3 ch1 PHY1
|
||||||
|
|
||||||
|
|
||||||
Media I/O (MIO) clock
|
Media I/O (MIO) clock, SD clock
|
||||||
---------------------
|
-------------------------------
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
|
@ -52,10 +52,10 @@ Required properties:
|
||||||
"socionext,uniphier-ld4-mio-clock" - for LD4 SoC.
|
"socionext,uniphier-ld4-mio-clock" - for LD4 SoC.
|
||||||
"socionext,uniphier-pro4-mio-clock" - for Pro4 SoC.
|
"socionext,uniphier-pro4-mio-clock" - for Pro4 SoC.
|
||||||
"socionext,uniphier-sld8-mio-clock" - for sLD8 SoC.
|
"socionext,uniphier-sld8-mio-clock" - for sLD8 SoC.
|
||||||
"socionext,uniphier-pro5-mio-clock" - for Pro5 SoC.
|
"socionext,uniphier-pro5-sd-clock" - for Pro5 SoC.
|
||||||
"socionext,uniphier-pxs2-mio-clock" - for PXs2/LD6b SoC.
|
"socionext,uniphier-pxs2-sd-clock" - for PXs2/LD6b SoC.
|
||||||
"socionext,uniphier-ld11-mio-clock" - for LD11 SoC.
|
"socionext,uniphier-ld11-mio-clock" - for LD11 SoC.
|
||||||
"socionext,uniphier-ld20-mio-clock" - for LD20 SoC.
|
"socionext,uniphier-ld20-sd-clock" - for LD20 SoC.
|
||||||
- #clock-cells: should be 1.
|
- #clock-cells: should be 1.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@ -66,7 +66,7 @@ Example:
|
||||||
reg = <0x59810000 0x800>;
|
reg = <0x59810000 0x800>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-mio-clock";
|
compatible = "socionext,uniphier-ld11-mio-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ Example:
|
||||||
reg = <0x59820000 0x200>;
|
reg = <0x59820000 0x200>;
|
||||||
|
|
||||||
clock {
|
clock {
|
||||||
compatible = "socionext,uniphier-ld20-peri-clock";
|
compatible = "socionext,uniphier-ld11-peri-clock";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -203,7 +203,7 @@ at91_clk_register_programmable(struct regmap *regmap,
|
||||||
ret = clk_hw_register(NULL, &prog->hw);
|
ret = clk_hw_register(NULL, &prog->hw);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(prog);
|
kfree(prog);
|
||||||
hw = &prog->hw;
|
hw = ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hw;
|
return hw;
|
||||||
|
|
|
@ -502,8 +502,12 @@ static long bcm2835_pll_rate_from_divisors(unsigned long parent_rate,
|
||||||
static long bcm2835_pll_round_rate(struct clk_hw *hw, unsigned long rate,
|
static long bcm2835_pll_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
unsigned long *parent_rate)
|
unsigned long *parent_rate)
|
||||||
{
|
{
|
||||||
|
struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
|
||||||
|
const struct bcm2835_pll_data *data = pll->data;
|
||||||
u32 ndiv, fdiv;
|
u32 ndiv, fdiv;
|
||||||
|
|
||||||
|
rate = clamp(rate, data->min_rate, data->max_rate);
|
||||||
|
|
||||||
bcm2835_pll_choose_ndiv_and_fdiv(rate, *parent_rate, &ndiv, &fdiv);
|
bcm2835_pll_choose_ndiv_and_fdiv(rate, *parent_rate, &ndiv, &fdiv);
|
||||||
|
|
||||||
return bcm2835_pll_rate_from_divisors(*parent_rate, ndiv, fdiv, 1);
|
return bcm2835_pll_rate_from_divisors(*parent_rate, ndiv, fdiv, 1);
|
||||||
|
@ -608,13 +612,6 @@ static int bcm2835_pll_set_rate(struct clk_hw *hw,
|
||||||
u32 ana[4];
|
u32 ana[4];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (rate < data->min_rate || rate > data->max_rate) {
|
|
||||||
dev_err(cprman->dev, "%s: rate out of spec: %lu vs (%lu, %lu)\n",
|
|
||||||
clk_hw_get_name(hw), rate,
|
|
||||||
data->min_rate, data->max_rate);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rate > data->max_fb_rate) {
|
if (rate > data->max_fb_rate) {
|
||||||
use_fb_prediv = true;
|
use_fb_prediv = true;
|
||||||
rate /= 2;
|
rate /= 2;
|
||||||
|
|
|
@ -216,6 +216,7 @@ static int max77686_clk_probe(struct platform_device *pdev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drv_data->num_clks = num_clks;
|
||||||
drv_data->max_clk_data = devm_kcalloc(dev, num_clks,
|
drv_data->max_clk_data = devm_kcalloc(dev, num_clks,
|
||||||
sizeof(*drv_data->max_clk_data),
|
sizeof(*drv_data->max_clk_data),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
|
@ -195,7 +195,7 @@ static void __init hi6220_clk_sys_init(struct device_node *np)
|
||||||
hi6220_clk_register_divider(hi6220_div_clks_sys,
|
hi6220_clk_register_divider(hi6220_div_clks_sys,
|
||||||
ARRAY_SIZE(hi6220_div_clks_sys), clk_data);
|
ARRAY_SIZE(hi6220_div_clks_sys), clk_data);
|
||||||
}
|
}
|
||||||
CLK_OF_DECLARE(hi6220_clk_sys, "hisilicon,hi6220-sysctrl", hi6220_clk_sys_init);
|
CLK_OF_DECLARE_DRIVER(hi6220_clk_sys, "hisilicon,hi6220-sysctrl", hi6220_clk_sys_init);
|
||||||
|
|
||||||
|
|
||||||
/* clocks in media controller */
|
/* clocks in media controller */
|
||||||
|
@ -252,7 +252,7 @@ static void __init hi6220_clk_media_init(struct device_node *np)
|
||||||
hi6220_clk_register_divider(hi6220_div_clks_media,
|
hi6220_clk_register_divider(hi6220_div_clks_media,
|
||||||
ARRAY_SIZE(hi6220_div_clks_media), clk_data);
|
ARRAY_SIZE(hi6220_div_clks_media), clk_data);
|
||||||
}
|
}
|
||||||
CLK_OF_DECLARE(hi6220_clk_media, "hisilicon,hi6220-mediactrl", hi6220_clk_media_init);
|
CLK_OF_DECLARE_DRIVER(hi6220_clk_media, "hisilicon,hi6220-mediactrl", hi6220_clk_media_init);
|
||||||
|
|
||||||
|
|
||||||
/* clocks in pmctrl */
|
/* clocks in pmctrl */
|
||||||
|
|
|
@ -8,6 +8,7 @@ config COMMON_CLK_MEDIATEK
|
||||||
|
|
||||||
config COMMON_CLK_MT8135
|
config COMMON_CLK_MT8135
|
||||||
bool "Clock driver for Mediatek MT8135"
|
bool "Clock driver for Mediatek MT8135"
|
||||||
|
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
select COMMON_CLK_MEDIATEK
|
select COMMON_CLK_MEDIATEK
|
||||||
default ARCH_MEDIATEK
|
default ARCH_MEDIATEK
|
||||||
---help---
|
---help---
|
||||||
|
@ -15,6 +16,7 @@ config COMMON_CLK_MT8135
|
||||||
|
|
||||||
config COMMON_CLK_MT8173
|
config COMMON_CLK_MT8173
|
||||||
bool "Clock driver for Mediatek MT8173"
|
bool "Clock driver for Mediatek MT8173"
|
||||||
|
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
select COMMON_CLK_MEDIATEK
|
select COMMON_CLK_MEDIATEK
|
||||||
default ARCH_MEDIATEK
|
default ARCH_MEDIATEK
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -305,7 +305,7 @@ static const struct of_device_id armada_3700_periph_clock_of_match[] = {
|
||||||
};
|
};
|
||||||
static int armada_3700_add_composite_clk(const struct clk_periph_data *data,
|
static int armada_3700_add_composite_clk(const struct clk_periph_data *data,
|
||||||
void __iomem *reg, spinlock_t *lock,
|
void __iomem *reg, spinlock_t *lock,
|
||||||
struct device *dev, struct clk_hw *hw)
|
struct device *dev, struct clk_hw **hw)
|
||||||
{
|
{
|
||||||
const struct clk_ops *mux_ops = NULL, *gate_ops = NULL,
|
const struct clk_ops *mux_ops = NULL, *gate_ops = NULL,
|
||||||
*rate_ops = NULL;
|
*rate_ops = NULL;
|
||||||
|
@ -329,6 +329,7 @@ static int armada_3700_add_composite_clk(const struct clk_periph_data *data,
|
||||||
gate->lock = lock;
|
gate->lock = lock;
|
||||||
gate_ops = gate_hw->init->ops;
|
gate_ops = gate_hw->init->ops;
|
||||||
gate->reg = reg + (u64)gate->reg;
|
gate->reg = reg + (u64)gate->reg;
|
||||||
|
gate->flags = CLK_GATE_SET_TO_DISABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->rate_hw) {
|
if (data->rate_hw) {
|
||||||
|
@ -353,13 +354,13 @@ static int armada_3700_add_composite_clk(const struct clk_periph_data *data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hw = clk_hw_register_composite(dev, data->name, data->parent_names,
|
*hw = clk_hw_register_composite(dev, data->name, data->parent_names,
|
||||||
data->num_parents, mux_hw,
|
data->num_parents, mux_hw,
|
||||||
mux_ops, rate_hw, rate_ops,
|
mux_ops, rate_hw, rate_ops,
|
||||||
gate_hw, gate_ops, CLK_IGNORE_UNUSED);
|
gate_hw, gate_ops, CLK_IGNORE_UNUSED);
|
||||||
|
|
||||||
if (IS_ERR(hw))
|
if (IS_ERR(*hw))
|
||||||
return PTR_ERR(hw);
|
return PTR_ERR(*hw);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -400,7 +401,7 @@ static int armada_3700_periph_clock_probe(struct platform_device *pdev)
|
||||||
spin_lock_init(&driver_data->lock);
|
spin_lock_init(&driver_data->lock);
|
||||||
|
|
||||||
for (i = 0; i < num_periph; i++) {
|
for (i = 0; i < num_periph; i++) {
|
||||||
struct clk_hw *hw = driver_data->hw_data->hws[i];
|
struct clk_hw **hw = &driver_data->hw_data->hws[i];
|
||||||
|
|
||||||
if (armada_3700_add_composite_clk(&data[i], reg,
|
if (armada_3700_add_composite_clk(&data[i], reg,
|
||||||
&driver_data->lock, dev, hw))
|
&driver_data->lock, dev, hw))
|
||||||
|
|
|
@ -106,6 +106,7 @@ static const struct of_device_id exynos_audss_clk_of_match[] = {
|
||||||
},
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, exynos_audss_clk_of_match);
|
||||||
|
|
||||||
static void exynos_audss_clk_teardown(void)
|
static void exynos_audss_clk_teardown(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -79,7 +79,7 @@ static int uniphier_clk_probe(struct platform_device *pdev)
|
||||||
hw_data->num = clk_num;
|
hw_data->num = clk_num;
|
||||||
|
|
||||||
/* avoid returning NULL for unused idx */
|
/* avoid returning NULL for unused idx */
|
||||||
for (; clk_num >= 0; clk_num--)
|
while (--clk_num >= 0)
|
||||||
hw_data->hws[clk_num] = ERR_PTR(-EINVAL);
|
hw_data->hws[clk_num] = ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
for (p = data; p->name; p++) {
|
for (p = data; p->name; p++) {
|
||||||
|
@ -110,6 +110,10 @@ static int uniphier_clk_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
static const struct of_device_id uniphier_clk_match[] = {
|
static const struct of_device_id uniphier_clk_match[] = {
|
||||||
/* System clock */
|
/* System clock */
|
||||||
|
{
|
||||||
|
.compatible = "socionext,uniphier-sld3-clock",
|
||||||
|
.data = uniphier_sld3_sys_clk_data,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-ld4-clock",
|
.compatible = "socionext,uniphier-ld4-clock",
|
||||||
.data = uniphier_ld4_sys_clk_data,
|
.data = uniphier_ld4_sys_clk_data,
|
||||||
|
@ -138,7 +142,7 @@ static const struct of_device_id uniphier_clk_match[] = {
|
||||||
.compatible = "socionext,uniphier-ld20-clock",
|
.compatible = "socionext,uniphier-ld20-clock",
|
||||||
.data = uniphier_ld20_sys_clk_data,
|
.data = uniphier_ld20_sys_clk_data,
|
||||||
},
|
},
|
||||||
/* Media I/O clock */
|
/* Media I/O clock, SD clock */
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-sld3-mio-clock",
|
.compatible = "socionext,uniphier-sld3-mio-clock",
|
||||||
.data = uniphier_sld3_mio_clk_data,
|
.data = uniphier_sld3_mio_clk_data,
|
||||||
|
@ -156,20 +160,20 @@ static const struct of_device_id uniphier_clk_match[] = {
|
||||||
.data = uniphier_sld3_mio_clk_data,
|
.data = uniphier_sld3_mio_clk_data,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-pro5-mio-clock",
|
.compatible = "socionext,uniphier-pro5-sd-clock",
|
||||||
.data = uniphier_pro5_mio_clk_data,
|
.data = uniphier_pro5_sd_clk_data,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-pxs2-mio-clock",
|
.compatible = "socionext,uniphier-pxs2-sd-clock",
|
||||||
.data = uniphier_pro5_mio_clk_data,
|
.data = uniphier_pro5_sd_clk_data,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-ld11-mio-clock",
|
.compatible = "socionext,uniphier-ld11-mio-clock",
|
||||||
.data = uniphier_sld3_mio_clk_data,
|
.data = uniphier_sld3_mio_clk_data,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "socionext,uniphier-ld20-mio-clock",
|
.compatible = "socionext,uniphier-ld20-sd-clock",
|
||||||
.data = uniphier_pro5_mio_clk_data,
|
.data = uniphier_pro5_sd_clk_data,
|
||||||
},
|
},
|
||||||
/* Peripheral clock */
|
/* Peripheral clock */
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,7 +93,7 @@ const struct uniphier_clk_data uniphier_sld3_mio_clk_data[] = {
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct uniphier_clk_data uniphier_pro5_mio_clk_data[] = {
|
const struct uniphier_clk_data uniphier_pro5_sd_clk_data[] = {
|
||||||
UNIPHIER_MIO_CLK_SD_FIXED,
|
UNIPHIER_MIO_CLK_SD_FIXED,
|
||||||
UNIPHIER_MIO_CLK_SD(0, 0),
|
UNIPHIER_MIO_CLK_SD(0, 0),
|
||||||
UNIPHIER_MIO_CLK_SD(1, 1),
|
UNIPHIER_MIO_CLK_SD(1, 1),
|
||||||
|
|
|
@ -42,7 +42,7 @@ static u8 uniphier_clk_mux_get_parent(struct clk_hw *hw)
|
||||||
struct uniphier_clk_mux *mux = to_uniphier_clk_mux(hw);
|
struct uniphier_clk_mux *mux = to_uniphier_clk_mux(hw);
|
||||||
int num_parents = clk_hw_get_num_parents(hw);
|
int num_parents = clk_hw_get_num_parents(hw);
|
||||||
int ret;
|
int ret;
|
||||||
u32 val;
|
unsigned int val;
|
||||||
u8 i;
|
u8 i;
|
||||||
|
|
||||||
ret = regmap_read(mux->regmap, mux->reg, &val);
|
ret = regmap_read(mux->regmap, mux->reg, &val);
|
||||||
|
|
|
@ -115,7 +115,7 @@ extern const struct uniphier_clk_data uniphier_pxs2_sys_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[];
|
extern const struct uniphier_clk_data uniphier_ld11_sys_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[];
|
extern const struct uniphier_clk_data uniphier_ld20_sys_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_sld3_mio_clk_data[];
|
extern const struct uniphier_clk_data uniphier_sld3_mio_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_pro5_mio_clk_data[];
|
extern const struct uniphier_clk_data uniphier_pro5_sd_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[];
|
extern const struct uniphier_clk_data uniphier_ld4_peri_clk_data[];
|
||||||
extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[];
|
extern const struct uniphier_clk_data uniphier_pro4_peri_clk_data[];
|
||||||
|
|
||||||
|
|
|
@ -785,7 +785,7 @@ extern struct of_device_id __clk_of_table;
|
||||||
* routines, one at of_clk_init(), and one at platform device probe
|
* routines, one at of_clk_init(), and one at platform device probe
|
||||||
*/
|
*/
|
||||||
#define CLK_OF_DECLARE_DRIVER(name, compat, fn) \
|
#define CLK_OF_DECLARE_DRIVER(name, compat, fn) \
|
||||||
static void name##_of_clk_init_driver(struct device_node *np) \
|
static void __init name##_of_clk_init_driver(struct device_node *np) \
|
||||||
{ \
|
{ \
|
||||||
of_node_clear_flag(np, OF_POPULATED); \
|
of_node_clear_flag(np, OF_POPULATED); \
|
||||||
fn(np); \
|
fn(np); \
|
||||||
|
|
Loading…
Reference in New Issue