aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2015-01-15 03:03:22 -0500
committerMark Brown <broonie@kernel.org>2015-01-15 06:37:48 -0500
commit8564295231727c4a05ed2e9b8337fe70afe531ef (patch)
treefb8ba5c0bc15928279d86875e4684a1f29ce3c48
parent9d0e202f1314cb4a88bf7e04a6ba017d1a1910dc (diff)
ASoC: rsnd: rsnd_mod controls clock
Current rsnd driver's mod (= ssi/src/dvc) have each own clk, but, these are needed to start/stop each mod. This patch adds struct clk in rsnd_mod, and start/stop these via rsnd_mod_hw_start/stop() macro Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/sh/rcar/core.c2
-rw-r--r--sound/soc/sh/rcar/dvc.c12
-rw-r--r--sound/soc/sh/rcar/rsnd.h4
-rw-r--r--sound/soc/sh/rcar/src.c8
-rw-r--r--sound/soc/sh/rcar/ssi.c8
5 files changed, 16 insertions, 18 deletions
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index d9c81cda09f7..766bd4ce439b 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -152,6 +152,7 @@ char *rsnd_mod_dma_name(struct rsnd_mod *mod)
152void rsnd_mod_init(struct rsnd_priv *priv, 152void rsnd_mod_init(struct rsnd_priv *priv,
153 struct rsnd_mod *mod, 153 struct rsnd_mod *mod,
154 struct rsnd_mod_ops *ops, 154 struct rsnd_mod_ops *ops,
155 struct clk *clk,
155 enum rsnd_mod_type type, 156 enum rsnd_mod_type type,
156 int id) 157 int id)
157{ 158{
@@ -159,6 +160,7 @@ void rsnd_mod_init(struct rsnd_priv *priv,
159 mod->id = id; 160 mod->id = id;
160 mod->ops = ops; 161 mod->ops = ops;
161 mod->type = type; 162 mod->type = type;
163 mod->clk = clk;
162} 164}
163 165
164/* 166/*
diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
index 5380a4827ba7..77cb00890471 100644
--- a/sound/soc/sh/rcar/dvc.c
+++ b/sound/soc/sh/rcar/dvc.c
@@ -17,7 +17,6 @@
17struct rsnd_dvc { 17struct rsnd_dvc {
18 struct rsnd_dvc_platform_info *info; /* rcar_snd.h */ 18 struct rsnd_dvc_platform_info *info; /* rcar_snd.h */
19 struct rsnd_mod mod; 19 struct rsnd_mod mod;
20 struct clk *clk;
21 struct rsnd_kctrl_cfg_m volume; 20 struct rsnd_kctrl_cfg_m volume;
22 struct rsnd_kctrl_cfg_m mute; 21 struct rsnd_kctrl_cfg_m mute;
23 struct rsnd_kctrl_cfg_s ren; /* Ramp Enable */ 22 struct rsnd_kctrl_cfg_s ren; /* Ramp Enable */
@@ -132,7 +131,6 @@ static int rsnd_dvc_probe_gen2(struct rsnd_mod *mod,
132static int rsnd_dvc_init(struct rsnd_mod *dvc_mod, 131static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
133 struct rsnd_dai *rdai) 132 struct rsnd_dai *rdai)
134{ 133{
135 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(dvc_mod);
136 struct rsnd_dai_stream *io = rsnd_mod_to_io(dvc_mod); 134 struct rsnd_dai_stream *io = rsnd_mod_to_io(dvc_mod);
137 struct rsnd_priv *priv = rsnd_mod_to_priv(dvc_mod); 135 struct rsnd_priv *priv = rsnd_mod_to_priv(dvc_mod);
138 struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io); 136 struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
@@ -153,7 +151,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
153 return -EINVAL; 151 return -EINVAL;
154 } 152 }
155 153
156 clk_prepare_enable(dvc->clk); 154 rsnd_mod_hw_start(dvc_mod);
157 155
158 /* 156 /*
159 * fixme 157 * fixme
@@ -181,9 +179,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
181static int rsnd_dvc_quit(struct rsnd_mod *mod, 179static int rsnd_dvc_quit(struct rsnd_mod *mod,
182 struct rsnd_dai *rdai) 180 struct rsnd_dai *rdai)
183{ 181{
184 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); 182 rsnd_mod_hw_stop(mod);
185
186 clk_disable_unprepare(dvc->clk);
187 183
188 return 0; 184 return 0;
189} 185}
@@ -356,9 +352,9 @@ int rsnd_dvc_probe(struct platform_device *pdev,
356 return PTR_ERR(clk); 352 return PTR_ERR(clk);
357 353
358 dvc->info = &info->dvc_info[i]; 354 dvc->info = &info->dvc_info[i];
359 dvc->clk = clk;
360 355
361 rsnd_mod_init(priv, &dvc->mod, &rsnd_dvc_ops, RSND_MOD_DVC, i); 356 rsnd_mod_init(priv, &dvc->mod, &rsnd_dvc_ops,
357 clk, RSND_MOD_DVC, i);
362 358
363 dev_dbg(dev, "CMD%d probed\n", i); 359 dev_dbg(dev, "CMD%d probed\n", i);
364 } 360 }
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index ff191cfbdcf6..d8c31170b491 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -226,6 +226,7 @@ struct rsnd_mod {
226 struct rsnd_mod_ops *ops; 226 struct rsnd_mod_ops *ops;
227 struct rsnd_dma dma; 227 struct rsnd_dma dma;
228 struct rsnd_dai_stream *io; 228 struct rsnd_dai_stream *io;
229 struct clk *clk;
229 u32 status; 230 u32 status;
230}; 231};
231/* 232/*
@@ -261,10 +262,13 @@ struct rsnd_mod {
261#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma) 262#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
262#define rsnd_mod_to_io(mod) ((mod)->io) 263#define rsnd_mod_to_io(mod) ((mod)->io)
263#define rsnd_mod_id(mod) ((mod)->id) 264#define rsnd_mod_id(mod) ((mod)->id)
265#define rsnd_mod_hw_start(mod) clk_prepare_enable((mod)->clk)
266#define rsnd_mod_hw_stop(mod) clk_disable_unprepare((mod)->clk)
264 267
265void rsnd_mod_init(struct rsnd_priv *priv, 268void rsnd_mod_init(struct rsnd_priv *priv,
266 struct rsnd_mod *mod, 269 struct rsnd_mod *mod,
267 struct rsnd_mod_ops *ops, 270 struct rsnd_mod_ops *ops,
271 struct clk *clk,
268 enum rsnd_mod_type type, 272 enum rsnd_mod_type type,
269 int id); 273 int id);
270char *rsnd_mod_name(struct rsnd_mod *mod); 274char *rsnd_mod_name(struct rsnd_mod *mod);
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index 648b35e7effc..6a3fd8dce1c3 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -22,7 +22,6 @@
22struct rsnd_src { 22struct rsnd_src {
23 struct rsnd_src_platform_info *info; /* rcar_snd.h */ 23 struct rsnd_src_platform_info *info; /* rcar_snd.h */
24 struct rsnd_mod mod; 24 struct rsnd_mod mod;
25 struct clk *clk;
26 int err; 25 int err;
27}; 26};
28 27
@@ -286,7 +285,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
286{ 285{
287 struct rsnd_src *src = rsnd_mod_to_src(mod); 286 struct rsnd_src *src = rsnd_mod_to_src(mod);
288 287
289 clk_prepare_enable(src->clk); 288 rsnd_mod_hw_start(mod);
290 289
291 src->err = 0; 290 src->err = 0;
292 291
@@ -306,7 +305,7 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
306 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 305 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
307 struct device *dev = rsnd_priv_to_dev(priv); 306 struct device *dev = rsnd_priv_to_dev(priv);
308 307
309 clk_disable_unprepare(src->clk); 308 rsnd_mod_hw_stop(mod);
310 309
311 if (src->err) 310 if (src->err)
312 dev_warn(dev, "src under/over flow err = %d\n", src->err); 311 dev_warn(dev, "src under/over flow err = %d\n", src->err);
@@ -902,9 +901,8 @@ int rsnd_src_probe(struct platform_device *pdev,
902 return PTR_ERR(clk); 901 return PTR_ERR(clk);
903 902
904 src->info = &info->src_info[i]; 903 src->info = &info->src_info[i];
905 src->clk = clk;
906 904
907 rsnd_mod_init(priv, &src->mod, ops, RSND_MOD_SRC, i); 905 rsnd_mod_init(priv, &src->mod, ops, clk, RSND_MOD_SRC, i);
908 906
909 dev_dbg(dev, "SRC%d probed\n", i); 907 dev_dbg(dev, "SRC%d probed\n", i);
910 } 908 }
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index df10585dd325..a55b96399ada 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -60,7 +60,6 @@
60#define SSI_NAME "ssi" 60#define SSI_NAME "ssi"
61 61
62struct rsnd_ssi { 62struct rsnd_ssi {
63 struct clk *clk;
64 struct rsnd_ssi_platform_info *info; /* rcar_snd.h */ 63 struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
65 struct rsnd_ssi *parent; 64 struct rsnd_ssi *parent;
66 struct rsnd_mod mod; 65 struct rsnd_mod mod;
@@ -188,7 +187,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
188 u32 cr; 187 u32 cr;
189 188
190 if (0 == ssi->usrcnt) { 189 if (0 == ssi->usrcnt) {
191 clk_prepare_enable(ssi->clk); 190 rsnd_mod_hw_start(&ssi->mod);
192 191
193 if (rsnd_dai_is_clk_master(rdai)) { 192 if (rsnd_dai_is_clk_master(rdai)) {
194 if (rsnd_ssi_clk_from_parent(ssi)) 193 if (rsnd_ssi_clk_from_parent(ssi))
@@ -260,7 +259,7 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi,
260 rsnd_ssi_master_clk_stop(ssi); 259 rsnd_ssi_master_clk_stop(ssi);
261 } 260 }
262 261
263 clk_disable_unprepare(ssi->clk); 262 rsnd_mod_hw_stop(&ssi->mod);
264 } 263 }
265 264
266 dev_dbg(dev, "%s[%d] hw stopped\n", 265 dev_dbg(dev, "%s[%d] hw stopped\n",
@@ -731,7 +730,6 @@ int rsnd_ssi_probe(struct platform_device *pdev,
731 return PTR_ERR(clk); 730 return PTR_ERR(clk);
732 731
733 ssi->info = pinfo; 732 ssi->info = pinfo;
734 ssi->clk = clk;
735 733
736 ops = &rsnd_ssi_non_ops; 734 ops = &rsnd_ssi_non_ops;
737 if (pinfo->dma_id > 0) 735 if (pinfo->dma_id > 0)
@@ -739,7 +737,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
739 else if (rsnd_ssi_pio_available(ssi)) 737 else if (rsnd_ssi_pio_available(ssi))
740 ops = &rsnd_ssi_pio_ops; 738 ops = &rsnd_ssi_pio_ops;
741 739
742 rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i); 740 rsnd_mod_init(priv, &ssi->mod, ops, clk, RSND_MOD_SSI, i);
743 741
744 rsnd_ssi_parent_clk_setup(priv, ssi); 742 rsnd_ssi_parent_clk_setup(priv, ssi);
745 } 743 }