Skip to content

Commit

Permalink
clk: mediatek: Migrate to mtk_clk_pdev_probe() for multimedia clocks
Browse files Browse the repository at this point in the history
Reduce duplication and simplify all MediaTek multimedia clock drivers
by migrating away from defining custom probe functions for each driver
and instead use mtk_clk_pdev_probe().

While at it, also add a .remove() callback to all of the multimedia
clock drivers where missing.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
Tested-by: Miles Chen <miles.chen@mediatek.com>
Tested-by: Chen-Yu Tsai <wenst@chromium.org>
Link: https://lore.kernel.org/r/20230306140543.1813621-4-angelogioacchino.delregno@collabora.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
  • Loading branch information
AngeloGioacchino Del Regno authored and Stephen Boyd committed Mar 13, 2023
1 parent 2520912 commit 65c10c5
Show file tree
Hide file tree
Showing 15 changed files with 165 additions and 480 deletions.
31 changes: 11 additions & 20 deletions drivers/clk/mediatek/clk-mt2701-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,32 +79,23 @@ static const struct mtk_gate mm_clks[] = {
GATE_DISP1(CLK_MM_TVE_FMM, "mm_tve_fmm", "mm_sel", 14),
};

static int clk_mt2701_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data;
int r;

clk_data = mtk_alloc_clk_data(CLK_MM_NR);

mtk_clk_register_gates(&pdev->dev, node, mm_clks,
ARRAY_SIZE(mm_clks), clk_data);

r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (r)
dev_err(&pdev->dev,
"could not register clock provider: %s: %d\n",
pdev->name, r);
static const struct mtk_clk_desc mm_desc = {
.clks = mm_clks,
.num_clks = ARRAY_SIZE(mm_clks),
};

return r;
}
static const struct platform_device_id clk_mt2701_mm_id_table[] = {
{ .name = "clk-mt2701-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static struct platform_driver clk_mt2701_mm_drv = {
.probe = clk_mt2701_mm_probe,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
.driver = {
.name = "clk-mt2701-mm",
},
.id_table = clk_mt2701_mm_id_table,
};

builtin_platform_driver(clk_mt2701_mm_drv);
31 changes: 11 additions & 20 deletions drivers/clk/mediatek/clk-mt2712-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,32 +126,23 @@ static const struct mtk_gate mm_clks[] = {
GATE_MM2(CLK_MM_DSI3_DIGITAL, "mm_dsi3_digital", "dsi1_lntc", 6),
};

static int clk_mt2712_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data;
int r;

clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);

mtk_clk_register_gates(&pdev->dev, node, mm_clks,
ARRAY_SIZE(mm_clks), clk_data);

r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);

if (r != 0)
pr_err("%s(): could not register clock provider: %d\n",
__func__, r);
static const struct mtk_clk_desc mm_desc = {
.clks = mm_clks,
.num_clks = ARRAY_SIZE(mm_clks),
};

return r;
}
static const struct platform_device_id clk_mt2712_mm_id_table[] = {
{ .name = "clk-mt2712-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static struct platform_driver clk_mt2712_mm_drv = {
.probe = clk_mt2712_mm_probe,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
.driver = {
.name = "clk-mt2712-mm",
},
.id_table = clk_mt2712_mm_id_table,
};

builtin_platform_driver(clk_mt2712_mm_drv);
24 changes: 11 additions & 13 deletions drivers/clk/mediatek/clk-mt6779-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,25 +85,23 @@ static const struct mtk_gate mm_clks[] = {
GATE_MM1(CLK_MM_DISP_OVL_FBDC, "mm_disp_ovl_fbdc", "mm_sel", 16),
};

static int clk_mt6779_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data;

clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);

mtk_clk_register_gates(&pdev->dev, node, mm_clks,
ARRAY_SIZE(mm_clks), clk_data);
static const struct mtk_clk_desc mm_desc = {
.clks = mm_clks,
.num_clks = ARRAY_SIZE(mm_clks),
};

return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
}
static const struct platform_device_id clk_mt6779_mm_id_table[] = {
{ .name = "clk-mt6779-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static struct platform_driver clk_mt6779_mm_drv = {
.probe = clk_mt6779_mm_probe,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
.driver = {
.name = "clk-mt6779-mm",
},
.id_table = clk_mt6779_mm_id_table,
};

module_platform_driver(clk_mt6779_mm_drv);
Expand Down
55 changes: 11 additions & 44 deletions drivers/clk/mediatek/clk-mt6795-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,56 +76,23 @@ static const struct mtk_gate mm_gates[] = {
GATE_MM1(CLK_MM_DPI_ENGINE, "mm_dpi_engine", "mm_sel", 9),
};

static int clk_mt6795_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data;
int ret;

clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
if (!clk_data)
return -ENOMEM;

ret = mtk_clk_register_gates(&pdev->dev, node, mm_gates,
ARRAY_SIZE(mm_gates), clk_data);
if (ret)
goto free_clk_data;

ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (ret)
goto unregister_gates;

platform_set_drvdata(pdev, clk_data);

return 0;

unregister_gates:
mtk_clk_unregister_gates(mm_gates, ARRAY_SIZE(mm_gates), clk_data);
free_clk_data:
mtk_free_clk_data(clk_data);
return ret;
}

static int clk_mt6795_mm_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);

of_clk_del_provider(node);
mtk_clk_unregister_gates(mm_gates, ARRAY_SIZE(mm_gates), clk_data);
mtk_free_clk_data(clk_data);
static const struct mtk_clk_desc mm_desc = {
.clks = mm_gates,
.num_clks = ARRAY_SIZE(mm_gates),
};

return 0;
}
static const struct platform_device_id clk_mt6795_mm_id_table[] = {
{ .name = "clk-mt6795-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static struct platform_driver clk_mt6795_mm_drv = {
.driver = {
.name = "clk-mt6795-mm",
},
.probe = clk_mt6795_mm_probe,
.remove = clk_mt6795_mm_remove,
.id_table = clk_mt6795_mm_id_table,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
};
module_platform_driver(clk_mt6795_mm_drv);

Expand Down
31 changes: 11 additions & 20 deletions drivers/clk/mediatek/clk-mt6797-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,32 +92,23 @@ static const struct mtk_gate mm_clks[] = {
"clk26m", 3),
};

static int clk_mt6797_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data;
int r;

clk_data = mtk_alloc_clk_data(CLK_MM_NR);

mtk_clk_register_gates(&pdev->dev, node, mm_clks,
ARRAY_SIZE(mm_clks), clk_data);

r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (r)
dev_err(&pdev->dev,
"could not register clock provider: %s: %d\n",
pdev->name, r);
static const struct mtk_clk_desc mm_desc = {
.clks = mm_clks,
.num_clks = ARRAY_SIZE(mm_clks),
};

return r;
}
static const struct platform_device_id clk_mt6797_mm_id_table[] = {
{ .name = "clk-mt6797-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static struct platform_driver clk_mt6797_mm_drv = {
.probe = clk_mt6797_mm_probe,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
.driver = {
.name = "clk-mt6797-mm",
},
.id_table = clk_mt6797_mm_id_table,
};

builtin_platform_driver(clk_mt6797_mm_drv);
47 changes: 11 additions & 36 deletions drivers/clk/mediatek/clk-mt8167-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,47 +86,22 @@ static const struct mtk_gate mm_clks[] = {
GATE_MM1(CLK_MM_HDMI_PLL, "mm_hdmi_pll", "hdmtx_dig_cts", 21),
};

struct clk_mt8167_mm_driver_data {
const struct mtk_gate *gates_clk;
int gates_num;
static const struct mtk_clk_desc mm_desc = {
.clks = mm_clks,
.num_clks = ARRAY_SIZE(mm_clks),
};

static const struct clk_mt8167_mm_driver_data mt8167_mmsys_driver_data = {
.gates_clk = mm_clks,
.gates_num = ARRAY_SIZE(mm_clks),
static const struct platform_device_id clk_mt8167_mm_id_table[] = {
{ .name = "clk-mt8167-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static int clk_mt8167_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
const struct clk_mt8167_mm_driver_data *data;
struct clk_hw_onecell_data *clk_data;
int ret;

clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
if (!clk_data)
return -ENOMEM;

data = &mt8167_mmsys_driver_data;

ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
data->gates_num, clk_data);
if (ret)
return ret;

ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (ret)
return ret;

return 0;
}

static struct platform_driver clk_mt8173_mm_drv = {
static struct platform_driver clk_mt8167_mm_drv = {
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
.driver = {
.name = "clk-mt8167-mm",
},
.probe = clk_mt8167_mm_probe,
.id_table = clk_mt8167_mm_id_table,
};

builtin_platform_driver(clk_mt8173_mm_drv);
builtin_platform_driver(clk_mt8167_mm_drv);
58 changes: 10 additions & 48 deletions drivers/clk/mediatek/clk-mt8173-mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ static const struct mtk_gate_regs mm1_cg_regs = {
}

static const struct mtk_gate mt8173_mm_clks[] = {
GATE_DUMMY(CLK_DUMMY, "mm_dummy"),
/* MM0 */
GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 0),
GATE_MM0(CLK_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 1),
Expand Down Expand Up @@ -100,62 +101,23 @@ static const struct mtk_gate mt8173_mm_clks[] = {
GATE_MM1(CLK_MM_HDMI_HDCP24M, "mm_hdmi_hdcp24m", "hdcp_24m_sel", 20),
};

struct clk_mt8173_mm_driver_data {
const struct mtk_gate *gates_clk;
int gates_num;
static const struct mtk_clk_desc mm_desc = {
.clks = mt8173_mm_clks,
.num_clks = ARRAY_SIZE(mt8173_mm_clks),
};

static const struct clk_mt8173_mm_driver_data mt8173_mmsys_driver_data = {
.gates_clk = mt8173_mm_clks,
.gates_num = ARRAY_SIZE(mt8173_mm_clks),
static const struct platform_device_id clk_mt8173_mm_id_table[] = {
{ .name = "clk-mt8173-mm", .driver_data = (kernel_ulong_t)&mm_desc },
{ /* sentinel */ }
};

static int clk_mt8173_mm_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
const struct clk_mt8173_mm_driver_data *data;
struct clk_hw_onecell_data *clk_data;
int ret;

clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
if (!clk_data)
return -ENOMEM;

data = &mt8173_mmsys_driver_data;

ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
data->gates_num, clk_data);
if (ret)
return ret;

ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (ret)
return ret;

return 0;
}

static int clk_mt8173_mm_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->parent->of_node;
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
const struct clk_mt8173_mm_driver_data *data = &mt8173_mmsys_driver_data;

of_clk_del_provider(node);
mtk_clk_unregister_gates(data->gates_clk, data->gates_num, clk_data);
mtk_free_clk_data(clk_data);

return 0;
}

static struct platform_driver clk_mt8173_mm_drv = {
.driver = {
.name = "clk-mt8173-mm",
},
.probe = clk_mt8173_mm_probe,
.remove = clk_mt8173_mm_remove,
.id_table = clk_mt8173_mm_id_table,
.probe = mtk_clk_pdev_probe,
.remove = mtk_clk_pdev_remove,
};

builtin_platform_driver(clk_mt8173_mm_drv);
Expand Down
Loading

0 comments on commit 65c10c5

Please sign in to comment.