mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
clock flags add CLK_OPS_PARENT_ENABLE, parents need enable during gate/ungate, set rate and re-parent
Signed-off-by: zhengshaobo1 <zhengshaobo1@xiaomi.com>
This commit is contained in:
parent
be767dde01
commit
6e6ba062fd
2 changed files with 43 additions and 1 deletions
|
|
@ -495,6 +495,12 @@ static void clk_change_rate(FAR struct clk_s *clk, uint32_t best_parent_rate)
|
|||
|
||||
if (clk->new_parent && clk->new_parent != clk->parent)
|
||||
{
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_enable(old_parent);
|
||||
clk_enable(clk->new_parent);
|
||||
}
|
||||
|
||||
if (clk->enable_count)
|
||||
{
|
||||
clk_enable(clk->new_parent);
|
||||
|
|
@ -519,6 +525,12 @@ static void clk_change_rate(FAR struct clk_s *clk, uint32_t best_parent_rate)
|
|||
clk_disable(clk);
|
||||
clk_disable(old_parent);
|
||||
}
|
||||
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_disable(clk->new_parent);
|
||||
clk_disable(old_parent);
|
||||
}
|
||||
}
|
||||
|
||||
if (!skip_set_rate && clk->ops->set_rate)
|
||||
|
|
@ -789,9 +801,14 @@ static void clk_disable_unused_subtree(FAR struct clk_s *clk)
|
|||
clk_disable_unused_subtree(child);
|
||||
}
|
||||
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_enable(clk->parent);
|
||||
}
|
||||
|
||||
if (clk->enable_count)
|
||||
{
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (clk_is_enabled(clk))
|
||||
|
|
@ -805,6 +822,12 @@ static void clk_disable_unused_subtree(FAR struct clk_s *clk)
|
|||
clk->ops->disable(clk);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_disable(clk->parent);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
@ -1062,6 +1085,12 @@ int clk_set_parent(FAR struct clk_s *clk, FAR struct clk_s *parent)
|
|||
|
||||
old_parent = clk->parent;
|
||||
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_enable(old_parent);
|
||||
clk_enable(parent);
|
||||
}
|
||||
|
||||
if (clk->enable_count)
|
||||
{
|
||||
clk_enable(parent);
|
||||
|
|
@ -1085,6 +1114,12 @@ int clk_set_parent(FAR struct clk_s *clk, FAR struct clk_s *parent)
|
|||
clk_disable(parent);
|
||||
}
|
||||
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_disable(parent);
|
||||
clk_disable(old_parent);
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -1094,6 +1129,12 @@ int clk_set_parent(FAR struct clk_s *clk, FAR struct clk_s *parent)
|
|||
clk_disable(old_parent);
|
||||
}
|
||||
|
||||
if (clk->flags & CLK_OPS_PARENT_ENABLE)
|
||||
{
|
||||
clk_disable(parent);
|
||||
clk_disable(old_parent);
|
||||
}
|
||||
|
||||
__clk_recalc_rate(clk);
|
||||
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#define CLK_SET_RATE_GATE 0x01
|
||||
#define CLK_SET_PARENT_GATE 0x02
|
||||
#define CLK_SET_RATE_PARENT 0x04
|
||||
#define CLK_OPS_PARENT_ENABLE 0x08
|
||||
#define CLK_GET_RATE_NOCACHE 0x10
|
||||
#define CLK_NAME_IS_STATIC 0x20
|
||||
#define CLK_PARENT_NAME_IS_STATIC 0x40
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue