Commit a69cd911 authored by Stephen Boyd's avatar Stephen Boyd

Merge tag 'sunxi-clk-for-5.16-1' of...

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
parents 6880fa6c e65d38e3
...@@ -24,7 +24,7 @@ properties: ...@@ -24,7 +24,7 @@ properties:
- const: allwinner,sun8i-v3s-de2-clk - const: allwinner,sun8i-v3s-de2-clk
- const: allwinner,sun50i-a64-de2-clk - const: allwinner,sun50i-a64-de2-clk
- const: allwinner,sun50i-h5-de2-clk - const: allwinner,sun50i-h5-de2-clk
- const: allwinner,sun50i-h6-de2-clk - const: allwinner,sun50i-h6-de3-clk
- items: - items:
- const: allwinner,sun8i-r40-de2-clk - const: allwinner,sun8i-r40-de2-clk
- const: allwinner,sun8i-h3-de2-clk - const: allwinner,sun8i-h3-de2-clk
......
...@@ -71,6 +71,7 @@ config SUN8I_A33_CCU ...@@ -71,6 +71,7 @@ config SUN8I_A33_CCU
config SUN8I_A83T_CCU config SUN8I_A83T_CCU
bool "Support for the Allwinner A83T CCU" bool "Support for the Allwinner A83T CCU"
default MACH_SUN8I default MACH_SUN8I
depends on MACH_SUN8I || COMPILE_TEST
config SUN8I_H3_CCU config SUN8I_H3_CCU
bool "Support for the Allwinner H3 CCU" bool "Support for the Allwinner H3 CCU"
......
...@@ -1464,7 +1464,7 @@ static void __init sun4i_ccu_init(struct device_node *node, ...@@ -1464,7 +1464,7 @@ static void __init sun4i_ccu_init(struct device_node *node,
val &= ~GENMASK(7, 6); val &= ~GENMASK(7, 6);
writel(val | (2 << 6), reg + SUN4I_AHB_REG); 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) 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) ...@@ -196,7 +196,7 @@ static int sun50i_a100_r_ccu_probe(struct platform_device *pdev)
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_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[] = { static const struct of_device_id sun50i_a100_r_ccu_ids[] = {
...@@ -208,6 +208,7 @@ static struct platform_driver sun50i_a100_r_ccu_driver = { ...@@ -208,6 +208,7 @@ static struct platform_driver sun50i_a100_r_ccu_driver = {
.probe = sun50i_a100_r_ccu_probe, .probe = sun50i_a100_r_ccu_probe,
.driver = { .driver = {
.name = "sun50i-a100-r-ccu", .name = "sun50i-a100-r-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun50i_a100_r_ccu_ids, .of_match_table = sun50i_a100_r_ccu_ids,
}, },
}; };
......
...@@ -1247,7 +1247,7 @@ static int sun50i_a100_ccu_probe(struct platform_device *pdev) ...@@ -1247,7 +1247,7 @@ static int sun50i_a100_ccu_probe(struct platform_device *pdev)
writel(val, reg + sun50i_a100_usb2_clk_regs[i]); 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) if (ret)
return ret; return ret;
...@@ -1270,6 +1270,7 @@ static struct platform_driver sun50i_a100_ccu_driver = { ...@@ -1270,6 +1270,7 @@ static struct platform_driver sun50i_a100_ccu_driver = {
.probe = sun50i_a100_ccu_probe, .probe = sun50i_a100_ccu_probe,
.driver = { .driver = {
.name = "sun50i-a100-ccu", .name = "sun50i-a100-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun50i_a100_ccu_ids, .of_match_table = sun50i_a100_ccu_ids,
}, },
}; };
......
...@@ -938,13 +938,11 @@ static struct ccu_mux_nb sun50i_a64_cpu_nb = { ...@@ -938,13 +938,11 @@ static struct ccu_mux_nb sun50i_a64_cpu_nb = {
static int sun50i_a64_ccu_probe(struct platform_device *pdev) static int sun50i_a64_ccu_probe(struct platform_device *pdev)
{ {
struct resource *res;
void __iomem *reg; void __iomem *reg;
u32 val; u32 val;
int ret; int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -955,7 +953,7 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev) ...@@ -955,7 +953,7 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev)
writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG); 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) if (ret)
return ret; return ret;
...@@ -978,6 +976,7 @@ static struct platform_driver sun50i_a64_ccu_driver = { ...@@ -978,6 +976,7 @@ static struct platform_driver sun50i_a64_ccu_driver = {
.probe = sun50i_a64_ccu_probe, .probe = sun50i_a64_ccu_probe,
.driver = { .driver = {
.name = "sun50i-a64-ccu", .name = "sun50i-a64-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun50i_a64_ccu_ids, .of_match_table = sun50i_a64_ccu_ids,
}, },
}; };
......
...@@ -232,7 +232,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node, ...@@ -232,7 +232,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
return; 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) static void __init sun50i_h6_r_ccu_setup(struct device_node *node)
......
...@@ -1183,13 +1183,11 @@ static const u32 usb2_clk_regs[] = { ...@@ -1183,13 +1183,11 @@ static const u32 usb2_clk_regs[] = {
static int sun50i_h6_ccu_probe(struct platform_device *pdev) static int sun50i_h6_ccu_probe(struct platform_device *pdev)
{ {
struct resource *res;
void __iomem *reg; void __iomem *reg;
u32 val; u32 val;
int i; int i;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -1240,7 +1238,7 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev) ...@@ -1240,7 +1238,7 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev)
val |= BIT(24); val |= BIT(24);
writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG); 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[] = { static const struct of_device_id sun50i_h6_ccu_ids[] = {
...@@ -1252,6 +1250,7 @@ static struct platform_driver sun50i_h6_ccu_driver = { ...@@ -1252,6 +1250,7 @@ static struct platform_driver sun50i_h6_ccu_driver = {
.probe = sun50i_h6_ccu_probe, .probe = sun50i_h6_ccu_probe,
.driver = { .driver = {
.name = "sun50i-h6-ccu", .name = "sun50i-h6-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun50i_h6_ccu_ids, .of_match_table = sun50i_h6_ccu_ids,
}, },
}; };
......
...@@ -1141,9 +1141,7 @@ static void __init sun50i_h616_ccu_setup(struct device_node *node) ...@@ -1141,9 +1141,7 @@ static void __init sun50i_h616_ccu_setup(struct device_node *node)
val |= BIT(24); val |= BIT(24);
writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG); writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG);
i = sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc); of_sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
if (i)
pr_err("%pOF: probing clocks fails: %d\n", node, i);
} }
CLK_OF_DECLARE(sun50i_h616_ccu, "allwinner,sun50i-h616-ccu", CLK_OF_DECLARE(sun50i_h616_ccu, "allwinner,sun50i-h616-ccu",
......
...@@ -1012,7 +1012,7 @@ static void __init sun5i_ccu_init(struct device_node *node, ...@@ -1012,7 +1012,7 @@ static void __init sun5i_ccu_init(struct device_node *node,
val &= ~GENMASK(7, 6); val &= ~GENMASK(7, 6);
writel(val | (2 << 6), reg + SUN5I_AHB_REG); 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) 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) ...@@ -1257,7 +1257,7 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
val |= 0x3 << 12; val |= 0x3 << 12;
writel(val, reg + SUN6I_A31_AHB1_REG); 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, ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
&sun6i_a31_cpu_nb); &sun6i_a31_cpu_nb);
......
...@@ -745,7 +745,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node) ...@@ -745,7 +745,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node)
val &= ~BIT(16); val &= ~BIT(16);
writel(val, reg + SUN8I_A23_PLL_MIPI_REG); 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", CLK_OF_DECLARE(sun8i_a23_ccu, "allwinner,sun8i-a23-ccu",
sun8i_a23_ccu_setup); sun8i_a23_ccu_setup);
...@@ -805,7 +805,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node) ...@@ -805,7 +805,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node)
val &= ~BIT(16); val &= ~BIT(16);
writel(val, reg + SUN8I_A33_PLL_MIPI_REG); 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 */ /* Gate then ungate PLL CPU after any rate changes */
ccu_pll_notifier_register(&sun8i_a33_pll_cpu_nb); ccu_pll_notifier_register(&sun8i_a33_pll_cpu_nb);
......
...@@ -887,12 +887,10 @@ static void sun8i_a83t_cpu_pll_fixup(void __iomem *reg) ...@@ -887,12 +887,10 @@ static void sun8i_a83t_cpu_pll_fixup(void __iomem *reg)
static int sun8i_a83t_ccu_probe(struct platform_device *pdev) static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
{ {
struct resource *res;
void __iomem *reg; void __iomem *reg;
u32 val; u32 val;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -906,7 +904,7 @@ static int sun8i_a83t_ccu_probe(struct platform_device *pdev) ...@@ -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_C0CPUX_REG);
sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C1CPUX_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[] = { static const struct of_device_id sun8i_a83t_ccu_ids[] = {
...@@ -918,6 +916,7 @@ static struct platform_driver sun8i_a83t_ccu_driver = { ...@@ -918,6 +916,7 @@ static struct platform_driver sun8i_a83t_ccu_driver = {
.probe = sun8i_a83t_ccu_probe, .probe = sun8i_a83t_ccu_probe,
.driver = { .driver = {
.name = "sun8i-a83t-ccu", .name = "sun8i-a83t-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun8i_a83t_ccu_ids, .of_match_table = sun8i_a83t_ccu_ids,
}, },
}; };
......
...@@ -280,7 +280,6 @@ static const struct sunxi_ccu_desc sun50i_h5_de2_clk_desc = { ...@@ -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) static int sunxi_de2_clk_probe(struct platform_device *pdev)
{ {
struct resource *res;
struct clk *bus_clk, *mod_clk; struct clk *bus_clk, *mod_clk;
struct reset_control *rstc; struct reset_control *rstc;
void __iomem *reg; void __iomem *reg;
...@@ -291,8 +290,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev) ...@@ -291,8 +290,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
if (!ccu_desc) if (!ccu_desc)
return -EINVAL; return -EINVAL;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -342,7 +340,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev) ...@@ -342,7 +340,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
goto err_disable_mod_clk; 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) if (ret)
goto err_assert_reset; goto err_assert_reset;
......
...@@ -1154,7 +1154,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node, ...@@ -1154,7 +1154,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
val &= ~GENMASK(19, 16); val &= ~GENMASK(19, 16);
writel(val | (0 << 16), reg + SUN8I_H3_PLL_AUDIO_REG); 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 */ /* Gate then ungate PLL CPU after any rate changes */
ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb); ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
......
...@@ -265,7 +265,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node, ...@@ -265,7 +265,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
return; 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) 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 = { ...@@ -1307,14 +1307,12 @@ static struct regmap_config sun8i_r40_ccu_regmap_config = {
static int sun8i_r40_ccu_probe(struct platform_device *pdev) static int sun8i_r40_ccu_probe(struct platform_device *pdev)
{ {
struct resource *res;
struct regmap *regmap; struct regmap *regmap;
void __iomem *reg; void __iomem *reg;
u32 val; u32 val;
int ret; int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -1346,7 +1344,7 @@ static int sun8i_r40_ccu_probe(struct platform_device *pdev) ...@@ -1346,7 +1344,7 @@ static int sun8i_r40_ccu_probe(struct platform_device *pdev)
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_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) if (ret)
return ret; return ret;
...@@ -1369,6 +1367,7 @@ static struct platform_driver sun8i_r40_ccu_driver = { ...@@ -1369,6 +1367,7 @@ static struct platform_driver sun8i_r40_ccu_driver = {
.probe = sun8i_r40_ccu_probe, .probe = sun8i_r40_ccu_probe,
.driver = { .driver = {
.name = "sun8i-r40-ccu", .name = "sun8i-r40-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun8i_r40_ccu_ids, .of_match_table = sun8i_r40_ccu_ids,
}, },
}; };
......
...@@ -822,7 +822,7 @@ static void __init sun8i_v3_v3s_ccu_init(struct device_node *node, ...@@ -822,7 +822,7 @@ static void __init sun8i_v3_v3s_ccu_init(struct device_node *node,
val &= ~GENMASK(19, 16); val &= ~GENMASK(19, 16);
writel(val, reg + SUN8I_V3S_PLL_AUDIO_REG); 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) 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 = { ...@@ -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) static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
{ {
struct resource *res;
struct clk *bus_clk; struct clk *bus_clk;
struct reset_control *rstc; struct reset_control *rstc;
void __iomem *reg; void __iomem *reg;
int ret; int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -246,8 +244,7 @@ static int sun9i_a80_de_clk_probe(struct platform_device *pdev) ...@@ -246,8 +244,7 @@ static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
goto err_disable_clk; goto err_disable_clk;
} }
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_de_clk_desc);
&sun9i_a80_de_clk_desc);
if (ret) if (ret)
goto err_assert_reset; goto err_assert_reset;
...@@ -269,6 +266,7 @@ static struct platform_driver sun9i_a80_de_clk_driver = { ...@@ -269,6 +266,7 @@ static struct platform_driver sun9i_a80_de_clk_driver = {
.probe = sun9i_a80_de_clk_probe, .probe = sun9i_a80_de_clk_probe,
.driver = { .driver = {
.name = "sun9i-a80-de-clks", .name = "sun9i-a80-de-clks",
.suppress_bind_attrs = true,
.of_match_table = sun9i_a80_de_clk_ids, .of_match_table = sun9i_a80_de_clk_ids,
}, },
}; };
......
...@@ -92,13 +92,11 @@ static const struct sunxi_ccu_desc sun9i_a80_usb_clk_desc = { ...@@ -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) static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
{ {
struct resource *res;
struct clk *bus_clk; struct clk *bus_clk;
void __iomem *reg; void __iomem *reg;
int ret; int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -117,8 +115,7 @@ static int sun9i_a80_usb_clk_probe(struct platform_device *pdev) ...@@ -117,8 +115,7 @@ static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
return ret; return ret;
} }
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_usb_clk_desc);
&sun9i_a80_usb_clk_desc);
if (ret) if (ret)
goto err_disable_clk; goto err_disable_clk;
......
...@@ -1213,12 +1213,10 @@ static void sun9i_a80_cpu_pll_fixup(void __iomem *reg) ...@@ -1213,12 +1213,10 @@ static void sun9i_a80_cpu_pll_fixup(void __iomem *reg)
static int sun9i_a80_ccu_probe(struct platform_device *pdev) static int sun9i_a80_ccu_probe(struct platform_device *pdev)
{ {
struct resource *res;
void __iomem *reg; void __iomem *reg;
u32 val; u32 val;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
...@@ -1231,7 +1229,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev) ...@@ -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_C0CPUX_REG);
sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C1CPUX_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[] = { static const struct of_device_id sun9i_a80_ccu_ids[] = {
...@@ -1243,6 +1241,7 @@ static struct platform_driver sun9i_a80_ccu_driver = { ...@@ -1243,6 +1241,7 @@ static struct platform_driver sun9i_a80_ccu_driver = {
.probe = sun9i_a80_ccu_probe, .probe = sun9i_a80_ccu_probe,
.driver = { .driver = {
.name = "sun9i-a80-ccu", .name = "sun9i-a80-ccu",
.suppress_bind_attrs = true,
.of_match_table = sun9i_a80_ccu_ids, .of_match_table = sun9i_a80_ccu_ids,
}, },
}; };
......
...@@ -538,7 +538,7 @@ static void __init suniv_f1c100s_ccu_setup(struct device_node *node) ...@@ -538,7 +538,7 @@ static void __init suniv_f1c100s_ccu_setup(struct device_node *node)
val &= ~GENMASK(19, 16); val &= ~GENMASK(19, 16);
writel(val | (3 << 16), reg + SUNIV_PLL_AUDIO_REG); 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 */ /* Gate then ungate PLL CPU after any rate changes */
ccu_pll_notifier_register(&suniv_pll_cpu_nb); ccu_pll_notifier_register(&suniv_pll_cpu_nb);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/device.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -14,7 +15,11 @@ ...@@ -14,7 +15,11 @@
#include "ccu_gate.h" #include "ccu_gate.h"
#include "ccu_reset.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) 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) ...@@ -79,12 +84,17 @@ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb)
&pll_nb->clk_nb); &pll_nb->clk_nb);
} }
int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, 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) const struct sunxi_ccu_desc *desc)
{ {
struct ccu_reset *reset; struct ccu_reset *reset;
int i, ret; int i, ret;
ccu->desc = desc;
spin_lock_init(&ccu->lock);
for (i = 0; i < desc->num_ccu_clks; i++) { for (i = 0; i < desc->num_ccu_clks; i++) {
struct ccu_common *cclk = desc->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, ...@@ -92,7 +102,7 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
continue; continue;
cclk->base = reg; cclk->base = reg;
cclk->lock = &ccu_lock; cclk->lock = &ccu->lock;
} }
for (i = 0; i < desc->hw_clks->num ; i++) { for (i = 0; i < desc->hw_clks->num ; i++) {
...@@ -103,6 +113,9 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, ...@@ -103,6 +113,9 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
continue; continue;
name = hw->init->name; name = hw->init->name;
if (dev)
ret = clk_hw_register(dev, hw);
else
ret = of_clk_hw_register(node, hw); ret = of_clk_hw_register(node, hw);
if (ret) { if (ret) {
pr_err("Couldn't register clock %d - %s\n", i, name); pr_err("Couldn't register clock %d - %s\n", i, name);
...@@ -115,29 +128,22 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, ...@@ -115,29 +128,22 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
if (ret) if (ret)
goto err_clk_unreg; goto err_clk_unreg;
reset = kzalloc(sizeof(*reset), GFP_KERNEL); reset = &ccu->reset;
if (!reset) {
ret = -ENOMEM;
goto err_alloc_reset;
}
reset->rcdev.of_node = node; reset->rcdev.of_node = node;
reset->rcdev.ops = &ccu_reset_ops; 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->rcdev.nr_resets = desc->num_resets;
reset->base = reg; reset->base = reg;
reset->lock = &ccu_lock; reset->lock = &ccu->lock;
reset->reset_map = desc->resets; reset->reset_map = desc->resets;
ret = reset_controller_register(&reset->rcdev); ret = reset_controller_register(&reset->rcdev);
if (ret) if (ret)
goto err_of_clk_unreg; goto err_del_provider;
return 0; return 0;
err_of_clk_unreg: err_del_provider:
kfree(reset);
err_alloc_reset:
of_clk_del_provider(node); of_clk_del_provider(node);
err_clk_unreg: err_clk_unreg:
while (--i >= 0) { while (--i >= 0) {
...@@ -149,3 +155,59 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, ...@@ -149,3 +155,59 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
} }
return ret; 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 { ...@@ -63,7 +63,9 @@ struct ccu_pll_nb {
int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb); int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb);
int sunxi_ccu_probe(struct device_node *node, void __iomem *reg, 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); const struct sunxi_ccu_desc *desc);
#endif /* _COMMON_H_ */ #endif /* _COMMON_H_ */
...@@ -40,7 +40,6 @@ struct ccu_mux_internal { ...@@ -40,7 +40,6 @@ struct ccu_mux_internal {
_SUNXI_CCU_MUX_TABLE(_shift, _width, NULL) _SUNXI_CCU_MUX_TABLE(_shift, _width, NULL)
struct ccu_mux { struct ccu_mux {
u16 reg;
u32 enable; u32 enable;
struct ccu_mux_internal mux; struct ccu_mux_internal mux;
......
...@@ -88,14 +88,12 @@ CLK_OF_DECLARE_DRIVER(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", ...@@ -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) static int sun4i_a10_mod0_clk_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct resource *r;
void __iomem *reg; void __iomem *reg;
if (!np) if (!np)
return -ENODEV; return -ENODEV;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
......
...@@ -40,7 +40,6 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev) ...@@ -40,7 +40,6 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
const struct gates_data *data; const struct gates_data *data;
const char *clk_parent; const char *clk_parent;
const char *clk_name; const char *clk_name;
struct resource *r;
void __iomem *reg; void __iomem *reg;
int ngates; int ngates;
int i; int i;
...@@ -53,8 +52,7 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev) ...@@ -53,8 +52,7 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
if (!data) if (!data)
return -ENODEV; return -ENODEV;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
......
...@@ -32,12 +32,10 @@ static int sun6i_a31_apb0_clk_probe(struct platform_device *pdev) ...@@ -32,12 +32,10 @@ static int sun6i_a31_apb0_clk_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
const char *clk_name = np->name; const char *clk_name = np->name;
const char *clk_parent; const char *clk_parent;
struct resource *r;
void __iomem *reg; void __iomem *reg;
struct clk *clk; struct clk *clk;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
......
...@@ -71,12 +71,10 @@ static DEFINE_SPINLOCK(sun6i_ar100_lock); ...@@ -71,12 +71,10 @@ static DEFINE_SPINLOCK(sun6i_ar100_lock);
static int sun6i_a31_ar100_clk_probe(struct platform_device *pdev) static int sun6i_a31_ar100_clk_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct resource *r;
void __iomem *reg; void __iomem *reg;
struct clk *clk; struct clk *clk;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
......
...@@ -87,12 +87,10 @@ CLK_OF_DECLARE_DRIVER(sun8i_a23_apb0, "allwinner,sun8i-a23-apb0-clk", ...@@ -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) static int sun8i_a23_apb0_clk_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct resource *r;
void __iomem *reg; void __iomem *reg;
struct clk *clk; struct clk *clk;
r = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_platform_ioremap_resource(pdev, 0);
reg = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(reg)) if (IS_ERR(reg))
return PTR_ERR(reg); return PTR_ERR(reg);
......
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