aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Baltieri <fabio.baltieri@linaro.org>2013-05-21 06:04:09 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-05-21 12:39:34 -0400
commitda33d723bcb3569400685b4e6e75a9894e2f42a7 (patch)
tree14c531a6c8e56cf12cd94c653d36973402b4736c
parent4510dbe324876f2f2f3dc9931e97ec0e98f1ee26 (diff)
ASoC: ab8500-codec: Set rx dai slots from rx_mask
Replace hard coded rx slot numbers from ab8500_codec_set_dai_tdm_slot using the ones requested by the machine driver in rx_mask instead. Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/ab8500-codec.c29
-rw-r--r--sound/soc/codecs/ab8500-codec.h35
2 files changed, 35 insertions, 29 deletions
diff --git a/sound/soc/codecs/ab8500-codec.c b/sound/soc/codecs/ab8500-codec.c
index bace321a83dd..4ca45b9d9625 100644
--- a/sound/soc/codecs/ab8500-codec.c
+++ b/sound/soc/codecs/ab8500-codec.c
@@ -2334,25 +2334,36 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
2334 } 2334 }
2335 2335
2336 /* Setup TDM AD according to active RX-slots */ 2336 /* Setup TDM AD according to active RX-slots */
2337
2338 if (rx_mask & ~0xff)
2339 return -EINVAL;
2340
2341 rx_mask = rx_mask << AB8500_AD_DATA0_OFFSET;
2337 slots_active = hweight32(rx_mask); 2342 slots_active = hweight32(rx_mask);
2343
2338 dev_dbg(dai->codec->dev, "%s: Slots, active, RX: %d\n", __func__, 2344 dev_dbg(dai->codec->dev, "%s: Slots, active, RX: %d\n", __func__,
2339 slots_active); 2345 slots_active);
2346
2340 switch (slots_active) { 2347 switch (slots_active) {
2341 case 0: 2348 case 0:
2342 break; 2349 break;
2343 case 1: 2350 case 1:
2344 /* AD_OUT3 -> slot 0 & 1 */ 2351 slot = find_first_bit((unsigned long *)&rx_mask, 32);
2345 snd_soc_update_bits(codec, AB8500_ADSLOTSEL1, AB8500_MASK_ALL, 2352 snd_soc_update_bits(codec, AB8500_ADSLOTSEL(slot),
2346 AB8500_ADSLOTSELX_AD_OUT3_TO_SLOT_EVEN | 2353 AB8500_MASK_SLOT(slot),
2347 AB8500_ADSLOTSELX_AD_OUT3_TO_SLOT_ODD); 2354 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2348 break; 2355 break;
2349 case 2: 2356 case 2:
2350 /* AD_OUT3 -> slot 0, AD_OUT2 -> slot 1 */ 2357 slot = find_first_bit((unsigned long *)&rx_mask, 32);
2358 snd_soc_update_bits(codec,
2359 AB8500_ADSLOTSEL(slot),
2360 AB8500_MASK_SLOT(slot),
2361 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2362 slot = find_next_bit((unsigned long *)&rx_mask, 32, slot + 1);
2351 snd_soc_update_bits(codec, 2363 snd_soc_update_bits(codec,
2352 AB8500_ADSLOTSEL1, 2364 AB8500_ADSLOTSEL(slot),
2353 AB8500_MASK_ALL, 2365 AB8500_MASK_SLOT(slot),
2354 AB8500_ADSLOTSELX_AD_OUT3_TO_SLOT_EVEN | 2366 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT2, slot));
2355 AB8500_ADSLOTSELX_AD_OUT2_TO_SLOT_ODD);
2356 break; 2367 break;
2357 case 8: 2368 case 8:
2358 dev_dbg(dai->codec->dev, 2369 dev_dbg(dai->codec->dev,
diff --git a/sound/soc/codecs/ab8500-codec.h b/sound/soc/codecs/ab8500-codec.h
index 64c14ce41f69..e2e54425d25e 100644
--- a/sound/soc/codecs/ab8500-codec.h
+++ b/sound/soc/codecs/ab8500-codec.h
@@ -80,6 +80,7 @@
80#define AB8500_ADSLOTSEL14 0x2C 80#define AB8500_ADSLOTSEL14 0x2C
81#define AB8500_ADSLOTSEL15 0x2D 81#define AB8500_ADSLOTSEL15 0x2D
82#define AB8500_ADSLOTSEL16 0x2E 82#define AB8500_ADSLOTSEL16 0x2E
83#define AB8500_ADSLOTSEL(slot) (AB8500_ADSLOTSEL1 + (slot >> 1))
83#define AB8500_ADSLOTHIZCTRL1 0x2F 84#define AB8500_ADSLOTHIZCTRL1 0x2F
84#define AB8500_ADSLOTHIZCTRL2 0x30 85#define AB8500_ADSLOTHIZCTRL2 0x30
85#define AB8500_ADSLOTHIZCTRL3 0x31 86#define AB8500_ADSLOTHIZCTRL3 0x31
@@ -151,6 +152,7 @@
151#define AB8500_CACHEREGNUM (AB8500_LAST_REG + 1) 152#define AB8500_CACHEREGNUM (AB8500_LAST_REG + 1)
152 153
153#define AB8500_MASK_ALL 0xFF 154#define AB8500_MASK_ALL 0xFF
155#define AB8500_MASK_SLOT(slot) ((slot & 1) ? 0xF0 : 0x0F)
154#define AB8500_MASK_NONE 0x00 156#define AB8500_MASK_NONE 0x00
155 157
156/* AB8500_POWERUP */ 158/* AB8500_POWERUP */
@@ -354,28 +356,21 @@
354#define AB8500_DIGIFCONF4_IF1WL0 0 356#define AB8500_DIGIFCONF4_IF1WL0 0
355 357
356/* AB8500_ADSLOTSELX */ 358/* AB8500_ADSLOTSELX */
357#define AB8500_ADSLOTSELX_AD_OUT1_TO_SLOT_ODD 0x00 359#define AB8500_AD_OUT1 0x0
358#define AB8500_ADSLOTSELX_AD_OUT2_TO_SLOT_ODD 0x10 360#define AB8500_AD_OUT2 0x1
359#define AB8500_ADSLOTSELX_AD_OUT3_TO_SLOT_ODD 0x20 361#define AB8500_AD_OUT3 0x2
360#define AB8500_ADSLOTSELX_AD_OUT4_TO_SLOT_ODD 0x30 362#define AB8500_AD_OUT4 0x3
361#define AB8500_ADSLOTSELX_AD_OUT5_TO_SLOT_ODD 0x40 363#define AB8500_AD_OUT5 0x4
362#define AB8500_ADSLOTSELX_AD_OUT6_TO_SLOT_ODD 0x50 364#define AB8500_AD_OUT6 0x5
363#define AB8500_ADSLOTSELX_AD_OUT7_TO_SLOT_ODD 0x60 365#define AB8500_AD_OUT7 0x6
364#define AB8500_ADSLOTSELX_AD_OUT8_TO_SLOT_ODD 0x70 366#define AB8500_AD_OUT8 0x7
365#define AB8500_ADSLOTSELX_ZEROES_TO_SLOT_ODD 0x80 367#define AB8500_ZEROES 0x8
366#define AB8500_ADSLOTSELX_TRISTATE_TO_SLOT_ODD 0xF0 368#define AB8500_TRISTATE 0xF
367#define AB8500_ADSLOTSELX_AD_OUT1_TO_SLOT_EVEN 0x00
368#define AB8500_ADSLOTSELX_AD_OUT2_TO_SLOT_EVEN 0x01
369#define AB8500_ADSLOTSELX_AD_OUT3_TO_SLOT_EVEN 0x02
370#define AB8500_ADSLOTSELX_AD_OUT4_TO_SLOT_EVEN 0x03
371#define AB8500_ADSLOTSELX_AD_OUT5_TO_SLOT_EVEN 0x04
372#define AB8500_ADSLOTSELX_AD_OUT6_TO_SLOT_EVEN 0x05
373#define AB8500_ADSLOTSELX_AD_OUT7_TO_SLOT_EVEN 0x06
374#define AB8500_ADSLOTSELX_AD_OUT8_TO_SLOT_EVEN 0x07
375#define AB8500_ADSLOTSELX_ZEROES_TO_SLOT_EVEN 0x08
376#define AB8500_ADSLOTSELX_TRISTATE_TO_SLOT_EVEN 0x0F
377#define AB8500_ADSLOTSELX_EVEN_SHIFT 0 369#define AB8500_ADSLOTSELX_EVEN_SHIFT 0
378#define AB8500_ADSLOTSELX_ODD_SHIFT 4 370#define AB8500_ADSLOTSELX_ODD_SHIFT 4
371#define AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(out, slot) \
372 ((out) << (((slot) & 1) ? \
373 AB8500_ADSLOTSELX_ODD_SHIFT : AB8500_ADSLOTSELX_EVEN_SHIFT))
379 374
380/* AB8500_ADSLOTHIZCTRL1 */ 375/* AB8500_ADSLOTHIZCTRL1 */
381/* AB8500_ADSLOTHIZCTRL2 */ 376/* AB8500_ADSLOTHIZCTRL2 */