aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2013-12-19 22:26:31 -0500
committerMark Brown <broonie@linaro.org>2013-12-31 08:35:29 -0500
commite337853ebb46d012c069ca47ba3ce9f4744305ea (patch)
tree8d12411a49e8435026c88d0847e109c28edd9d27
parenta073278228836d7d18fdd6c40b619919c0befb64 (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.c58
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
33static enum rsnd_reg rsnd_adg_ssi_reg_get(int id) 33static 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
54int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod) 61int 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}