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.
|
enable lock.
|
||||||
|
|
||||||
The enable lock is a spinlock and is held across calls to the .enable,
|
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
|
.disable operations. Those operations are thus not allowed to sleep,
|
||||||
sleep, and calls to the clk_enable(), clk_disable() and clk_is_enabled() API
|
and calls to the clk_enable(), clk_disable() API functions are allowed in
|
||||||
functions are allowed in atomic context.
|
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.
|
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
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
DEFINE_SHOW_ATTRIBUTE(clk_summary);
|
||||||
|
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void clk_dump_one(struct seq_file *s, struct clk_core *c, int level)
|
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, '}');
|
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;
|
struct clk_core *c;
|
||||||
bool first_node = true;
|
bool first_node = true;
|
||||||
|
@ -2557,19 +2545,7 @@ static int clk_dump(struct seq_file *s, void *data)
|
||||||
seq_puts(s, "}\n");
|
seq_puts(s, "}\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
DEFINE_SHOW_ATTRIBUTE(clk_dump);
|
||||||
|
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
unsigned long flag;
|
unsigned long flag;
|
||||||
|
@ -2591,7 +2567,7 @@ static const struct {
|
||||||
#undef ENTRY
|
#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;
|
struct clk_core *core = s->private;
|
||||||
unsigned long flags = core->flags;
|
unsigned long flags = core->flags;
|
||||||
|
@ -2610,20 +2586,9 @@ static int clk_flags_dump(struct seq_file *s, void *data)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
DEFINE_SHOW_ATTRIBUTE(clk_flags);
|
||||||
|
|
||||||
static int clk_flags_open(struct inode *inode, struct file *file)
|
static int possible_parents_show(struct seq_file *s, void *data)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
struct clk_core *core = s->private;
|
struct clk_core *core = s->private;
|
||||||
int i;
|
int i;
|
||||||
|
@ -2635,18 +2600,7 @@ static int possible_parents_dump(struct seq_file *s, void *data)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
DEFINE_SHOW_ATTRIBUTE(possible_parents);
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)
|
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;
|
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);
|
rcc);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -697,19 +697,12 @@ err:
|
||||||
return ret;
|
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 = {
|
static struct platform_driver rpm_smd_clk_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "qcom-clk-smd-rpm",
|
.name = "qcom-clk-smd-rpm",
|
||||||
.of_match_table = rpm_smd_clk_match_table,
|
.of_match_table = rpm_smd_clk_match_table,
|
||||||
},
|
},
|
||||||
.probe = rpm_smd_clk_probe,
|
.probe = rpm_smd_clk_probe,
|
||||||
.remove = rpm_smd_clk_remove,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init rpm_smd_clk_init(void)
|
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",
|
.name = "gcc_aggre0_snoc_axi_clk",
|
||||||
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||||
.ops = &clk_branch2_ops,
|
.ops = &clk_branch2_ops,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -2910,7 +2910,7 @@ static struct clk_branch gcc_aggre0_cnoc_ahb_clk = {
|
||||||
.name = "gcc_aggre0_cnoc_ahb_clk",
|
.name = "gcc_aggre0_cnoc_ahb_clk",
|
||||||
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||||
.ops = &clk_branch2_ops,
|
.ops = &clk_branch2_ops,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -2925,7 +2925,7 @@ static struct clk_branch gcc_smmu_aggre0_axi_clk = {
|
||||||
.name = "gcc_smmu_aggre0_axi_clk",
|
.name = "gcc_smmu_aggre0_axi_clk",
|
||||||
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
.parent_names = (const char *[]){ "system_noc_clk_src" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||||
.ops = &clk_branch2_ops,
|
.ops = &clk_branch2_ops,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -2940,7 +2940,7 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = {
|
||||||
.name = "gcc_smmu_aggre0_ahb_clk",
|
.name = "gcc_smmu_aggre0_ahb_clk",
|
||||||
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
.parent_names = (const char *[]){ "config_noc_clk_src" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||||
.ops = &clk_branch2_ops,
|
.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);
|
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;
|
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;
|
rate = osc->rate_max;
|
||||||
|
|
||||||
return rate;
|
return rate;
|
||||||
|
@ -104,6 +104,7 @@ static int vexpress_osc_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
|
|
||||||
of_clk_add_provider(pdev->dev.of_node, of_clk_src_simple_get, 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);
|
dev_dbg(&pdev->dev, "Registered clock '%s'\n", init.name);
|
||||||
|
|
||||||
|
|
|
@ -209,7 +209,7 @@ static inline int clk_prepare(struct clk *clk)
|
||||||
return 0;
|
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();
|
might_sleep();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -603,8 +603,8 @@ static inline struct clk *clk_get(struct device *dev, const char *id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int clk_bulk_get(struct device *dev, int num_clks,
|
static inline int __must_check clk_bulk_get(struct device *dev, int num_clks,
|
||||||
struct clk_bulk_data *clks)
|
struct clk_bulk_data *clks)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -614,8 +614,8 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int devm_clk_bulk_get(struct device *dev, int num_clks,
|
static inline int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
|
||||||
struct clk_bulk_data *clks)
|
struct clk_bulk_data *clks)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -645,7 +645,7 @@ static inline int clk_enable(struct clk *clk)
|
||||||
return 0;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -719,8 +719,8 @@ static inline void clk_disable_unprepare(struct clk *clk)
|
||||||
clk_unprepare(clk);
|
clk_unprepare(clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int clk_bulk_prepare_enable(int num_clks,
|
static inline int __must_check clk_bulk_prepare_enable(int num_clks,
|
||||||
struct clk_bulk_data *clks)
|
struct clk_bulk_data *clks)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue