linux/sound/pci/echoaudio/gina24_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        if (snd_BUG_ON((subdevice_id & 0xfff0) != GINA24))
  45                return -ENODEV;
  46
  47        if ((err = init_dsp_comm_page(chip))) {
  48                dev_err(chip->card->dev,
  49                        "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_ESYNC | ECHO_CLOCK_BIT_ESYNC96 |
  59                ECHO_CLOCK_BIT_ADAT;
  60
  61        /* Gina24 comes in both '301 and '361 flavors */
  62        if (chip->device_id == DEVICE_ID_56361) {
  63                chip->dsp_code_to_load = FW_GINA24_361_DSP;
  64                chip->digital_modes =
  65                        ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
  66                        ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
  67                        ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
  68        } else {
  69                chip->dsp_code_to_load = FW_GINA24_301_DSP;
  70                chip->digital_modes =
  71                        ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
  72                        ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
  73                        ECHOCAPS_HAS_DIGITAL_MODE_ADAT |
  74                        ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_CDROM;
  75        }
  76
  77        if ((err = load_firmware(chip)) < 0)
  78                return err;
  79        chip->bad_board = false;
  80
  81        return err;
  82}
  83
  84
  85
  86static int set_mixer_defaults(struct echoaudio *chip)
  87{
  88        chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
  89        chip->professional_spdif = false;
  90        chip->digital_in_automute = true;
  91        return init_line_levels(chip);
  92}
  93
  94
  95
  96static u32 detect_input_clocks(const struct echoaudio *chip)
  97{
  98        u32 clocks_from_dsp, clock_bits;
  99
 100        /* Map the DSP clock detect bits to the generic driver clock
 101           detect bits */
 102        clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
 103
 104        clock_bits = ECHO_CLOCK_BIT_INTERNAL;
 105
 106        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF)
 107                clock_bits |= ECHO_CLOCK_BIT_SPDIF;
 108
 109        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ADAT)
 110                clock_bits |= ECHO_CLOCK_BIT_ADAT;
 111
 112        if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_ESYNC)
 113                clock_bits |= ECHO_CLOCK_BIT_ESYNC | ECHO_CLOCK_BIT_ESYNC96;
 114
 115        return clock_bits;
 116}
 117
 118
 119
 120/* Gina24 has an ASIC on the PCI card which must be loaded for anything
 121interesting to happen. */
 122static int load_asic(struct echoaudio *chip)
 123{
 124        u32 control_reg;
 125        int err;
 126        short asic;
 127
 128        if (chip->asic_loaded)
 129                return 1;
 130
 131        /* Give the DSP a few milliseconds to settle down */
 132        mdelay(10);
 133
 134        /* Pick the correct ASIC for '301 or '361 Gina24 */
 135        if (chip->device_id == DEVICE_ID_56361)
 136                asic = FW_GINA24_361_ASIC;
 137        else
 138                asic = FW_GINA24_301_ASIC;
 139
 140        err = load_asic_generic(chip, DSP_FNC_LOAD_GINA24_ASIC, asic);
 141        if (err < 0)
 142                return err;
 143
 144        chip->asic_code = asic;
 145
 146        /* Now give the new ASIC a little time to set up */
 147        mdelay(10);
 148        /* See if it worked */
 149        err = check_asic_status(chip);
 150
 151        /* Set up the control register if the load succeeded -
 152           48 kHz, internal clock, S/PDIF RCA mode */
 153        if (!err) {
 154                control_reg = GML_CONVERTER_ENABLE | GML_48KHZ;
 155                err = write_control_reg(chip, control_reg, true);
 156        }
 157        return err;
 158}
 159
 160
 161
 162static int set_sample_rate(struct echoaudio *chip, u32 rate)
 163{
 164        u32 control_reg, clock;
 165
 166        if (snd_BUG_ON(rate >= 50000 &&
 167                       chip->digital_mode == DIGITAL_MODE_ADAT))
 168                return -EINVAL;
 169
 170        /* Only set the clock for internal mode. */
 171        if (chip->input_clock != ECHO_CLOCK_INTERNAL) {
 172                dev_warn(chip->card->dev,
 173                         "Cannot set sample rate - clock not set to CLK_CLOCKININTERNAL\n");
 174                /* Save the rate anyhow */
 175                chip->comm_page->sample_rate = cpu_to_le32(rate);
 176                chip->sample_rate = rate;
 177                return 0;
 178        }
 179
 180        clock = 0;
 181
 182        control_reg = le32_to_cpu(chip->comm_page->control_register);
 183        control_reg &= GML_CLOCK_CLEAR_MASK & GML_SPDIF_RATE_CLEAR_MASK;
 184
 185        switch (rate) {
 186        case 96000:
 187                clock = GML_96KHZ;
 188                break;
 189        case 88200:
 190                clock = GML_88KHZ;
 191                break;
 192        case 48000:
 193                clock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
 194                break;
 195        case 44100:
 196                clock = GML_44KHZ;
 197                /* Professional mode ? */
 198                if (control_reg & GML_SPDIF_PRO_MODE)
 199                        clock |= GML_SPDIF_SAMPLE_RATE0;
 200                break;
 201        case 32000:
 202                clock = GML_32KHZ | GML_SPDIF_SAMPLE_RATE0 |
 203                        GML_SPDIF_SAMPLE_RATE1;
 204                break;
 205        case 22050:
 206                clock = GML_22KHZ;
 207                break;
 208        case 16000:
 209                clock = GML_16KHZ;
 210                break;
 211        case 11025:
 212                clock = GML_11KHZ;
 213                break;
 214        case 8000:
 215                clock = GML_8KHZ;
 216                break;
 217        default:
 218                dev_err(chip->card->dev,
 219                        "set_sample_rate: %d invalid!\n", rate);
 220                return -EINVAL;
 221        }
 222
 223        control_reg |= clock;
 224
 225        chip->comm_page->sample_rate = cpu_to_le32(rate);       /* ignored by the DSP */
 226        chip->sample_rate = rate;
 227        dev_dbg(chip->card->dev, "set_sample_rate: %d clock %d\n", rate, clock);
 228
 229        return write_control_reg(chip, control_reg, false);
 230}
 231
 232
 233
 234static int set_input_clock(struct echoaudio *chip, u16 clock)
 235{
 236        u32 control_reg, clocks_from_dsp;
 237
 238
 239        /* Mask off the clock select bits */
 240        control_reg = le32_to_cpu(chip->comm_page->control_register) &
 241                GML_CLOCK_CLEAR_MASK;
 242        clocks_from_dsp = le32_to_cpu(chip->comm_page->status_clocks);
 243
 244        switch (clock) {
 245        case ECHO_CLOCK_INTERNAL:
 246                chip->input_clock = ECHO_CLOCK_INTERNAL;
 247                return set_sample_rate(chip, chip->sample_rate);
 248        case ECHO_CLOCK_SPDIF:
 249                if (chip->digital_mode == DIGITAL_MODE_ADAT)
 250                        return -EAGAIN;
 251                control_reg |= GML_SPDIF_CLOCK;
 252                if (clocks_from_dsp & GML_CLOCK_DETECT_BIT_SPDIF96)
 253                        control_reg |= GML_DOUBLE_SPEED_MODE;
 254                else
 255                        control_reg &= ~GML_DOUBLE_SPEED_MODE;
 256                break;
 257        case ECHO_CLOCK_ADAT:
 258                if (chip->digital_mode != DIGITAL_MODE_ADAT)
 259                        return -EAGAIN;
 260                control_reg |= GML_ADAT_CLOCK;
 261                control_reg &= ~GML_DOUBLE_SPEED_MODE;
 262                break;
 263        case ECHO_CLOCK_ESYNC:
 264                control_reg |= GML_ESYNC_CLOCK;
 265                control_reg &= ~GML_DOUBLE_SPEED_MODE;
 266                break;
 267        case ECHO_CLOCK_ESYNC96:
 268                control_reg |= GML_ESYNC_CLOCK | GML_DOUBLE_SPEED_MODE;
 269                break;
 270        default:
 271                dev_err(chip->card->dev,
 272                        "Input clock 0x%x not supported for Gina24\n", clock);
 273                return -EINVAL;
 274        }
 275
 276        chip->input_clock = clock;
 277        return write_control_reg(chip, control_reg, true);
 278}
 279
 280
 281
 282static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode)
 283{
 284        u32 control_reg;
 285        int err, incompatible_clock;
 286
 287        /* Set clock to "internal" if it's not compatible with the new mode */
 288        incompatible_clock = false;
 289        switch (mode) {
 290        case DIGITAL_MODE_SPDIF_OPTICAL:
 291        case DIGITAL_MODE_SPDIF_CDROM:
 292        case DIGITAL_MODE_SPDIF_RCA:
 293                if (chip->input_clock == ECHO_CLOCK_ADAT)
 294                        incompatible_clock = true;
 295                break;
 296        case DIGITAL_MODE_ADAT:
 297                if (chip->input_clock == ECHO_CLOCK_SPDIF)
 298                        incompatible_clock = true;
 299                break;
 300        default:
 301                dev_err(chip->card->dev,
 302                        "Digital mode not supported: %d\n", mode);
 303                return -EINVAL;
 304        }
 305
 306        spin_lock_irq(&chip->lock);
 307
 308        if (incompatible_clock) {       /* Switch to 48KHz, internal */
 309                chip->sample_rate = 48000;
 310                set_input_clock(chip, ECHO_CLOCK_INTERNAL);
 311        }
 312
 313        /* Clear the current digital mode */
 314        control_reg = le32_to_cpu(chip->comm_page->control_register);
 315        control_reg &= GML_DIGITAL_MODE_CLEAR_MASK;
 316
 317        /* Tweak the control reg */
 318        switch (mode) {
 319        case DIGITAL_MODE_SPDIF_OPTICAL:
 320                control_reg |= GML_SPDIF_OPTICAL_MODE;
 321                break;
 322        case DIGITAL_MODE_SPDIF_CDROM:
 323                /* '361 Gina24 cards do not have the S/PDIF CD-ROM mode */
 324                if (chip->device_id == DEVICE_ID_56301)
 325                        control_reg |= GML_SPDIF_CDROM_MODE;
 326                break;
 327        case DIGITAL_MODE_SPDIF_RCA:
 328                /* GML_SPDIF_OPTICAL_MODE bit cleared */
 329                break;
 330        case DIGITAL_MODE_ADAT:
 331                control_reg |= GML_ADAT_MODE;
 332                control_reg &= ~GML_DOUBLE_SPEED_MODE;
 333                break;
 334        }
 335
 336        err = write_control_reg(chip, control_reg, true);
 337        spin_unlock_irq(&chip->lock);
 338        if (err < 0)
 339                return err;
 340        chip->digital_mode = mode;
 341
 342        dev_dbg(chip->card->dev,
 343                "set_digital_mode to %d\n", chip->digital_mode);
 344        return incompatible_clock;
 345}
 346