diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2015-01-15 03:03:22 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-01-15 06:37:48 -0500 |
commit | 8564295231727c4a05ed2e9b8337fe70afe531ef (patch) | |
tree | fb8ba5c0bc15928279d86875e4684a1f29ce3c48 | |
parent | 9d0e202f1314cb4a88bf7e04a6ba017d1a1910dc (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.c | 2 | ||||
-rw-r--r-- | sound/soc/sh/rcar/dvc.c | 12 | ||||
-rw-r--r-- | sound/soc/sh/rcar/rsnd.h | 4 | ||||
-rw-r--r-- | sound/soc/sh/rcar/src.c | 8 | ||||
-rw-r--r-- | sound/soc/sh/rcar/ssi.c | 8 |
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) | |||
152 | void rsnd_mod_init(struct rsnd_priv *priv, | 152 | void 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 @@ | |||
17 | struct rsnd_dvc { | 17 | struct 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, | |||
132 | static int rsnd_dvc_init(struct rsnd_mod *dvc_mod, | 131 | static 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, | |||
181 | static int rsnd_dvc_quit(struct rsnd_mod *mod, | 179 | static 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 | ||
265 | void rsnd_mod_init(struct rsnd_priv *priv, | 268 | void 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); |
270 | char *rsnd_mod_name(struct rsnd_mod *mod); | 274 | char *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 @@ | |||
22 | struct rsnd_src { | 22 | struct 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 | ||
62 | struct rsnd_ssi { | 62 | struct 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 | } |