root/sound/pci/ctxfi/ctatc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ct_map_audio_buffer
  2. ct_unmap_audio_buffer
  3. atc_get_ptp_phys
  4. convert_format
  5. atc_get_pitch
  6. select_rom
  7. atc_pcm_playback_prepare
  8. atc_pcm_release_resources
  9. atc_pcm_playback_start
  10. atc_pcm_stop
  11. atc_pcm_playback_position
  12. setup_src_node_conf
  13. atc_pcm_capture_get_resources
  14. atc_pcm_capture_prepare
  15. atc_pcm_capture_start
  16. atc_pcm_capture_position
  17. spdif_passthru_playback_get_resources
  18. atc_pll_init
  19. spdif_passthru_playback_setup
  20. spdif_passthru_playback_prepare
  21. atc_select_line_in
  22. atc_select_mic_in
  23. atc_capabilities
  24. atc_output_switch_get
  25. atc_output_switch_put
  26. atc_mic_source_switch_get
  27. atc_mic_source_switch_put
  28. atc_select_digit_io
  29. atc_daio_unmute
  30. atc_dao_get_status
  31. atc_dao_set_status
  32. atc_line_front_unmute
  33. atc_line_surround_unmute
  34. atc_line_clfe_unmute
  35. atc_line_rear_unmute
  36. atc_line_in_unmute
  37. atc_mic_unmute
  38. atc_spdif_out_unmute
  39. atc_spdif_in_unmute
  40. atc_spdif_out_get_status
  41. atc_spdif_out_set_status
  42. atc_spdif_out_passthru
  43. atc_release_resources
  44. ct_atc_destroy
  45. atc_dev_free
  46. atc_identify_card
  47. ct_atc_create_alsa_devs
  48. atc_create_hw_devs
  49. atc_get_resources
  50. atc_connect_dai
  51. atc_connect_resources
  52. atc_suspend
  53. atc_hw_resume
  54. atc_resources_resume
  55. atc_resume
  56. ct_atc_create

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /**
   3  * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
   4  *
   5  * @File    ctatc.c
   6  *
   7  * @Brief
   8  * This file contains the implementation of the device resource management
   9  * object.
  10  *
  11  * @Author Liu Chun
  12  * @Date Mar 28 2008
  13  */
  14 
  15 #include "ctatc.h"
  16 #include "ctpcm.h"
  17 #include "ctmixer.h"
  18 #include "ctsrc.h"
  19 #include "ctamixer.h"
  20 #include "ctdaio.h"
  21 #include "cttimer.h"
  22 #include <linux/delay.h>
  23 #include <linux/slab.h>
  24 #include <sound/pcm.h>
  25 #include <sound/control.h>
  26 #include <sound/asoundef.h>
  27 
  28 #define MONO_SUM_SCALE  0x19a8  /* 2^(-0.5) in 14-bit floating format */
  29 #define MAX_MULTI_CHN   8
  30 
  31 #define IEC958_DEFAULT_CON ((IEC958_AES0_NONAUDIO \
  32                             | IEC958_AES0_CON_NOT_COPYRIGHT) \
  33                             | ((IEC958_AES1_CON_MIXER \
  34                             | IEC958_AES1_CON_ORIGINAL) << 8) \
  35                             | (0x10 << 16) \
  36                             | ((IEC958_AES3_CON_FS_48000) << 24))
  37 
  38 static struct snd_pci_quirk subsys_20k1_list[] = {
  39         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0022, "SB055x", CTSB055X),
  40         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x002f, "SB055x", CTSB055X),
  41         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0029, "SB073x", CTSB073X),
  42         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0031, "SB073x", CTSB073X),
  43         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE, 0xf000, 0x6000,
  44                            "UAA", CTUAA),
  45         { } /* terminator */
  46 };
  47 
  48 static struct snd_pci_quirk subsys_20k2_list[] = {
  49         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, PCI_SUBDEVICE_ID_CREATIVE_SB0760,
  50                       "SB0760", CTSB0760),
  51         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, PCI_SUBDEVICE_ID_CREATIVE_SB1270,
  52                       "SB1270", CTSB1270),
  53         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, PCI_SUBDEVICE_ID_CREATIVE_SB08801,
  54                       "SB0880", CTSB0880),
  55         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, PCI_SUBDEVICE_ID_CREATIVE_SB08802,
  56                       "SB0880", CTSB0880),
  57         SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, PCI_SUBDEVICE_ID_CREATIVE_SB08803,
  58                       "SB0880", CTSB0880),
  59         SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_CREATIVE, 0xf000,
  60                            PCI_SUBDEVICE_ID_CREATIVE_HENDRIX, "HENDRIX",
  61                            CTHENDRIX),
  62         { } /* terminator */
  63 };
  64 
  65 static const char *ct_subsys_name[NUM_CTCARDS] = {
  66         /* 20k1 models */
  67         [CTSB055X]      = "SB055x",
  68         [CTSB073X]      = "SB073x",
  69         [CTUAA]         = "UAA",
  70         [CT20K1_UNKNOWN] = "Unknown",
  71         /* 20k2 models */
  72         [CTSB0760]      = "SB076x",
  73         [CTHENDRIX]     = "Hendrix",
  74         [CTSB0880]      = "SB0880",
  75         [CTSB1270]      = "SB1270",
  76         [CT20K2_UNKNOWN] = "Unknown",
  77 };
  78 
  79 static struct {
  80         int (*create)(struct ct_atc *atc,
  81                         enum CTALSADEVS device, const char *device_name);
  82         int (*destroy)(void *alsa_dev);
  83         const char *public_name;
  84 } alsa_dev_funcs[NUM_CTALSADEVS] = {
  85         [FRONT]         = { .create = ct_alsa_pcm_create,
  86                             .destroy = NULL,
  87                             .public_name = "Front/WaveIn"},
  88         [SURROUND]      = { .create = ct_alsa_pcm_create,
  89                             .destroy = NULL,
  90                             .public_name = "Surround"},
  91         [CLFE]          = { .create = ct_alsa_pcm_create,
  92                             .destroy = NULL,
  93                             .public_name = "Center/LFE"},
  94         [SIDE]          = { .create = ct_alsa_pcm_create,
  95                             .destroy = NULL,
  96                             .public_name = "Side"},
  97         [IEC958]        = { .create = ct_alsa_pcm_create,
  98                             .destroy = NULL,
  99                             .public_name = "IEC958 Non-audio"},
 100 
 101         [MIXER]         = { .create = ct_alsa_mix_create,
 102                             .destroy = NULL,
 103                             .public_name = "Mixer"}
 104 };
 105 
 106 typedef int (*create_t)(struct hw *, void **);
 107 typedef int (*destroy_t)(void *);
 108 
 109 static struct {
 110         int (*create)(struct hw *hw, void **rmgr);
 111         int (*destroy)(void *mgr);
 112 } rsc_mgr_funcs[NUM_RSCTYP] = {
 113         [SRC]           = { .create     = (create_t)src_mgr_create,
 114                             .destroy    = (destroy_t)src_mgr_destroy    },
 115         [SRCIMP]        = { .create     = (create_t)srcimp_mgr_create,
 116                             .destroy    = (destroy_t)srcimp_mgr_destroy },
 117         [AMIXER]        = { .create     = (create_t)amixer_mgr_create,
 118                             .destroy    = (destroy_t)amixer_mgr_destroy },
 119         [SUM]           = { .create     = (create_t)sum_mgr_create,
 120                             .destroy    = (destroy_t)sum_mgr_destroy    },
 121         [DAIO]          = { .create     = (create_t)daio_mgr_create,
 122                             .destroy    = (destroy_t)daio_mgr_destroy   }
 123 };
 124 
 125 static int
 126 atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm);
 127 
 128 /* *
 129  * Only mono and interleaved modes are supported now.
 130  * Always allocates a contiguous channel block.
 131  * */
 132 
 133 static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 134 {
 135         struct snd_pcm_runtime *runtime;
 136         struct ct_vm *vm;
 137 
 138         if (!apcm->substream)
 139                 return 0;
 140 
 141         runtime = apcm->substream->runtime;
 142         vm = atc->vm;
 143 
 144         apcm->vm_block = vm->map(vm, apcm->substream, runtime->dma_bytes);
 145 
 146         if (!apcm->vm_block)
 147                 return -ENOENT;
 148 
 149         return 0;
 150 }
 151 
 152 static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 153 {
 154         struct ct_vm *vm;
 155 
 156         if (!apcm->vm_block)
 157                 return;
 158 
 159         vm = atc->vm;
 160 
 161         vm->unmap(vm, apcm->vm_block);
 162 
 163         apcm->vm_block = NULL;
 164 }
 165 
 166 static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index)
 167 {
 168         return atc->vm->get_ptp_phys(atc->vm, index);
 169 }
 170 
 171 static unsigned int convert_format(snd_pcm_format_t snd_format,
 172                                    struct snd_card *card)
 173 {
 174         switch (snd_format) {
 175         case SNDRV_PCM_FORMAT_U8:
 176                 return SRC_SF_U8;
 177         case SNDRV_PCM_FORMAT_S16_LE:
 178                 return SRC_SF_S16;
 179         case SNDRV_PCM_FORMAT_S24_3LE:
 180                 return SRC_SF_S24;
 181         case SNDRV_PCM_FORMAT_S32_LE:
 182                 return SRC_SF_S32;
 183         case SNDRV_PCM_FORMAT_FLOAT_LE:
 184                 return SRC_SF_F32;
 185         default:
 186                 dev_err(card->dev, "not recognized snd format is %d\n",
 187                         snd_format);
 188                 return SRC_SF_S16;
 189         }
 190 }
 191 
 192 static unsigned int
 193 atc_get_pitch(unsigned int input_rate, unsigned int output_rate)
 194 {
 195         unsigned int pitch;
 196         int b;
 197 
 198         /* get pitch and convert to fixed-point 8.24 format. */
 199         pitch = (input_rate / output_rate) << 24;
 200         input_rate %= output_rate;
 201         input_rate /= 100;
 202         output_rate /= 100;
 203         for (b = 31; ((b >= 0) && !(input_rate >> b)); )
 204                 b--;
 205 
 206         if (b >= 0) {
 207                 input_rate <<= (31 - b);
 208                 input_rate /= output_rate;
 209                 b = 24 - (31 - b);
 210                 if (b >= 0)
 211                         input_rate <<= b;
 212                 else
 213                         input_rate >>= -b;
 214 
 215                 pitch |= input_rate;
 216         }
 217 
 218         return pitch;
 219 }
 220 
 221 static int select_rom(unsigned int pitch)
 222 {
 223         if (pitch > 0x00428f5c && pitch < 0x01b851ec) {
 224                 /* 0.26 <= pitch <= 1.72 */
 225                 return 1;
 226         } else if (pitch == 0x01d66666 || pitch == 0x01d66667) {
 227                 /* pitch == 1.8375 */
 228                 return 2;
 229         } else if (pitch == 0x02000000) {
 230                 /* pitch == 2 */
 231                 return 3;
 232         } else if (pitch <= 0x08000000) {
 233                 /* 0 <= pitch <= 8 */
 234                 return 0;
 235         } else {
 236                 return -ENOENT;
 237         }
 238 }
 239 
 240 static int atc_pcm_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 241 {
 242         struct src_mgr *src_mgr = atc->rsc_mgrs[SRC];
 243         struct amixer_mgr *amixer_mgr = atc->rsc_mgrs[AMIXER];
 244         struct src_desc desc = {0};
 245         struct amixer_desc mix_dsc = {0};
 246         struct src *src;
 247         struct amixer *amixer;
 248         int err;
 249         int n_amixer = apcm->substream->runtime->channels, i = 0;
 250         int device = apcm->substream->pcm->device;
 251         unsigned int pitch;
 252 
 253         /* first release old resources */
 254         atc_pcm_release_resources(atc, apcm);
 255 
 256         /* Get SRC resource */
 257         desc.multi = apcm->substream->runtime->channels;
 258         desc.msr = atc->msr;
 259         desc.mode = MEMRD;
 260         err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
 261         if (err)
 262                 goto error1;
 263 
 264         pitch = atc_get_pitch(apcm->substream->runtime->rate,
 265                                                 (atc->rsr * atc->msr));
 266         src = apcm->src;
 267         src->ops->set_pitch(src, pitch);
 268         src->ops->set_rom(src, select_rom(pitch));
 269         src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
 270                                              atc->card));
 271         src->ops->set_pm(src, (src->ops->next_interleave(src) != NULL));
 272 
 273         /* Get AMIXER resource */
 274         n_amixer = (n_amixer < 2) ? 2 : n_amixer;
 275         apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
 276         if (!apcm->amixers) {
 277                 err = -ENOMEM;
 278                 goto error1;
 279         }
 280         mix_dsc.msr = atc->msr;
 281         for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
 282                 err = amixer_mgr->get_amixer(amixer_mgr, &mix_dsc,
 283                                         (struct amixer **)&apcm->amixers[i]);
 284                 if (err)
 285                         goto error1;
 286 
 287                 apcm->n_amixer++;
 288         }
 289 
 290         /* Set up device virtual mem map */
 291         err = ct_map_audio_buffer(atc, apcm);
 292         if (err < 0)
 293                 goto error1;
 294 
 295         /* Connect resources */
 296         src = apcm->src;
 297         for (i = 0; i < n_amixer; i++) {
 298                 amixer = apcm->amixers[i];
 299                 mutex_lock(&atc->atc_mutex);
 300                 amixer->ops->setup(amixer, &src->rsc,
 301                                         INIT_VOL, atc->pcm[i+device*2]);
 302                 mutex_unlock(&atc->atc_mutex);
 303                 src = src->ops->next_interleave(src);
 304                 if (!src)
 305                         src = apcm->src;
 306         }
 307 
 308         ct_timer_prepare(apcm->timer);
 309 
 310         return 0;
 311 
 312 error1:
 313         atc_pcm_release_resources(atc, apcm);
 314         return err;
 315 }
 316 
 317 static int
 318 atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 319 {
 320         struct src_mgr *src_mgr = atc->rsc_mgrs[SRC];
 321         struct srcimp_mgr *srcimp_mgr = atc->rsc_mgrs[SRCIMP];
 322         struct amixer_mgr *amixer_mgr = atc->rsc_mgrs[AMIXER];
 323         struct sum_mgr *sum_mgr = atc->rsc_mgrs[SUM];
 324         struct srcimp *srcimp;
 325         int i;
 326 
 327         if (apcm->srcimps) {
 328                 for (i = 0; i < apcm->n_srcimp; i++) {
 329                         srcimp = apcm->srcimps[i];
 330                         srcimp->ops->unmap(srcimp);
 331                         srcimp_mgr->put_srcimp(srcimp_mgr, srcimp);
 332                         apcm->srcimps[i] = NULL;
 333                 }
 334                 kfree(apcm->srcimps);
 335                 apcm->srcimps = NULL;
 336         }
 337 
 338         if (apcm->srccs) {
 339                 for (i = 0; i < apcm->n_srcc; i++) {
 340                         src_mgr->put_src(src_mgr, apcm->srccs[i]);
 341                         apcm->srccs[i] = NULL;
 342                 }
 343                 kfree(apcm->srccs);
 344                 apcm->srccs = NULL;
 345         }
 346 
 347         if (apcm->amixers) {
 348                 for (i = 0; i < apcm->n_amixer; i++) {
 349                         amixer_mgr->put_amixer(amixer_mgr, apcm->amixers[i]);
 350                         apcm->amixers[i] = NULL;
 351                 }
 352                 kfree(apcm->amixers);
 353                 apcm->amixers = NULL;
 354         }
 355 
 356         if (apcm->mono) {
 357                 sum_mgr->put_sum(sum_mgr, apcm->mono);
 358                 apcm->mono = NULL;
 359         }
 360 
 361         if (apcm->src) {
 362                 src_mgr->put_src(src_mgr, apcm->src);
 363                 apcm->src = NULL;
 364         }
 365 
 366         if (apcm->vm_block) {
 367                 /* Undo device virtual mem map */
 368                 ct_unmap_audio_buffer(atc, apcm);
 369                 apcm->vm_block = NULL;
 370         }
 371 
 372         return 0;
 373 }
 374 
 375 static int atc_pcm_playback_start(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 376 {
 377         unsigned int max_cisz;
 378         struct src *src = apcm->src;
 379 
 380         if (apcm->started)
 381                 return 0;
 382         apcm->started = 1;
 383 
 384         max_cisz = src->multi * src->rsc.msr;
 385         max_cisz = 0x80 * (max_cisz < 8 ? max_cisz : 8);
 386 
 387         src->ops->set_sa(src, apcm->vm_block->addr);
 388         src->ops->set_la(src, apcm->vm_block->addr + apcm->vm_block->size);
 389         src->ops->set_ca(src, apcm->vm_block->addr + max_cisz);
 390         src->ops->set_cisz(src, max_cisz);
 391 
 392         src->ops->set_bm(src, 1);
 393         src->ops->set_state(src, SRC_STATE_INIT);
 394         src->ops->commit_write(src);
 395 
 396         ct_timer_start(apcm->timer);
 397         return 0;
 398 }
 399 
 400 static int atc_pcm_stop(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 401 {
 402         struct src *src;
 403         int i;
 404 
 405         ct_timer_stop(apcm->timer);
 406 
 407         src = apcm->src;
 408         src->ops->set_bm(src, 0);
 409         src->ops->set_state(src, SRC_STATE_OFF);
 410         src->ops->commit_write(src);
 411 
 412         if (apcm->srccs) {
 413                 for (i = 0; i < apcm->n_srcc; i++) {
 414                         src = apcm->srccs[i];
 415                         src->ops->set_bm(src, 0);
 416                         src->ops->set_state(src, SRC_STATE_OFF);
 417                         src->ops->commit_write(src);
 418                 }
 419         }
 420 
 421         apcm->started = 0;
 422 
 423         return 0;
 424 }
 425 
 426 static int
 427 atc_pcm_playback_position(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 428 {
 429         struct src *src = apcm->src;
 430         u32 size, max_cisz;
 431         int position;
 432 
 433         if (!src)
 434                 return 0;
 435         position = src->ops->get_ca(src);
 436 
 437         if (position < apcm->vm_block->addr) {
 438                 dev_dbg(atc->card->dev,
 439                         "bad ca - ca=0x%08x, vba=0x%08x, vbs=0x%08x\n",
 440                         position, apcm->vm_block->addr, apcm->vm_block->size);
 441                 position = apcm->vm_block->addr;
 442         }
 443 
 444         size = apcm->vm_block->size;
 445         max_cisz = src->multi * src->rsc.msr;
 446         max_cisz = 128 * (max_cisz < 8 ? max_cisz : 8);
 447 
 448         return (position + size - max_cisz - apcm->vm_block->addr) % size;
 449 }
 450 
 451 struct src_node_conf_t {
 452         unsigned int pitch;
 453         unsigned int msr:8;
 454         unsigned int mix_msr:8;
 455         unsigned int imp_msr:8;
 456         unsigned int vo:1;
 457 };
 458 
 459 static void setup_src_node_conf(struct ct_atc *atc, struct ct_atc_pcm *apcm,
 460                                 struct src_node_conf_t *conf, int *n_srcc)
 461 {
 462         unsigned int pitch;
 463 
 464         /* get pitch and convert to fixed-point 8.24 format. */
 465         pitch = atc_get_pitch((atc->rsr * atc->msr),
 466                                 apcm->substream->runtime->rate);
 467         *n_srcc = 0;
 468 
 469         if (1 == atc->msr) { /* FIXME: do we really need SRC here if pitch==1 */
 470                 *n_srcc = apcm->substream->runtime->channels;
 471                 conf[0].pitch = pitch;
 472                 conf[0].mix_msr = conf[0].imp_msr = conf[0].msr = 1;
 473                 conf[0].vo = 1;
 474         } else if (2 <= atc->msr) {
 475                 if (0x8000000 < pitch) {
 476                         /* Need two-stage SRCs, SRCIMPs and
 477                          * AMIXERs for converting format */
 478                         conf[0].pitch = (atc->msr << 24);
 479                         conf[0].msr = conf[0].mix_msr = 1;
 480                         conf[0].imp_msr = atc->msr;
 481                         conf[0].vo = 0;
 482                         conf[1].pitch = atc_get_pitch(atc->rsr,
 483                                         apcm->substream->runtime->rate);
 484                         conf[1].msr = conf[1].mix_msr = conf[1].imp_msr = 1;
 485                         conf[1].vo = 1;
 486                         *n_srcc = apcm->substream->runtime->channels * 2;
 487                 } else if (0x1000000 < pitch) {
 488                         /* Need one-stage SRCs, SRCIMPs and
 489                          * AMIXERs for converting format */
 490                         conf[0].pitch = pitch;
 491                         conf[0].msr = conf[0].mix_msr
 492                                     = conf[0].imp_msr = atc->msr;
 493                         conf[0].vo = 1;
 494                         *n_srcc = apcm->substream->runtime->channels;
 495                 }
 496         }
 497 }
 498 
 499 static int
 500 atc_pcm_capture_get_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 501 {
 502         struct src_mgr *src_mgr = atc->rsc_mgrs[SRC];
 503         struct srcimp_mgr *srcimp_mgr = atc->rsc_mgrs[SRCIMP];
 504         struct amixer_mgr *amixer_mgr = atc->rsc_mgrs[AMIXER];
 505         struct sum_mgr *sum_mgr = atc->rsc_mgrs[SUM];
 506         struct src_desc src_dsc = {0};
 507         struct src *src;
 508         struct srcimp_desc srcimp_dsc = {0};
 509         struct srcimp *srcimp;
 510         struct amixer_desc mix_dsc = {0};
 511         struct sum_desc sum_dsc = {0};
 512         unsigned int pitch;
 513         int multi, err, i;
 514         int n_srcimp, n_amixer, n_srcc, n_sum;
 515         struct src_node_conf_t src_node_conf[2] = {{0} };
 516 
 517         /* first release old resources */
 518         atc_pcm_release_resources(atc, apcm);
 519 
 520         /* The numbers of converting SRCs and SRCIMPs should be determined
 521          * by pitch value. */
 522 
 523         multi = apcm->substream->runtime->channels;
 524 
 525         /* get pitch and convert to fixed-point 8.24 format. */
 526         pitch = atc_get_pitch((atc->rsr * atc->msr),
 527                                 apcm->substream->runtime->rate);
 528 
 529         setup_src_node_conf(atc, apcm, src_node_conf, &n_srcc);
 530         n_sum = (1 == multi) ? 1 : 0;
 531         n_amixer = n_sum * 2 + n_srcc;
 532         n_srcimp = n_srcc;
 533         if ((multi > 1) && (0x8000000 >= pitch)) {
 534                 /* Need extra AMIXERs and SRCIMPs for special treatment
 535                  * of interleaved recording of conjugate channels */
 536                 n_amixer += multi * atc->msr;
 537                 n_srcimp += multi * atc->msr;
 538         } else {
 539                 n_srcimp += multi;
 540         }
 541 
 542         if (n_srcc) {
 543                 apcm->srccs = kcalloc(n_srcc, sizeof(void *), GFP_KERNEL);
 544                 if (!apcm->srccs)
 545                         return -ENOMEM;
 546         }
 547         if (n_amixer) {
 548                 apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
 549                 if (!apcm->amixers) {
 550                         err = -ENOMEM;
 551                         goto error1;
 552                 }
 553         }
 554         apcm->srcimps = kcalloc(n_srcimp, sizeof(void *), GFP_KERNEL);
 555         if (!apcm->srcimps) {
 556                 err = -ENOMEM;
 557                 goto error1;
 558         }
 559 
 560         /* Allocate SRCs for sample rate conversion if needed */
 561         src_dsc.multi = 1;
 562         src_dsc.mode = ARCRW;
 563         for (i = 0, apcm->n_srcc = 0; i < n_srcc; i++) {
 564                 src_dsc.msr = src_node_conf[i/multi].msr;
 565                 err = src_mgr->get_src(src_mgr, &src_dsc,
 566                                         (struct src **)&apcm->srccs[i]);
 567                 if (err)
 568                         goto error1;
 569 
 570                 src = apcm->srccs[i];
 571                 pitch = src_node_conf[i/multi].pitch;
 572                 src->ops->set_pitch(src, pitch);
 573                 src->ops->set_rom(src, select_rom(pitch));
 574                 src->ops->set_vo(src, src_node_conf[i/multi].vo);
 575 
 576                 apcm->n_srcc++;
 577         }
 578 
 579         /* Allocate AMIXERs for routing SRCs of conversion if needed */
 580         for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
 581                 if (i < (n_sum*2))
 582                         mix_dsc.msr = atc->msr;
 583                 else if (i < (n_sum*2+n_srcc))
 584                         mix_dsc.msr = src_node_conf[(i-n_sum*2)/multi].mix_msr;
 585                 else
 586                         mix_dsc.msr = 1;
 587 
 588                 err = amixer_mgr->get_amixer(amixer_mgr, &mix_dsc,
 589                                         (struct amixer **)&apcm->amixers[i]);
 590                 if (err)
 591                         goto error1;
 592 
 593                 apcm->n_amixer++;
 594         }
 595 
 596         /* Allocate a SUM resource to mix all input channels together */
 597         sum_dsc.msr = atc->msr;
 598         err = sum_mgr->get_sum(sum_mgr, &sum_dsc, (struct sum **)&apcm->mono);
 599         if (err)
 600                 goto error1;
 601 
 602         pitch = atc_get_pitch((atc->rsr * atc->msr),
 603                                 apcm->substream->runtime->rate);
 604         /* Allocate SRCIMP resources */
 605         for (i = 0, apcm->n_srcimp = 0; i < n_srcimp; i++) {
 606                 if (i < (n_srcc))
 607                         srcimp_dsc.msr = src_node_conf[i/multi].imp_msr;
 608                 else if (1 == multi)
 609                         srcimp_dsc.msr = (pitch <= 0x8000000) ? atc->msr : 1;
 610                 else
 611                         srcimp_dsc.msr = 1;
 612 
 613                 err = srcimp_mgr->get_srcimp(srcimp_mgr, &srcimp_dsc, &srcimp);
 614                 if (err)
 615                         goto error1;
 616 
 617                 apcm->srcimps[i] = srcimp;
 618                 apcm->n_srcimp++;
 619         }
 620 
 621         /* Allocate a SRC for writing data to host memory */
 622         src_dsc.multi = apcm->substream->runtime->channels;
 623         src_dsc.msr = 1;
 624         src_dsc.mode = MEMWR;
 625         err = src_mgr->get_src(src_mgr, &src_dsc, (struct src **)&apcm->src);
 626         if (err)
 627                 goto error1;
 628 
 629         src = apcm->src;
 630         src->ops->set_pitch(src, pitch);
 631 
 632         /* Set up device virtual mem map */
 633         err = ct_map_audio_buffer(atc, apcm);
 634         if (err < 0)
 635                 goto error1;
 636 
 637         return 0;
 638 
 639 error1:
 640         atc_pcm_release_resources(atc, apcm);
 641         return err;
 642 }
 643 
 644 static int atc_pcm_capture_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 645 {
 646         struct src *src;
 647         struct amixer *amixer;
 648         struct srcimp *srcimp;
 649         struct ct_mixer *mixer = atc->mixer;
 650         struct sum *mono;
 651         struct rsc *out_ports[8] = {NULL};
 652         int err, i, j, n_sum, multi;
 653         unsigned int pitch;
 654         int mix_base = 0, imp_base = 0;
 655 
 656         atc_pcm_release_resources(atc, apcm);
 657 
 658         /* Get needed resources. */
 659         err = atc_pcm_capture_get_resources(atc, apcm);
 660         if (err)
 661                 return err;
 662 
 663         /* Connect resources */
 664         mixer->get_output_ports(mixer, MIX_PCMO_FRONT,
 665                                 &out_ports[0], &out_ports[1]);
 666 
 667         multi = apcm->substream->runtime->channels;
 668         if (1 == multi) {
 669                 mono = apcm->mono;
 670                 for (i = 0; i < 2; i++) {
 671                         amixer = apcm->amixers[i];
 672                         amixer->ops->setup(amixer, out_ports[i],
 673                                                 MONO_SUM_SCALE, mono);
 674                 }
 675                 out_ports[0] = &mono->rsc;
 676                 n_sum = 1;
 677                 mix_base = n_sum * 2;
 678         }
 679 
 680         for (i = 0; i < apcm->n_srcc; i++) {
 681                 src = apcm->srccs[i];
 682                 srcimp = apcm->srcimps[imp_base+i];
 683                 amixer = apcm->amixers[mix_base+i];
 684                 srcimp->ops->map(srcimp, src, out_ports[i%multi]);
 685                 amixer->ops->setup(amixer, &src->rsc, INIT_VOL, NULL);
 686                 out_ports[i%multi] = &amixer->rsc;
 687         }
 688 
 689         pitch = atc_get_pitch((atc->rsr * atc->msr),
 690                                 apcm->substream->runtime->rate);
 691 
 692         if ((multi > 1) && (pitch <= 0x8000000)) {
 693                 /* Special connection for interleaved
 694                  * recording with conjugate channels */
 695                 for (i = 0; i < multi; i++) {
 696                         out_ports[i]->ops->master(out_ports[i]);
 697                         for (j = 0; j < atc->msr; j++) {
 698                                 amixer = apcm->amixers[apcm->n_srcc+j*multi+i];
 699                                 amixer->ops->set_input(amixer, out_ports[i]);
 700                                 amixer->ops->set_scale(amixer, INIT_VOL);
 701                                 amixer->ops->set_sum(amixer, NULL);
 702                                 amixer->ops->commit_raw_write(amixer);
 703                                 out_ports[i]->ops->next_conj(out_ports[i]);
 704 
 705                                 srcimp = apcm->srcimps[apcm->n_srcc+j*multi+i];
 706                                 srcimp->ops->map(srcimp, apcm->src,
 707                                                         &amixer->rsc);
 708                         }
 709                 }
 710         } else {
 711                 for (i = 0; i < multi; i++) {
 712                         srcimp = apcm->srcimps[apcm->n_srcc+i];
 713                         srcimp->ops->map(srcimp, apcm->src, out_ports[i]);
 714                 }
 715         }
 716 
 717         ct_timer_prepare(apcm->timer);
 718 
 719         return 0;
 720 }
 721 
 722 static int atc_pcm_capture_start(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 723 {
 724         struct src *src;
 725         struct src_mgr *src_mgr = atc->rsc_mgrs[SRC];
 726         int i, multi;
 727 
 728         if (apcm->started)
 729                 return 0;
 730 
 731         apcm->started = 1;
 732         multi = apcm->substream->runtime->channels;
 733         /* Set up converting SRCs */
 734         for (i = 0; i < apcm->n_srcc; i++) {
 735                 src = apcm->srccs[i];
 736                 src->ops->set_pm(src, ((i%multi) != (multi-1)));
 737                 src_mgr->src_disable(src_mgr, src);
 738         }
 739 
 740         /*  Set up recording SRC */
 741         src = apcm->src;
 742         src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
 743                                              atc->card));
 744         src->ops->set_sa(src, apcm->vm_block->addr);
 745         src->ops->set_la(src, apcm->vm_block->addr + apcm->vm_block->size);
 746         src->ops->set_ca(src, apcm->vm_block->addr);
 747         src_mgr->src_disable(src_mgr, src);
 748 
 749         /* Disable relevant SRCs firstly */
 750         src_mgr->commit_write(src_mgr);
 751 
 752         /* Enable SRCs respectively */
 753         for (i = 0; i < apcm->n_srcc; i++) {
 754                 src = apcm->srccs[i];
 755                 src->ops->set_state(src, SRC_STATE_RUN);
 756                 src->ops->commit_write(src);
 757                 src_mgr->src_enable_s(src_mgr, src);
 758         }
 759         src = apcm->src;
 760         src->ops->set_bm(src, 1);
 761         src->ops->set_state(src, SRC_STATE_RUN);
 762         src->ops->commit_write(src);
 763         src_mgr->src_enable_s(src_mgr, src);
 764 
 765         /* Enable relevant SRCs synchronously */
 766         src_mgr->commit_write(src_mgr);
 767 
 768         ct_timer_start(apcm->timer);
 769         return 0;
 770 }
 771 
 772 static int
 773 atc_pcm_capture_position(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 774 {
 775         struct src *src = apcm->src;
 776 
 777         if (!src)
 778                 return 0;
 779         return src->ops->get_ca(src) - apcm->vm_block->addr;
 780 }
 781 
 782 static int spdif_passthru_playback_get_resources(struct ct_atc *atc,
 783                                                  struct ct_atc_pcm *apcm)
 784 {
 785         struct src_mgr *src_mgr = atc->rsc_mgrs[SRC];
 786         struct amixer_mgr *amixer_mgr = atc->rsc_mgrs[AMIXER];
 787         struct src_desc desc = {0};
 788         struct amixer_desc mix_dsc = {0};
 789         struct src *src;
 790         int err;
 791         int n_amixer = apcm->substream->runtime->channels, i;
 792         unsigned int pitch, rsr = atc->pll_rate;
 793 
 794         /* first release old resources */
 795         atc_pcm_release_resources(atc, apcm);
 796 
 797         /* Get SRC resource */
 798         desc.multi = apcm->substream->runtime->channels;
 799         desc.msr = 1;
 800         while (apcm->substream->runtime->rate > (rsr * desc.msr))
 801                 desc.msr <<= 1;
 802 
 803         desc.mode = MEMRD;
 804         err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
 805         if (err)
 806                 goto error1;
 807 
 808         pitch = atc_get_pitch(apcm->substream->runtime->rate, (rsr * desc.msr));
 809         src = apcm->src;
 810         src->ops->set_pitch(src, pitch);
 811         src->ops->set_rom(src, select_rom(pitch));
 812         src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
 813                                              atc->card));
 814         src->ops->set_pm(src, (src->ops->next_interleave(src) != NULL));
 815         src->ops->set_bp(src, 1);
 816 
 817         /* Get AMIXER resource */
 818         n_amixer = (n_amixer < 2) ? 2 : n_amixer;
 819         apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
 820         if (!apcm->amixers) {
 821                 err = -ENOMEM;
 822                 goto error1;
 823         }
 824         mix_dsc.msr = desc.msr;
 825         for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
 826                 err = amixer_mgr->get_amixer(amixer_mgr, &mix_dsc,
 827                                         (struct amixer **)&apcm->amixers[i]);
 828                 if (err)
 829                         goto error1;
 830 
 831                 apcm->n_amixer++;
 832         }
 833 
 834         /* Set up device virtual mem map */
 835         err = ct_map_audio_buffer(atc, apcm);
 836         if (err < 0)
 837                 goto error1;
 838 
 839         return 0;
 840 
 841 error1:
 842         atc_pcm_release_resources(atc, apcm);
 843         return err;
 844 }
 845 
 846 static int atc_pll_init(struct ct_atc *atc, int rate)
 847 {
 848         struct hw *hw = atc->hw;
 849         int err;
 850         err = hw->pll_init(hw, rate);
 851         atc->pll_rate = err ? 0 : rate;
 852         return err;
 853 }
 854 
 855 static int
 856 spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 857 {
 858         struct dao *dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
 859         unsigned int rate = apcm->substream->runtime->rate;
 860         unsigned int status;
 861         int err = 0;
 862         unsigned char iec958_con_fs;
 863 
 864         switch (rate) {
 865         case 48000:
 866                 iec958_con_fs = IEC958_AES3_CON_FS_48000;
 867                 break;
 868         case 44100:
 869                 iec958_con_fs = IEC958_AES3_CON_FS_44100;
 870                 break;
 871         case 32000:
 872                 iec958_con_fs = IEC958_AES3_CON_FS_32000;
 873                 break;
 874         default:
 875                 return -ENOENT;
 876         }
 877 
 878         mutex_lock(&atc->atc_mutex);
 879         dao->ops->get_spos(dao, &status);
 880         if (((status >> 24) & IEC958_AES3_CON_FS) != iec958_con_fs) {
 881                 status &= ~(IEC958_AES3_CON_FS << 24);
 882                 status |= (iec958_con_fs << 24);
 883                 dao->ops->set_spos(dao, status);
 884                 dao->ops->commit_write(dao);
 885         }
 886         if ((rate != atc->pll_rate) && (32000 != rate))
 887                 err = atc_pll_init(atc, rate);
 888         mutex_unlock(&atc->atc_mutex);
 889 
 890         return err;
 891 }
 892 
 893 static int
 894 spdif_passthru_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
 895 {
 896         struct src *src;
 897         struct amixer *amixer;
 898         struct dao *dao;
 899         int err;
 900         int i;
 901 
 902         atc_pcm_release_resources(atc, apcm);
 903 
 904         /* Configure SPDIFOO and PLL to passthrough mode;
 905          * determine pll_rate. */
 906         err = spdif_passthru_playback_setup(atc, apcm);
 907         if (err)
 908                 return err;
 909 
 910         /* Get needed resources. */
 911         err = spdif_passthru_playback_get_resources(atc, apcm);
 912         if (err)
 913                 return err;
 914 
 915         /* Connect resources */
 916         src = apcm->src;
 917         for (i = 0; i < apcm->n_amixer; i++) {
 918                 amixer = apcm->amixers[i];
 919                 amixer->ops->setup(amixer, &src->rsc, INIT_VOL, NULL);
 920                 src = src->ops->next_interleave(src);
 921                 if (!src)
 922                         src = apcm->src;
 923         }
 924         /* Connect to SPDIFOO */
 925         mutex_lock(&atc->atc_mutex);
 926         dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
 927         amixer = apcm->amixers[0];
 928         dao->ops->set_left_input(dao, &amixer->rsc);
 929         amixer = apcm->amixers[1];
 930         dao->ops->set_right_input(dao, &amixer->rsc);
 931         mutex_unlock(&atc->atc_mutex);
 932 
 933         ct_timer_prepare(apcm->timer);
 934 
 935         return 0;
 936 }
 937 
 938 static int atc_select_line_in(struct ct_atc *atc)
 939 {
 940         struct hw *hw = atc->hw;
 941         struct ct_mixer *mixer = atc->mixer;
 942         struct src *src;
 943 
 944         if (hw->is_adc_source_selected(hw, ADC_LINEIN))
 945                 return 0;
 946 
 947         mixer->set_input_left(mixer, MIX_MIC_IN, NULL);
 948         mixer->set_input_right(mixer, MIX_MIC_IN, NULL);
 949 
 950         hw->select_adc_source(hw, ADC_LINEIN);
 951 
 952         src = atc->srcs[2];
 953         mixer->set_input_left(mixer, MIX_LINE_IN, &src->rsc);
 954         src = atc->srcs[3];
 955         mixer->set_input_right(mixer, MIX_LINE_IN, &src->rsc);
 956 
 957         return 0;
 958 }
 959 
 960 static int atc_select_mic_in(struct ct_atc *atc)
 961 {
 962         struct hw *hw = atc->hw;
 963         struct ct_mixer *mixer = atc->mixer;
 964         struct src *src;
 965 
 966         if (hw->is_adc_source_selected(hw, ADC_MICIN))
 967                 return 0;
 968 
 969         mixer->set_input_left(mixer, MIX_LINE_IN, NULL);
 970         mixer->set_input_right(mixer, MIX_LINE_IN, NULL);
 971 
 972         hw->select_adc_source(hw, ADC_MICIN);
 973 
 974         src = atc->srcs[2];
 975         mixer->set_input_left(mixer, MIX_MIC_IN, &src->rsc);
 976         src = atc->srcs[3];
 977         mixer->set_input_right(mixer, MIX_MIC_IN, &src->rsc);
 978 
 979         return 0;
 980 }
 981 
 982 static struct capabilities atc_capabilities(struct ct_atc *atc)
 983 {
 984         struct hw *hw = atc->hw;
 985 
 986         return hw->capabilities(hw);
 987 }
 988 
 989 static int atc_output_switch_get(struct ct_atc *atc)
 990 {
 991         struct hw *hw = atc->hw;
 992 
 993         return hw->output_switch_get(hw);
 994 }
 995 
 996 static int atc_output_switch_put(struct ct_atc *atc, int position)
 997 {
 998         struct hw *hw = atc->hw;
 999 
1000         return hw->output_switch_put(hw, position);
1001 }
1002 
1003 static int atc_mic_source_switch_get(struct ct_atc *atc)
1004 {
1005         struct hw *hw = atc->hw;
1006 
1007         return hw->mic_source_switch_get(hw);
1008 }
1009 
1010 static int atc_mic_source_switch_put(struct ct_atc *atc, int position)
1011 {
1012         struct hw *hw = atc->hw;
1013 
1014         return hw->mic_source_switch_put(hw, position);
1015 }
1016 
1017 static int atc_select_digit_io(struct ct_atc *atc)
1018 {
1019         struct hw *hw = atc->hw;
1020 
1021         if (hw->is_adc_source_selected(hw, ADC_NONE))
1022                 return 0;
1023 
1024         hw->select_adc_source(hw, ADC_NONE);
1025 
1026         return 0;
1027 }
1028 
1029 static int atc_daio_unmute(struct ct_atc *atc, unsigned char state, int type)
1030 {
1031         struct daio_mgr *daio_mgr = atc->rsc_mgrs[DAIO];
1032 
1033         if (state)
1034                 daio_mgr->daio_enable(daio_mgr, atc->daios[type]);
1035         else
1036                 daio_mgr->daio_disable(daio_mgr, atc->daios[type]);
1037 
1038         daio_mgr->commit_write(daio_mgr);
1039 
1040         return 0;
1041 }
1042 
1043 static int
1044 atc_dao_get_status(struct ct_atc *atc, unsigned int *status, int type)
1045 {
1046         struct dao *dao = container_of(atc->daios[type], struct dao, daio);
1047         return dao->ops->get_spos(dao, status);
1048 }
1049 
1050 static int
1051 atc_dao_set_status(struct ct_atc *atc, unsigned int status, int type)
1052 {
1053         struct dao *dao = container_of(atc->daios[type], struct dao, daio);
1054 
1055         dao->ops->set_spos(dao, status);
1056         dao->ops->commit_write(dao);
1057         return 0;
1058 }
1059 
1060 static int atc_line_front_unmute(struct ct_atc *atc, unsigned char state)
1061 {
1062         return atc_daio_unmute(atc, state, LINEO1);
1063 }
1064 
1065 static int atc_line_surround_unmute(struct ct_atc *atc, unsigned char state)
1066 {
1067         return atc_daio_unmute(atc, state, LINEO2);
1068 }
1069 
1070 static int atc_line_clfe_unmute(struct ct_atc *atc, unsigned char state)
1071 {
1072         return atc_daio_unmute(atc, state, LINEO3);
1073 }
1074 
1075 static int atc_line_rear_unmute(struct ct_atc *atc, unsigned char state)
1076 {
1077         return atc_daio_unmute(atc, state, LINEO4);
1078 }
1079 
1080 static int atc_line_in_unmute(struct ct_atc *atc, unsigned char state)
1081 {
1082         return atc_daio_unmute(atc, state, LINEIM);
1083 }
1084 
1085 static int atc_mic_unmute(struct ct_atc *atc, unsigned char state)
1086 {
1087         return atc_daio_unmute(atc, state, MIC);
1088 }
1089 
1090 static int atc_spdif_out_unmute(struct ct_atc *atc, unsigned char state)
1091 {
1092         return atc_daio_unmute(atc, state, SPDIFOO);
1093 }
1094 
1095 static int atc_spdif_in_unmute(struct ct_atc *atc, unsigned char state)
1096 {
1097         return atc_daio_unmute(atc, state, SPDIFIO);
1098 }
1099 
1100 static int atc_spdif_out_get_status(struct ct_atc *atc, unsigned int *status)
1101 {
1102         return atc_dao_get_status(atc, status, SPDIFOO);
1103 }
1104 
1105 static int atc_spdif_out_set_status(struct ct_atc *atc, unsigned int status)
1106 {
1107         return atc_dao_set_status(atc, status, SPDIFOO);
1108 }
1109 
1110 static int atc_spdif_out_passthru(struct ct_atc *atc, unsigned char state)
1111 {
1112         struct dao_desc da_dsc = {0};
1113         struct dao *dao;
1114         int err;
1115         struct ct_mixer *mixer = atc->mixer;
1116         struct rsc *rscs[2] = {NULL};
1117         unsigned int spos = 0;
1118 
1119         mutex_lock(&atc->atc_mutex);
1120         dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
1121         da_dsc.msr = state ? 1 : atc->msr;
1122         da_dsc.passthru = state ? 1 : 0;
1123         err = dao->ops->reinit(dao, &da_dsc);
1124         if (state) {
1125                 spos = IEC958_DEFAULT_CON;
1126         } else {
1127                 mixer->get_output_ports(mixer, MIX_SPDIF_OUT,
1128                                         &rscs[0], &rscs[1]);
1129                 dao->ops->set_left_input(dao, rscs[0]);
1130                 dao->ops->set_right_input(dao, rscs[1]);
1131                 /* Restore PLL to atc->rsr if needed. */
1132                 if (atc->pll_rate != atc->rsr)
1133                         err = atc_pll_init(atc, atc->rsr);
1134         }
1135         dao->ops->set_spos(dao, spos);
1136         dao->ops->commit_write(dao);
1137         mutex_unlock(&atc->atc_mutex);
1138 
1139         return err;
1140 }
1141 
1142 static int atc_release_resources(struct ct_atc *atc)
1143 {
1144         int i;
1145         struct daio_mgr *daio_mgr = NULL;
1146         struct dao *dao = NULL;
1147         struct daio *daio = NULL;
1148         struct sum_mgr *sum_mgr = NULL;
1149         struct src_mgr *src_mgr = NULL;
1150         struct srcimp_mgr *srcimp_mgr = NULL;
1151         struct srcimp *srcimp = NULL;
1152         struct ct_mixer *mixer = NULL;
1153 
1154         /* disconnect internal mixer objects */
1155         if (atc->mixer) {
1156                 mixer = atc->mixer;
1157                 mixer->set_input_left(mixer, MIX_LINE_IN, NULL);
1158                 mixer->set_input_right(mixer, MIX_LINE_IN, NULL);
1159                 mixer->set_input_left(mixer, MIX_MIC_IN, NULL);
1160                 mixer->set_input_right(mixer, MIX_MIC_IN, NULL);
1161                 mixer->set_input_left(mixer, MIX_SPDIF_IN, NULL);
1162                 mixer->set_input_right(mixer, MIX_SPDIF_IN, NULL);
1163         }
1164 
1165         if (atc->daios) {
1166                 daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
1167                 for (i = 0; i < atc->n_daio; i++) {
1168                         daio = atc->daios[i];
1169                         if (daio->type < LINEIM) {
1170                                 dao = container_of(daio, struct dao, daio);
1171                                 dao->ops->clear_left_input(dao);
1172                                 dao->ops->clear_right_input(dao);
1173                         }
1174                         daio_mgr->put_daio(daio_mgr, daio);
1175                 }
1176                 kfree(atc->daios);
1177                 atc->daios = NULL;
1178         }
1179 
1180         if (atc->pcm) {
1181                 sum_mgr = atc->rsc_mgrs[SUM];
1182                 for (i = 0; i < atc->n_pcm; i++)
1183                         sum_mgr->put_sum(sum_mgr, atc->pcm[i]);
1184 
1185                 kfree(atc->pcm);
1186                 atc->pcm = NULL;
1187         }
1188 
1189         if (atc->srcs) {
1190                 src_mgr = atc->rsc_mgrs[SRC];
1191                 for (i = 0; i < atc->n_src; i++)
1192                         src_mgr->put_src(src_mgr, atc->srcs[i]);
1193 
1194                 kfree(atc->srcs);
1195                 atc->srcs = NULL;
1196         }
1197 
1198         if (atc->srcimps) {
1199                 srcimp_mgr = atc->rsc_mgrs[SRCIMP];
1200                 for (i = 0; i < atc->n_srcimp; i++) {
1201                         srcimp = atc->srcimps[i];
1202                         srcimp->ops->unmap(srcimp);
1203                         srcimp_mgr->put_srcimp(srcimp_mgr, atc->srcimps[i]);
1204                 }
1205                 kfree(atc->srcimps);
1206                 atc->srcimps = NULL;
1207         }
1208 
1209         return 0;
1210 }
1211 
1212 static int ct_atc_destroy(struct ct_atc *atc)
1213 {
1214         int i = 0;
1215 
1216         if (!atc)
1217                 return 0;
1218 
1219         if (atc->timer) {
1220                 ct_timer_free(atc->timer);
1221                 atc->timer = NULL;
1222         }
1223 
1224         atc_release_resources(atc);
1225 
1226         /* Destroy internal mixer objects */
1227         if (atc->mixer)
1228                 ct_mixer_destroy(atc->mixer);
1229 
1230         for (i = 0; i < NUM_RSCTYP; i++) {
1231                 if (rsc_mgr_funcs[i].destroy && atc->rsc_mgrs[i])
1232                         rsc_mgr_funcs[i].destroy(atc->rsc_mgrs[i]);
1233 
1234         }
1235 
1236         if (atc->hw)
1237                 destroy_hw_obj(atc->hw);
1238 
1239         /* Destroy device virtual memory manager object */
1240         if (atc->vm) {
1241                 ct_vm_destroy(atc->vm);
1242                 atc->vm = NULL;
1243         }
1244 
1245         kfree(atc);
1246 
1247         return 0;
1248 }
1249 
1250 static int atc_dev_free(struct snd_device *dev)
1251 {
1252         struct ct_atc *atc = dev->device_data;
1253         return ct_atc_destroy(atc);
1254 }
1255 
1256 static int atc_identify_card(struct ct_atc *atc, unsigned int ssid)
1257 {
1258         const struct snd_pci_quirk *p;
1259         const struct snd_pci_quirk *list;
1260         u16 vendor_id, device_id;
1261 
1262         switch (atc->chip_type) {
1263         case ATC20K1:
1264                 atc->chip_name = "20K1";
1265                 list = subsys_20k1_list;
1266                 break;
1267         case ATC20K2:
1268                 atc->chip_name = "20K2";
1269                 list = subsys_20k2_list;
1270                 break;
1271         default:
1272                 return -ENOENT;
1273         }
1274         if (ssid) {
1275                 vendor_id = ssid >> 16;
1276                 device_id = ssid & 0xffff;
1277         } else {
1278                 vendor_id = atc->pci->subsystem_vendor;
1279                 device_id = atc->pci->subsystem_device;
1280         }
1281         p = snd_pci_quirk_lookup_id(vendor_id, device_id, list);
1282         if (p) {
1283                 if (p->value < 0) {
1284                         dev_err(atc->card->dev,
1285                                 "Device %04x:%04x is black-listed\n",
1286                                 vendor_id, device_id);
1287                         return -ENOENT;
1288                 }
1289                 atc->model = p->value;
1290         } else {
1291                 if (atc->chip_type == ATC20K1)
1292                         atc->model = CT20K1_UNKNOWN;
1293                 else
1294                         atc->model = CT20K2_UNKNOWN;
1295         }
1296         atc->model_name = ct_subsys_name[atc->model];
1297         dev_info(atc->card->dev, "chip %s model %s (%04x:%04x) is found\n",
1298                    atc->chip_name, atc->model_name,
1299                    vendor_id, device_id);
1300         return 0;
1301 }
1302 
1303 int ct_atc_create_alsa_devs(struct ct_atc *atc)
1304 {
1305         enum CTALSADEVS i;
1306         int err;
1307 
1308         alsa_dev_funcs[MIXER].public_name = atc->chip_name;
1309 
1310         for (i = 0; i < NUM_CTALSADEVS; i++) {
1311                 if (!alsa_dev_funcs[i].create)
1312                         continue;
1313 
1314                 err = alsa_dev_funcs[i].create(atc, i,
1315                                 alsa_dev_funcs[i].public_name);
1316                 if (err) {
1317                         dev_err(atc->card->dev,
1318                                 "Creating alsa device %d failed!\n", i);
1319                         return err;
1320                 }
1321         }
1322 
1323         return 0;
1324 }
1325 
1326 static int atc_create_hw_devs(struct ct_atc *atc)
1327 {
1328         struct hw *hw;
1329         struct card_conf info = {0};
1330         int i, err;
1331 
1332         err = create_hw_obj(atc->pci, atc->chip_type, atc->model, &hw);
1333         if (err) {
1334                 dev_err(atc->card->dev, "Failed to create hw obj!!!\n");
1335                 return err;
1336         }
1337         hw->card = atc->card;
1338         atc->hw = hw;
1339 
1340         /* Initialize card hardware. */
1341         info.rsr = atc->rsr;
1342         info.msr = atc->msr;
1343         info.vm_pgt_phys = atc_get_ptp_phys(atc, 0);
1344         err = hw->card_init(hw, &info);
1345         if (err < 0)
1346                 return err;
1347 
1348         for (i = 0; i < NUM_RSCTYP; i++) {
1349                 if (!rsc_mgr_funcs[i].create)
1350                         continue;
1351 
1352                 err = rsc_mgr_funcs[i].create(atc->hw, &atc->rsc_mgrs[i]);
1353                 if (err) {
1354                         dev_err(atc->card->dev,
1355                                 "Failed to create rsc_mgr %d!!!\n", i);
1356                         return err;
1357                 }
1358         }
1359 
1360         return 0;
1361 }
1362 
1363 static int atc_get_resources(struct ct_atc *atc)
1364 {
1365         struct daio_desc da_desc = {0};
1366         struct daio_mgr *daio_mgr;
1367         struct src_desc src_dsc = {0};
1368         struct src_mgr *src_mgr;
1369         struct srcimp_desc srcimp_dsc = {0};
1370         struct srcimp_mgr *srcimp_mgr;
1371         struct sum_desc sum_dsc = {0};
1372         struct sum_mgr *sum_mgr;
1373         int err, i, num_srcs, num_daios;
1374 
1375         num_daios = ((atc->model == CTSB1270) ? 8 : 7);
1376         num_srcs = ((atc->model == CTSB1270) ? 6 : 4);
1377 
1378         atc->daios = kcalloc(num_daios, sizeof(void *), GFP_KERNEL);
1379         if (!atc->daios)
1380                 return -ENOMEM;
1381 
1382         atc->srcs = kcalloc(num_srcs, sizeof(void *), GFP_KERNEL);
1383         if (!atc->srcs)
1384                 return -ENOMEM;
1385 
1386         atc->srcimps = kcalloc(num_srcs, sizeof(void *), GFP_KERNEL);
1387         if (!atc->srcimps)
1388                 return -ENOMEM;
1389 
1390         atc->pcm = kcalloc(2 * 4, sizeof(void *), GFP_KERNEL);
1391         if (!atc->pcm)
1392                 return -ENOMEM;
1393 
1394         daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
1395         da_desc.msr = atc->msr;
1396         for (i = 0, atc->n_daio = 0; i < num_daios; i++) {
1397                 da_desc.type = (atc->model != CTSB073X) ? i :
1398                              ((i == SPDIFIO) ? SPDIFI1 : i);
1399                 err = daio_mgr->get_daio(daio_mgr, &da_desc,
1400                                         (struct daio **)&atc->daios[i]);
1401                 if (err) {
1402                         dev_err(atc->card->dev,
1403                                 "Failed to get DAIO resource %d!!!\n",
1404                                 i);
1405                         return err;
1406                 }
1407                 atc->n_daio++;
1408         }
1409 
1410         src_mgr = atc->rsc_mgrs[SRC];
1411         src_dsc.multi = 1;
1412         src_dsc.msr = atc->msr;
1413         src_dsc.mode = ARCRW;
1414         for (i = 0, atc->n_src = 0; i < num_srcs; i++) {
1415                 err = src_mgr->get_src(src_mgr, &src_dsc,
1416                                         (struct src **)&atc->srcs[i]);
1417                 if (err)
1418                         return err;
1419 
1420                 atc->n_src++;
1421         }
1422 
1423         srcimp_mgr = atc->rsc_mgrs[SRCIMP];
1424         srcimp_dsc.msr = 8;
1425         for (i = 0, atc->n_srcimp = 0; i < num_srcs; i++) {
1426                 err = srcimp_mgr->get_srcimp(srcimp_mgr, &srcimp_dsc,
1427                                         (struct srcimp **)&atc->srcimps[i]);
1428                 if (err)
1429                         return err;
1430 
1431                 atc->n_srcimp++;
1432         }
1433 
1434         sum_mgr = atc->rsc_mgrs[SUM];
1435         sum_dsc.msr = atc->msr;
1436         for (i = 0, atc->n_pcm = 0; i < (2*4); i++) {
1437                 err = sum_mgr->get_sum(sum_mgr, &sum_dsc,
1438                                         (struct sum **)&atc->pcm[i]);
1439                 if (err)
1440                         return err;
1441 
1442                 atc->n_pcm++;
1443         }
1444 
1445         return 0;
1446 }
1447 
1448 static void
1449 atc_connect_dai(struct src_mgr *src_mgr, struct dai *dai,
1450                 struct src **srcs, struct srcimp **srcimps)
1451 {
1452         struct rsc *rscs[2] = {NULL};
1453         struct src *src;
1454         struct srcimp *srcimp;
1455         int i = 0;
1456 
1457         rscs[0] = &dai->daio.rscl;
1458         rscs[1] = &dai->daio.rscr;
1459         for (i = 0; i < 2; i++) {
1460                 src = srcs[i];
1461                 srcimp = srcimps[i];
1462                 srcimp->ops->map(srcimp, src, rscs[i]);
1463                 src_mgr->src_disable(src_mgr, src);
1464         }
1465 
1466         src_mgr->commit_write(src_mgr); /* Actually disable SRCs */
1467 
1468         src = srcs[0];
1469         src->ops->set_pm(src, 1);
1470         for (i = 0; i < 2; i++) {
1471                 src = srcs[i];
1472                 src->ops->set_state(src, SRC_STATE_RUN);
1473                 src->ops->commit_write(src);
1474                 src_mgr->src_enable_s(src_mgr, src);
1475         }
1476 
1477         dai->ops->set_srt_srcl(dai, &(srcs[0]->rsc));
1478         dai->ops->set_srt_srcr(dai, &(srcs[1]->rsc));
1479 
1480         dai->ops->set_enb_src(dai, 1);
1481         dai->ops->set_enb_srt(dai, 1);
1482         dai->ops->commit_write(dai);
1483 
1484         src_mgr->commit_write(src_mgr); /* Synchronously enable SRCs */
1485 }
1486 
1487 static void atc_connect_resources(struct ct_atc *atc)
1488 {
1489         struct dai *dai;
1490         struct dao *dao;
1491         struct src *src;
1492         struct sum *sum;
1493         struct ct_mixer *mixer;
1494         struct rsc *rscs[2] = {NULL};
1495         int i, j;
1496 
1497         mixer = atc->mixer;
1498 
1499         for (i = MIX_WAVE_FRONT, j = LINEO1; i <= MIX_SPDIF_OUT; i++, j++) {
1500                 mixer->get_output_ports(mixer, i, &rscs[0], &rscs[1]);
1501                 dao = container_of(atc->daios[j], struct dao, daio);
1502                 dao->ops->set_left_input(dao, rscs[0]);
1503                 dao->ops->set_right_input(dao, rscs[1]);
1504         }
1505 
1506         dai = container_of(atc->daios[LINEIM], struct dai, daio);
1507         atc_connect_dai(atc->rsc_mgrs[SRC], dai,
1508                         (struct src **)&atc->srcs[2],
1509                         (struct srcimp **)&atc->srcimps[2]);
1510         src = atc->srcs[2];
1511         mixer->set_input_left(mixer, MIX_LINE_IN, &src->rsc);
1512         src = atc->srcs[3];
1513         mixer->set_input_right(mixer, MIX_LINE_IN, &src->rsc);
1514 
1515         if (atc->model == CTSB1270) {
1516                 /* Titanium HD has a dedicated ADC for the Mic. */
1517                 dai = container_of(atc->daios[MIC], struct dai, daio);
1518                 atc_connect_dai(atc->rsc_mgrs[SRC], dai,
1519                         (struct src **)&atc->srcs[4],
1520                         (struct srcimp **)&atc->srcimps[4]);
1521                 src = atc->srcs[4];
1522                 mixer->set_input_left(mixer, MIX_MIC_IN, &src->rsc);
1523                 src = atc->srcs[5];
1524                 mixer->set_input_right(mixer, MIX_MIC_IN, &src->rsc);
1525         }
1526 
1527         dai = container_of(atc->daios[SPDIFIO], struct dai, daio);
1528         atc_connect_dai(atc->rsc_mgrs[SRC], dai,
1529                         (struct src **)&atc->srcs[0],
1530                         (struct srcimp **)&atc->srcimps[0]);
1531 
1532         src = atc->srcs[0];
1533         mixer->set_input_left(mixer, MIX_SPDIF_IN, &src->rsc);
1534         src = atc->srcs[1];
1535         mixer->set_input_right(mixer, MIX_SPDIF_IN, &src->rsc);
1536 
1537         for (i = MIX_PCMI_FRONT, j = 0; i <= MIX_PCMI_SURROUND; i++, j += 2) {
1538                 sum = atc->pcm[j];
1539                 mixer->set_input_left(mixer, i, &sum->rsc);
1540                 sum = atc->pcm[j+1];
1541                 mixer->set_input_right(mixer, i, &sum->rsc);
1542         }
1543 }
1544 
1545 #ifdef CONFIG_PM_SLEEP
1546 static int atc_suspend(struct ct_atc *atc)
1547 {
1548         struct hw *hw = atc->hw;
1549 
1550         snd_power_change_state(atc->card, SNDRV_CTL_POWER_D3hot);
1551 
1552         atc_release_resources(atc);
1553 
1554         hw->suspend(hw);
1555 
1556         return 0;
1557 }
1558 
1559 static int atc_hw_resume(struct ct_atc *atc)
1560 {
1561         struct hw *hw = atc->hw;
1562         struct card_conf info = {0};
1563 
1564         /* Re-initialize card hardware. */
1565         info.rsr = atc->rsr;
1566         info.msr = atc->msr;
1567         info.vm_pgt_phys = atc_get_ptp_phys(atc, 0);
1568         return hw->resume(hw, &info);
1569 }
1570 
1571 static int atc_resources_resume(struct ct_atc *atc)
1572 {
1573         struct ct_mixer *mixer;
1574         int err = 0;
1575 
1576         /* Get resources */
1577         err = atc_get_resources(atc);
1578         if (err < 0) {
1579                 atc_release_resources(atc);
1580                 return err;
1581         }
1582 
1583         /* Build topology */
1584         atc_connect_resources(atc);
1585 
1586         mixer = atc->mixer;
1587         mixer->resume(mixer);
1588 
1589         return 0;
1590 }
1591 
1592 static int atc_resume(struct ct_atc *atc)
1593 {
1594         int err = 0;
1595 
1596         /* Do hardware resume. */
1597         err = atc_hw_resume(atc);
1598         if (err < 0) {
1599                 dev_err(atc->card->dev,
1600                         "pci_enable_device failed, disabling device\n");
1601                 snd_card_disconnect(atc->card);
1602                 return err;
1603         }
1604 
1605         err = atc_resources_resume(atc);
1606         if (err < 0)
1607                 return err;
1608 
1609         snd_power_change_state(atc->card, SNDRV_CTL_POWER_D0);
1610 
1611         return 0;
1612 }
1613 #endif
1614 
1615 static const struct ct_atc atc_preset = {
1616         .map_audio_buffer = ct_map_audio_buffer,
1617         .unmap_audio_buffer = ct_unmap_audio_buffer,
1618         .pcm_playback_prepare = atc_pcm_playback_prepare,
1619         .pcm_release_resources = atc_pcm_release_resources,
1620         .pcm_playback_start = atc_pcm_playback_start,
1621         .pcm_playback_stop = atc_pcm_stop,
1622         .pcm_playback_position = atc_pcm_playback_position,
1623         .pcm_capture_prepare = atc_pcm_capture_prepare,
1624         .pcm_capture_start = atc_pcm_capture_start,
1625         .pcm_capture_stop = atc_pcm_stop,
1626         .pcm_capture_position = atc_pcm_capture_position,
1627         .spdif_passthru_playback_prepare = spdif_passthru_playback_prepare,
1628         .get_ptp_phys = atc_get_ptp_phys,
1629         .select_line_in = atc_select_line_in,
1630         .select_mic_in = atc_select_mic_in,
1631         .select_digit_io = atc_select_digit_io,
1632         .line_front_unmute = atc_line_front_unmute,
1633         .line_surround_unmute = atc_line_surround_unmute,
1634         .line_clfe_unmute = atc_line_clfe_unmute,
1635         .line_rear_unmute = atc_line_rear_unmute,
1636         .line_in_unmute = atc_line_in_unmute,
1637         .mic_unmute = atc_mic_unmute,
1638         .spdif_out_unmute = atc_spdif_out_unmute,
1639         .spdif_in_unmute = atc_spdif_in_unmute,
1640         .spdif_out_get_status = atc_spdif_out_get_status,
1641         .spdif_out_set_status = atc_spdif_out_set_status,
1642         .spdif_out_passthru = atc_spdif_out_passthru,
1643         .capabilities = atc_capabilities,
1644         .output_switch_get = atc_output_switch_get,
1645         .output_switch_put = atc_output_switch_put,
1646         .mic_source_switch_get = atc_mic_source_switch_get,
1647         .mic_source_switch_put = atc_mic_source_switch_put,
1648 #ifdef CONFIG_PM_SLEEP
1649         .suspend = atc_suspend,
1650         .resume = atc_resume,
1651 #endif
1652 };
1653 
1654 /**
1655  *  ct_atc_create - create and initialize a hardware manager
1656  *  @card: corresponding alsa card object
1657  *  @pci: corresponding kernel pci device object
1658  *  @ratc: return created object address in it
1659  *
1660  *  Creates and initializes a hardware manager.
1661  *
1662  *  Creates kmallocated ct_atc structure. Initializes hardware.
1663  *  Returns 0 if succeeds, or negative error code if fails.
1664  */
1665 
1666 int ct_atc_create(struct snd_card *card, struct pci_dev *pci,
1667                   unsigned int rsr, unsigned int msr,
1668                   int chip_type, unsigned int ssid,
1669                   struct ct_atc **ratc)
1670 {
1671         struct ct_atc *atc;
1672         static struct snd_device_ops ops = {
1673                 .dev_free = atc_dev_free,
1674         };
1675         int err;
1676 
1677         *ratc = NULL;
1678 
1679         atc = kzalloc(sizeof(*atc), GFP_KERNEL);
1680         if (!atc)
1681                 return -ENOMEM;
1682 
1683         /* Set operations */
1684         *atc = atc_preset;
1685 
1686         atc->card = card;
1687         atc->pci = pci;
1688         atc->rsr = rsr;
1689         atc->msr = msr;
1690         atc->chip_type = chip_type;
1691 
1692         mutex_init(&atc->atc_mutex);
1693 
1694         /* Find card model */
1695         err = atc_identify_card(atc, ssid);
1696         if (err < 0) {
1697                 dev_err(card->dev, "ctatc: Card not recognised\n");
1698                 goto error1;
1699         }
1700 
1701         /* Set up device virtual memory management object */
1702         err = ct_vm_create(&atc->vm, pci);
1703         if (err < 0)
1704                 goto error1;
1705 
1706         /* Create all atc hw devices */
1707         err = atc_create_hw_devs(atc);
1708         if (err < 0)
1709                 goto error1;
1710 
1711         err = ct_mixer_create(atc, (struct ct_mixer **)&atc->mixer);
1712         if (err) {
1713                 dev_err(card->dev, "Failed to create mixer obj!!!\n");
1714                 goto error1;
1715         }
1716 
1717         /* Get resources */
1718         err = atc_get_resources(atc);
1719         if (err < 0)
1720                 goto error1;
1721 
1722         /* Build topology */
1723         atc_connect_resources(atc);
1724 
1725         atc->timer = ct_timer_new(atc);
1726         if (!atc->timer) {
1727                 err = -ENOMEM;
1728                 goto error1;
1729         }
1730 
1731         err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, atc, &ops);
1732         if (err < 0)
1733                 goto error1;
1734 
1735         *ratc = atc;
1736         return 0;
1737 
1738 error1:
1739         ct_atc_destroy(atc);
1740         dev_err(card->dev, "Something wrong!!!\n");
1741         return err;
1742 }

/* [<][>][^][v][top][bottom][index][help] */