diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2013-12-19 22:26:31 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-12-31 08:35:29 -0500 |
commit | e337853ebb46d012c069ca47ba3ce9f4744305ea (patch) | |
tree | 8d12411a49e8435026c88d0847e109c28edd9d27 | |
parent | a073278228836d7d18fdd6c40b619919c0befb64 (diff) |
ASoC: rsnd: add rsnd_adg_set_ssi_clk() and cleanup adg
This patch adds rsnd_adg_set_ssi_clk() to access to
AUDIO_CLK_SEL0/1/2, and removes last user of
rsnd_write/read/bset which is very low level function.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | sound/soc/sh/rcar/adg.c | 58 |
1 files changed, 24 insertions, 34 deletions
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index 9430097979a5..55d0394955b2 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c | |||
@@ -30,41 +30,41 @@ struct rsnd_adg { | |||
30 | i++, (pos) = adg->clk[i]) | 30 | i++, (pos) = adg->clk[i]) |
31 | #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg) | 31 | #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg) |
32 | 32 | ||
33 | static enum rsnd_reg rsnd_adg_ssi_reg_get(int id) | 33 | static void rsnd_adg_set_ssi_clk(struct rsnd_mod *mod, u32 val) |
34 | { | 34 | { |
35 | enum rsnd_reg reg; | 35 | int id = rsnd_mod_id(mod); |
36 | int shift = (id % 4) * 8; | ||
37 | u32 mask = 0xFF << shift; | ||
38 | |||
39 | val = val << shift; | ||
36 | 40 | ||
37 | /* | 41 | /* |
38 | * SSI 8 is not connected to ADG. | 42 | * SSI 8 is not connected to ADG. |
39 | * it works with SSI 7 | 43 | * it works with SSI 7 |
40 | */ | 44 | */ |
41 | if (id == 8) | 45 | if (id == 8) |
42 | return RSND_REG_MAX; | 46 | return; |
43 | 47 | ||
44 | if (0 <= id && id <= 3) | 48 | switch (id / 4) { |
45 | reg = RSND_REG_AUDIO_CLK_SEL0; | 49 | case 0: |
46 | else if (4 <= id && id <= 7) | 50 | rsnd_mod_bset(mod, AUDIO_CLK_SEL0, mask, val); |
47 | reg = RSND_REG_AUDIO_CLK_SEL1; | 51 | break; |
48 | else | 52 | case 1: |
49 | reg = RSND_REG_AUDIO_CLK_SEL2; | 53 | rsnd_mod_bset(mod, AUDIO_CLK_SEL1, mask, val); |
50 | 54 | break; | |
51 | return reg; | 55 | case 2: |
56 | rsnd_mod_bset(mod, AUDIO_CLK_SEL2, mask, val); | ||
57 | break; | ||
58 | } | ||
52 | } | 59 | } |
53 | 60 | ||
54 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod) | 61 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod) |
55 | { | 62 | { |
56 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | ||
57 | enum rsnd_reg reg; | ||
58 | int id; | ||
59 | |||
60 | /* | 63 | /* |
61 | * "mod" = "ssi" here. | 64 | * "mod" = "ssi" here. |
62 | * we can get "ssi id" from mod | 65 | * we can get "ssi id" from mod |
63 | */ | 66 | */ |
64 | id = rsnd_mod_id(mod); | 67 | rsnd_adg_set_ssi_clk(mod, 0); |
65 | reg = rsnd_adg_ssi_reg_get(id); | ||
66 | |||
67 | rsnd_write(priv, mod, reg, 0); | ||
68 | 68 | ||
69 | return 0; | 69 | return 0; |
70 | } | 70 | } |
@@ -75,8 +75,7 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate) | |||
75 | struct rsnd_adg *adg = rsnd_priv_to_adg(priv); | 75 | struct rsnd_adg *adg = rsnd_priv_to_adg(priv); |
76 | struct device *dev = rsnd_priv_to_dev(priv); | 76 | struct device *dev = rsnd_priv_to_dev(priv); |
77 | struct clk *clk; | 77 | struct clk *clk; |
78 | enum rsnd_reg reg; | 78 | int i; |
79 | int id, shift, i; | ||
80 | u32 data; | 79 | u32 data; |
81 | int sel_table[] = { | 80 | int sel_table[] = { |
82 | [CLKA] = 0x1, | 81 | [CLKA] = 0x1, |
@@ -125,19 +124,10 @@ found_clock: | |||
125 | * This "mod" = "ssi" here. | 124 | * This "mod" = "ssi" here. |
126 | * we can get "ssi id" from mod | 125 | * we can get "ssi id" from mod |
127 | */ | 126 | */ |
128 | id = rsnd_mod_id(mod); | 127 | rsnd_adg_set_ssi_clk(mod, data); |
129 | reg = rsnd_adg_ssi_reg_get(id); | ||
130 | |||
131 | dev_dbg(dev, "ADG: ssi%d selects clk%d = %d", id, i, rate); | ||
132 | |||
133 | /* | ||
134 | * Enable SSIx clock | ||
135 | */ | ||
136 | shift = (id % 4) * 8; | ||
137 | 128 | ||
138 | rsnd_bset(priv, mod, reg, | 129 | dev_dbg(dev, "ADG: ssi%d selects clk%d = %d", |
139 | 0xFF << shift, | 130 | rsnd_mod_id(mod), i, rate); |
140 | data << shift); | ||
141 | 131 | ||
142 | return 0; | 132 | return 0; |
143 | } | 133 | } |