1 // SPDX-License-Identifier: GPL-2.0
4 * Memory Mapped IO Fixed clock driver
6 * Copyright (C) 2018 Cadence Design Systems, Inc.
9 * Jan Kotas <jank@cadence.com>
12 #include <linux/clk-provider.h>
14 #include <linux/module.h>
15 #include <linux/of_address.h>
16 #include <linux/platform_device.h>
18 static struct clk_hw
*fixed_mmio_clk_setup(struct device_node
*node
)
21 const char *clk_name
= node
->name
;
26 base
= of_iomap(node
, 0);
28 pr_err("%pOFn: failed to map address\n", node
);
34 of_property_read_string(node
, "clock-output-names", &clk_name
);
36 clk
= clk_hw_register_fixed_rate(NULL
, clk_name
, NULL
, 0, freq
);
38 pr_err("%pOFn: failed to register fixed rate clock\n", node
);
42 ret
= of_clk_add_hw_provider(node
, of_clk_hw_simple_get
, clk
);
44 pr_err("%pOFn: failed to add clock provider\n", node
);
45 clk_hw_unregister(clk
);
52 static void __init
of_fixed_mmio_clk_setup(struct device_node
*node
)
54 fixed_mmio_clk_setup(node
);
56 CLK_OF_DECLARE(fixed_mmio_clk
, "fixed-mmio-clock", of_fixed_mmio_clk_setup
);
59 * This is not executed when of_fixed_mmio_clk_setup succeeded.
61 static int of_fixed_mmio_clk_probe(struct platform_device
*pdev
)
65 clk
= fixed_mmio_clk_setup(pdev
->dev
.of_node
);
69 platform_set_drvdata(pdev
, clk
);
74 static void of_fixed_mmio_clk_remove(struct platform_device
*pdev
)
76 struct clk_hw
*clk
= platform_get_drvdata(pdev
);
78 of_clk_del_provider(pdev
->dev
.of_node
);
79 clk_hw_unregister_fixed_rate(clk
);
82 static const struct of_device_id of_fixed_mmio_clk_ids
[] = {
83 { .compatible
= "fixed-mmio-clock" },
86 MODULE_DEVICE_TABLE(of
, of_fixed_mmio_clk_ids
);
88 static struct platform_driver of_fixed_mmio_clk_driver
= {
90 .name
= "of_fixed_mmio_clk",
91 .of_match_table
= of_fixed_mmio_clk_ids
,
93 .probe
= of_fixed_mmio_clk_probe
,
94 .remove
= of_fixed_mmio_clk_remove
,
96 module_platform_driver(of_fixed_mmio_clk_driver
);
98 MODULE_AUTHOR("Jan Kotas <jank@cadence.com>");
99 MODULE_DESCRIPTION("Memory Mapped IO Fixed clock driver");