diff options
author | Mark Brown <broonie@kernel.org> | 2017-03-29 07:55:05 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-03-29 07:55:05 -0400 |
commit | 0cb3a12f2a5827ff8692ff247538683b1b1f979d (patch) | |
tree | 999471206b77a695c231d4cd6be04e71279eb335 | |
parent | 4368c27666df1f1e80aa525baf49d29073c28ce7 (diff) | |
parent | 9986943ef5d61a9bea3c86000d91d3b789f0060e (diff) |
Merge remote-tracking branch 'asoc/fix/rcar' into asoc-linus
-rw-r--r-- | sound/soc/sh/rcar/cmd.c | 36 | ||||
-rw-r--r-- | sound/soc/sh/rcar/dma.c | 18 | ||||
-rw-r--r-- | sound/soc/sh/rcar/ssiu.c | 6 |
3 files changed, 41 insertions, 19 deletions
diff --git a/sound/soc/sh/rcar/cmd.c b/sound/soc/sh/rcar/cmd.c index abb5eaac854a..7d92a24b7cfa 100644 --- a/sound/soc/sh/rcar/cmd.c +++ b/sound/soc/sh/rcar/cmd.c | |||
@@ -31,23 +31,24 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, | |||
31 | struct rsnd_mod *mix = rsnd_io_to_mod_mix(io); | 31 | struct rsnd_mod *mix = rsnd_io_to_mod_mix(io); |
32 | struct device *dev = rsnd_priv_to_dev(priv); | 32 | struct device *dev = rsnd_priv_to_dev(priv); |
33 | u32 data; | 33 | u32 data; |
34 | u32 path[] = { | ||
35 | [1] = 1 << 0, | ||
36 | [5] = 1 << 8, | ||
37 | [6] = 1 << 12, | ||
38 | [9] = 1 << 15, | ||
39 | }; | ||
34 | 40 | ||
35 | if (!mix && !dvc) | 41 | if (!mix && !dvc) |
36 | return 0; | 42 | return 0; |
37 | 43 | ||
44 | if (ARRAY_SIZE(path) < rsnd_mod_id(mod) + 1) | ||
45 | return -ENXIO; | ||
46 | |||
38 | if (mix) { | 47 | if (mix) { |
39 | struct rsnd_dai *rdai; | 48 | struct rsnd_dai *rdai; |
40 | struct rsnd_mod *src; | 49 | struct rsnd_mod *src; |
41 | struct rsnd_dai_stream *tio; | 50 | struct rsnd_dai_stream *tio; |
42 | int i; | 51 | int i; |
43 | u32 path[] = { | ||
44 | [0] = 0, | ||
45 | [1] = 1 << 0, | ||
46 | [2] = 0, | ||
47 | [3] = 0, | ||
48 | [4] = 0, | ||
49 | [5] = 1 << 8 | ||
50 | }; | ||
51 | 52 | ||
52 | /* | 53 | /* |
53 | * it is assuming that integrater is well understanding about | 54 | * it is assuming that integrater is well understanding about |
@@ -70,16 +71,19 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, | |||
70 | } else { | 71 | } else { |
71 | struct rsnd_mod *src = rsnd_io_to_mod_src(io); | 72 | struct rsnd_mod *src = rsnd_io_to_mod_src(io); |
72 | 73 | ||
73 | u32 path[] = { | 74 | u8 cmd_case[] = { |
74 | [0] = 0x30000, | 75 | [0] = 0x3, |
75 | [1] = 0x30001, | 76 | [1] = 0x3, |
76 | [2] = 0x40000, | 77 | [2] = 0x4, |
77 | [3] = 0x10000, | 78 | [3] = 0x1, |
78 | [4] = 0x20000, | 79 | [4] = 0x2, |
79 | [5] = 0x40100 | 80 | [5] = 0x4, |
81 | [6] = 0x1, | ||
82 | [9] = 0x2, | ||
80 | }; | 83 | }; |
81 | 84 | ||
82 | data = path[rsnd_mod_id(src)]; | 85 | data = path[rsnd_mod_id(src)] | |
86 | cmd_case[rsnd_mod_id(src)] << 16; | ||
83 | } | 87 | } |
84 | 88 | ||
85 | dev_dbg(dev, "ctu/mix path = 0x%08x", data); | 89 | dev_dbg(dev, "ctu/mix path = 0x%08x", data); |
diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c index 1f405c833867..241cb3b08a07 100644 --- a/sound/soc/sh/rcar/dma.c +++ b/sound/soc/sh/rcar/dma.c | |||
@@ -454,6 +454,20 @@ static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg) | |||
454 | return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); | 454 | return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); |
455 | } | 455 | } |
456 | 456 | ||
457 | static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg) | ||
458 | { | ||
459 | struct rsnd_mod *mod = rsnd_mod_get(dma); | ||
460 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | ||
461 | struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); | ||
462 | void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg); | ||
463 | u32 val = ioread32(addr); | ||
464 | |||
465 | val &= ~mask; | ||
466 | val |= (data & mask); | ||
467 | |||
468 | iowrite32(val, addr); | ||
469 | } | ||
470 | |||
457 | static int rsnd_dmapp_stop(struct rsnd_mod *mod, | 471 | static int rsnd_dmapp_stop(struct rsnd_mod *mod, |
458 | struct rsnd_dai_stream *io, | 472 | struct rsnd_dai_stream *io, |
459 | struct rsnd_priv *priv) | 473 | struct rsnd_priv *priv) |
@@ -461,10 +475,10 @@ static int rsnd_dmapp_stop(struct rsnd_mod *mod, | |||
461 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); | 475 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); |
462 | int i; | 476 | int i; |
463 | 477 | ||
464 | rsnd_dmapp_write(dma, 0, PDMACHCR); | 478 | rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR); |
465 | 479 | ||
466 | for (i = 0; i < 1024; i++) { | 480 | for (i = 0; i < 1024; i++) { |
467 | if (0 == rsnd_dmapp_read(dma, PDMACHCR)) | 481 | if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE)) |
468 | return 0; | 482 | return 0; |
469 | udelay(1); | 483 | udelay(1); |
470 | } | 484 | } |
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c index 4e817c8a18c0..14fafdaf1395 100644 --- a/sound/soc/sh/rcar/ssiu.c +++ b/sound/soc/sh/rcar/ssiu.c | |||
@@ -64,7 +64,11 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod, | |||
64 | mask1 = (1 << 4) | (1 << 20); /* mask sync bit */ | 64 | mask1 = (1 << 4) | (1 << 20); /* mask sync bit */ |
65 | mask2 = (1 << 4); /* mask sync bit */ | 65 | mask2 = (1 << 4); /* mask sync bit */ |
66 | val1 = val2 = 0; | 66 | val1 = val2 = 0; |
67 | if (rsnd_ssi_is_pin_sharing(io)) { | 67 | if (id == 8) { |
68 | /* | ||
69 | * SSI8 pin is sharing with SSI7, nothing to do. | ||
70 | */ | ||
71 | } else if (rsnd_ssi_is_pin_sharing(io)) { | ||
68 | int shift = -1; | 72 | int shift = -1; |
69 | 73 | ||
70 | switch (id) { | 74 | switch (id) { |