Skip to content

Commit

Permalink
drivers: clk: st: Add clock propagation for audio clocks
Browse files Browse the repository at this point in the history
This patch allows fine tuning of the quads FS for audio clocks
accuracy.

Signed-off-by: Olivier Bideau <[email protected]>
Signed-off-by: Gabriel Fernandez <[email protected]>
Acked-by: Peter Griffin <[email protected]>
Signed-off-by: Stephen Boyd <[email protected]>
  • Loading branch information
Gabriel-Fernandez-stm authored and bebarino committed Sep 16, 2016
1 parent b699f3e commit 26bd0a5
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Documentation/devicetree/bindings/clock/st/st,flexgen.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ This binding uses the common clock binding[2].
Required properties:
- compatible : shall be:
"st,flexgen"
"st,flexgen-audio", "st,flexgen" (enable clock propagation on parent for
audio use case)

- #clock-cells : from common clock binding; shall be set to 1 (multiple clock
outputs).
Expand Down
26 changes: 25 additions & 1 deletion drivers/clk/st/clk-flexgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
#include <linux/of.h>
#include <linux/of_address.h>

struct clkgen_data {
unsigned long flags;
};

struct flexgen {
struct clk_hw hw;

Expand Down Expand Up @@ -259,6 +263,18 @@ static const char ** __init flexgen_get_parents(struct device_node *np,
return parents;
}

static const struct clkgen_data clkgen_audio = {
.flags = CLK_SET_RATE_PARENT,
};

static const struct of_device_id flexgen_of_match[] = {
{
.compatible = "st,flexgen-audio",
.data = &clkgen_audio,
},
{}
};

static void __init st_of_flexgen_setup(struct device_node *np)
{
struct device_node *pnode;
Expand All @@ -267,6 +283,9 @@ static void __init st_of_flexgen_setup(struct device_node *np)
const char **parents;
int num_parents, i;
spinlock_t *rlock = NULL;
const struct of_device_id *match;
struct clkgen_data *data = NULL;
unsigned long flex_flags = 0;
int ret;

pnode = of_get_parent(np);
Expand All @@ -281,6 +300,12 @@ static void __init st_of_flexgen_setup(struct device_node *np)
if (!parents)
return;

match = of_match_node(flexgen_of_match, np);
if (match) {
data = (struct clkgen_data *)match->data;
flex_flags = data->flags;
}

clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
if (!clk_data)
goto err;
Expand All @@ -307,7 +332,6 @@ static void __init st_of_flexgen_setup(struct device_node *np)
for (i = 0; i < clk_data->clk_num; i++) {
struct clk *clk;
const char *clk_name;
unsigned long flex_flags = 0;

if (of_property_read_string_index(np, "clock-output-names",
i, &clk_name)) {
Expand Down

0 comments on commit 26bd0a5

Please sign in to comment.