Commit 7edc3f20 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk fixes from Stephen Boyd:
 "Here's a trio of fixes:

   - The runtime PM clk patches that landed this merge window forgot to
     runtime resume devices that may be off while recalculating and
     setting rates of child clks of whatever clk is changing rates.

   - We had a NULL pointer deref in an old clk tracepoint when
     clk_set_parent() is called with a NULL parent pointer. This
     shouldn't really happen, but it's best to avoid this regardless.

   - The sun9i-mmc clk driver didn't provide 'reset' support, just
     'assert' and 'deassert' so the MMC driver stopped probing when the
     probe was changed to do a reset instead of assert/deassert pair.
     This implements the reset so things work again"

* tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
  clk: sunxi: sun9i-mmc: Implement reset callback for reset controls
  clk: fix a panic error caused by accessing NULL pointer
  clk: Manage proper runtime PM state in clk_change_rate()
parents ead68f21 61d2f2a0
...@@ -1564,6 +1564,9 @@ static void clk_change_rate(struct clk_core *core) ...@@ -1564,6 +1564,9 @@ static void clk_change_rate(struct clk_core *core)
best_parent_rate = core->parent->rate; best_parent_rate = core->parent->rate;
} }
if (clk_pm_runtime_get(core))
return;
if (core->flags & CLK_SET_RATE_UNGATE) { if (core->flags & CLK_SET_RATE_UNGATE) {
unsigned long flags; unsigned long flags;
...@@ -1634,6 +1637,8 @@ static void clk_change_rate(struct clk_core *core) ...@@ -1634,6 +1637,8 @@ static void clk_change_rate(struct clk_core *core)
/* handle the new child who might not be in core->children yet */ /* handle the new child who might not be in core->children yet */
if (core->new_child) if (core->new_child)
clk_change_rate(core->new_child); clk_change_rate(core->new_child);
clk_pm_runtime_put(core);
} }
static int clk_core_set_rate_nolock(struct clk_core *core, static int clk_core_set_rate_nolock(struct clk_core *core,
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -83,9 +84,20 @@ static int sun9i_mmc_reset_deassert(struct reset_controller_dev *rcdev, ...@@ -83,9 +84,20 @@ static int sun9i_mmc_reset_deassert(struct reset_controller_dev *rcdev,
return 0; return 0;
} }
static int sun9i_mmc_reset_reset(struct reset_controller_dev *rcdev,
unsigned long id)
{
sun9i_mmc_reset_assert(rcdev, id);
udelay(10);
sun9i_mmc_reset_deassert(rcdev, id);
return 0;
}
static const struct reset_control_ops sun9i_mmc_reset_ops = { static const struct reset_control_ops sun9i_mmc_reset_ops = {
.assert = sun9i_mmc_reset_assert, .assert = sun9i_mmc_reset_assert,
.deassert = sun9i_mmc_reset_deassert, .deassert = sun9i_mmc_reset_deassert,
.reset = sun9i_mmc_reset_reset,
}; };
static int sun9i_a80_mmc_config_clk_probe(struct platform_device *pdev) static int sun9i_a80_mmc_config_clk_probe(struct platform_device *pdev)
......
...@@ -134,12 +134,12 @@ DECLARE_EVENT_CLASS(clk_parent, ...@@ -134,12 +134,12 @@ DECLARE_EVENT_CLASS(clk_parent,
TP_STRUCT__entry( TP_STRUCT__entry(
__string( name, core->name ) __string( name, core->name )
__string( pname, parent->name ) __string( pname, parent ? parent->name : "none" )
), ),
TP_fast_assign( TP_fast_assign(
__assign_str(name, core->name); __assign_str(name, core->name);
__assign_str(pname, parent->name); __assign_str(pname, parent ? parent->name : "none");
), ),
TP_printk("%s %s", __get_str(name), __get_str(pname)) TP_printk("%s %s", __get_str(name), __get_str(pname))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment