aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2013-11-28 21:43:45 -0500
committerMark Brown <broonie@linaro.org>2013-11-29 07:09:54 -0500
commit507d466c733e28d132a7be87040a3da126df7947 (patch)
treecffaa17b4a801ed296fd7af37c02c15ef4029729 /sound/soc
parent531eaf491e25ce215bbcf434e23e77f53fc98171 (diff)
ASoC: rcar: add Gen2 sound support
This patch adds Gen2 sound support for Renesas R-Car. But, it is supporting PIO transfer only at this point Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/sh/rcar/gen.c91
-rw-r--r--sound/soc/sh/rcar/rsnd.h3
-rw-r--r--sound/soc/sh/rcar/ssi.c3
3 files changed, 91 insertions, 6 deletions
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index a29e36eb1a30..bf066f73ef05 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -213,9 +213,88 @@ int rsnd_gen_path_exit(struct rsnd_priv *priv,
213 213
214/* 214/*
215 * Gen2 215 * Gen2
216 * will be filled in the future
217 */ 216 */
218 217
218/* single address mapping */
219#define RSND_GEN2_S_REG(gen, reg, id, offset) \
220 RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, 0, 9)
221
222/* multi address mapping */
223#define RSND_GEN2_M_REG(gen, reg, id, offset, _id_offset) \
224 RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, _id_offset, 9)
225
226static int rsnd_gen2_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen)
227{
228 struct reg_field regf[RSND_REG_MAX] = {
229 RSND_GEN2_S_REG(gen, SSIU, SSI_MODE0, 0x800),
230 RSND_GEN2_S_REG(gen, SSIU, SSI_MODE1, 0x804),
231 /* FIXME: it needs SSI_MODE2/3 in the future */
232 RSND_GEN2_M_REG(gen, SSIU, INT_ENABLE, 0x18, 0x80),
233
234 RSND_GEN2_S_REG(gen, ADG, BRRA, 0x00),
235 RSND_GEN2_S_REG(gen, ADG, BRRB, 0x04),
236 RSND_GEN2_S_REG(gen, ADG, SSICKR, 0x08),
237 RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c),
238 RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10),
239 RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL2, 0x14),
240
241 RSND_GEN2_M_REG(gen, SSI, SSICR, 0x00, 0x40),
242 RSND_GEN2_M_REG(gen, SSI, SSISR, 0x04, 0x40),
243 RSND_GEN2_M_REG(gen, SSI, SSITDR, 0x08, 0x40),
244 RSND_GEN2_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40),
245 RSND_GEN2_M_REG(gen, SSI, SSIWSR, 0x20, 0x40),
246 };
247
248 return rsnd_gen_regmap_init(priv, gen, regf);
249}
250
251static int rsnd_gen2_probe(struct platform_device *pdev,
252 struct rcar_snd_info *info,
253 struct rsnd_priv *priv)
254{
255 struct device *dev = rsnd_priv_to_dev(priv);
256 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
257 struct resource *scu_res;
258 struct resource *adg_res;
259 struct resource *ssiu_res;
260 struct resource *ssi_res;
261 int ret;
262
263 /*
264 * map address
265 */
266 scu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SCU);
267 adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_ADG);
268 ssiu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSIU);
269 ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSI);
270
271 gen->base[RSND_GEN2_SCU] = devm_ioremap_resource(dev, scu_res);
272 gen->base[RSND_GEN2_ADG] = devm_ioremap_resource(dev, adg_res);
273 gen->base[RSND_GEN2_SSIU] = devm_ioremap_resource(dev, ssiu_res);
274 gen->base[RSND_GEN2_SSI] = devm_ioremap_resource(dev, ssi_res);
275 if (IS_ERR(gen->base[RSND_GEN2_SCU]) ||
276 IS_ERR(gen->base[RSND_GEN2_ADG]) ||
277 IS_ERR(gen->base[RSND_GEN2_SSIU]) ||
278 IS_ERR(gen->base[RSND_GEN2_SSI]))
279 return -ENODEV;
280
281 ret = rsnd_gen2_regmap_init(priv, gen);
282 if (ret < 0)
283 return ret;
284
285 dev_dbg(dev, "Gen2 device probed\n");
286 dev_dbg(dev, "SRU : %08x => %p\n", scu_res->start,
287 gen->base[RSND_GEN2_SCU]);
288 dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start,
289 gen->base[RSND_GEN2_ADG]);
290 dev_dbg(dev, "SSIU : %08x => %p\n", ssiu_res->start,
291 gen->base[RSND_GEN2_SSIU]);
292 dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start,
293 gen->base[RSND_GEN2_SSI]);
294
295 return 0;
296}
297
219/* 298/*
220 * Gen1 299 * Gen1
221 */ 300 */
@@ -318,12 +397,14 @@ int rsnd_gen_probe(struct platform_device *pdev,
318 397
319 priv->gen = gen; 398 priv->gen = gen;
320 399
321 if (rsnd_is_gen1(priv)) { 400 ret = -ENODEV;
401 if (rsnd_is_gen1(priv))
322 ret = rsnd_gen1_probe(pdev, info, priv); 402 ret = rsnd_gen1_probe(pdev, info, priv);
323 } else { 403 else if (rsnd_is_gen2(priv))
404 ret = rsnd_gen2_probe(pdev, info, priv);
405
406 if (ret < 0)
324 dev_err(dev, "unknown generation R-Car sound device\n"); 407 dev_err(dev, "unknown generation R-Car sound device\n");
325 return -ENODEV;
326 }
327 408
328 return ret; 409 return ret;
329} 410}
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 63a9d7081c60..bff7b9e53066 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -31,7 +31,7 @@
31 * see gen1/gen2 for detail 31 * see gen1/gen2 for detail
32 */ 32 */
33enum rsnd_reg { 33enum rsnd_reg {
34 /* SRU/SCU */ 34 /* SRU/SCU/SSIU */
35 RSND_REG_SRC_ROUTE_SEL, 35 RSND_REG_SRC_ROUTE_SEL,
36 RSND_REG_SRC_TMG_SEL0, 36 RSND_REG_SRC_TMG_SEL0,
37 RSND_REG_SRC_TMG_SEL1, 37 RSND_REG_SRC_TMG_SEL1,
@@ -41,6 +41,7 @@ enum rsnd_reg {
41 RSND_REG_SSI_MODE1, 41 RSND_REG_SSI_MODE1,
42 RSND_REG_BUSIF_MODE, 42 RSND_REG_BUSIF_MODE,
43 RSND_REG_BUSIF_ADINR, 43 RSND_REG_BUSIF_ADINR,
44 RSND_REG_INT_ENABLE,
44 45
45 /* ADG */ 46 /* ADG */
46 RSND_REG_BRRA, 47 RSND_REG_BRRA,
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index b71cf9d7dd3f..477465f9507b 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -457,6 +457,9 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
457 /* enable PIO IRQ */ 457 /* enable PIO IRQ */
458 ssi->cr_etc = UIEN | OIEN | DIEN; 458 ssi->cr_etc = UIEN | OIEN | DIEN;
459 459
460 /* enable PIO interrupt */
461 rsnd_mod_write(&ssi->mod, INT_ENABLE, 0x0f000000);
462
460 rsnd_ssi_hw_start(ssi, rdai, io); 463 rsnd_ssi_hw_start(ssi, rdai, io);
461 464
462 dev_dbg(dev, "%s.%d start\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); 465 dev_dbg(dev, "%s.%d start\n", rsnd_mod_name(mod), rsnd_mod_id(mod));