summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/microchip/Makefile2
-rw-r--r--drivers/clk/microchip/mpfs_clk.c18
-rw-r--r--drivers/clk/microchip/mpfs_clk.h12
-rw-r--r--drivers/clk/microchip/mpfs_clk_cfg.c7
-rw-r--r--drivers/clk/microchip/mpfs_clk_periph.c16
5 files changed, 20 insertions, 35 deletions
diff --git a/drivers/clk/microchip/Makefile b/drivers/clk/microchip/Makefile
index 904b345d75f..329b2c0c93f 100644
--- a/drivers/clk/microchip/Makefile
+++ b/drivers/clk/microchip/Makefile
@@ -1 +1 @@
-obj-y += mpfs_clk.o mpfs_clk_cfg.o mpfs_clk_periph.o
+obj-y += mpfs_clk.o mpfs_clk_cfg.o mpfs_clk_periph.o mpfs_clk_msspll.o
diff --git a/drivers/clk/microchip/mpfs_clk.c b/drivers/clk/microchip/mpfs_clk.c
index 67828c9bf40..7ba1218b56e 100644
--- a/drivers/clk/microchip/mpfs_clk.c
+++ b/drivers/clk/microchip/mpfs_clk.c
@@ -11,34 +11,32 @@
#include <dm/device.h>
#include <dm/devres.h>
#include <dm/uclass.h>
+#include <dt-bindings/clock/microchip-mpfs-clock.h>
#include <linux/err.h>
#include "mpfs_clk.h"
static int mpfs_clk_probe(struct udevice *dev)
{
- int ret;
+ struct clk *parent_clk = dev_get_priv(dev);
+ struct clk clk_ahb = { .id = CLK_AHB };
void __iomem *base;
- u32 clk_rate;
- const char *parent_clk_name;
- struct clk *clk = dev_get_priv(dev);
+ int ret;
base = dev_read_addr_ptr(dev);
if (!base)
return -EINVAL;
- ret = clk_get_by_index(dev, 0, clk);
+ ret = clk_get_by_index(dev, 0, parent_clk);
if (ret)
return ret;
- dev_read_u32(clk->dev, "clock-frequency", &clk_rate);
- parent_clk_name = clk->dev->name;
-
- ret = mpfs_clk_register_cfgs(base, clk_rate, parent_clk_name);
+ ret = mpfs_clk_register_cfgs(base, parent_clk);
if (ret)
return ret;
- ret = mpfs_clk_register_periphs(base, clk_rate, "clk_ahb");
+ clk_request(dev, &clk_ahb);
+ ret = mpfs_clk_register_periphs(base, &clk_ahb);
return ret;
}
diff --git a/drivers/clk/microchip/mpfs_clk.h b/drivers/clk/microchip/mpfs_clk.h
index 442562a5e7b..35cfeac92e8 100644
--- a/drivers/clk/microchip/mpfs_clk.h
+++ b/drivers/clk/microchip/mpfs_clk.h
@@ -11,22 +11,18 @@
* mpfs_clk_register_cfgs() - register configuration clocks
*
* @base: base address of the mpfs system register.
- * @clk_rate: the mpfs pll clock rate.
- * @parent_name: a pointer to parent clock name.
+ * @parent: a pointer to parent clock.
* Return: zero on success, or a negative error code.
*/
-int mpfs_clk_register_cfgs(void __iomem *base, u32 clk_rate,
- const char *parent_name);
+int mpfs_clk_register_cfgs(void __iomem *base, struct clk *parent);
/**
* mpfs_clk_register_periphs() - register peripheral clocks
*
* @base: base address of the mpfs system register.
- * @clk_rate: the mpfs pll clock rate.
- * @parent_name: a pointer to parent clock name.
+ * @parent: a pointer to parent clock.
* Return: zero on success, or a negative error code.
*/
-int mpfs_clk_register_periphs(void __iomem *base, u32 clk_rate,
- const char *parent_name);
+int mpfs_clk_register_periphs(void __iomem *base, struct clk *parent);
/**
* divider_get_val() - get the clock divider value
*
diff --git a/drivers/clk/microchip/mpfs_clk_cfg.c b/drivers/clk/microchip/mpfs_clk_cfg.c
index fefddd14137..5739fd66e8d 100644
--- a/drivers/clk/microchip/mpfs_clk_cfg.c
+++ b/drivers/clk/microchip/mpfs_clk_cfg.c
@@ -117,8 +117,7 @@ static struct mpfs_cfg_hw_clock mpfs_cfg_clks[] = {
CLK_CFG(CLK_AHB, "clk_ahb", 4, 2, mpfs_div_ahb_table, 0),
};
-int mpfs_clk_register_cfgs(void __iomem *base, u32 clk_rate,
- const char *parent_name)
+int mpfs_clk_register_cfgs(void __iomem *base, struct clk *parent)
{
int ret;
int i, id, num_clks;
@@ -129,9 +128,9 @@ int mpfs_clk_register_cfgs(void __iomem *base, u32 clk_rate,
for (i = 0; i < num_clks; i++) {
hw = &mpfs_cfg_clks[i].hw;
mpfs_cfg_clks[i].sys_base = base;
- mpfs_cfg_clks[i].prate = clk_rate;
+ mpfs_cfg_clks[i].prate = clk_get_rate(parent);
name = mpfs_cfg_clks[i].cfg.name;
- ret = clk_register(hw, MPFS_CFG_CLOCK, name, parent_name);
+ ret = clk_register(hw, MPFS_CFG_CLOCK, name, parent->dev->name);
if (ret)
ERR_PTR(ret);
id = mpfs_cfg_clks[i].cfg.id;
diff --git a/drivers/clk/microchip/mpfs_clk_periph.c b/drivers/clk/microchip/mpfs_clk_periph.c
index 61d90eb4a85..1488ef503ed 100644
--- a/drivers/clk/microchip/mpfs_clk_periph.c
+++ b/drivers/clk/microchip/mpfs_clk_periph.c
@@ -99,16 +99,9 @@ static int mpfs_periph_clk_disable(struct clk *hw)
static ulong mpfs_periph_clk_recalc_rate(struct clk *hw)
{
struct mpfs_periph_hw_clock *periph_hw = to_mpfs_periph_clk(hw);
- void __iomem *base_addr = periph_hw->sys_base;
- unsigned long rate;
- u32 val;
- val = readl(base_addr + REG_CLOCK_CONFIG_CR) >> CFG_AHB_SHIFT;
- val &= clk_div_mask(CFG_WIDTH);
- rate = periph_hw->prate / (1u << val);
- hw->rate = rate;
+ return periph_hw->prate;
- return rate;
}
#define CLK_PERIPH(_id, _name, _shift, _flags) { \
@@ -150,8 +143,7 @@ static struct mpfs_periph_hw_clock mpfs_periph_clks[] = {
CLK_PERIPH(CLK_CFM, "clk_periph_cfm", 29, 0),
};
-int mpfs_clk_register_periphs(void __iomem *base, u32 clk_rate,
- const char *parent_name)
+int mpfs_clk_register_periphs(void __iomem *base, struct clk *parent)
{
int ret;
int i, id, num_clks;
@@ -162,9 +154,9 @@ int mpfs_clk_register_periphs(void __iomem *base, u32 clk_rate,
for (i = 0; i < num_clks; i++) {
hw = &mpfs_periph_clks[i].hw;
mpfs_periph_clks[i].sys_base = base;
- mpfs_periph_clks[i].prate = clk_rate;
+ mpfs_periph_clks[i].prate = clk_get_rate(parent);
name = mpfs_periph_clks[i].periph.name;
- ret = clk_register(hw, MPFS_PERIPH_CLOCK, name, parent_name);
+ ret = clk_register(hw, MPFS_PERIPH_CLOCK, name, parent->dev->name);
if (ret)
ERR_PTR(ret);
id = mpfs_periph_clks[i].periph.id;