aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/clk-divider.c11
-rw-r--r--drivers/clk/nxp/clk-lpc18xx-ccu.c2
-rw-r--r--drivers/clk/rockchip/clk.c4
-rw-r--r--include/linux/clk-provider.h1
4 files changed, 15 insertions, 3 deletions
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index ded3ff4b91b9..aa1dacdaa39d 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -423,6 +423,12 @@ const struct clk_ops clk_divider_ops = {
423}; 423};
424EXPORT_SYMBOL_GPL(clk_divider_ops); 424EXPORT_SYMBOL_GPL(clk_divider_ops);
425 425
426const struct clk_ops clk_divider_ro_ops = {
427 .recalc_rate = clk_divider_recalc_rate,
428 .round_rate = clk_divider_round_rate,
429};
430EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
431
426static struct clk *_register_divider(struct device *dev, const char *name, 432static struct clk *_register_divider(struct device *dev, const char *name,
427 const char *parent_name, unsigned long flags, 433 const char *parent_name, unsigned long flags,
428 void __iomem *reg, u8 shift, u8 width, 434 void __iomem *reg, u8 shift, u8 width,
@@ -446,7 +452,10 @@ static struct clk *_register_divider(struct device *dev, const char *name,
446 return ERR_PTR(-ENOMEM); 452 return ERR_PTR(-ENOMEM);
447 453
448 init.name = name; 454 init.name = name;
449 init.ops = &clk_divider_ops; 455 if (clk_divider_flags & CLK_DIVIDER_READ_ONLY)
456 init.ops = &clk_divider_ro_ops;
457 else
458 init.ops = &clk_divider_ops;
450 init.flags = flags | CLK_IS_BASIC; 459 init.flags = flags | CLK_IS_BASIC;
451 init.parent_names = (parent_name ? &parent_name: NULL); 460 init.parent_names = (parent_name ? &parent_name: NULL);
452 init.num_parents = (parent_name ? 1 : 0); 461 init.num_parents = (parent_name ? 1 : 0);
diff --git a/drivers/clk/nxp/clk-lpc18xx-ccu.c b/drivers/clk/nxp/clk-lpc18xx-ccu.c
index 13aabbb3acbe..558da89555af 100644
--- a/drivers/clk/nxp/clk-lpc18xx-ccu.c
+++ b/drivers/clk/nxp/clk-lpc18xx-ccu.c
@@ -222,7 +222,7 @@ static void lpc18xx_ccu_register_branch_gate_div(struct lpc18xx_clk_branch *bran
222 div->width = 1; 222 div->width = 1;
223 223
224 div_hw = &div->hw; 224 div_hw = &div->hw;
225 div_ops = &clk_divider_ops; 225 div_ops = &clk_divider_ro_ops;
226 } 226 }
227 227
228 branch->gate.reg = branch->offset + reg_base; 228 branch->gate.reg = branch->offset + reg_base;
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index d9a0b5d4d47f..f7e8693ad28b 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -90,7 +90,9 @@ static struct clk *rockchip_clk_register_branch(const char *name,
90 div->width = div_width; 90 div->width = div_width;
91 div->lock = lock; 91 div->lock = lock;
92 div->table = div_table; 92 div->table = div_table;
93 div_ops = &clk_divider_ops; 93 div_ops = (div_flags & CLK_DIVIDER_READ_ONLY)
94 ? &clk_divider_ro_ops
95 : &clk_divider_ops;
94 } 96 }
95 97
96 clk = clk_register_composite(NULL, name, parent_names, num_parents, 98 clk = clk_register_composite(NULL, name, parent_names, num_parents,
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index 1143e38555a4..408a60dca353 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -385,6 +385,7 @@ struct clk_divider {
385#define CLK_DIVIDER_MAX_AT_ZERO BIT(6) 385#define CLK_DIVIDER_MAX_AT_ZERO BIT(6)
386 386
387extern const struct clk_ops clk_divider_ops; 387extern const struct clk_ops clk_divider_ops;
388extern const struct clk_ops clk_divider_ro_ops;
388 389
389unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate, 390unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate,
390 unsigned int val, const struct clk_div_table *table, 391 unsigned int val, const struct clk_div_table *table,