Skip to content

Commit

Permalink
Merge series "ASoC: rsnd: add D3 support" from Kuninori Morimoto <kun…
Browse files Browse the repository at this point in the history
[email protected]>:

Hi Mark, Rob

These adds R-Car D3 support for rsnd driver.
[1/3] is tidyup patch for dt-bindings (not only for D3).
[2/3], [3/3] are for R-Car D3.

Kuninori Morimoto (3):
  ASoC: dt-bindings: renesas: rsnd: tidyup properties
  ASoC: rsnd: tidyup loop on rsnd_adg_clk_query()
  ASoC: rsnd: add null CLOCKIN support

 .../bindings/sound/renesas,rsnd.yaml          | 10 ++++-
 sound/soc/sh/rcar/adg.c                       | 37 ++++++++++++++++---
 2 files changed, 41 insertions(+), 6 deletions(-)

--
2.25.1
  • Loading branch information
broonie committed May 24, 2021
2 parents af00978 + d6956a7 commit eb37ca9
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
10 changes: 9 additions & 1 deletion Documentation/devicetree/bindings/sound/renesas,rsnd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,11 @@ properties:
power-domains: true

resets:
minItems: 1
maxItems: 11

reset-names:
minItems: 1
maxItems: 11

clocks:
Expand All @@ -110,6 +112,13 @@ properties:
- pattern: '^dvc\.[0-1]$'
- pattern: '^clk_(a|b|c|i)$'

ports:
$ref: /schemas/graph.yaml#/properties/ports
properties:
port(@[0-9a-f]+)?:
$ref: audio-graph-port.yaml#
unevaluatedProperties: false

port:
$ref: audio-graph-port.yaml#
unevaluatedProperties: false
Expand Down Expand Up @@ -257,7 +266,6 @@ required:
- "#sound-dai-cells"

allOf:
- $ref: audio-graph.yaml#
- if:
properties:
compatible:
Expand Down
37 changes: 32 additions & 5 deletions sound/soc/sh/rcar/adg.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// Helper routines for R-Car sound ADG.
//
// Copyright (C) 2013 Kuninori Morimoto <[email protected]>

#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include "rsnd.h"

#define CLKA 0
Expand Down Expand Up @@ -290,7 +290,6 @@ static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
{
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
struct clk *clk;
int i;
int sel_table[] = {
[CLKA] = 0x1,
Expand All @@ -303,10 +302,9 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
* find suitable clock from
* AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI.
*/
for_each_rsnd_clk(clk, adg, i) {
for (i = 0; i < CLKMAX; i++)
if (rate == adg->clk_rate[i])
return sel_table[i];
}

/*
* find divided clock from BRGA/BRGB
Expand Down Expand Up @@ -391,6 +389,30 @@ void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable)
}
}

#define NULL_CLK "rsnd_adg_null"
static struct clk *rsnd_adg_null_clk_get(struct rsnd_priv *priv)
{
static struct clk_hw *hw;
struct device *dev = rsnd_priv_to_dev(priv);

if (!hw) {
struct clk_hw *_hw;
int ret;

_hw = clk_hw_register_fixed_rate_with_accuracy(dev, NULL_CLK, NULL, 0, 0, 0);
if (IS_ERR(_hw))
return NULL;

ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_simple_get, _hw);
if (ret < 0)
clk_hw_unregister_fixed_rate(_hw);

hw = _hw;
}

return clk_hw_get_clk(hw, NULL_CLK);
}

static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
struct rsnd_adg *adg)
{
Expand All @@ -400,7 +422,12 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
for (i = 0; i < CLKMAX; i++) {
struct clk *clk = devm_clk_get(dev, clk_name[i]);

adg->clk[i] = IS_ERR(clk) ? NULL : clk;
if (IS_ERR(clk))
clk = rsnd_adg_null_clk_get(priv);
if (IS_ERR(clk))
dev_err(dev, "no adg clock (%s)\n", clk_name[i]);

adg->clk[i] = clk;
}
}

Expand Down

0 comments on commit eb37ca9

Please sign in to comment.