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