linux/sound/pci/ali5451/ali5451.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Matt Wu <Matt_Wu@acersoftech.com.cn>
   4 *  Apr 26, 2001
   5 *  Routines for control of ALi pci audio M5451
   6 *
   7 *  BUGS:
   8 *    --
   9 *
  10 *  TODO:
  11 *    --
  12 */
  13
  14#include <linux/io.h>
  15#include <linux/delay.h>
  16#include <linux/interrupt.h>
  17#include <linux/init.h>
  18#include <linux/pci.h>
  19#include <linux/slab.h>
  20#include <linux/module.h>
  21#include <linux/dma-mapping.h>
  22#include <sound/core.h>
  23#include <sound/pcm.h>
  24#include <sound/info.h>
  25#include <sound/ac97_codec.h>
  26#include <sound/mpu401.h>
  27#include <sound/initval.h>
  28
  29MODULE_AUTHOR("Matt Wu <Matt_Wu@acersoftech.com.cn>");
  30MODULE_DESCRIPTION("ALI M5451");
  31MODULE_LICENSE("GPL");
  32MODULE_SUPPORTED_DEVICE("{{ALI,M5451,pci},{ALI,M5451}}");
  33
  34static int index = SNDRV_DEFAULT_IDX1;  /* Index */
  35static char *id = SNDRV_DEFAULT_STR1;   /* ID for this card */
  36static int pcm_channels = 32;
  37static bool spdif;
  38
  39module_param(index, int, 0444);
  40MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio.");
  41module_param(id, charp, 0444);
  42MODULE_PARM_DESC(id, "ID string for ALI M5451 PCI Audio.");
  43module_param(pcm_channels, int, 0444);
  44MODULE_PARM_DESC(pcm_channels, "PCM Channels");
  45module_param(spdif, bool, 0444);
  46MODULE_PARM_DESC(spdif, "Support SPDIF I/O");
  47
  48/* just for backward compatibility */
  49static bool enable;
  50module_param(enable, bool, 0444);
  51
  52
  53/*
  54 *  Constants definition
  55 */
  56
  57#define DEVICE_ID_ALI5451       ((PCI_VENDOR_ID_AL<<16)|PCI_DEVICE_ID_AL_M5451)
  58
  59
  60#define ALI_CHANNELS            32
  61
  62#define ALI_PCM_IN_CHANNEL      31
  63#define ALI_SPDIF_IN_CHANNEL    19
  64#define ALI_SPDIF_OUT_CHANNEL   15
  65#define ALI_CENTER_CHANNEL      24
  66#define ALI_LEF_CHANNEL         23
  67#define ALI_SURR_LEFT_CHANNEL   26
  68#define ALI_SURR_RIGHT_CHANNEL  25
  69#define ALI_MODEM_IN_CHANNEL    21
  70#define ALI_MODEM_OUT_CHANNEL   20
  71
  72#define SNDRV_ALI_VOICE_TYPE_PCM        01
  73#define SNDRV_ALI_VOICE_TYPE_OTH        02
  74
  75#define ALI_5451_V02            0x02
  76
  77/*
  78 *  Direct Registers
  79 */
  80
  81#define ALI_LEGACY_DMAR0        0x00  /* ADR0 */
  82#define ALI_LEGACY_DMAR4        0x04  /* CNT0 */
  83#define ALI_LEGACY_DMAR11       0x0b  /* MOD  */
  84#define ALI_LEGACY_DMAR15       0x0f  /* MMR  */
  85#define ALI_MPUR0               0x20
  86#define ALI_MPUR1               0x21
  87#define ALI_MPUR2               0x22
  88#define ALI_MPUR3               0x23
  89
  90#define ALI_AC97_WRITE          0x40
  91#define ALI_AC97_READ           0x44
  92
  93#define ALI_SCTRL               0x48
  94#define   ALI_SPDIF_OUT_ENABLE          0x20
  95#define   ALI_SCTRL_LINE_IN2            (1 << 9)
  96#define   ALI_SCTRL_GPIO_IN2            (1 << 13)
  97#define   ALI_SCTRL_LINE_OUT_EN         (1 << 20)
  98#define   ALI_SCTRL_GPIO_OUT_EN         (1 << 23)
  99#define   ALI_SCTRL_CODEC1_READY        (1 << 24)
 100#define   ALI_SCTRL_CODEC2_READY        (1 << 25)
 101#define ALI_AC97_GPIO           0x4c
 102#define   ALI_AC97_GPIO_ENABLE          0x8000
 103#define   ALI_AC97_GPIO_DATA_SHIFT      16
 104#define ALI_SPDIF_CS            0x70
 105#define ALI_SPDIF_CTRL          0x74
 106#define   ALI_SPDIF_IN_FUNC_ENABLE      0x02
 107#define   ALI_SPDIF_IN_CH_STATUS        0x40
 108#define   ALI_SPDIF_OUT_CH_STATUS       0xbf
 109#define ALI_START               0x80
 110#define ALI_STOP                0x84
 111#define ALI_CSPF                0x90
 112#define ALI_AINT                0x98
 113#define ALI_GC_CIR              0xa0
 114        #define ENDLP_IE                0x00001000
 115        #define MIDLP_IE                0x00002000
 116#define ALI_AINTEN              0xa4
 117#define ALI_VOLUME              0xa8
 118#define ALI_SBDELTA_DELTA_R     0xac
 119#define ALI_MISCINT             0xb0
 120        #define ADDRESS_IRQ             0x00000020
 121        #define TARGET_REACHED          0x00008000
 122        #define MIXER_OVERFLOW          0x00000800
 123        #define MIXER_UNDERFLOW         0x00000400
 124        #define GPIO_IRQ                0x01000000
 125#define ALI_SBBL_SBCL           0xc0
 126#define ALI_SBCTRL_SBE2R_SBDD   0xc4
 127#define ALI_STIMER              0xc8
 128#define ALI_GLOBAL_CONTROL      0xd4
 129#define   ALI_SPDIF_OUT_SEL_PCM         0x00000400 /* bit 10 */
 130#define   ALI_SPDIF_IN_SUPPORT          0x00000800 /* bit 11 */
 131#define   ALI_SPDIF_OUT_CH_ENABLE       0x00008000 /* bit 15 */
 132#define   ALI_SPDIF_IN_CH_ENABLE        0x00080000 /* bit 19 */
 133#define   ALI_PCM_IN_ENABLE             0x80000000 /* bit 31 */
 134
 135#define ALI_CSO_ALPHA_FMS       0xe0
 136#define ALI_LBA                 0xe4
 137#define ALI_ESO_DELTA           0xe8
 138#define ALI_GVSEL_PAN_VOC_CTRL_EC       0xf0
 139#define ALI_EBUF1               0xf4
 140#define ALI_EBUF2               0xf8
 141
 142#define ALI_REG(codec, x) ((codec)->port + x)
 143
 144#define MAX_CODECS 2
 145
 146
 147struct snd_ali;
 148struct snd_ali_voice;
 149
 150struct snd_ali_channel_control {
 151        /* register data */
 152        struct REGDATA {
 153                unsigned int start;
 154                unsigned int stop;
 155                unsigned int aint;
 156                unsigned int ainten;
 157        } data;
 158                
 159        /* register addresses */
 160        struct REGS {
 161                unsigned int start;
 162                unsigned int stop;
 163                unsigned int aint;
 164                unsigned int ainten;
 165                unsigned int ac97read;
 166                unsigned int ac97write;
 167        } regs;
 168
 169};
 170
 171struct snd_ali_voice {
 172        unsigned int number;
 173        unsigned int use :1,
 174                pcm :1,
 175                midi :1,
 176                mode :1,
 177                synth :1,
 178                running :1;
 179
 180        /* PCM data */
 181        struct snd_ali *codec;
 182        struct snd_pcm_substream *substream;
 183        struct snd_ali_voice *extra;
 184        
 185        int eso;                /* final ESO value for channel */
 186        int count;              /* runtime->period_size */
 187
 188        /* --- */
 189
 190        void *private_data;
 191        void (*private_free)(void *private_data);
 192};
 193
 194
 195struct snd_alidev {
 196
 197        struct snd_ali_voice voices[ALI_CHANNELS];      
 198
 199        unsigned int    chcnt;                  /* num of opened channels */
 200        unsigned int    chmap;                  /* bitmap for opened channels */
 201        unsigned int synthcount;
 202
 203};
 204
 205
 206#define ALI_GLOBAL_REGS         56
 207#define ALI_CHANNEL_REGS        8
 208struct snd_ali_image {
 209        u32 regs[ALI_GLOBAL_REGS];
 210        u32 channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
 211};
 212
 213
 214struct snd_ali {
 215        int             irq;
 216        unsigned long   port;
 217        unsigned char   revision;
 218
 219        unsigned int hw_initialized :1;
 220        unsigned int spdif_support :1;
 221
 222        struct pci_dev  *pci;
 223        struct pci_dev  *pci_m1533;
 224        struct pci_dev  *pci_m7101;
 225
 226        struct snd_card *card;
 227        struct snd_pcm  *pcm[MAX_CODECS];
 228        struct snd_alidev       synth;
 229        struct snd_ali_channel_control chregs;
 230
 231        /* S/PDIF Mask */
 232        unsigned int    spdif_mask;
 233
 234        unsigned int spurious_irq_count;
 235        unsigned int spurious_irq_max_delta;
 236
 237        unsigned int num_of_codecs;
 238
 239        struct snd_ac97_bus *ac97_bus;
 240        struct snd_ac97 *ac97[MAX_CODECS];
 241        unsigned short  ac97_ext_id;
 242        unsigned short  ac97_ext_status;
 243
 244        spinlock_t      reg_lock;
 245        spinlock_t      voice_alloc;
 246
 247#ifdef CONFIG_PM_SLEEP
 248        struct snd_ali_image *image;
 249#endif
 250};
 251
 252static const struct pci_device_id snd_ali_ids[] = {
 253        {PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0},
 254        {0, }
 255};
 256MODULE_DEVICE_TABLE(pci, snd_ali_ids);
 257
 258static void snd_ali_clear_voices(struct snd_ali *, unsigned int, unsigned int);
 259static unsigned short snd_ali_codec_peek(struct snd_ali *, int, unsigned short);
 260static void snd_ali_codec_poke(struct snd_ali *, int, unsigned short,
 261                               unsigned short);
 262
 263/*
 264 *  AC97 ACCESS
 265 */
 266
 267static inline unsigned int snd_ali_5451_peek(struct snd_ali *codec,
 268                                             unsigned int port)
 269{
 270        return (unsigned int)inl(ALI_REG(codec, port)); 
 271}
 272
 273static inline void snd_ali_5451_poke(struct snd_ali *codec,
 274                                     unsigned int port,
 275                                     unsigned int val)
 276{
 277        outl((unsigned int)val, ALI_REG(codec, port));
 278}
 279
 280static int snd_ali_codec_ready(struct snd_ali *codec,
 281                               unsigned int port)
 282{
 283        unsigned long end_time;
 284        unsigned int res;
 285        
 286        end_time = jiffies + msecs_to_jiffies(250);
 287
 288        for (;;) {
 289                res = snd_ali_5451_peek(codec,port);
 290                if (!(res & 0x8000))
 291                        return 0;
 292                if (!time_after_eq(end_time, jiffies))
 293                        break;
 294                schedule_timeout_uninterruptible(1);
 295        }
 296
 297        snd_ali_5451_poke(codec, port, res & ~0x8000);
 298        dev_dbg(codec->card->dev, "ali_codec_ready: codec is not ready.\n ");
 299        return -EIO;
 300}
 301
 302static int snd_ali_stimer_ready(struct snd_ali *codec)
 303{
 304        unsigned long end_time;
 305        unsigned long dwChk1,dwChk2;
 306        
 307        dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
 308        end_time = jiffies + msecs_to_jiffies(250);
 309
 310        for (;;) {
 311                dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
 312                if (dwChk2 != dwChk1)
 313                        return 0;
 314                if (!time_after_eq(end_time, jiffies))
 315                        break;
 316                schedule_timeout_uninterruptible(1);
 317        }
 318
 319        dev_err(codec->card->dev, "ali_stimer_read: stimer is not ready.\n");
 320        return -EIO;
 321}
 322
 323static void snd_ali_codec_poke(struct snd_ali *codec,int secondary,
 324                               unsigned short reg,
 325                               unsigned short val)
 326{
 327        unsigned int dwVal;
 328        unsigned int port;
 329
 330        if (reg >= 0x80) {
 331                dev_err(codec->card->dev,
 332                        "ali_codec_poke: reg(%xh) invalid.\n", reg);
 333                return;
 334        }
 335
 336        port = codec->chregs.regs.ac97write;
 337
 338        if (snd_ali_codec_ready(codec, port) < 0)
 339                return;
 340        if (snd_ali_stimer_ready(codec) < 0)
 341                return;
 342
 343        dwVal  = (unsigned int) (reg & 0xff);
 344        dwVal |= 0x8000 | (val << 16);
 345        if (secondary)
 346                dwVal |= 0x0080;
 347        if (codec->revision == ALI_5451_V02)
 348                dwVal |= 0x0100;
 349
 350        snd_ali_5451_poke(codec, port, dwVal);
 351
 352        return ;
 353}
 354
 355static unsigned short snd_ali_codec_peek(struct snd_ali *codec,
 356                                         int secondary,
 357                                         unsigned short reg)
 358{
 359        unsigned int dwVal;
 360        unsigned int port;
 361
 362        if (reg >= 0x80) {
 363                dev_err(codec->card->dev,
 364                        "ali_codec_peek: reg(%xh) invalid.\n", reg);
 365                return ~0;
 366        }
 367
 368        port = codec->chregs.regs.ac97read;
 369
 370        if (snd_ali_codec_ready(codec, port) < 0)
 371                return ~0;
 372        if (snd_ali_stimer_ready(codec) < 0)
 373                return ~0;
 374
 375        dwVal  = (unsigned int) (reg & 0xff);
 376        dwVal |= 0x8000;                                /* bit 15*/
 377        if (secondary)
 378                dwVal |= 0x0080;
 379
 380        snd_ali_5451_poke(codec, port, dwVal);
 381
 382        if (snd_ali_stimer_ready(codec) < 0)
 383                return ~0;
 384        if (snd_ali_codec_ready(codec, port) < 0)
 385                return ~0;
 386        
 387        return (snd_ali_5451_peek(codec, port) & 0xffff0000) >> 16;
 388}
 389
 390static void snd_ali_codec_write(struct snd_ac97 *ac97,
 391                                unsigned short reg,
 392                                unsigned short val )
 393{
 394        struct snd_ali *codec = ac97->private_data;
 395
 396        dev_dbg(codec->card->dev, "codec_write: reg=%xh data=%xh.\n", reg, val);
 397        if (reg == AC97_GPIO_STATUS) {
 398                outl((val << ALI_AC97_GPIO_DATA_SHIFT) | ALI_AC97_GPIO_ENABLE,
 399                     ALI_REG(codec, ALI_AC97_GPIO));
 400                return;
 401        }
 402        snd_ali_codec_poke(codec, ac97->num, reg, val);
 403        return ;
 404}
 405
 406
 407static unsigned short snd_ali_codec_read(struct snd_ac97 *ac97,
 408                                         unsigned short reg)
 409{
 410        struct snd_ali *codec = ac97->private_data;
 411
 412        dev_dbg(codec->card->dev, "codec_read reg=%xh.\n", reg);
 413        return snd_ali_codec_peek(codec, ac97->num, reg);
 414}
 415
 416/*
 417 *      AC97 Reset
 418 */
 419
 420static int snd_ali_reset_5451(struct snd_ali *codec)
 421{
 422        struct pci_dev *pci_dev;
 423        unsigned short wCount, wReg;
 424        unsigned int   dwVal;
 425        
 426        pci_dev = codec->pci_m1533;
 427        if (pci_dev) {
 428                pci_read_config_dword(pci_dev, 0x7c, &dwVal);
 429                pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
 430                mdelay(5);
 431                pci_read_config_dword(pci_dev, 0x7c, &dwVal);
 432                pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
 433                mdelay(5);
 434        }
 435        
 436        pci_dev = codec->pci;
 437        pci_read_config_dword(pci_dev, 0x44, &dwVal);
 438        pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
 439        udelay(500);
 440        pci_read_config_dword(pci_dev, 0x44, &dwVal);
 441        pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
 442        mdelay(5);
 443        
 444        wCount = 200;
 445        while(wCount--) {
 446                wReg = snd_ali_codec_peek(codec, 0, AC97_POWERDOWN);
 447                if ((wReg & 0x000f) == 0x000f)
 448                        return 0;
 449                mdelay(5);
 450        }
 451
 452        /* non-fatal if you have a non PM capable codec */
 453        /* dev_warn(codec->card->dev, "ali5451: reset time out\n"); */
 454        return 0;
 455}
 456
 457/*
 458 *  ALI 5451 Controller
 459 */
 460
 461static void snd_ali_enable_special_channel(struct snd_ali *codec,
 462                                           unsigned int channel)
 463{
 464        unsigned long dwVal;
 465
 466        dwVal  = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 467        dwVal |= 1 << (channel & 0x0000001f);
 468        outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 469}
 470
 471static void snd_ali_disable_special_channel(struct snd_ali *codec,
 472                                            unsigned int channel)
 473{
 474        unsigned long dwVal;
 475
 476        dwVal  = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 477        dwVal &= ~(1 << (channel & 0x0000001f));
 478        outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 479}
 480
 481static void snd_ali_enable_address_interrupt(struct snd_ali *codec)
 482{
 483        unsigned int gc;
 484
 485        gc  = inl(ALI_REG(codec, ALI_GC_CIR));
 486        gc |= ENDLP_IE;
 487        gc |= MIDLP_IE;
 488        outl( gc, ALI_REG(codec, ALI_GC_CIR));
 489}
 490
 491static void snd_ali_disable_address_interrupt(struct snd_ali *codec)
 492{
 493        unsigned int gc;
 494
 495        gc  = inl(ALI_REG(codec, ALI_GC_CIR));
 496        gc &= ~ENDLP_IE;
 497        gc &= ~MIDLP_IE;
 498        outl(gc, ALI_REG(codec, ALI_GC_CIR));
 499}
 500
 501static void snd_ali_disable_voice_irq(struct snd_ali *codec,
 502                                      unsigned int channel)
 503{
 504        unsigned int mask;
 505        struct snd_ali_channel_control *pchregs = &(codec->chregs);
 506
 507        dev_dbg(codec->card->dev, "disable_voice_irq channel=%d\n", channel);
 508
 509        mask = 1 << (channel & 0x1f);
 510        pchregs->data.ainten  = inl(ALI_REG(codec, pchregs->regs.ainten));
 511        pchregs->data.ainten &= ~mask;
 512        outl(pchregs->data.ainten, ALI_REG(codec, pchregs->regs.ainten));
 513}
 514
 515static int snd_ali_alloc_pcm_channel(struct snd_ali *codec, int channel)
 516{
 517        unsigned int idx =  channel & 0x1f;
 518
 519        if (codec->synth.chcnt >= ALI_CHANNELS){
 520                dev_err(codec->card->dev,
 521                           "ali_alloc_pcm_channel: no free channels.\n");
 522                return -1;
 523        }
 524
 525        if (!(codec->synth.chmap & (1 << idx))) {
 526                codec->synth.chmap |= 1 << idx;
 527                codec->synth.chcnt++;
 528                dev_dbg(codec->card->dev, "alloc_pcm_channel no. %d.\n", idx);
 529                return idx;
 530        }
 531        return -1;
 532}
 533
 534static int snd_ali_find_free_channel(struct snd_ali * codec, int rec)
 535{
 536        int idx;
 537        int result = -1;
 538
 539        dev_dbg(codec->card->dev,
 540                "find_free_channel: for %s\n", rec ? "rec" : "pcm");
 541
 542        /* recording */
 543        if (rec) {
 544                if (codec->spdif_support &&
 545                    (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
 546                     ALI_SPDIF_IN_SUPPORT))
 547                        idx = ALI_SPDIF_IN_CHANNEL;
 548                else
 549                        idx = ALI_PCM_IN_CHANNEL;
 550
 551                result = snd_ali_alloc_pcm_channel(codec, idx);
 552                if (result >= 0)
 553                        return result;
 554                else {
 555                        dev_err(codec->card->dev,
 556                                "ali_find_free_channel: record channel is busy now.\n");
 557                        return -1;
 558                }
 559        }
 560
 561        /* playback... */
 562        if (codec->spdif_support &&
 563            (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
 564             ALI_SPDIF_OUT_CH_ENABLE)) {
 565                idx = ALI_SPDIF_OUT_CHANNEL;
 566                result = snd_ali_alloc_pcm_channel(codec, idx);
 567                if (result >= 0)
 568                        return result;
 569                else
 570                        dev_err(codec->card->dev,
 571                                "ali_find_free_channel: S/PDIF out channel is in busy now.\n");
 572        }
 573
 574        for (idx = 0; idx < ALI_CHANNELS; idx++) {
 575                result = snd_ali_alloc_pcm_channel(codec, idx);
 576                if (result >= 0)
 577                        return result;
 578        }
 579        dev_err(codec->card->dev, "ali_find_free_channel: no free channels.\n");
 580        return -1;
 581}
 582
 583static void snd_ali_free_channel_pcm(struct snd_ali *codec, int channel)
 584{
 585        unsigned int idx = channel & 0x0000001f;
 586
 587        dev_dbg(codec->card->dev, "free_channel_pcm channel=%d\n", channel);
 588
 589        if (channel < 0 || channel >= ALI_CHANNELS)
 590                return;
 591
 592        if (!(codec->synth.chmap & (1 << idx))) {
 593                dev_err(codec->card->dev,
 594                        "ali_free_channel_pcm: channel %d is not in use.\n",
 595                        channel);
 596                return;
 597        } else {
 598                codec->synth.chmap &= ~(1 << idx);
 599                codec->synth.chcnt--;
 600        }
 601}
 602
 603static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel)
 604{
 605        unsigned int mask = 1 << (channel & 0x1f);
 606
 607        dev_dbg(codec->card->dev, "stop_voice: channel=%d\n", channel);
 608        outl(mask, ALI_REG(codec, codec->chregs.regs.stop));
 609}
 610
 611/*
 612 *    S/PDIF Part
 613 */
 614
 615static void snd_ali_delay(struct snd_ali *codec,int interval)
 616{
 617        unsigned long  begintimer,currenttimer;
 618
 619        begintimer   = inl(ALI_REG(codec, ALI_STIMER));
 620        currenttimer = inl(ALI_REG(codec, ALI_STIMER));
 621
 622        while (currenttimer < begintimer + interval) {
 623                if (snd_ali_stimer_ready(codec) < 0)
 624                        break;
 625                currenttimer = inl(ALI_REG(codec,  ALI_STIMER));
 626                cpu_relax();
 627        }
 628}
 629
 630static void snd_ali_detect_spdif_rate(struct snd_ali *codec)
 631{
 632        u16 wval;
 633        u16 count = 0;
 634        u8  bval, R1 = 0, R2;
 635
 636        bval  = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1));
 637        bval |= 0x1F;
 638        outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL + 1));
 639
 640        while ((R1 < 0x0b || R1 > 0x0e) && R1 != 0x12 && count <= 50000) {
 641                count ++;
 642                snd_ali_delay(codec, 6);
 643                bval = inb(ALI_REG(codec, ALI_SPDIF_CTRL + 1));
 644                R1 = bval & 0x1F;
 645        }
 646
 647        if (count > 50000) {
 648                dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n");
 649                return;
 650        }
 651
 652        for (count = 0; count <= 50000; count++) {
 653                snd_ali_delay(codec, 6);
 654                bval = inb(ALI_REG(codec,ALI_SPDIF_CTRL + 1));
 655                R2 = bval & 0x1F;
 656                if (R2 != R1)
 657                        R1 = R2;
 658                else
 659                        break;
 660        }
 661
 662        if (count > 50000) {
 663                dev_err(codec->card->dev, "ali_detect_spdif_rate: timeout!\n");
 664                return;
 665        }
 666
 667        if (R2 >= 0x0b && R2 <= 0x0e) {
 668                wval  = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2));
 669                wval &= 0xe0f0;
 670                wval |= (0x09 << 8) | 0x05;
 671                outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2));
 672
 673                bval  = inb(ALI_REG(codec, ALI_SPDIF_CS + 3)) & 0xf0;
 674                outb(bval | 0x02, ALI_REG(codec, ALI_SPDIF_CS + 3));
 675        } else if (R2 == 0x12) {
 676                wval  = inw(ALI_REG(codec, ALI_SPDIF_CTRL + 2));
 677                wval &= 0xe0f0;
 678                wval |= (0x0e << 8) | 0x08;
 679                outw(wval, ALI_REG(codec, ALI_SPDIF_CTRL + 2));
 680
 681                bval  = inb(ALI_REG(codec,ALI_SPDIF_CS + 3)) & 0xf0;
 682                outb(bval | 0x03, ALI_REG(codec, ALI_SPDIF_CS + 3));
 683        }
 684}
 685
 686static unsigned int snd_ali_get_spdif_in_rate(struct snd_ali *codec)
 687{
 688        u32     dwRate;
 689        u8      bval;
 690
 691        bval  = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
 692        bval &= 0x7f;
 693        bval |= 0x40;
 694        outb(bval, ALI_REG(codec, ALI_SPDIF_CTRL));
 695
 696        snd_ali_detect_spdif_rate(codec);
 697
 698        bval  = inb(ALI_REG(codec, ALI_SPDIF_CS + 3));
 699        bval &= 0x0f;
 700
 701        switch (bval) {
 702        case 0: dwRate = 44100; break;
 703        case 1: dwRate = 48000; break;
 704        case 2: dwRate = 32000; break;
 705        default: dwRate = 0; break;
 706        }
 707
 708        return dwRate;
 709}
 710
 711static void snd_ali_enable_spdif_in(struct snd_ali *codec)
 712{       
 713        unsigned int dwVal;
 714
 715        dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 716        dwVal |= ALI_SPDIF_IN_SUPPORT;
 717        outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 718
 719        dwVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
 720        dwVal |= 0x02;
 721        outb(dwVal, ALI_REG(codec, ALI_SPDIF_CTRL));
 722
 723        snd_ali_enable_special_channel(codec, ALI_SPDIF_IN_CHANNEL);
 724}
 725
 726static void snd_ali_disable_spdif_in(struct snd_ali *codec)
 727{
 728        unsigned int dwVal;
 729        
 730        dwVal = inl(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 731        dwVal &= ~ALI_SPDIF_IN_SUPPORT;
 732        outl(dwVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 733        
 734        snd_ali_disable_special_channel(codec, ALI_SPDIF_IN_CHANNEL);   
 735}
 736
 737
 738static void snd_ali_set_spdif_out_rate(struct snd_ali *codec, unsigned int rate)
 739{
 740        unsigned char  bVal;
 741        unsigned int  dwRate;
 742        
 743        switch (rate) {
 744        case 32000: dwRate = 0x300; break;
 745        case 48000: dwRate = 0x200; break;
 746        default: dwRate = 0; break;
 747        }
 748        
 749        bVal  = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
 750        bVal &= (unsigned char)(~(1<<6));
 751        
 752        bVal |= 0x80;           /* select right */
 753        outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL));
 754        outb(dwRate | 0x20, ALI_REG(codec, ALI_SPDIF_CS + 2));
 755        
 756        bVal &= ~0x80;  /* select left */
 757        outb(bVal, ALI_REG(codec, ALI_SPDIF_CTRL));
 758        outw(rate | 0x10, ALI_REG(codec, ALI_SPDIF_CS + 2));
 759}
 760
 761static void snd_ali_enable_spdif_out(struct snd_ali *codec)
 762{
 763        unsigned short wVal;
 764        unsigned char bVal;
 765        struct pci_dev *pci_dev;
 766
 767        pci_dev = codec->pci_m1533;
 768        if (pci_dev == NULL)
 769                return;
 770        pci_read_config_byte(pci_dev, 0x61, &bVal);
 771        bVal |= 0x40;
 772        pci_write_config_byte(pci_dev, 0x61, bVal);
 773        pci_read_config_byte(pci_dev, 0x7d, &bVal);
 774        bVal |= 0x01;
 775        pci_write_config_byte(pci_dev, 0x7d, bVal);
 776
 777        pci_read_config_byte(pci_dev, 0x7e, &bVal);
 778        bVal &= (~0x20);
 779        bVal |= 0x10;
 780        pci_write_config_byte(pci_dev, 0x7e, bVal);
 781
 782        bVal = inb(ALI_REG(codec, ALI_SCTRL));
 783        outb(bVal | ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL));
 784
 785        bVal = inb(ALI_REG(codec, ALI_SPDIF_CTRL));
 786        outb(bVal & ALI_SPDIF_OUT_CH_STATUS, ALI_REG(codec, ALI_SPDIF_CTRL));
 787   
 788        wVal = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 789        wVal |= ALI_SPDIF_OUT_SEL_PCM;
 790        outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 791        snd_ali_disable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
 792}
 793
 794static void snd_ali_enable_spdif_chnout(struct snd_ali *codec)
 795{
 796        unsigned short wVal;
 797
 798        wVal  = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 799        wVal &= ~ALI_SPDIF_OUT_SEL_PCM;
 800        outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 801/*
 802        wVal = inw(ALI_REG(codec, ALI_SPDIF_CS));
 803        if (flag & ALI_SPDIF_OUT_NON_PCM)
 804                wVal |= 0x0002;
 805        else    
 806                wVal &= (~0x0002);
 807        outw(wVal, ALI_REG(codec, ALI_SPDIF_CS));
 808*/
 809        snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
 810}
 811
 812static void snd_ali_disable_spdif_chnout(struct snd_ali *codec)
 813{
 814        unsigned short wVal;
 815
 816        wVal  = inw(ALI_REG(codec, ALI_GLOBAL_CONTROL));
 817        wVal |= ALI_SPDIF_OUT_SEL_PCM;
 818        outw(wVal, ALI_REG(codec, ALI_GLOBAL_CONTROL));
 819
 820        snd_ali_enable_special_channel(codec, ALI_SPDIF_OUT_CHANNEL);
 821}
 822
 823static void snd_ali_disable_spdif_out(struct snd_ali *codec)
 824{
 825        unsigned char  bVal;
 826
 827        bVal = inb(ALI_REG(codec, ALI_SCTRL));
 828        outb(bVal & ~ALI_SPDIF_OUT_ENABLE, ALI_REG(codec, ALI_SCTRL));
 829
 830        snd_ali_disable_spdif_chnout(codec);
 831}
 832
 833static void snd_ali_update_ptr(struct snd_ali *codec, int channel)
 834{
 835        struct snd_ali_voice *pvoice;
 836        struct snd_ali_channel_control *pchregs;
 837        unsigned int old, mask;
 838
 839        pchregs = &(codec->chregs);
 840
 841        /* check if interrupt occurred for channel */
 842        old  = pchregs->data.aint;
 843        mask = 1U << (channel & 0x1f);
 844
 845        if (!(old & mask))
 846                return;
 847
 848        pvoice = &codec->synth.voices[channel];
 849
 850        udelay(100);
 851        spin_lock(&codec->reg_lock);
 852
 853        if (pvoice->pcm && pvoice->substream) {
 854                /* pcm interrupt */
 855                if (pvoice->running) {
 856                        dev_dbg(codec->card->dev,
 857                                "update_ptr: cso=%4.4x cspf=%d.\n",
 858                                inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2)),
 859                                (inl(ALI_REG(codec, ALI_CSPF)) & mask) == mask);
 860                        spin_unlock(&codec->reg_lock);
 861                        snd_pcm_period_elapsed(pvoice->substream);
 862                        spin_lock(&codec->reg_lock);
 863                } else {
 864                        snd_ali_stop_voice(codec, channel);
 865                        snd_ali_disable_voice_irq(codec, channel);
 866                }       
 867        } else if (codec->synth.voices[channel].synth) {
 868                /* synth interrupt */
 869        } else if (codec->synth.voices[channel].midi) {
 870                /* midi interrupt */
 871        } else {
 872                /* unknown interrupt */
 873                snd_ali_stop_voice(codec, channel);
 874                snd_ali_disable_voice_irq(codec, channel);
 875        }
 876        spin_unlock(&codec->reg_lock);
 877        outl(mask,ALI_REG(codec,pchregs->regs.aint));
 878        pchregs->data.aint = old & (~mask);
 879}
 880
 881static irqreturn_t snd_ali_card_interrupt(int irq, void *dev_id)
 882{
 883        struct snd_ali  *codec = dev_id;
 884        int channel;
 885        unsigned int audio_int;
 886        struct snd_ali_channel_control *pchregs;
 887
 888        if (codec == NULL || !codec->hw_initialized)
 889                return IRQ_NONE;
 890
 891        audio_int = inl(ALI_REG(codec, ALI_MISCINT));
 892        if (!audio_int)
 893                return IRQ_NONE;
 894
 895        pchregs = &(codec->chregs);
 896        if (audio_int & ADDRESS_IRQ) {
 897                /* get interrupt status for all channels */
 898                pchregs->data.aint = inl(ALI_REG(codec, pchregs->regs.aint));
 899                for (channel = 0; channel < ALI_CHANNELS; channel++)
 900                        snd_ali_update_ptr(codec, channel);
 901        }
 902        outl((TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
 903                ALI_REG(codec, ALI_MISCINT));
 904
 905        return IRQ_HANDLED;
 906}
 907
 908
 909static struct snd_ali_voice *snd_ali_alloc_voice(struct snd_ali * codec,
 910                                                 int type, int rec, int channel)
 911{
 912        struct snd_ali_voice *pvoice;
 913        int idx;
 914
 915        dev_dbg(codec->card->dev, "alloc_voice: type=%d rec=%d\n", type, rec);
 916
 917        spin_lock_irq(&codec->voice_alloc);
 918        if (type == SNDRV_ALI_VOICE_TYPE_PCM) {
 919                idx = channel > 0 ? snd_ali_alloc_pcm_channel(codec, channel) :
 920                        snd_ali_find_free_channel(codec,rec);
 921                if (idx < 0) {
 922                        dev_err(codec->card->dev, "ali_alloc_voice: err.\n");
 923                        spin_unlock_irq(&codec->voice_alloc);
 924                        return NULL;
 925                }
 926                pvoice = &(codec->synth.voices[idx]);
 927                pvoice->codec = codec;
 928                pvoice->use = 1;
 929                pvoice->pcm = 1;
 930                pvoice->mode = rec;
 931                spin_unlock_irq(&codec->voice_alloc);
 932                return pvoice;
 933        }
 934        spin_unlock_irq(&codec->voice_alloc);
 935        return NULL;
 936}
 937
 938
 939static void snd_ali_free_voice(struct snd_ali * codec,
 940                               struct snd_ali_voice *pvoice)
 941{
 942        void (*private_free)(void *);
 943        void *private_data;
 944
 945        dev_dbg(codec->card->dev, "free_voice: channel=%d\n", pvoice->number);
 946        if (!pvoice->use)
 947                return;
 948        snd_ali_clear_voices(codec, pvoice->number, pvoice->number);
 949        spin_lock_irq(&codec->voice_alloc);
 950        private_free = pvoice->private_free;
 951        private_data = pvoice->private_data;
 952        pvoice->private_free = NULL;
 953        pvoice->private_data = NULL;
 954        if (pvoice->pcm)
 955                snd_ali_free_channel_pcm(codec, pvoice->number);
 956        pvoice->use = pvoice->pcm = pvoice->synth = 0;
 957        pvoice->substream = NULL;
 958        spin_unlock_irq(&codec->voice_alloc);
 959        if (private_free)
 960                private_free(private_data);
 961}
 962
 963
 964static void snd_ali_clear_voices(struct snd_ali *codec,
 965                                 unsigned int v_min,
 966                                 unsigned int v_max)
 967{
 968        unsigned int i;
 969
 970        for (i = v_min; i <= v_max; i++) {
 971                snd_ali_stop_voice(codec, i);
 972                snd_ali_disable_voice_irq(codec, i);
 973        }
 974}
 975
 976static void snd_ali_write_voice_regs(struct snd_ali *codec,
 977                         unsigned int Channel,
 978                         unsigned int LBA,
 979                         unsigned int CSO,
 980                         unsigned int ESO,
 981                         unsigned int DELTA,
 982                         unsigned int ALPHA_FMS,
 983                         unsigned int GVSEL,
 984                         unsigned int PAN,
 985                         unsigned int VOL,
 986                         unsigned int CTRL,
 987                         unsigned int EC)
 988{
 989        unsigned int ctlcmds[4];
 990        
 991        outb((unsigned char)(Channel & 0x001f), ALI_REG(codec, ALI_GC_CIR));
 992
 993        ctlcmds[0] =  (CSO << 16) | (ALPHA_FMS & 0x0000ffff);
 994        ctlcmds[1] =  LBA;
 995        ctlcmds[2] =  (ESO << 16) | (DELTA & 0x0ffff);
 996        ctlcmds[3] =  (GVSEL << 31) |
 997                      ((PAN & 0x0000007f) << 24) |
 998                      ((VOL & 0x000000ff) << 16) |
 999                      ((CTRL & 0x0000000f) << 12) |
1000                      (EC & 0x00000fff);
1001
1002        outb(Channel, ALI_REG(codec, ALI_GC_CIR));
1003
1004        outl(ctlcmds[0], ALI_REG(codec, ALI_CSO_ALPHA_FMS));
1005        outl(ctlcmds[1], ALI_REG(codec, ALI_LBA));
1006        outl(ctlcmds[2], ALI_REG(codec, ALI_ESO_DELTA));
1007        outl(ctlcmds[3], ALI_REG(codec, ALI_GVSEL_PAN_VOC_CTRL_EC));
1008
1009        outl(0x30000000, ALI_REG(codec, ALI_EBUF1));    /* Still Mode */
1010        outl(0x30000000, ALI_REG(codec, ALI_EBUF2));    /* Still Mode */
1011}
1012
1013static unsigned int snd_ali_convert_rate(unsigned int rate, int rec)
1014{
1015        unsigned int delta;
1016
1017        if (rate < 4000)
1018                rate = 4000;
1019        if (rate > 48000)
1020                rate = 48000;
1021
1022        if (rec) {
1023                if (rate == 44100)
1024                        delta = 0x116a;
1025                else if (rate == 8000)
1026                        delta = 0x6000;
1027                else if (rate == 48000)
1028                        delta = 0x1000;
1029                else
1030                        delta = ((48000 << 12) / rate) & 0x0000ffff;
1031        } else {
1032                if (rate == 44100)
1033                        delta = 0xeb3;
1034                else if (rate == 8000)
1035                        delta = 0x2ab;
1036                else if (rate == 48000)
1037                        delta = 0x1000;
1038                else 
1039                        delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
1040        }
1041
1042        return delta;
1043}
1044
1045static unsigned int snd_ali_control_mode(struct snd_pcm_substream *substream)
1046{
1047        unsigned int CTRL;
1048        struct snd_pcm_runtime *runtime = substream->runtime;
1049
1050        /* set ctrl mode
1051           CTRL default: 8-bit (unsigned) mono, loop mode enabled
1052         */
1053        CTRL = 0x00000001;
1054        if (snd_pcm_format_width(runtime->format) == 16)
1055                CTRL |= 0x00000008;     /* 16-bit data */
1056        if (!snd_pcm_format_unsigned(runtime->format))
1057                CTRL |= 0x00000002;     /* signed data */
1058        if (runtime->channels > 1)
1059                CTRL |= 0x00000004;     /* stereo data */
1060        return CTRL;
1061}
1062
1063/*
1064 *  PCM part
1065 */
1066
1067static int snd_ali_trigger(struct snd_pcm_substream *substream,
1068                               int cmd)
1069                                    
1070{
1071        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1072        struct snd_pcm_substream *s;
1073        unsigned int what, whati, capture_flag;
1074        struct snd_ali_voice *pvoice, *evoice;
1075        unsigned int val;
1076        int do_start;
1077
1078        switch (cmd) {
1079        case SNDRV_PCM_TRIGGER_START:
1080        case SNDRV_PCM_TRIGGER_RESUME:
1081                do_start = 1;
1082                break;
1083        case SNDRV_PCM_TRIGGER_STOP:
1084        case SNDRV_PCM_TRIGGER_SUSPEND:
1085                do_start = 0;
1086                break;
1087        default:
1088                return -EINVAL;
1089        }
1090
1091        what = whati = capture_flag = 0;
1092        snd_pcm_group_for_each_entry(s, substream) {
1093                if ((struct snd_ali *) snd_pcm_substream_chip(s) == codec) {
1094                        pvoice = s->runtime->private_data;
1095                        evoice = pvoice->extra;
1096                        what |= 1 << (pvoice->number & 0x1f);
1097                        if (evoice == NULL)
1098                                whati |= 1 << (pvoice->number & 0x1f);
1099                        else {
1100                                whati |= 1 << (evoice->number & 0x1f);
1101                                what |= 1 << (evoice->number & 0x1f);
1102                        }
1103                        if (do_start) {
1104                                pvoice->running = 1;
1105                                if (evoice != NULL)
1106                                        evoice->running = 1;
1107                        } else {
1108                                pvoice->running = 0;
1109                                if (evoice != NULL)
1110                                        evoice->running = 0;
1111                        }
1112                        snd_pcm_trigger_done(s, substream);
1113                        if (pvoice->mode)
1114                                capture_flag = 1;
1115                }
1116        }
1117        spin_lock(&codec->reg_lock);
1118        if (!do_start)
1119                outl(what, ALI_REG(codec, ALI_STOP));
1120        val = inl(ALI_REG(codec, ALI_AINTEN));
1121        if (do_start)
1122                val |= whati;
1123        else
1124                val &= ~whati;
1125        outl(val, ALI_REG(codec, ALI_AINTEN));
1126        if (do_start)
1127                outl(what, ALI_REG(codec, ALI_START));
1128        dev_dbg(codec->card->dev, "trigger: what=%xh whati=%xh\n", what, whati);
1129        spin_unlock(&codec->reg_lock);
1130
1131        return 0;
1132}
1133
1134static int snd_ali_playback_hw_params(struct snd_pcm_substream *substream,
1135                                      struct snd_pcm_hw_params *hw_params)
1136{
1137        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1138        struct snd_pcm_runtime *runtime = substream->runtime;
1139        struct snd_ali_voice *pvoice = runtime->private_data;
1140        struct snd_ali_voice *evoice = pvoice->extra;
1141        int err;
1142
1143        err = snd_pcm_lib_malloc_pages(substream,
1144                                       params_buffer_bytes(hw_params));
1145        if (err < 0)
1146                return err;
1147        
1148        /* voice management */
1149
1150        if (params_buffer_size(hw_params) / 2 !=
1151            params_period_size(hw_params)) {
1152                if (!evoice) {
1153                        evoice = snd_ali_alloc_voice(codec,
1154                                                     SNDRV_ALI_VOICE_TYPE_PCM,
1155                                                     0, -1);
1156                        if (!evoice)
1157                                return -ENOMEM;
1158                        pvoice->extra = evoice;
1159                        evoice->substream = substream;
1160                }
1161        } else {
1162                if (evoice) {
1163                        snd_ali_free_voice(codec, evoice);
1164                        pvoice->extra = evoice = NULL;
1165                }
1166        }
1167
1168        return 0;
1169}
1170
1171static int snd_ali_playback_hw_free(struct snd_pcm_substream *substream)
1172{
1173        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1174        struct snd_pcm_runtime *runtime = substream->runtime;
1175        struct snd_ali_voice *pvoice = runtime->private_data;
1176        struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL;
1177
1178        snd_pcm_lib_free_pages(substream);
1179        if (evoice) {
1180                snd_ali_free_voice(codec, evoice);
1181                pvoice->extra = NULL;
1182        }
1183        return 0;
1184}
1185
1186static int snd_ali_hw_params(struct snd_pcm_substream *substream,
1187                             struct snd_pcm_hw_params *hw_params)
1188{
1189        return snd_pcm_lib_malloc_pages(substream,
1190                                        params_buffer_bytes(hw_params));
1191}
1192
1193static int snd_ali_hw_free(struct snd_pcm_substream *substream)
1194{
1195        return snd_pcm_lib_free_pages(substream);
1196}
1197
1198static int snd_ali_playback_prepare(struct snd_pcm_substream *substream)
1199{
1200        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1201        struct snd_pcm_runtime *runtime = substream->runtime;
1202        struct snd_ali_voice *pvoice = runtime->private_data;
1203        struct snd_ali_voice *evoice = pvoice->extra;
1204
1205        unsigned int LBA;
1206        unsigned int Delta;
1207        unsigned int ESO;
1208        unsigned int CTRL;
1209        unsigned int GVSEL;
1210        unsigned int PAN;
1211        unsigned int VOL;
1212        unsigned int EC;
1213        
1214        dev_dbg(codec->card->dev, "playback_prepare ...\n");
1215
1216        spin_lock_irq(&codec->reg_lock);        
1217        
1218        /* set Delta (rate) value */
1219        Delta = snd_ali_convert_rate(runtime->rate, 0);
1220
1221        if (pvoice->number == ALI_SPDIF_IN_CHANNEL || 
1222            pvoice->number == ALI_PCM_IN_CHANNEL)
1223                snd_ali_disable_special_channel(codec, pvoice->number);
1224        else if (codec->spdif_support &&
1225                 (inl(ALI_REG(codec, ALI_GLOBAL_CONTROL)) &
1226                  ALI_SPDIF_OUT_CH_ENABLE)
1227                 && pvoice->number == ALI_SPDIF_OUT_CHANNEL) {
1228                snd_ali_set_spdif_out_rate(codec, runtime->rate);
1229                Delta = 0x1000;
1230        }
1231        
1232        /* set Loop Back Address */
1233        LBA = runtime->dma_addr;
1234
1235        /* set interrupt count size */
1236        pvoice->count = runtime->period_size;
1237
1238        /* set target ESO for channel */
1239        pvoice->eso = runtime->buffer_size; 
1240
1241        dev_dbg(codec->card->dev, "playback_prepare: eso=%xh count=%xh\n",
1242                       pvoice->eso, pvoice->count);
1243
1244        /* set ESO to capture first MIDLP interrupt */
1245        ESO = pvoice->eso -1;
1246        /* set ctrl mode */
1247        CTRL = snd_ali_control_mode(substream);
1248
1249        GVSEL = 1;
1250        PAN = 0;
1251        VOL = 0;
1252        EC = 0;
1253        dev_dbg(codec->card->dev, "playback_prepare:\n");
1254        dev_dbg(codec->card->dev,
1255                "ch=%d, Rate=%d Delta=%xh,GVSEL=%xh,PAN=%xh,CTRL=%xh\n",
1256                       pvoice->number,runtime->rate,Delta,GVSEL,PAN,CTRL);
1257        snd_ali_write_voice_regs(codec,
1258                                 pvoice->number,
1259                                 LBA,
1260                                 0,     /* cso */
1261                                 ESO,
1262                                 Delta,
1263                                 0,     /* alpha */
1264                                 GVSEL,
1265                                 PAN,
1266                                 VOL,
1267                                 CTRL,
1268                                 EC);
1269        if (evoice) {
1270                evoice->count = pvoice->count;
1271                evoice->eso = pvoice->count << 1;
1272                ESO = evoice->eso - 1;
1273                snd_ali_write_voice_regs(codec,
1274                                         evoice->number,
1275                                         LBA,
1276                                         0,     /* cso */
1277                                         ESO,
1278                                         Delta,
1279                                         0,     /* alpha */
1280                                         GVSEL,
1281                                         0x7f,
1282                                         0x3ff,
1283                                         CTRL,
1284                                         EC);
1285        }
1286        spin_unlock_irq(&codec->reg_lock);
1287        return 0;
1288}
1289
1290
1291static int snd_ali_prepare(struct snd_pcm_substream *substream)
1292{
1293        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1294        struct snd_pcm_runtime *runtime = substream->runtime;
1295        struct snd_ali_voice *pvoice = runtime->private_data;
1296        unsigned int LBA;
1297        unsigned int Delta;
1298        unsigned int ESO;
1299        unsigned int CTRL;
1300        unsigned int GVSEL;
1301        unsigned int PAN;
1302        unsigned int VOL;
1303        unsigned int EC;
1304        u8       bValue;
1305
1306        spin_lock_irq(&codec->reg_lock);
1307
1308        dev_dbg(codec->card->dev, "ali_prepare...\n");
1309
1310        snd_ali_enable_special_channel(codec,pvoice->number);
1311
1312        Delta = (pvoice->number == ALI_MODEM_IN_CHANNEL ||
1313                 pvoice->number == ALI_MODEM_OUT_CHANNEL) ? 
1314                0x1000 : snd_ali_convert_rate(runtime->rate, pvoice->mode);
1315
1316        /* Prepare capture intr channel */
1317        if (pvoice->number == ALI_SPDIF_IN_CHANNEL) {
1318
1319                unsigned int rate;
1320                
1321                spin_unlock_irq(&codec->reg_lock);
1322                if (codec->revision != ALI_5451_V02)
1323                        return -1;
1324
1325                rate = snd_ali_get_spdif_in_rate(codec);
1326                if (rate == 0) {
1327                        dev_warn(codec->card->dev,
1328                                 "ali_capture_prepare: spdif rate detect err!\n");
1329                        rate = 48000;
1330                }
1331                spin_lock_irq(&codec->reg_lock);
1332                bValue = inb(ALI_REG(codec,ALI_SPDIF_CTRL));
1333                if (bValue & 0x10) {
1334                        outb(bValue,ALI_REG(codec,ALI_SPDIF_CTRL));
1335                        dev_warn(codec->card->dev,
1336                                 "clear SPDIF parity error flag.\n");
1337                }
1338
1339                if (rate != 48000)
1340                        Delta = ((rate << 12) / runtime->rate) & 0x00ffff;
1341        }
1342
1343        /* set target ESO for channel  */
1344        pvoice->eso = runtime->buffer_size; 
1345
1346        /* set interrupt count size  */
1347        pvoice->count = runtime->period_size;
1348
1349        /* set Loop Back Address  */
1350        LBA = runtime->dma_addr;
1351
1352        /* set ESO to capture first MIDLP interrupt  */
1353        ESO = pvoice->eso - 1;
1354        CTRL = snd_ali_control_mode(substream);
1355        GVSEL = 0;
1356        PAN = 0x00;
1357        VOL = 0x00;
1358        EC = 0;
1359
1360        snd_ali_write_voice_regs(    codec,
1361                                     pvoice->number,
1362                                     LBA,
1363                                     0, /* cso */
1364                                     ESO,
1365                                     Delta,
1366                                     0, /* alpha */
1367                                     GVSEL,
1368                                     PAN,
1369                                     VOL,
1370                                     CTRL,
1371                                     EC);
1372
1373        spin_unlock_irq(&codec->reg_lock);
1374
1375        return 0;
1376}
1377
1378
1379static snd_pcm_uframes_t
1380snd_ali_playback_pointer(struct snd_pcm_substream *substream)
1381{
1382        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1383        struct snd_pcm_runtime *runtime = substream->runtime;
1384        struct snd_ali_voice *pvoice = runtime->private_data;
1385        unsigned int cso;
1386
1387        spin_lock(&codec->reg_lock);
1388        if (!pvoice->running) {
1389                spin_unlock(&codec->reg_lock);
1390                return 0;
1391        }
1392        outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR));
1393        cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2));
1394        spin_unlock(&codec->reg_lock);
1395        dev_dbg(codec->card->dev, "playback pointer returned cso=%xh.\n", cso);
1396
1397        cso %= runtime->buffer_size;
1398        return cso;
1399}
1400
1401
1402static snd_pcm_uframes_t snd_ali_pointer(struct snd_pcm_substream *substream)
1403{
1404        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1405        struct snd_pcm_runtime *runtime = substream->runtime;
1406        struct snd_ali_voice *pvoice = runtime->private_data;
1407        unsigned int cso;
1408
1409        spin_lock(&codec->reg_lock);
1410        if (!pvoice->running) {
1411                spin_unlock(&codec->reg_lock);
1412                return 0;
1413        }
1414        outb(pvoice->number, ALI_REG(codec, ALI_GC_CIR));
1415        cso = inw(ALI_REG(codec, ALI_CSO_ALPHA_FMS + 2));
1416        spin_unlock(&codec->reg_lock);
1417
1418        cso %= runtime->buffer_size;
1419        return cso;
1420}
1421
1422static struct snd_pcm_hardware snd_ali_playback =
1423{
1424        .info =         (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1425                         SNDRV_PCM_INFO_BLOCK_TRANSFER |
1426                         SNDRV_PCM_INFO_MMAP_VALID |
1427                         SNDRV_PCM_INFO_RESUME |
1428                         SNDRV_PCM_INFO_SYNC_START),
1429        .formats =      (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
1430                         SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
1431        .rates =        SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
1432        .rate_min =             4000,
1433        .rate_max =             48000,
1434        .channels_min =         1,
1435        .channels_max =         2,
1436        .buffer_bytes_max =     (256*1024),
1437        .period_bytes_min =     64,
1438        .period_bytes_max =     (256*1024),
1439        .periods_min =          1,
1440        .periods_max =          1024,
1441        .fifo_size =            0,
1442};
1443
1444/*
1445 *  Capture support device description
1446 */
1447
1448static struct snd_pcm_hardware snd_ali_capture =
1449{
1450        .info =         (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1451                         SNDRV_PCM_INFO_BLOCK_TRANSFER |
1452                         SNDRV_PCM_INFO_MMAP_VALID |
1453                         SNDRV_PCM_INFO_RESUME |
1454                         SNDRV_PCM_INFO_SYNC_START),
1455        .formats =      (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
1456                         SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
1457        .rates =        SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
1458        .rate_min =             4000,
1459        .rate_max =             48000,
1460        .channels_min =         1,
1461        .channels_max =         2,
1462        .buffer_bytes_max =     (128*1024),
1463        .period_bytes_min =     64,
1464        .period_bytes_max =     (128*1024),
1465        .periods_min =          1,
1466        .periods_max =          1024,
1467        .fifo_size =            0,
1468};
1469
1470static void snd_ali_pcm_free_substream(struct snd_pcm_runtime *runtime)
1471{
1472        struct snd_ali_voice *pvoice = runtime->private_data;
1473
1474        if (pvoice)
1475                snd_ali_free_voice(pvoice->codec, pvoice);
1476}
1477
1478static int snd_ali_open(struct snd_pcm_substream *substream, int rec,
1479                        int channel, struct snd_pcm_hardware *phw)
1480{
1481        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1482        struct snd_pcm_runtime *runtime = substream->runtime;
1483        struct snd_ali_voice *pvoice;
1484
1485        pvoice = snd_ali_alloc_voice(codec, SNDRV_ALI_VOICE_TYPE_PCM, rec,
1486                                     channel);
1487        if (!pvoice)
1488                return -EAGAIN;
1489
1490        pvoice->substream = substream;
1491        runtime->private_data = pvoice;
1492        runtime->private_free = snd_ali_pcm_free_substream;
1493
1494        runtime->hw = *phw;
1495        snd_pcm_set_sync(substream);
1496        snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
1497                                     0, 64*1024);
1498        return 0;
1499}
1500
1501static int snd_ali_playback_open(struct snd_pcm_substream *substream)
1502{
1503        return snd_ali_open(substream, 0, -1, &snd_ali_playback);
1504}
1505
1506static int snd_ali_capture_open(struct snd_pcm_substream *substream)
1507{
1508        return snd_ali_open(substream, 1, -1, &snd_ali_capture);
1509}
1510
1511static int snd_ali_playback_close(struct snd_pcm_substream *substream)
1512{
1513        return 0;
1514}
1515
1516static int snd_ali_close(struct snd_pcm_substream *substream)
1517{
1518        struct snd_ali *codec = snd_pcm_substream_chip(substream);
1519        struct snd_ali_voice *pvoice = substream->runtime->private_data;
1520
1521        snd_ali_disable_special_channel(codec,pvoice->number);
1522
1523        return 0;
1524}
1525
1526static const struct snd_pcm_ops snd_ali_playback_ops = {
1527        .open =         snd_ali_playback_open,
1528        .close =        snd_ali_playback_close,
1529        .ioctl =        snd_pcm_lib_ioctl,
1530        .hw_params =    snd_ali_playback_hw_params,
1531        .hw_free =      snd_ali_playback_hw_free,
1532        .prepare =      snd_ali_playback_prepare,
1533        .trigger =      snd_ali_trigger,
1534        .pointer =      snd_ali_playback_pointer,
1535};
1536
1537static const struct snd_pcm_ops snd_ali_capture_ops = {
1538        .open =         snd_ali_capture_open,
1539        .close =        snd_ali_close,
1540        .ioctl =        snd_pcm_lib_ioctl,
1541        .hw_params =    snd_ali_hw_params,
1542        .hw_free =      snd_ali_hw_free,
1543        .prepare =      snd_ali_prepare,
1544        .trigger =      snd_ali_trigger,
1545        .pointer =      snd_ali_pointer,
1546};
1547
1548/*
1549 * Modem PCM
1550 */
1551
1552static int snd_ali_modem_hw_params(struct snd_pcm_substream *substream,
1553                                 struct snd_pcm_hw_params *hw_params)
1554{
1555        struct snd_ali *chip = snd_pcm_substream_chip(substream);
1556        unsigned int modem_num = chip->num_of_codecs - 1;
1557        snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_RATE,
1558                       params_rate(hw_params));
1559        snd_ac97_write(chip->ac97[modem_num], AC97_LINE1_LEVEL, 0);
1560        return snd_ali_hw_params(substream, hw_params);
1561}
1562
1563static struct snd_pcm_hardware snd_ali_modem =
1564{
1565        .info =         (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1566                         SNDRV_PCM_INFO_BLOCK_TRANSFER |
1567                         SNDRV_PCM_INFO_MMAP_VALID |
1568                         SNDRV_PCM_INFO_RESUME |
1569                         SNDRV_PCM_INFO_SYNC_START),
1570        .formats =      SNDRV_PCM_FMTBIT_S16_LE,
1571        .rates =        (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000 |
1572                         SNDRV_PCM_RATE_16000),
1573        .rate_min =             8000,
1574        .rate_max =             16000,
1575        .channels_min =         1,
1576        .channels_max =         1,
1577        .buffer_bytes_max =     (256*1024),
1578        .period_bytes_min =     64,
1579        .period_bytes_max =     (256*1024),
1580        .periods_min =          1,
1581        .periods_max =          1024,
1582        .fifo_size =            0,
1583};
1584
1585static int snd_ali_modem_open(struct snd_pcm_substream *substream, int rec,
1586                              int channel)
1587{
1588        static const unsigned int rates[] = {8000, 9600, 12000, 16000};
1589        static const struct snd_pcm_hw_constraint_list hw_constraint_rates = {
1590                .count = ARRAY_SIZE(rates),
1591                .list = rates,
1592                .mask = 0,
1593        };
1594        int err = snd_ali_open(substream, rec, channel, &snd_ali_modem);
1595
1596        if (err)
1597                return err;
1598        return snd_pcm_hw_constraint_list(substream->runtime, 0,
1599                        SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
1600}
1601
1602static int snd_ali_modem_playback_open(struct snd_pcm_substream *substream)
1603{
1604        return snd_ali_modem_open(substream, 0, ALI_MODEM_OUT_CHANNEL);
1605}
1606
1607static int snd_ali_modem_capture_open(struct snd_pcm_substream *substream)
1608{
1609        return snd_ali_modem_open(substream, 1, ALI_MODEM_IN_CHANNEL);
1610}
1611
1612static const struct snd_pcm_ops snd_ali_modem_playback_ops = {
1613        .open =         snd_ali_modem_playback_open,
1614        .close =        snd_ali_close,
1615        .ioctl =        snd_pcm_lib_ioctl,
1616        .hw_params =    snd_ali_modem_hw_params,
1617        .hw_free =      snd_ali_hw_free,
1618        .prepare =      snd_ali_prepare,
1619        .trigger =      snd_ali_trigger,
1620        .pointer =      snd_ali_pointer,
1621};
1622
1623static const struct snd_pcm_ops snd_ali_modem_capture_ops = {
1624        .open =         snd_ali_modem_capture_open,
1625        .close =        snd_ali_close,
1626        .ioctl =        snd_pcm_lib_ioctl,
1627        .hw_params =    snd_ali_modem_hw_params,
1628        .hw_free =      snd_ali_hw_free,
1629        .prepare =      snd_ali_prepare,
1630        .trigger =      snd_ali_trigger,
1631        .pointer =      snd_ali_pointer,
1632};
1633
1634
1635struct ali_pcm_description {
1636        char *name;
1637        unsigned int playback_num;
1638        unsigned int capture_num;
1639        const struct snd_pcm_ops *playback_ops;
1640        const struct snd_pcm_ops *capture_ops;
1641        unsigned short class;
1642};
1643
1644
1645static void snd_ali_pcm_free(struct snd_pcm *pcm)
1646{
1647        struct snd_ali *codec = pcm->private_data;
1648        codec->pcm[pcm->device] = NULL;
1649}
1650
1651
1652static int snd_ali_pcm(struct snd_ali *codec, int device,
1653                       struct ali_pcm_description *desc)
1654{
1655        struct snd_pcm *pcm;
1656        int err;
1657
1658        err = snd_pcm_new(codec->card, desc->name, device,
1659                          desc->playback_num, desc->capture_num, &pcm);
1660        if (err < 0) {
1661                dev_err(codec->card->dev,
1662                        "snd_ali_pcm: err called snd_pcm_new.\n");
1663                return err;
1664        }
1665        pcm->private_data = codec;
1666        pcm->private_free = snd_ali_pcm_free;
1667        if (desc->playback_ops)
1668                snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1669                                desc->playback_ops);
1670        if (desc->capture_ops)
1671                snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
1672                                desc->capture_ops);
1673
1674        snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1675                                              snd_dma_pci_data(codec->pci),
1676                                              64*1024, 128*1024);
1677
1678        pcm->info_flags = 0;
1679        pcm->dev_class = desc->class;
1680        pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
1681        strcpy(pcm->name, desc->name);
1682        codec->pcm[0] = pcm;
1683        return 0;
1684}
1685
1686static struct ali_pcm_description ali_pcms[] = {
1687        { .name = "ALI 5451",
1688          .playback_num = ALI_CHANNELS,
1689          .capture_num = 1,
1690          .playback_ops = &snd_ali_playback_ops,
1691          .capture_ops = &snd_ali_capture_ops
1692        },
1693        { .name = "ALI 5451 modem",
1694          .playback_num = 1,
1695          .capture_num = 1,
1696          .playback_ops = &snd_ali_modem_playback_ops,
1697          .capture_ops = &snd_ali_modem_capture_ops,
1698          .class = SNDRV_PCM_CLASS_MODEM
1699        }
1700};
1701
1702static int snd_ali_build_pcms(struct snd_ali *codec)
1703{
1704        int i, err;
1705        for (i = 0; i < codec->num_of_codecs && i < ARRAY_SIZE(ali_pcms); i++) {
1706                err = snd_ali_pcm(codec, i, &ali_pcms[i]);
1707                if (err < 0)
1708                        return err;
1709        }
1710        return 0;
1711}
1712
1713
1714#define ALI5451_SPDIF(xname, xindex, value) \
1715{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex,\
1716.info = snd_ali5451_spdif_info, .get = snd_ali5451_spdif_get, \
1717.put = snd_ali5451_spdif_put, .private_value = value}
1718
1719#define snd_ali5451_spdif_info          snd_ctl_boolean_mono_info
1720
1721static int snd_ali5451_spdif_get(struct snd_kcontrol *kcontrol,
1722                                 struct snd_ctl_elem_value *ucontrol)
1723{
1724        struct snd_ali *codec = kcontrol->private_data;
1725        unsigned int spdif_enable;
1726
1727        spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0;
1728
1729        spin_lock_irq(&codec->reg_lock);
1730        switch (kcontrol->private_value) {
1731        case 0:
1732                spdif_enable = (codec->spdif_mask & 0x02) ? 1 : 0;
1733                break;
1734        case 1:
1735                spdif_enable = ((codec->spdif_mask & 0x02) &&
1736                          (codec->spdif_mask & 0x04)) ? 1 : 0;
1737                break;
1738        case 2:
1739                spdif_enable = (codec->spdif_mask & 0x01) ? 1 : 0;
1740                break;
1741        default:
1742                break;
1743        }
1744        ucontrol->value.integer.value[0] = spdif_enable;
1745        spin_unlock_irq(&codec->reg_lock);
1746        return 0;
1747}
1748
1749static int snd_ali5451_spdif_put(struct snd_kcontrol *kcontrol,
1750                                 struct snd_ctl_elem_value *ucontrol)
1751{
1752        struct snd_ali *codec = kcontrol->private_data;
1753        unsigned int change = 0, spdif_enable = 0;
1754
1755        spdif_enable = ucontrol->value.integer.value[0] ? 1 : 0;
1756
1757        spin_lock_irq(&codec->reg_lock);
1758        switch (kcontrol->private_value) {
1759        case 0:
1760                change = (codec->spdif_mask & 0x02) ? 1 : 0;
1761                change = change ^ spdif_enable;
1762                if (change) {
1763                        if (spdif_enable) {
1764                                codec->spdif_mask |= 0x02;
1765                                snd_ali_enable_spdif_out(codec);
1766                        } else {
1767                                codec->spdif_mask &= ~(0x02);
1768                                codec->spdif_mask &= ~(0x04);
1769                                snd_ali_disable_spdif_out(codec);
1770                        }
1771                }
1772                break;
1773        case 1: 
1774                change = (codec->spdif_mask & 0x04) ? 1 : 0;
1775                change = change ^ spdif_enable;
1776                if (change && (codec->spdif_mask & 0x02)) {
1777                        if (spdif_enable) {
1778                                codec->spdif_mask |= 0x04;
1779                                snd_ali_enable_spdif_chnout(codec);
1780                        } else {
1781                                codec->spdif_mask &= ~(0x04);
1782                                snd_ali_disable_spdif_chnout(codec);
1783                        }
1784                }
1785                break;
1786        case 2:
1787                change = (codec->spdif_mask & 0x01) ? 1 : 0;
1788                change = change ^ spdif_enable;
1789                if (change) {
1790                        if (spdif_enable) {
1791                                codec->spdif_mask |= 0x01;
1792                                snd_ali_enable_spdif_in(codec);
1793                        } else {
1794                                codec->spdif_mask &= ~(0x01);
1795                                snd_ali_disable_spdif_in(codec);
1796                        }
1797                }
1798                break;
1799        default:
1800                break;
1801        }
1802        spin_unlock_irq(&codec->reg_lock);
1803        
1804        return change;
1805}
1806
1807static struct snd_kcontrol_new snd_ali5451_mixer_spdif[] = {
1808        /* spdif aplayback switch */
1809        /* FIXME: "IEC958 Playback Switch" may conflict with one on ac97_codec */
1810        ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 0, 0),
1811        /* spdif out to spdif channel */
1812        ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Channel Output ",NONE,SWITCH), 0, 1),
1813        /* spdif in from spdif channel */
1814        ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, 2)
1815};
1816
1817static int snd_ali_mixer(struct snd_ali *codec)
1818{
1819        struct snd_ac97_template ac97;
1820        unsigned int idx;
1821        int i, err;
1822        static struct snd_ac97_bus_ops ops = {
1823                .write = snd_ali_codec_write,
1824                .read = snd_ali_codec_read,
1825        };
1826
1827        err = snd_ac97_bus(codec->card, 0, &ops, codec, &codec->ac97_bus);
1828        if (err < 0)
1829                return err;
1830
1831        memset(&ac97, 0, sizeof(ac97));
1832        ac97.private_data = codec;
1833
1834        for (i = 0; i < codec->num_of_codecs; i++) {
1835                ac97.num = i;
1836                err = snd_ac97_mixer(codec->ac97_bus, &ac97, &codec->ac97[i]);
1837                if (err < 0) {
1838                        dev_err(codec->card->dev,
1839                                   "ali mixer %d creating error.\n", i);
1840                        if (i == 0)
1841                                return err;
1842                        codec->num_of_codecs = 1;
1843                        break;
1844                }
1845        }
1846
1847        if (codec->spdif_support) {
1848                for (idx = 0; idx < ARRAY_SIZE(snd_ali5451_mixer_spdif); idx++) {
1849                        err = snd_ctl_add(codec->card,
1850                                          snd_ctl_new1(&snd_ali5451_mixer_spdif[idx], codec));
1851                        if (err < 0)
1852                                return err;
1853                }
1854        }
1855        return 0;
1856}
1857
1858#ifdef CONFIG_PM_SLEEP
1859static int ali_suspend(struct device *dev)
1860{
1861        struct snd_card *card = dev_get_drvdata(dev);
1862        struct snd_ali *chip = card->private_data;
1863        struct snd_ali_image *im;
1864        int i, j;
1865
1866        im = chip->image;
1867        if (!im)
1868                return 0;
1869
1870        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1871        for (i = 0; i < chip->num_of_codecs; i++)
1872                snd_ac97_suspend(chip->ac97[i]);
1873
1874        spin_lock_irq(&chip->reg_lock);
1875        
1876        im->regs[ALI_MISCINT >> 2] = inl(ALI_REG(chip, ALI_MISCINT));
1877        /* im->regs[ALI_START >> 2] = inl(ALI_REG(chip, ALI_START)); */
1878        im->regs[ALI_STOP >> 2] = inl(ALI_REG(chip, ALI_STOP));
1879        
1880        /* disable all IRQ bits */
1881        outl(0, ALI_REG(chip, ALI_MISCINT));
1882        
1883        for (i = 0; i < ALI_GLOBAL_REGS; i++) { 
1884                if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP))
1885                        continue;
1886                im->regs[i] = inl(ALI_REG(chip, i*4));
1887        }
1888        
1889        for (i = 0; i < ALI_CHANNELS; i++) {
1890                outb(i, ALI_REG(chip, ALI_GC_CIR));
1891                for (j = 0; j < ALI_CHANNEL_REGS; j++) 
1892                        im->channel_regs[i][j] = inl(ALI_REG(chip, j*4 + 0xe0));
1893        }
1894
1895        /* stop all HW channel */
1896        outl(0xffffffff, ALI_REG(chip, ALI_STOP));
1897
1898        spin_unlock_irq(&chip->reg_lock);
1899        return 0;
1900}
1901
1902static int ali_resume(struct device *dev)
1903{
1904        struct snd_card *card = dev_get_drvdata(dev);
1905        struct snd_ali *chip = card->private_data;
1906        struct snd_ali_image *im;
1907        int i, j;
1908
1909        im = chip->image;
1910        if (!im)
1911                return 0;
1912
1913        spin_lock_irq(&chip->reg_lock);
1914        
1915        for (i = 0; i < ALI_CHANNELS; i++) {
1916                outb(i, ALI_REG(chip, ALI_GC_CIR));
1917                for (j = 0; j < ALI_CHANNEL_REGS; j++) 
1918                        outl(im->channel_regs[i][j], ALI_REG(chip, j*4 + 0xe0));
1919        }
1920        
1921        for (i = 0; i < ALI_GLOBAL_REGS; i++) { 
1922                if ((i*4 == ALI_MISCINT) || (i*4 == ALI_STOP) ||
1923                    (i*4 == ALI_START))
1924                        continue;
1925                outl(im->regs[i], ALI_REG(chip, i*4));
1926        }
1927        
1928        /* start HW channel */
1929        outl(im->regs[ALI_START >> 2], ALI_REG(chip, ALI_START));
1930        /* restore IRQ enable bits */
1931        outl(im->regs[ALI_MISCINT >> 2], ALI_REG(chip, ALI_MISCINT));
1932        
1933        spin_unlock_irq(&chip->reg_lock);
1934
1935        for (i = 0 ; i < chip->num_of_codecs; i++)
1936                snd_ac97_resume(chip->ac97[i]);
1937        
1938        snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1939        return 0;
1940}
1941
1942static SIMPLE_DEV_PM_OPS(ali_pm, ali_suspend, ali_resume);
1943#define ALI_PM_OPS      &ali_pm
1944#else
1945#define ALI_PM_OPS      NULL
1946#endif /* CONFIG_PM_SLEEP */
1947
1948static int snd_ali_free(struct snd_ali * codec)
1949{
1950        if (codec->hw_initialized)
1951                snd_ali_disable_address_interrupt(codec);
1952        if (codec->irq >= 0)
1953                free_irq(codec->irq, codec);
1954        if (codec->port)
1955                pci_release_regions(codec->pci);
1956        pci_disable_device(codec->pci);
1957#ifdef CONFIG_PM_SLEEP
1958        kfree(codec->image);
1959#endif
1960        pci_dev_put(codec->pci_m1533);
1961        pci_dev_put(codec->pci_m7101);
1962        kfree(codec);
1963        return 0;
1964}
1965
1966static int snd_ali_chip_init(struct snd_ali *codec)
1967{
1968        unsigned int legacy;
1969        unsigned char temp;
1970        struct pci_dev *pci_dev;
1971
1972        dev_dbg(codec->card->dev, "chip initializing ...\n");
1973
1974        if (snd_ali_reset_5451(codec)) {
1975                dev_err(codec->card->dev, "ali_chip_init: reset 5451 error.\n");
1976                return -1;
1977        }
1978
1979        if (codec->revision == ALI_5451_V02) {
1980                pci_dev = codec->pci_m1533;
1981                pci_read_config_byte(pci_dev, 0x59, &temp);
1982                temp |= 0x80;
1983                pci_write_config_byte(pci_dev, 0x59, temp);
1984        
1985                pci_dev = codec->pci_m7101;
1986                pci_read_config_byte(pci_dev, 0xb8, &temp);
1987                temp |= 0x20;
1988                pci_write_config_byte(pci_dev, 0xB8, temp);
1989        }
1990
1991        pci_read_config_dword(codec->pci, 0x44, &legacy);
1992        legacy &= 0xff00ff00;
1993        legacy |= 0x000800aa;
1994        pci_write_config_dword(codec->pci, 0x44, legacy);
1995
1996        outl(0x80000001, ALI_REG(codec, ALI_GLOBAL_CONTROL));
1997        outl(0x00000000, ALI_REG(codec, ALI_AINTEN));
1998        outl(0xffffffff, ALI_REG(codec, ALI_AINT));
1999        outl(0x00000000, ALI_REG(codec, ALI_VOLUME));
2000        outb(0x10,       ALI_REG(codec, ALI_MPUR2));
2001
2002        codec->ac97_ext_id = snd_ali_codec_peek(codec, 0, AC97_EXTENDED_ID);
2003        codec->ac97_ext_status = snd_ali_codec_peek(codec, 0,
2004                                                    AC97_EXTENDED_STATUS);
2005        if (codec->spdif_support) {
2006                snd_ali_enable_spdif_out(codec);
2007                codec->spdif_mask = 0x00000002;
2008        }
2009
2010        codec->num_of_codecs = 1;
2011
2012        /* secondary codec - modem */
2013        if (inl(ALI_REG(codec, ALI_SCTRL)) & ALI_SCTRL_CODEC2_READY) {
2014                codec->num_of_codecs++;
2015                outl(inl(ALI_REG(codec, ALI_SCTRL)) |
2016                     (ALI_SCTRL_LINE_IN2 | ALI_SCTRL_GPIO_IN2 |
2017                      ALI_SCTRL_LINE_OUT_EN),
2018                     ALI_REG(codec, ALI_SCTRL));
2019        }
2020
2021        dev_dbg(codec->card->dev, "chip initialize succeed.\n");
2022        return 0;
2023
2024}
2025
2026/* proc for register dump */
2027static void snd_ali_proc_read(struct snd_info_entry *entry,
2028                              struct snd_info_buffer *buf)
2029{
2030        struct snd_ali *codec = entry->private_data;
2031        int i;
2032        for (i = 0; i < 256 ; i+= 4)
2033                snd_iprintf(buf, "%02x: %08x\n", i, inl(ALI_REG(codec, i)));
2034}
2035
2036static void snd_ali_proc_init(struct snd_ali *codec)
2037{
2038        snd_card_ro_proc_new(codec->card, "ali5451", codec, snd_ali_proc_read);
2039}
2040
2041static int snd_ali_resources(struct snd_ali *codec)
2042{
2043        int err;
2044
2045        dev_dbg(codec->card->dev, "resources allocation ...\n");
2046        err = pci_request_regions(codec->pci, "ALI 5451");
2047        if (err < 0)
2048                return err;
2049        codec->port = pci_resource_start(codec->pci, 0);
2050
2051        if (request_irq(codec->pci->irq, snd_ali_card_interrupt,
2052                        IRQF_SHARED, KBUILD_MODNAME, codec)) {
2053                dev_err(codec->card->dev, "Unable to request irq.\n");
2054                return -EBUSY;
2055        }
2056        codec->irq = codec->pci->irq;
2057        dev_dbg(codec->card->dev, "resources allocated.\n");
2058        return 0;
2059}
2060static int snd_ali_dev_free(struct snd_device *device)
2061{
2062        struct snd_ali *codec = device->device_data;
2063        snd_ali_free(codec);
2064        return 0;
2065}
2066
2067static int snd_ali_create(struct snd_card *card,
2068                          struct pci_dev *pci,
2069                          int pcm_streams,
2070                          int spdif_support,
2071                          struct snd_ali **r_ali)
2072{
2073        struct snd_ali *codec;
2074        int i, err;
2075        unsigned short cmdw;
2076        static struct snd_device_ops ops = {
2077                .dev_free = snd_ali_dev_free,
2078        };
2079
2080        *r_ali = NULL;
2081
2082        dev_dbg(card->dev, "creating ...\n");
2083
2084        /* enable PCI device */
2085        err = pci_enable_device(pci);
2086        if (err < 0)
2087                return err;
2088        /* check, if we can restrict PCI DMA transfers to 31 bits */
2089        if (dma_set_mask(&pci->dev, DMA_BIT_MASK(31)) < 0 ||
2090            dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(31)) < 0) {
2091                dev_err(card->dev,
2092                        "architecture does not support 31bit PCI busmaster DMA\n");
2093                pci_disable_device(pci);
2094                return -ENXIO;
2095        }
2096
2097        codec = kzalloc(sizeof(*codec), GFP_KERNEL);
2098        if (!codec) {
2099                pci_disable_device(pci);
2100                return -ENOMEM;
2101        }
2102
2103        spin_lock_init(&codec->reg_lock);
2104        spin_lock_init(&codec->voice_alloc);
2105
2106        codec->card = card;
2107        codec->pci = pci;
2108        codec->irq = -1;
2109        codec->revision = pci->revision;
2110        codec->spdif_support = spdif_support;
2111
2112        if (pcm_streams < 1)
2113                pcm_streams = 1;
2114        if (pcm_streams > 32)
2115                pcm_streams = 32;
2116        
2117        pci_set_master(pci);
2118        pci_read_config_word(pci, PCI_COMMAND, &cmdw);
2119        if ((cmdw & PCI_COMMAND_IO) != PCI_COMMAND_IO) {
2120                cmdw |= PCI_COMMAND_IO;
2121                pci_write_config_word(pci, PCI_COMMAND, cmdw);
2122        }
2123        pci_set_master(pci);
2124        
2125        if (snd_ali_resources(codec)) {
2126                snd_ali_free(codec);
2127                return -EBUSY;
2128        }
2129
2130        synchronize_irq(pci->irq);
2131
2132        codec->synth.chmap = 0;
2133        codec->synth.chcnt = 0;
2134        codec->spdif_mask = 0;
2135        codec->synth.synthcount = 0;
2136
2137        if (codec->revision == ALI_5451_V02)
2138                codec->chregs.regs.ac97read = ALI_AC97_WRITE;
2139        else
2140                codec->chregs.regs.ac97read = ALI_AC97_READ;
2141        codec->chregs.regs.ac97write = ALI_AC97_WRITE;
2142
2143        codec->chregs.regs.start  = ALI_START;
2144        codec->chregs.regs.stop   = ALI_STOP;
2145        codec->chregs.regs.aint   = ALI_AINT;
2146        codec->chregs.regs.ainten = ALI_AINTEN;
2147
2148        codec->chregs.data.start  = 0x00;
2149        codec->chregs.data.stop   = 0x00;
2150        codec->chregs.data.aint   = 0x00;
2151        codec->chregs.data.ainten = 0x00;
2152
2153        /* M1533: southbridge */
2154        codec->pci_m1533 = pci_get_device(0x10b9, 0x1533, NULL);
2155        if (!codec->pci_m1533) {
2156                dev_err(card->dev, "cannot find ALi 1533 chip.\n");
2157                snd_ali_free(codec);
2158                return -ENODEV;
2159        }
2160        /* M7101: power management */
2161        codec->pci_m7101 = pci_get_device(0x10b9, 0x7101, NULL);
2162        if (!codec->pci_m7101 && codec->revision == ALI_5451_V02) {
2163                dev_err(card->dev, "cannot find ALi 7101 chip.\n");
2164                snd_ali_free(codec);
2165                return -ENODEV;
2166        }
2167
2168        dev_dbg(card->dev, "snd_device_new is called.\n");
2169        err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, codec, &ops);
2170        if (err < 0) {
2171                snd_ali_free(codec);
2172                return err;
2173        }
2174
2175        /* initialise synth voices*/
2176        for (i = 0; i < ALI_CHANNELS; i++)
2177                codec->synth.voices[i].number = i;
2178
2179        err = snd_ali_chip_init(codec);
2180        if (err < 0) {
2181                dev_err(card->dev, "ali create: chip init error.\n");
2182                return err;
2183        }
2184
2185#ifdef CONFIG_PM_SLEEP
2186        codec->image = kmalloc(sizeof(*codec->image), GFP_KERNEL);
2187        if (!codec->image)
2188                dev_warn(card->dev, "can't allocate apm buffer\n");
2189#endif
2190
2191        snd_ali_enable_address_interrupt(codec);
2192        codec->hw_initialized = 1;
2193
2194        *r_ali = codec;
2195        dev_dbg(card->dev, "created.\n");
2196        return 0;
2197}
2198
2199static int snd_ali_probe(struct pci_dev *pci,
2200                         const struct pci_device_id *pci_id)
2201{
2202        struct snd_card *card;
2203        struct snd_ali *codec;
2204        int err;
2205
2206        dev_dbg(&pci->dev, "probe ...\n");
2207
2208        err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card);
2209        if (err < 0)
2210                return err;
2211
2212        err = snd_ali_create(card, pci, pcm_channels, spdif, &codec);
2213        if (err < 0)
2214                goto error;
2215        card->private_data = codec;
2216
2217        dev_dbg(&pci->dev, "mixer building ...\n");
2218        err = snd_ali_mixer(codec);
2219        if (err < 0)
2220                goto error;
2221        
2222        dev_dbg(&pci->dev, "pcm building ...\n");
2223        err = snd_ali_build_pcms(codec);
2224        if (err < 0)
2225                goto error;
2226
2227        snd_ali_proc_init(codec);
2228
2229        strcpy(card->driver, "ALI5451");
2230        strcpy(card->shortname, "ALI 5451");
2231        
2232        sprintf(card->longname, "%s at 0x%lx, irq %i",
2233                card->shortname, codec->port, codec->irq);
2234
2235        dev_dbg(&pci->dev, "register card.\n");
2236        err = snd_card_register(card);
2237        if (err < 0)
2238                goto error;
2239
2240        pci_set_drvdata(pci, card);
2241        return 0;
2242
2243 error:
2244        snd_card_free(card);
2245        return err;
2246}
2247
2248static void snd_ali_remove(struct pci_dev *pci)
2249{
2250        snd_card_free(pci_get_drvdata(pci));
2251}
2252
2253static struct pci_driver ali5451_driver = {
2254        .name = KBUILD_MODNAME,
2255        .id_table = snd_ali_ids,
2256        .probe = snd_ali_probe,
2257        .remove = snd_ali_remove,
2258        .driver = {
2259                .pm = ALI_PM_OPS,
2260        },
2261};                                
2262
2263module_pci_driver(ali5451_driver);
2264