mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 04:25:27 +08:00
Our usual PR for the Allwinner SoCs, this time improving the module
support and converting to more helpers. -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCYW0qDAAKCRDj7w1vZxhR xTKDAP9Zxk9u3/DgpxtxbXKSj9qvW0SsWfvXTgRLdLB4ZqTlwQD/e2knKBmkC4vr AeIsbZLrAhhFAFH36jfWO3maBl2FGwA= =hAY5 -----END PGP SIGNATURE----- Merge tag 'sunxi-clk-for-5.16-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into clk-allwinner Pull Allwinner clk driver updates from Maxime Ripard: Our usual PR for the Allwinner SoCs, this time improving the module support and converting to more helpers. * tag 'sunxi-clk-for-5.16-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux: clk: sunxi: sun8i-apb0: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi: sun6i-ar100: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi: sun6i-apb0-gates: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi: sun6i-apb0: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun9i-a80-usb: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun9i-a80-de: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun9i-a80: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun8i-r40: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun8i-de2: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun8i-a83t: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun50i-h6: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi-ng: ccu-sun50i-a64: Make use of the helper function devm_platform_ioremap_resource() clk: sunxi: clk-mod0: Make use of the helper function devm_platform_ioremap_resource() dt-bindings: clocks: Fix typo in the H6 compatible clk: sunxi-ng: Use a separate lock for each CCU instance clk: sunxi-ng: Prevent unbinding CCUs via sysfs clk: sunxi-ng: Unregister clocks/resets when unbinding clk: sunxi-ng: Add machine dependency to A83T CCU clk: sunxi-ng: mux: Remove unused 'reg' field
This commit is contained in:
commit
a69cd911b1
@ -24,7 +24,7 @@ properties:
|
||||
- const: allwinner,sun8i-v3s-de2-clk
|
||||
- const: allwinner,sun50i-a64-de2-clk
|
||||
- const: allwinner,sun50i-h5-de2-clk
|
||||
- const: allwinner,sun50i-h6-de2-clk
|
||||
- const: allwinner,sun50i-h6-de3-clk
|
||||
- items:
|
||||
- const: allwinner,sun8i-r40-de2-clk
|
||||
- const: allwinner,sun8i-h3-de2-clk
|
||||
|
@ -71,6 +71,7 @@ config SUN8I_A33_CCU
|
||||
config SUN8I_A83T_CCU
|
||||
bool "Support for the Allwinner A83T CCU"
|
||||
default MACH_SUN8I
|
||||
depends on MACH_SUN8I || COMPILE_TEST
|
||||
|
||||
config SUN8I_H3_CCU
|
||||
bool "Support for the Allwinner H3 CCU"
|
||||
|
@ -1464,7 +1464,7 @@ static void __init sun4i_ccu_init(struct device_node *node,
|
||||
val &= ~GENMASK(7, 6);
|
||||
writel(val | (2 << 6), reg + SUN4I_AHB_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, desc);
|
||||
of_sunxi_ccu_probe(node, reg, desc);
|
||||
}
|
||||
|
||||
static void __init sun4i_a10_ccu_setup(struct device_node *node)
|
||||
|
@ -196,7 +196,7 @@ static int sun50i_a100_r_ccu_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_r_ccu_desc);
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_r_ccu_desc);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun50i_a100_r_ccu_ids[] = {
|
||||
@ -208,6 +208,7 @@ static struct platform_driver sun50i_a100_r_ccu_driver = {
|
||||
.probe = sun50i_a100_r_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun50i-a100-r-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun50i_a100_r_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -1247,7 +1247,7 @@ static int sun50i_a100_ccu_probe(struct platform_device *pdev)
|
||||
writel(val, reg + sun50i_a100_usb2_clk_regs[i]);
|
||||
}
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_ccu_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_ccu_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1270,6 +1270,7 @@ static struct platform_driver sun50i_a100_ccu_driver = {
|
||||
.probe = sun50i_a100_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun50i-a100-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun50i_a100_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -938,13 +938,11 @@ static struct ccu_mux_nb sun50i_a64_cpu_nb = {
|
||||
|
||||
static int sun50i_a64_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -955,7 +953,7 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev)
|
||||
|
||||
writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG);
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a64_ccu_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -978,6 +976,7 @@ static struct platform_driver sun50i_a64_ccu_driver = {
|
||||
.probe = sun50i_a64_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun50i-a64-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun50i_a64_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -232,7 +232,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
|
||||
return;
|
||||
}
|
||||
|
||||
sunxi_ccu_probe(node, reg, desc);
|
||||
of_sunxi_ccu_probe(node, reg, desc);
|
||||
}
|
||||
|
||||
static void __init sun50i_h6_r_ccu_setup(struct device_node *node)
|
||||
|
@ -1183,13 +1183,11 @@ static const u32 usb2_clk_regs[] = {
|
||||
|
||||
static int sun50i_h6_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -1240,7 +1238,7 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev)
|
||||
val |= BIT(24);
|
||||
writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG);
|
||||
|
||||
return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc);
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun50i_h6_ccu_ids[] = {
|
||||
@ -1252,6 +1250,7 @@ static struct platform_driver sun50i_h6_ccu_driver = {
|
||||
.probe = sun50i_h6_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun50i-h6-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun50i_h6_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -1141,9 +1141,7 @@ static void __init sun50i_h616_ccu_setup(struct device_node *node)
|
||||
val |= BIT(24);
|
||||
writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG);
|
||||
|
||||
i = sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
|
||||
if (i)
|
||||
pr_err("%pOF: probing clocks fails: %d\n", node, i);
|
||||
of_sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(sun50i_h616_ccu, "allwinner,sun50i-h616-ccu",
|
||||
|
@ -1012,7 +1012,7 @@ static void __init sun5i_ccu_init(struct device_node *node,
|
||||
val &= ~GENMASK(7, 6);
|
||||
writel(val | (2 << 6), reg + SUN5I_AHB_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, desc);
|
||||
of_sunxi_ccu_probe(node, reg, desc);
|
||||
}
|
||||
|
||||
static void __init sun5i_a10s_ccu_setup(struct device_node *node)
|
||||
|
@ -1257,7 +1257,7 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
|
||||
val |= 0x3 << 12;
|
||||
writel(val, reg + SUN6I_A31_AHB1_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
|
||||
of_sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
|
||||
|
||||
ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
|
||||
&sun6i_a31_cpu_nb);
|
||||
|
@ -745,7 +745,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node)
|
||||
val &= ~BIT(16);
|
||||
writel(val, reg + SUN8I_A23_PLL_MIPI_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
|
||||
of_sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
|
||||
}
|
||||
CLK_OF_DECLARE(sun8i_a23_ccu, "allwinner,sun8i-a23-ccu",
|
||||
sun8i_a23_ccu_setup);
|
||||
|
@ -805,7 +805,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node)
|
||||
val &= ~BIT(16);
|
||||
writel(val, reg + SUN8I_A33_PLL_MIPI_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
|
||||
of_sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
|
||||
|
||||
/* Gate then ungate PLL CPU after any rate changes */
|
||||
ccu_pll_notifier_register(&sun8i_a33_pll_cpu_nb);
|
||||
|
@ -887,12 +887,10 @@ static void sun8i_a83t_cpu_pll_fixup(void __iomem *reg)
|
||||
|
||||
static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -906,7 +904,7 @@ static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
|
||||
sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C0CPUX_REG);
|
||||
sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C1CPUX_REG);
|
||||
|
||||
return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_a83t_ccu_desc);
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_a83t_ccu_desc);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun8i_a83t_ccu_ids[] = {
|
||||
@ -918,6 +916,7 @@ static struct platform_driver sun8i_a83t_ccu_driver = {
|
||||
.probe = sun8i_a83t_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun8i-a83t-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun8i_a83t_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -280,7 +280,6 @@ static const struct sunxi_ccu_desc sun50i_h5_de2_clk_desc = {
|
||||
|
||||
static int sunxi_de2_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
struct clk *bus_clk, *mod_clk;
|
||||
struct reset_control *rstc;
|
||||
void __iomem *reg;
|
||||
@ -291,8 +290,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
|
||||
if (!ccu_desc)
|
||||
return -EINVAL;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -342,7 +340,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
|
||||
goto err_disable_mod_clk;
|
||||
}
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, ccu_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, ccu_desc);
|
||||
if (ret)
|
||||
goto err_assert_reset;
|
||||
|
||||
|
@ -1154,7 +1154,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
|
||||
val &= ~GENMASK(19, 16);
|
||||
writel(val | (0 << 16), reg + SUN8I_H3_PLL_AUDIO_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, desc);
|
||||
of_sunxi_ccu_probe(node, reg, desc);
|
||||
|
||||
/* Gate then ungate PLL CPU after any rate changes */
|
||||
ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
|
||||
|
@ -265,7 +265,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
|
||||
return;
|
||||
}
|
||||
|
||||
sunxi_ccu_probe(node, reg, desc);
|
||||
of_sunxi_ccu_probe(node, reg, desc);
|
||||
}
|
||||
|
||||
static void __init sun8i_a83t_r_ccu_setup(struct device_node *node)
|
||||
|
@ -1307,14 +1307,12 @@ static struct regmap_config sun8i_r40_ccu_regmap_config = {
|
||||
|
||||
static int sun8i_r40_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
struct regmap *regmap;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -1346,7 +1344,7 @@ static int sun8i_r40_ccu_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_r40_ccu_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_r40_ccu_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1369,6 +1367,7 @@ static struct platform_driver sun8i_r40_ccu_driver = {
|
||||
.probe = sun8i_r40_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun8i-r40-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun8i_r40_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -822,7 +822,7 @@ static void __init sun8i_v3_v3s_ccu_init(struct device_node *node,
|
||||
val &= ~GENMASK(19, 16);
|
||||
writel(val, reg + SUN8I_V3S_PLL_AUDIO_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, ccu_desc);
|
||||
of_sunxi_ccu_probe(node, reg, ccu_desc);
|
||||
}
|
||||
|
||||
static void __init sun8i_v3s_ccu_setup(struct device_node *node)
|
||||
|
@ -203,14 +203,12 @@ static const struct sunxi_ccu_desc sun9i_a80_de_clk_desc = {
|
||||
|
||||
static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
struct clk *bus_clk;
|
||||
struct reset_control *rstc;
|
||||
void __iomem *reg;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -246,8 +244,7 @@ static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
|
||||
goto err_disable_clk;
|
||||
}
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
|
||||
&sun9i_a80_de_clk_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_de_clk_desc);
|
||||
if (ret)
|
||||
goto err_assert_reset;
|
||||
|
||||
@ -269,6 +266,7 @@ static struct platform_driver sun9i_a80_de_clk_driver = {
|
||||
.probe = sun9i_a80_de_clk_probe,
|
||||
.driver = {
|
||||
.name = "sun9i-a80-de-clks",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun9i_a80_de_clk_ids,
|
||||
},
|
||||
};
|
||||
|
@ -92,13 +92,11 @@ static const struct sunxi_ccu_desc sun9i_a80_usb_clk_desc = {
|
||||
|
||||
static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
struct clk *bus_clk;
|
||||
void __iomem *reg;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -117,8 +115,7 @@ static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
|
||||
&sun9i_a80_usb_clk_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_usb_clk_desc);
|
||||
if (ret)
|
||||
goto err_disable_clk;
|
||||
|
||||
|
@ -1213,12 +1213,10 @@ static void sun9i_a80_cpu_pll_fixup(void __iomem *reg)
|
||||
|
||||
static int sun9i_a80_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
@ -1231,7 +1229,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev)
|
||||
sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C0CPUX_REG);
|
||||
sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C1CPUX_REG);
|
||||
|
||||
return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun9i_a80_ccu_desc);
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_ccu_desc);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun9i_a80_ccu_ids[] = {
|
||||
@ -1243,6 +1241,7 @@ static struct platform_driver sun9i_a80_ccu_driver = {
|
||||
.probe = sun9i_a80_ccu_probe,
|
||||
.driver = {
|
||||
.name = "sun9i-a80-ccu",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = sun9i_a80_ccu_ids,
|
||||
},
|
||||
};
|
||||
|
@ -538,7 +538,7 @@ static void __init suniv_f1c100s_ccu_setup(struct device_node *node)
|
||||
val &= ~GENMASK(19, 16);
|
||||
writel(val | (3 << 16), reg + SUNIV_PLL_AUDIO_REG);
|
||||
|
||||
sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
|
||||
of_sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
|
||||
|
||||
/* Gate then ungate PLL CPU after any rate changes */
|
||||
ccu_pll_notifier_register(&suniv_pll_cpu_nb);
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@ -14,7 +15,11 @@
|
||||
#include "ccu_gate.h"
|
||||
#include "ccu_reset.h"
|
||||
|
||||
static DEFINE_SPINLOCK(ccu_lock);
|
||||
struct sunxi_ccu {
|
||||
const struct sunxi_ccu_desc *desc;
|
||||
spinlock_t lock;
|
||||
struct ccu_reset reset;
|
||||
};
|
||||
|
||||
void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)
|
||||
{
|
||||
@ -79,12 +84,17 @@ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb)
|
||||
&pll_nb->clk_nb);
|
||||
}
|
||||
|
||||
int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc)
|
||||
static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,
|
||||
struct device_node *node, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc)
|
||||
{
|
||||
struct ccu_reset *reset;
|
||||
int i, ret;
|
||||
|
||||
ccu->desc = desc;
|
||||
|
||||
spin_lock_init(&ccu->lock);
|
||||
|
||||
for (i = 0; i < desc->num_ccu_clks; i++) {
|
||||
struct ccu_common *cclk = desc->ccu_clks[i];
|
||||
|
||||
@ -92,7 +102,7 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
continue;
|
||||
|
||||
cclk->base = reg;
|
||||
cclk->lock = &ccu_lock;
|
||||
cclk->lock = &ccu->lock;
|
||||
}
|
||||
|
||||
for (i = 0; i < desc->hw_clks->num ; i++) {
|
||||
@ -103,7 +113,10 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
continue;
|
||||
|
||||
name = hw->init->name;
|
||||
ret = of_clk_hw_register(node, hw);
|
||||
if (dev)
|
||||
ret = clk_hw_register(dev, hw);
|
||||
else
|
||||
ret = of_clk_hw_register(node, hw);
|
||||
if (ret) {
|
||||
pr_err("Couldn't register clock %d - %s\n", i, name);
|
||||
goto err_clk_unreg;
|
||||
@ -115,29 +128,22 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
if (ret)
|
||||
goto err_clk_unreg;
|
||||
|
||||
reset = kzalloc(sizeof(*reset), GFP_KERNEL);
|
||||
if (!reset) {
|
||||
ret = -ENOMEM;
|
||||
goto err_alloc_reset;
|
||||
}
|
||||
|
||||
reset = &ccu->reset;
|
||||
reset->rcdev.of_node = node;
|
||||
reset->rcdev.ops = &ccu_reset_ops;
|
||||
reset->rcdev.owner = THIS_MODULE;
|
||||
reset->rcdev.owner = dev ? dev->driver->owner : THIS_MODULE;
|
||||
reset->rcdev.nr_resets = desc->num_resets;
|
||||
reset->base = reg;
|
||||
reset->lock = &ccu_lock;
|
||||
reset->lock = &ccu->lock;
|
||||
reset->reset_map = desc->resets;
|
||||
|
||||
ret = reset_controller_register(&reset->rcdev);
|
||||
if (ret)
|
||||
goto err_of_clk_unreg;
|
||||
goto err_del_provider;
|
||||
|
||||
return 0;
|
||||
|
||||
err_of_clk_unreg:
|
||||
kfree(reset);
|
||||
err_alloc_reset:
|
||||
err_del_provider:
|
||||
of_clk_del_provider(node);
|
||||
err_clk_unreg:
|
||||
while (--i >= 0) {
|
||||
@ -149,3 +155,59 @@ err_clk_unreg:
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void devm_sunxi_ccu_release(struct device *dev, void *res)
|
||||
{
|
||||
struct sunxi_ccu *ccu = res;
|
||||
const struct sunxi_ccu_desc *desc = ccu->desc;
|
||||
int i;
|
||||
|
||||
reset_controller_unregister(&ccu->reset.rcdev);
|
||||
of_clk_del_provider(dev->of_node);
|
||||
|
||||
for (i = 0; i < desc->hw_clks->num; i++) {
|
||||
struct clk_hw *hw = desc->hw_clks->hws[i];
|
||||
|
||||
if (!hw)
|
||||
continue;
|
||||
clk_hw_unregister(hw);
|
||||
}
|
||||
}
|
||||
|
||||
int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc)
|
||||
{
|
||||
struct sunxi_ccu *ccu;
|
||||
int ret;
|
||||
|
||||
ccu = devres_alloc(devm_sunxi_ccu_release, sizeof(*ccu), GFP_KERNEL);
|
||||
if (!ccu)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = sunxi_ccu_probe(ccu, dev, dev->of_node, reg, desc);
|
||||
if (ret) {
|
||||
devres_free(ccu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
devres_add(dev, ccu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc)
|
||||
{
|
||||
struct sunxi_ccu *ccu;
|
||||
int ret;
|
||||
|
||||
ccu = kzalloc(sizeof(*ccu), GFP_KERNEL);
|
||||
if (!ccu)
|
||||
return;
|
||||
|
||||
ret = sunxi_ccu_probe(ccu, NULL, node, reg, desc);
|
||||
if (ret) {
|
||||
pr_err("%pOF: probing clocks failed: %d\n", node, ret);
|
||||
kfree(ccu);
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,9 @@ struct ccu_pll_nb {
|
||||
|
||||
int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb);
|
||||
|
||||
int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc);
|
||||
int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc);
|
||||
void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
const struct sunxi_ccu_desc *desc);
|
||||
|
||||
#endif /* _COMMON_H_ */
|
||||
|
@ -40,7 +40,6 @@ struct ccu_mux_internal {
|
||||
_SUNXI_CCU_MUX_TABLE(_shift, _width, NULL)
|
||||
|
||||
struct ccu_mux {
|
||||
u16 reg;
|
||||
u32 enable;
|
||||
|
||||
struct ccu_mux_internal mux;
|
||||
|
@ -88,14 +88,12 @@ CLK_OF_DECLARE_DRIVER(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk",
|
||||
static int sun4i_a10_mod0_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource *r;
|
||||
void __iomem *reg;
|
||||
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, r);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
|
@ -40,7 +40,6 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
|
||||
const struct gates_data *data;
|
||||
const char *clk_parent;
|
||||
const char *clk_name;
|
||||
struct resource *r;
|
||||
void __iomem *reg;
|
||||
int ngates;
|
||||
int i;
|
||||
@ -53,8 +52,7 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
|
||||
if (!data)
|
||||
return -ENODEV;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, r);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
|
@ -32,12 +32,10 @@ static int sun6i_a31_apb0_clk_probe(struct platform_device *pdev)
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const char *clk_name = np->name;
|
||||
const char *clk_parent;
|
||||
struct resource *r;
|
||||
void __iomem *reg;
|
||||
struct clk *clk;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, r);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
|
@ -71,12 +71,10 @@ static DEFINE_SPINLOCK(sun6i_ar100_lock);
|
||||
static int sun6i_a31_ar100_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource *r;
|
||||
void __iomem *reg;
|
||||
struct clk *clk;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, r);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
|
@ -87,12 +87,10 @@ CLK_OF_DECLARE_DRIVER(sun8i_a23_apb0, "allwinner,sun8i-a23-apb0-clk",
|
||||
static int sun8i_a23_apb0_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource *r;
|
||||
void __iomem *reg;
|
||||
struct clk *clk;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, r);
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user