Merge branches 'clk-versatile', 'clk-doc', 'clk-must-check', 'clk-qcom' and 'clk-debugfs' into clk-next
* clk-versatile: clk: versatile: Remove WARNs in ->round_rate() clk: versatile: add min/max rate boundaries for vexpress osc clock * clk-doc: Documentation: clk: enable lock is not held for clk_is_enabled API * clk-must-check: clk: add more __must_check for bulk APIs * clk-qcom: clk: qcom: smd-rpm: Migrate to devm_of_clk_add_hw_provider() clk: qcom: gcc-msm8996: Mark aggre0 noc clks as critical * clk-debugfs: clk: Re-use DEFINE_SHOW_ATTRIBUTE() macro
This commit is contained in:
commit
caa9f3b7d7
|
@ -268,9 +268,19 @@ The common clock framework uses two global locks, the prepare lock and the
|
|||
enable lock.
|
||||
|
||||
The enable lock is a spinlock and is held across calls to the .enable,
|
||||
.disable and .is_enabled operations. Those operations are thus not allowed to
|
||||
sleep, and calls to the clk_enable(), clk_disable() and clk_is_enabled() API
|
||||
functions are allowed in atomic context.
|
||||
.disable operations. Those operations are thus not allowed to sleep,
|
||||
and calls to the clk_enable(), clk_disable() API functions are allowed in
|
||||
atomic context.
|
||||
|
||||
For clk_is_enabled() API, it is also designed to be allowed to be used in
|
||||
atomic context. However, it doesn't really make any sense to hold the enable
|
||||
lock in core, unless you want to do something else with the information of
|
||||
the enable state with that lock held. Otherwise, seeing if a clk is enabled is
|
||||
a one-shot read of the enabled state, which could just as easily change after
|
||||
the function returns because the lock is released. Thus the user of this API
|
||||
needs to handle synchronizing the read of the state with whatever they're
|
||||
using it for to make sure that the enable state doesn't change during that
|
||||
time.
|
||||
|
||||
The prepare lock is a mutex and is held across calls to all other operations.
|
||||
All those operations are allowed to sleep, and calls to the corresponding API
|
||||
|
|
|
@ -2488,19 +2488,7 @@ static int clk_summary_show(struct seq_file *s, void *data)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int clk_summary_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, clk_summary_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations clk_summary_fops = {
|
||||
.open = clk_summary_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(clk_summary);
|
||||
|
||||
static void clk_dump_one(struct seq_file *s, struct clk_core *c, int level)
|
||||
{
|
||||
|
@ -2534,7 +2522,7 @@ static void clk_dump_subtree(struct seq_file *s, struct clk_core *c, int level)
|
|||
seq_putc(s, '}');
|
||||
}
|
||||
|
||||
static int clk_dump(struct seq_file *s, void *data)
|
||||
static int clk_dump_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct clk_core *c;
|
||||
bool first_node = true;
|
||||
|
@ -2557,19 +2545,7 @@ static int clk_dump(struct seq_file *s, void *data)
|
|||
seq_puts(s, "}\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int clk_dump_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, clk_dump, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations clk_dump_fops = {
|
||||
.open = clk_dump_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(clk_dump);
|
||||
|
||||
static const struct {
|
||||
unsigned long flag;
|
||||
|
@ -2591,7 +2567,7 @@ static const struct {
|
|||
#undef ENTRY
|
||||
};
|
||||
|
||||
static int clk_flags_dump(struct seq_file *s, void *data)
|
||||
static int clk_flags_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct clk_core *core = s->private;
|
||||
unsigned long flags = core->flags;
|
||||
|
@ -2610,20 +2586,9 @@ static int clk_flags_dump(struct seq_file *s, void *data)
|
|||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(clk_flags);
|
||||
|
||||
static int clk_flags_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, clk_flags_dump, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations clk_flags_fops = {
|
||||
.open = clk_flags_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int possible_parents_dump(struct seq_file *s, void *data)
|
||||
static int possible_parents_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct clk_core *core = s->private;
|
||||
int i;
|
||||
|
@ -2635,18 +2600,7 @@ static int possible_parents_dump(struct seq_file *s, void *data)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int possible_parents_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, possible_parents_dump, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations possible_parents_fops = {
|
||||
.open = possible_parents_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
DEFINE_SHOW_ATTRIBUTE(possible_parents);
|
||||
|
||||
static int clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)
|
||||
{
|
||||
|
|
|
@ -686,7 +686,7 @@ static int rpm_smd_clk_probe(struct platform_device *pdev)
|
|||
goto err;
|
||||
}
|
||||
|
||||
ret = of_clk_add_hw_provider(pdev->dev.of_node, qcom_smdrpm_clk_hw_get,
|
||||
ret = devm_of_clk_add_hw_provider(&pdev->dev, qcom_smdrpm_clk_hw_get,
|
||||
rcc);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
@ -697,19 +697,12 @@ static int rpm_smd_clk_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int rpm_smd_clk_remove(struct platform_device *pdev)
|
||||
{
|
||||
of_clk_del_provider(pdev->dev.of_node);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver rpm_smd_clk_driver = {
|
||||
.driver = {
|
||||
.name = "qcom-clk-smd-rpm",
|
||||
.of_match_table = rpm_smd_clk_match_table,
|
||||
},
|
||||
.probe = rpm_smd_clk_probe,
|
||||
.remove = rpm_smd_clk_remove,
|
||||
};
|
||||
|
||||
static int __init rpm_smd_clk_init(void)
|
||||
|
|
|
@ -2895,7 +2895,7 @@ static struct clk_branch gcc_aggre0_snoc_axi_clk = {
|
|||
.name = "gcc_aggre0_snoc_axi_clk",
|
||||
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
|
@ -2910,7 +2910,7 @@ static struct clk_branch gcc_aggre0_cnoc_ahb_clk = {
|
|||
.name = "gcc_aggre0_cnoc_ahb_clk",
|
||||
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
|
@ -2925,7 +2925,7 @@ static struct clk_branch gcc_smmu_aggre0_axi_clk = {
|
|||
.name = "gcc_smmu_aggre0_axi_clk",
|
||||
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
|
@ -2940,7 +2940,7 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = {
|
|||
.name = "gcc_smmu_aggre0_ahb_clk",
|
||||
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
|
|
|
@ -44,10 +44,10 @@ static long vexpress_osc_round_rate(struct clk_hw *hw, unsigned long rate,
|
|||
{
|
||||
struct vexpress_osc *osc = to_vexpress_osc(hw);
|
||||
|
||||
if (WARN_ON(osc->rate_min && rate < osc->rate_min))
|
||||
if (osc->rate_min && rate < osc->rate_min)
|
||||
rate = osc->rate_min;
|
||||
|
||||
if (WARN_ON(osc->rate_max && rate > osc->rate_max))
|
||||
if (osc->rate_max && rate > osc->rate_max)
|
||||
rate = osc->rate_max;
|
||||
|
||||
return rate;
|
||||
|
@ -104,6 +104,7 @@ static int vexpress_osc_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(clk);
|
||||
|
||||
of_clk_add_provider(pdev->dev.of_node, of_clk_src_simple_get, clk);
|
||||
clk_hw_set_rate_range(&osc->hw, osc->rate_min, osc->rate_max);
|
||||
|
||||
dev_dbg(&pdev->dev, "Registered clock '%s'\n", init.name);
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ static inline int clk_prepare(struct clk *clk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int clk_bulk_prepare(int num_clks, struct clk_bulk_data *clks)
|
||||
static inline int __must_check clk_bulk_prepare(int num_clks, struct clk_bulk_data *clks)
|
||||
{
|
||||
might_sleep();
|
||||
return 0;
|
||||
|
@ -603,8 +603,8 @@ static inline struct clk *clk_get(struct device *dev, const char *id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int clk_bulk_get(struct device *dev, int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
static inline int __must_check clk_bulk_get(struct device *dev, int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -614,8 +614,8 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int devm_clk_bulk_get(struct device *dev, int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
static inline int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -645,7 +645,7 @@ static inline int clk_enable(struct clk *clk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int clk_bulk_enable(int num_clks, struct clk_bulk_data *clks)
|
||||
static inline int __must_check clk_bulk_enable(int num_clks, struct clk_bulk_data *clks)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -719,8 +719,8 @@ static inline void clk_disable_unprepare(struct clk *clk)
|
|||
clk_unprepare(clk);
|
||||
}
|
||||
|
||||
static inline int clk_bulk_prepare_enable(int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
static inline int __must_check clk_bulk_prepare_enable(int num_clks,
|
||||
struct clk_bulk_data *clks)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
|
Loading…
Reference in New Issue