linux/sound/pci/echoaudio/mona_dsp.c
<<
>>
Prefs
   1/****************************************************************************
   2
   3   Copyright Echo Digital Audio Corporation (c) 1998 - 2004
   4   All rights reserved
   5   www.echoaudio.com
   6
   7   This file is part of Echo Digital Audio's generic driver library.
   8
   9   Echo Digital Audio's generic driver library is free software;
  10   you can redistribute it and/or modify it under the terms of
  11   the GNU General Public License as published by the Free Software
  12   Foundation.
  13
  14   This program is distributed in the hope that it will be useful,
  15   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17   GNU General Public License for more details.
  18
  19   You should have received a copy of the GNU General Public License
  20   along with this program; if not, write to the Free Software
  21   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  22   MA  02111-1307, USA.
  23
  24   *************************************************************************
  25
  26 Translation from C++ and adaptation for use in ALSA-Driver
  27 were made by Giuliano Pochini <pochini@shiny.it>
  28
  29****************************************************************************/
  30
  31
  32static int write_control_reg(struct echoaudio *chip, u32 value, char force);
  33static int set_input_clock(struct echoaudio *chip, u16 clock);
  34static int set_professional_spdif(struct echoaudio *chip, char prof);
  35static int set_digital_mode(struct echoaudio *chip, u8 mode);
  36static int load_asic_generic(struct echoaudio *chip, u32 cmd, short asic);
  37static int check_asic_status(struct echoaudio *chip);
  38
  39
  40static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
  41{
  42        int err;
  43
  44        DE_INIT(("init_hw() - Mona\n"));
  45        if (snd_BUG_ON((subdevice_id & 0xfff0) != MONA))
  46                return -ENODEV;
  47
  48        if ((err = init_dsp_comm_page(chip))) {
  49                DE_INIT(("init_hw - could not initialize DSP comm page\n"));
  50                return err;
  51        }
  52
  53        chip->device_id = device_id;
  54        chip->subdevice_id = subdevice_id;
  55        chip->bad_board = TRUE;
  56        chip->input_clock_types =
  57                ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
  58                ECHO_CLOCK_BIT_WORD | ECHO_CLOCK_BIT_ADAT;
  59        chip->digital_modes =
  60                ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
  61                ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
  62                ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
  63
  64        /* Mona comes in both '301 and '361 flavors */
  65        if (chip->device_id == DEVICE_ID_56361)
  66                chip->dsp_code_to_load = FW_MONA_361_DSP;
  67        else
  68                chip->dsp_code_to_load = FW_MONA_301_DSP;
  69
  70        if ((err = load_firmware(chip)) < 0)
  71                return err;
  72        chip->bad_board = FALSE;
  73
  74        DE_INIT(("init_hw done\n"));
  75        return err;
  76}
  77
  78
  79
  80static int set_mixer_defaults(struct echoaudio *chip)
  81{
  82        chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
  83        chip->professional_spdif = FALSE;
  84        chip->digital_in_automute = TRUE;
  85        return init_line_levels(chip);
  86}
  87
  88
  89
  90static u32 detect_input_clocks(const struct echoaudio *chip)
  91{
  92        u32 clocks_from_dsp, clock_bits;
  93
  94        /* Map the DSP clock detect bits to the generic driver clock
  95           detect bits */
  96        clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
  97
  98        clock_bits = ECHO_CLOCK_BIT_INTERNAL;
  99
 100        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
 101                clock_bits |= ECHO_CLOCK_BIT_SPDIF;
 102
 103        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
 104                clock_bits |= ECHO_CLOCK_BIT_ADAT;
 105
 106        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD)
 107                clock_bits |= ECHO_CLOCK_BIT_WORD;
 108
 109        return clock_bits;
 110}
 111
 112
 113
 114/* Mona has an ASIC on the PCI card and another ASIC in the external box; 
 115both need to be loaded. */
 116static int load_asic(struct echoaudio *chip)
 117{
 118        u32 control_reg;
 119        int err;
 120        short asic;
 121
 122        if (chip->asic_loaded)
 123                return 0;
 124
 125        mdelay(10);
 126
 127        if (chip->device_id == DEVICE_ID_56361)
 128                asic = FW_MONA_361_1_ASIC48;
 129        else
 130                asic = FW_MONA_301_1_ASIC48;
 131
 132        err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC, asic);
 133        if (err < 0)
 134                return err;
 135
 136        chip->asic_code = asic;
 137        mdelay(10);
 138
 139        /* Do the external one */
 140        err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_EXTERNAL_ASIC,
 141                                FW_MONA_2_ASIC);
 142        if (err < 0)
 143                return err;
 144
 145        mdelay(10);
 146        err = check_asic_status(chip);
 147
 148        /* Set up the control register if the load succeeded -
 149           48 kHz, internal clock, S/PDIF RCA mode */
 150        if (!err) {
 151                control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
 152                err = write_control_reg(chip, control_reg, TRUE);
 153        }
 154
 155        return err;
 156}
 157
 158
 159
 160/* Depending on what digital mode you want, Mona needs different ASICs
 161loaded.  This function checks the ASIC needed for the new mode and sees
 162if it matches the one already loaded. */
 163static int switch_asic(struct echoaudio *chip, char double_speed)
 164{
 165        int err;
 166        short asic;
 167
 168        /* Check the clock detect bits to see if this is
 169        a single-speed clock or a double-speed clock; load
 170        a new ASIC if necessary. */
 171        if (chip->device_id == DEVICE_ID_56361) {
 172                if (double_speed)
 173                        asic = FW_MONA_361_1_ASIC96;
 174                else
 175                        asic = FW_MONA_361_1_ASIC48;
 176        } else {
 177                if (double_speed)
 178                        asic = FW_MONA_301_1_ASIC96;
 179                else
 180                        asic = FW_MONA_301_1_ASIC48;
 181        }
 182
 183        if (asic != chip->asic_code) {
 184                /* Load the desired ASIC */
 185                err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
 186                                        asic);
 187                if (err < 0)
 188                        return err;
 189                chip->asic_code = asic;
 190        }
 191
 192        return 0;
 193}
 194
 195
 196
 197static int set_sample_rate(struct echoaudio *chip, u32 rate)
 198{
 199        u32 control_reg, clock;
 200        short asic;
 201        char force_write;
 202
 203        /* Only set the clock for internal mode. */
 204        if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
 205                DE_ACT(("set_sample_rate: Cannot set sample rate - "
 206                        "clock not set to CLK_CLOCKININTERNAL\n"));
 207                /* Save the rate anyhow */
 208                chip->comm_page->sample_rate = cpu_to_le32(rate);
 209                chip->sample_rate = rate;
 210                return 0;
 211        }
 212
 213        /* Now, check to see if the required ASIC is loaded */
 214        if (rate >= 88200) {
 215                if (chip->digital_mode == DIGITAL_MODE_ADAT)
 216                        return -EINVAL;
 217                if (chip->device_id == DEVICE_ID_56361)
 218                        asic = FW_MONA_361_1_ASIC96;
 219                else
 220                        asic = FW_MONA_301_1_ASIC96;
 221        } else {
 222                if (chip->device_id == DEVICE_ID_56361)
 223                        asic = FW_MONA_361_1_ASIC48;
 224                else
 225                        asic = FW_MONA_301_1_ASIC48;
 226        }
 227
 228        force_write = 0;
 229        if (asic != chip->asic_code) {
 230                int err;
 231                /* Load the desired ASIC (load_asic_generic() can sleep) */
 232                spin_unlock_irq(&chip->lock);
 233                err = load_asic_generic(chip, DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
 234                                        asic);
 235                spin_lock_irq(&chip->lock);
 236
 237                if (err < 0)
 238                        return err;
 239                chip->asic_code = asic;
 240                force_write = 1;
 241        }
 242
 243        /* Compute the new control register value */
 244        clock = 0;
 245        control_reg = le32_to_cpu(chip->comm_page->control_register);
 246        control_reg &= GML_CLOCK_CLEAR_MASK;
 247        control_reg &= GML_SPDIF_RATE_CLEAR_MASK;
 248
 249        switch (rate) {
 250        case 96000:
 251                clock = GML_96KHZ;
 252                break;
 253        case 88200:
 254                clock = GML_88KHZ;
 255                break;
 256        case 48000:
 257                clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
 258                break;
 259        case 44100:
 260                clock = GML_44KHZ;
 261                /* Professional mode */
 262                if (control_reg & GML_SPDIF_PRO_MODE)
 263                        clock |= GML_SPDIF_SAMPLE_RATE0;
 264                break;
 265        case 32000:
 266                clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
 267                        GML_SPDIF_SAMPLE_RATE1;
 268                break;
 269        case 22050:
 270                clock = GML_22KHZ;
 271                break;
 272        case 16000:
 273                clock = GML_16KHZ;
 274                break;
 275        case 11025:
 276                clock = GML_11KHZ;
 277                break;
 278        case 8000:
 279                clock = GML_8KHZ;
 280                break;
 281        default:
 282                DE_ACT(("set_sample_rate: %d invalid!\n", rate));
 283                return -EINVAL;
 284        }
 285
 286        control_reg |= clock;
 287
 288        chip->comm_page->sample_rate = cpu_to_le32(rate);       /* ignored by the DSP */
 289        chip->sample_rate = rate;
 290        DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock));
 291
 292        return write_control_reg(chip, control_reg, force_write);
 293}
 294
 295
 296
 297static int set_input_clock(struct echoaudio *chip, u16 clock)
 298{
 299        u32 control_reg, clocks_from_dsp;
 300        int err;
 301
 302        DE_ACT(("set_input_clock:\n"));
 303
 304        /* Prevent two simultaneous calls to switch_asic() */
 305        if (atomic_read(&chip->opencount))
 306                return -EAGAIN;
 307
 308        /* Mask off the clock select bits */
 309        control_reg = le32_to_cpu(chip->comm_page->control_register) &
 310                GML_CLOCK_CLEAR_MASK;
 311        clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
 312
 313        switch (clock) {
 314        case ECHO_CLOCK_INTERNAL:
 315                DE_ACT(("Set Mona clock to INTERNAL\n"));
 316                chip->input_clock = ECHO_CLOCK_INTERNAL;
 317                return set_sample_rate(chip, chip->sample_rate);
 318        case ECHO_CLOCK_SPDIF:
 319                if (chip->digital_mode == DIGITAL_MODE_ADAT)
 320                        return -EAGAIN;
 321                spin_unlock_irq(&chip->lock);
 322                err = switch_asic(chip, clocks_from_dsp &
 323                                  GML_CLOCK_DETECT_BIT_SPDIF96);
 324                spin_lock_irq(&chip->lock);
 325                if (err < 0)
 326                        return err;
 327                DE_ACT(("Set Mona clock to SPDIF\n"));
 328                control_reg |= GML_SPDIF_CLOCK;
 329                if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
 330                        control_reg |= GML_DOUBLE_SPEED_MODE;
 331                else
 332                        control_reg &= ~GML_DOUBLE_SPEED_MODE;
 333                break;
 334        case ECHO_CLOCK_WORD:
 335                DE_ACT(("Set Mona clock to WORD\n"));
 336                spin_unlock_irq(&chip->lock);
 337                err = switch_asic(chip, clocks_from_dsp &
 338                                  GML_CLOCK_DETECT_BIT_WORD96);
 339                spin_lock_irq(&chip->lock);
 340                if (err < 0)
 341                        return err;
 342                control_reg |= GML_WORD_CLOCK;
 343                if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_WORD96)
 344                        control_reg |= GML_DOUBLE_SPEED_MODE;
 345                else
 346                        control_reg &= ~GML_DOUBLE_SPEED_MODE;
 347                break;
 348        case ECHO_CLOCK_ADAT:
 349                DE_ACT(("Set Mona clock to ADAT\n"));
 350                if (chip->digital_mode != DIGITAL_MODE_ADAT)
 351                        return -EAGAIN;
 352                control_reg |= GML_ADAT_CLOCK;
 353                control_reg &= ~GML_DOUBLE_SPEED_MODE;
 354                break;
 355        default:
 356                DE_ACT(("Input clock 0x%x not supported for Mona\n", clock));
 357                return -EINVAL;
 358        }
 359
 360        chip->input_clock = clock;
 361        return write_control_reg(chip, control_reg, TRUE);
 362}
 363
 364
 365
 366static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
 367{
 368        u32 control_reg;
 369        int err, incompatible_clock;
 370
 371        /* Set clock to "internal" if it's not compatible with the new mode */
 372        incompatible_clock = FALSE;
 373        switch (mode) {
 374        case DIGITAL_MODE_SPDIF_OPTICAL:
 375        case DIGITAL_MODE_SPDIF_RCA:
 376                if (chip->input_clock == ECHO_CLOCK_ADAT)
 377                        incompatible_clock = TRUE;
 378                break;
 379        case DIGITAL_MODE_ADAT:
 380                if (chip->input_clock == ECHO_CLOCK_SPDIF)
 381                        incompatible_clock = TRUE;
 382                break;
 383        default:
 384                DE_ACT(("Digital mode not supported: %d\n", mode));
 385                return -EINVAL;
 386        }
 387
 388        spin_lock_irq(&chip->lock);
 389
 390        if (incompatible_clock) {       /* Switch to 48KHz, internal */
 391                chip->sample_rate = 48000;
 392                set_input_clock(chip, ECHO_CLOCK_INTERNAL);
 393        }
 394
 395        /* Clear the current digital mode */
 396        control_reg = le32_to_cpu(chip->comm_page->control_register);
 397        control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
 398
 399        /* Tweak the control reg */
 400        switch (mode) {
 401        case DIGITAL_MODE_SPDIF_OPTICAL:
 402                control_reg |= GML_SPDIF_OPTICAL_MODE;
 403                break;
 404        case DIGITAL_MODE_SPDIF_RCA:
 405                /* GML_SPDIF_OPTICAL_MODE bit cleared */
 406                break;
 407        case DIGITAL_MODE_ADAT:
 408                /* If the current ASIC is the 96KHz ASIC, switch the ASIC
 409                   and set to 48 KHz */
 410                if (chip->asic_code == FW_MONA_361_1_ASIC96 ||
 411                    chip->asic_code == FW_MONA_301_1_ASIC96) {
 412                        set_sample_rate(chip, 48000);
 413                }
 414                control_reg |= GML_ADAT_MODE;
 415                control_reg &= ~GML_DOUBLE_SPEED_MODE;
 416                break;
 417        }
 418
 419        err = write_control_reg(chip, control_reg, FALSE);
 420        spin_unlock_irq(&chip->lock);
 421        if (err < 0)
 422                return err;
 423        chip->digital_mode = mode;
 424
 425        DE_ACT(("set_digital_mode to %d\n", mode));
 426        return incompatible_clock;
 427}
 428