aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/sh/rcar/ssi.c52
1 files changed, 20 insertions, 32 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 7613256c9840..b71cf9d7dd3f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -101,31 +101,30 @@ struct rsnd_ssiu {
101#define rsnd_ssi_to_ssiu(ssi)\ 101#define rsnd_ssi_to_ssiu(ssi)\
102 (((struct rsnd_ssiu *)((ssi) - rsnd_mod_id(&(ssi)->mod))) - 1) 102 (((struct rsnd_ssiu *)((ssi) - rsnd_mod_id(&(ssi)->mod))) - 1)
103 103
104static void rsnd_ssi_mode_init(struct rsnd_priv *priv, 104static void rsnd_ssi_mode_set(struct rsnd_priv *priv,
105 struct rsnd_ssiu *ssiu) 105 struct rsnd_dai *rdai,
106 struct rsnd_ssi *ssi)
106{ 107{
107 struct device *dev = rsnd_priv_to_dev(priv); 108 struct device *dev = rsnd_priv_to_dev(priv);
108 struct rsnd_ssi *ssi;
109 struct rsnd_mod *scu; 109 struct rsnd_mod *scu;
110 struct rsnd_ssiu *ssiu = rsnd_ssi_to_ssiu(ssi);
111 int id = rsnd_mod_id(&ssi->mod);
110 u32 flags; 112 u32 flags;
111 u32 val; 113 u32 val;
112 int i; 114
115 scu = rsnd_scu_mod_get(priv, rsnd_mod_id(&ssi->mod));
113 116
114 /* 117 /*
115 * SSI_MODE0 118 * SSI_MODE0
116 */ 119 */
117 ssiu->ssi_mode0 = 0; 120
118 for_each_rsnd_ssi(ssi, priv, i) { 121 /* see also BUSIF_MODE */
119 flags = rsnd_ssi_mode_flags(ssi); 122 if (rsnd_scu_hpbif_is_enable(scu)) {
120 scu = rsnd_scu_mod_get(priv, rsnd_mod_id(&ssi->mod)); 123 ssiu->ssi_mode0 &= ~(1 << id);
121 124 dev_dbg(dev, "SSI%d uses DEPENDENT mode\n", id);
122 /* see also BUSIF_MODE */ 125 } else {
123 if (rsnd_scu_hpbif_is_enable(scu)) { 126 ssiu->ssi_mode0 |= (1 << id);
124 dev_dbg(dev, "SSI%d uses DEPENDENT mode\n", i); 127 dev_dbg(dev, "SSI%d uses INDEPENDENT mode\n", id);
125 } else {
126 ssiu->ssi_mode0 |= (1 << i);
127 dev_dbg(dev, "SSI%d uses INDEPENDENT mode\n", i);
128 }
129 } 128 }
130 129
131 /* 130 /*
@@ -134,7 +133,7 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv,
134#define ssi_parent_set(p, sync, adg, ext) \ 133#define ssi_parent_set(p, sync, adg, ext) \
135 do { \ 134 do { \
136 ssi->parent = ssiu->ssi + p; \ 135 ssi->parent = ssiu->ssi + p; \
137 if (flags & RSND_SSI_CLK_FROM_ADG) \ 136 if (rsnd_rdai_is_clk_master(rdai)) \
138 val = adg; \ 137 val = adg; \
139 else \ 138 else \
140 val = ext; \ 139 val = ext; \
@@ -142,15 +141,11 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv,
142 val |= sync; \ 141 val |= sync; \
143 } while (0) 142 } while (0)
144 143
145 ssiu->ssi_mode1 = 0; 144 flags = rsnd_ssi_mode_flags(ssi);
146 for_each_rsnd_ssi(ssi, priv, i) { 145 if (flags & RSND_SSI_CLK_PIN_SHARE) {
147 flags = rsnd_ssi_mode_flags(ssi);
148
149 if (!(flags & RSND_SSI_CLK_PIN_SHARE))
150 continue;
151 146
152 val = 0; 147 val = 0;
153 switch (i) { 148 switch (id) {
154 case 1: 149 case 1:
155 ssi_parent_set(0, (1 << 4), (0x2 << 0), (0x1 << 0)); 150 ssi_parent_set(0, (1 << 4), (0x2 << 0), (0x1 << 0));
156 break; 151 break;
@@ -167,11 +162,6 @@ static void rsnd_ssi_mode_init(struct rsnd_priv *priv,
167 162
168 ssiu->ssi_mode1 |= val; 163 ssiu->ssi_mode1 |= val;
169 } 164 }
170}
171
172static void rsnd_ssi_mode_set(struct rsnd_ssi *ssi)
173{
174 struct rsnd_ssiu *ssiu = rsnd_ssi_to_ssiu(ssi);
175 165
176 rsnd_mod_write(&ssi->mod, SSI_MODE0, ssiu->ssi_mode0); 166 rsnd_mod_write(&ssi->mod, SSI_MODE0, ssiu->ssi_mode0);
177 rsnd_mod_write(&ssi->mod, SSI_MODE1, ssiu->ssi_mode1); 167 rsnd_mod_write(&ssi->mod, SSI_MODE1, ssiu->ssi_mode1);
@@ -381,7 +371,7 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
381 ssi->cr_own = cr; 371 ssi->cr_own = cr;
382 ssi->err = -1; /* ignore 1st error */ 372 ssi->err = -1; /* ignore 1st error */
383 373
384 rsnd_ssi_mode_set(ssi); 374 rsnd_ssi_mode_set(priv, rdai, ssi);
385 375
386 dev_dbg(dev, "%s.%d init\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); 376 dev_dbg(dev, "%s.%d init\n", rsnd_mod_name(mod), rsnd_mod_id(mod));
387 377
@@ -708,8 +698,6 @@ int rsnd_ssi_probe(struct platform_device *pdev,
708 rsnd_mod_init(priv, &ssi->mod, ops, i); 698 rsnd_mod_init(priv, &ssi->mod, ops, i);
709 } 699 }
710 700
711 rsnd_ssi_mode_init(priv, ssiu);
712
713 dev_dbg(dev, "ssi probed\n"); 701 dev_dbg(dev, "ssi probed\n");
714 702
715 return 0; 703 return 0;