1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 
  27 /*
  28  * audio1575 Audio Driver
  29  *
  30  * The driver is primarily targeted at providing audio support for
  31  * those systems which use the Uli M1575 audio core.
  32  *
  33  * The M1575 audio core, in AC'97 controller mode, has independent
  34  * channels for PCM in, PCM out, mic in, modem in, and modem out.
  35  *
  36  * The AC'97 controller is a PCI bus master with scatter/gather
  37  * support. Each channel has a DMA engine. Currently, we use only
  38  * the PCM in and PCM out channels. Each DMA engine uses one buffer
  39  * descriptor list. And the buffer descriptor list is an array of up
  40  * to 32 entries, each of which describes a data buffer. Each entry
  41  * contains a pointer to a data buffer, control bits, and the length
  42  * of the buffer being pointed to, where the length is expressed as
  43  * the number of samples. This, combined with the 16-bit sample size,
  44  * gives the actual physical length of the buffer.
  45  *
  46  *      NOTE:
  47  *      This driver depends on the drv/audio, misc/ac97
  48  *      modules being loaded first.
  49  */
  50 
  51 #include <sys/types.h>
  52 #include <sys/modctl.h>
  53 #include <sys/kmem.h>
  54 #include <sys/conf.h>
  55 #include <sys/ddi.h>
  56 #include <sys/sunddi.h>
  57 #include <sys/pci.h>
  58 #include <sys/note.h>
  59 #include <sys/audio/audio_driver.h>
  60 #include <sys/audio/ac97.h>
  61 #include "audio1575.h"
  62 
  63 /*
  64  * Module linkage routines for the kernel
  65  */
  66 static int audio1575_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
  67 static int audio1575_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
  68 static int audio1575_ddi_quiesce(dev_info_t *);
  69 
  70 /*
  71  * Entry point routine prototypes
  72  */
  73 static int audio1575_open(void *, int, unsigned *, caddr_t *);
  74 static void audio1575_close(void *);
  75 static int audio1575_start(void *);
  76 static void audio1575_stop(void *);
  77 static int audio1575_format(void *);
  78 static int audio1575_channels(void *);
  79 static int audio1575_rate(void *);
  80 static uint64_t audio1575_count(void *);
  81 static void audio1575_sync(void *, unsigned);
  82 
  83 static audio_engine_ops_t audio1575_engine_ops = {
  84         AUDIO_ENGINE_VERSION,
  85         audio1575_open,
  86         audio1575_close,
  87         audio1575_start,
  88         audio1575_stop,
  89         audio1575_count,
  90         audio1575_format,
  91         audio1575_channels,
  92         audio1575_rate,
  93         audio1575_sync,
  94         NULL,
  95         NULL,
  96         NULL
  97 };
  98 
  99 /*
 100  * Local Routine Prototypes
 101  */
 102 static int audio1575_attach(dev_info_t *);
 103 static int audio1575_resume(dev_info_t *);
 104 static int audio1575_detach(dev_info_t *);
 105 static int audio1575_suspend(dev_info_t *);
 106 
 107 static int audio1575_alloc_port(audio1575_state_t *, int, uint8_t);
 108 static void audio1575_free_port(audio1575_port_t *);
 109 
 110 static int audio1575_codec_sync(audio1575_state_t *);
 111 static void audio1575_write_ac97(void *, uint8_t, uint16_t);
 112 static uint16_t audio1575_read_ac97(void *, uint8_t);
 113 static int audio1575_chip_init(audio1575_state_t *);
 114 static int audio1575_map_regs(audio1575_state_t *);
 115 static void audio1575_unmap_regs(audio1575_state_t *);
 116 static void audio1575_dma_stop(audio1575_state_t *, boolean_t);
 117 static void audio1575_pci_enable(audio1575_state_t *);
 118 static void audio1575_pci_disable(audio1575_state_t *);
 119 
 120 static void audio1575_destroy(audio1575_state_t *);
 121 
 122 /*
 123  * Global variables, but used only by this file.
 124  */
 125 
 126 /*
 127  * DDI Structures
 128  */
 129 
 130 
 131 /* Device operations structure */
 132 static struct dev_ops audio1575_dev_ops = {
 133         DEVO_REV,               /* devo_rev */
 134         0,                      /* devo_refcnt */
 135         NULL,                   /* devo_getinfo */
 136         nulldev,                /* devo_identify - obsolete */
 137         nulldev,                /* devo_probe */
 138         audio1575_ddi_attach,   /* devo_attach */
 139         audio1575_ddi_detach,   /* devo_detach */
 140         nodev,                  /* devo_reset */
 141         NULL,                   /* devi_cb_ops */
 142         NULL,                   /* devo_bus_ops */
 143         NULL,                   /* devo_power */
 144         audio1575_ddi_quiesce,  /* devo_quiesce */
 145 };
 146 
 147 /* Linkage structure for loadable drivers */
 148 static struct modldrv audio1575_modldrv = {
 149         &mod_driverops,             /* drv_modops */
 150         M1575_MOD_NAME,         /* drv_linkinfo */
 151         &audio1575_dev_ops, /* drv_dev_ops */
 152 };
 153 
 154 /* Module linkage structure */
 155 static struct modlinkage audio1575_modlinkage = {
 156         MODREV_1,                       /* ml_rev */
 157         (void *)&audio1575_modldrv, /* ml_linkage */
 158         NULL                            /* NULL terminates the list */
 159 };
 160 
 161 
 162 /*
 163  * device access attributes for register mapping
 164  */
 165 static struct ddi_device_acc_attr dev_attr = {
 166         DDI_DEVICE_ATTR_V0,
 167         DDI_STRUCTURE_LE_ACC,
 168         DDI_STRICTORDER_ACC
 169 };
 170 
 171 static struct ddi_device_acc_attr buf_attr = {
 172         DDI_DEVICE_ATTR_V0,
 173         DDI_NEVERSWAP_ACC,
 174         DDI_STRICTORDER_ACC
 175 };
 176 
 177 /*
 178  * DMA attributes of buffer descriptor list
 179  */
 180 static ddi_dma_attr_t bdlist_dma_attr = {
 181         DMA_ATTR_V0,    /* version */
 182         0x0000000000000000LL,           /* dlim_addr_lo */
 183         0x00000000ffffffffLL,           /* dlim_addr_hi */
 184         0x000000000000ffffLL,           /* DMA counter register - 64 bits */
 185         0x0000000000000008LL,           /* DMA address align must be 8-bytes */
 186         0x0000003c,                     /* 1 through 64 byte burst sizes */
 187         0x00000008,                     /* min xfer DMA size BDList entry */
 188         0x00000000000ffffLL,            /* max xfer size, 64K */
 189         0x000000000001fffLL,            /* seg, set to PAGESIZE */
 190         0x00000001,                     /* s/g list length, no s/g */
 191         0x00000008,                     /* granularity of device minxfer */
 192         0                               /* DMA flags use virtual address */
 193 };
 194 
 195 /*
 196  * DMA attributes of buffers to be used to receive/send audio data
 197  */
 198 static ddi_dma_attr_t   sample_buf_dma_attr = {
 199         DMA_ATTR_V0,
 200         0x0000000000000000LL,           /* dlim_addr_lo */
 201         0x00000000ffffffffLL,           /* dlim_addr_hi */
 202         0x000000000001fffeLL,           /* DMA counter register - 16 bits */
 203         0x0000000000000004LL,           /* DMA address align 2-byte boundary */
 204         0x0000003c,                     /* 1 through 60 byte burst sizes */
 205         0x00000004,                     /* min xfer DMA size BDList entry */
 206         0x000000000001ffffLL,           /* max xfer size, 64K */
 207         0x000000000001ffffLL,           /* seg, set to 64K */
 208         0x00000001,                     /* s/g list length, no s/g */
 209         0x00000004,                     /* granularity of device minxfer */
 210         0                               /* DMA flags use virtual address */
 211 };
 212 
 213 /*
 214  * _init()
 215  *
 216  * Description:
 217  *      Driver initialization, called when driver is first loaded.
 218  *      This is how access is initially given to all the static structures.
 219  *
 220  * Arguments:
 221  *      None
 222  *
 223  * Returns:
 224  *      mod_install() status, see mod_install(9f)
 225  */
 226 int
 227 _init(void)
 228 {
 229         int     error;
 230 
 231         audio_init_ops(&audio1575_dev_ops, M1575_NAME);
 232 
 233         if ((error = mod_install(&audio1575_modlinkage)) != 0) {
 234                 audio_fini_ops(&audio1575_dev_ops);
 235         }
 236 
 237         return (error);
 238 }
 239 
 240 /*
 241  * _fini()
 242  *
 243  * Description:
 244  *      Module de-initialization, called when the driver is to be unloaded.
 245  *
 246  * Arguments:
 247  *      None
 248  *
 249  * Returns:
 250  *      mod_remove() status, see mod_remove(9f)
 251  */
 252 int
 253 _fini(void)
 254 {
 255         int             error;
 256 
 257         if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
 258                 return (error);
 259         }
 260 
 261         /* clean up ops */
 262         audio_fini_ops(&audio1575_dev_ops);
 263 
 264         return (0);
 265 }
 266 
 267 /*
 268  * _info()
 269  *
 270  * Description:
 271  *      Module information, returns information about the driver.
 272  *
 273  * Arguments:
 274  *      modinfo         *modinfop       Pointer to the opaque modinfo structure
 275  *
 276  * Returns:
 277  *      mod_info() status, see mod_info(9f)
 278  */
 279 int
 280 _info(struct modinfo *modinfop)
 281 {
 282         return (mod_info(&audio1575_modlinkage, modinfop));
 283 }
 284 
 285 
 286 /* ******************* Driver Entry Points ********************************* */
 287 
 288 /*
 289  * audio1575_ddi_attach()
 290  *
 291  * Description:
 292  *      Implements the DDI attach(9e) entry point.
 293  *
 294  * Arguments:
 295  *      dev_info_t      *dip    Pointer to the device's dev_info struct
 296  *      ddi_attach_cmd_t cmd    Attach command
 297  *
 298  * Returns:
 299  *      DDI_SUCCESS             The driver was initialized properly
 300  *      DDI_FAILURE             The driver couldn't be initialized properly
 301  */
 302 static int
 303 audio1575_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
 304 {
 305         switch (cmd) {
 306         case DDI_ATTACH:
 307                 return (audio1575_attach(dip));
 308 
 309         case DDI_RESUME:
 310                 return (audio1575_resume(dip));
 311         }
 312         return (DDI_FAILURE);
 313 }
 314 
 315 /*
 316  * audio1575_ddi_detach()
 317  *
 318  * Description:
 319  *      Implements the detach(9e) entry point.
 320  *
 321  * Arguments:
 322  *      dev_info_t              *dip    Pointer to the device's dev_info struct
 323  *      ddi_detach_cmd_t        cmd     Detach command
 324  *
 325  * Returns:
 326  *      DDI_SUCCESS     The driver was detached
 327  *      DDI_FAILURE     The driver couldn't be detached
 328  */
 329 static int
 330 audio1575_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
 331 {
 332         switch (cmd) {
 333         case DDI_DETACH:
 334                 return (audio1575_detach(dip));
 335 
 336         case DDI_SUSPEND:
 337                 return (audio1575_suspend(dip));
 338         }
 339         return (DDI_FAILURE);
 340 }
 341 
 342 /*
 343  * audio1575_ddi_quiesce()
 344  *
 345  * Description:
 346  *      Implements the quiesce(9e) entry point.
 347  *
 348  * Arguments:
 349  *      dev_info_t              *dip    Pointer to the device's dev_info struct
 350  *
 351  * Returns:
 352  *      DDI_SUCCESS     The driver was quiesced
 353  *      DDI_FAILURE     The driver couldn't be quiesced
 354  */
 355 static int
 356 audio1575_ddi_quiesce(dev_info_t *dip)
 357 {
 358         audio1575_state_t       *statep;
 359 
 360         if ((statep = ddi_get_driver_private(dip)) == NULL)
 361                 return (DDI_FAILURE);
 362 
 363         audio1575_dma_stop(statep, B_TRUE);
 364         return (DDI_SUCCESS);
 365 }
 366 
 367 /*
 368  * audio1575_open()
 369  *
 370  * Description:
 371  *      Opens a DMA engine for use.
 372  *
 373  * Arguments:
 374  *      void            *arg            The DMA engine to set up
 375  *      int             flag            Open flags
 376  *      unsigned        *nframesp       Receives number of frames
 377  *      caddr_t         *bufp           Receives kernel data buffer
 378  *
 379  * Returns:
 380  *      0       on success
 381  *      errno   on failure
 382  */
 383 static int
 384 audio1575_open(void *arg, int flag, unsigned *nframesp, caddr_t *bufp)
 385 {
 386         audio1575_port_t        *port = arg;
 387 
 388         _NOTE(ARGUNUSED(flag));
 389 
 390         port->count = 0;
 391         *nframesp = port->nframes;
 392         *bufp = port->samp_kaddr;
 393 
 394         return (0);
 395 }
 396 
 397 
 398 /*
 399  * audio1575_close()
 400  *
 401  * Description:
 402  *      Closes an audio DMA engine that was previously opened.  Since
 403  *      nobody is using it, we take this opportunity to possibly power
 404  *      down the entire device.
 405  *
 406  * Arguments:
 407  *      void    *arg            The DMA engine to shut down
 408  */
 409 static void
 410 audio1575_close(void *arg)
 411 {
 412         _NOTE(ARGUNUSED(arg));
 413 }
 414 
 415 /*
 416  * audio1575_stop()
 417  *
 418  * Description:
 419  *      This is called by the framework to stop a port that is
 420  *      transferring data.
 421  *
 422  * Arguments:
 423  *      void    *arg            The DMA engine to stop
 424  */
 425 static void
 426 audio1575_stop(void *arg)
 427 {
 428         audio1575_port_t        *port = arg;
 429         audio1575_state_t       *statep = port->statep;
 430 
 431         mutex_enter(&statep->lock);
 432         if (port->num == M1575_REC) {
 433                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
 434         } else {
 435                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
 436         }
 437         mutex_exit(&statep->lock);
 438 }
 439 
 440 /*
 441  * audio1575_start()
 442  *
 443  * Description:
 444  *      This is called by the framework to start a port transferring data.
 445  *
 446  * Arguments:
 447  *      void    *arg            The DMA engine to start
 448  *
 449  * Returns:
 450  *      0       on success (never fails, errno if it did)
 451  */
 452 static int
 453 audio1575_start(void *arg)
 454 {
 455         audio1575_port_t        *port = arg;
 456         audio1575_state_t       *statep = port->statep;
 457 
 458         mutex_enter(&statep->lock);
 459 
 460         port->offset = 0;
 461 
 462         if (port->num == M1575_REC) {
 463                 /* Uli FIFO madness ... */
 464                 SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
 465                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
 466 
 467                 PUT8(M1575_PCMICR_REG, 0);
 468                 PUT8(M1575_PCMICR_REG, M1575_CR_RR);
 469 
 470                 PUT32(M1575_PCMIBDBAR_REG, port->bdl_paddr);
 471                 PUT8(M1575_PCMILVIV_REG, M1575_BD_NUMS - 1);
 472 
 473                 CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
 474 
 475                 /* ULi says do fifo resets here */
 476                 SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
 477                 CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
 478                 PUT8(M1575_PCMICR_REG, 0);
 479                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMISTART);
 480 
 481         } else {
 482 
 483                 uint32_t        scr;
 484 
 485                 /* Uli FIFO madness ... */
 486                 SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMORST);
 487                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
 488 
 489                 /* configure the number of channels properly */
 490                 scr = GET32(M1575_SCR_REG);
 491                 scr &= ~(M1575_SCR_6CHL_MASK | M1575_SCR_CHAMOD_MASK);
 492                 scr |= M1575_SCR_6CHL_2;        /* select our proper ordering */
 493                 switch (port->nchan) {
 494                 case 2:
 495                         scr |= M1575_SCR_CHAMOD_2;
 496                         break;
 497                 case 4:
 498                         scr |= M1575_SCR_CHAMOD_4;
 499                         break;
 500                 case 6:
 501                         scr |= M1575_SCR_CHAMOD_6;
 502                         break;
 503                 }
 504                 PUT32(M1575_SCR_REG, scr);
 505 
 506                 PUT8(M1575_PCMOCR_REG, 0);
 507                 PUT8(M1575_PCMOCR_REG, M1575_CR_RR);
 508 
 509                 PUT32(M1575_PCMOBDBAR_REG, port->bdl_paddr);
 510                 PUT8(M1575_PCMOLVIV_REG, M1575_BD_NUMS - 1);
 511 
 512                 CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
 513                 PUT8(M1575_PCMOCR_REG, 0);
 514                 SET32(M1575_DMACR_REG, M1575_DMACR_PCMOSTART);
 515         }
 516 
 517         mutex_exit(&statep->lock);
 518         return (0);
 519 }
 520 
 521 
 522 
 523 /*
 524  * audio1575_format()
 525  *
 526  * Description:
 527  *      Called by the framework to query the format for the device.
 528  *
 529  * Arguments:
 530  *      void    *arg            The DMA engine to query
 531  *
 532  * Returns:
 533  *      AUDIO_FORMAT_S16_LE
 534  */
 535 static int
 536 audio1575_format(void *arg)
 537 {
 538         _NOTE(ARGUNUSED(arg));
 539 
 540         return (AUDIO_FORMAT_S16_LE);
 541 }
 542 
 543 /*
 544  * audio1575_channels()
 545  *
 546  * Description:
 547  *      Called by the framework to query the channels for the device.
 548  *
 549  * Arguments:
 550  *      void    *arg            The DMA engine to query
 551  *
 552  * Returns:
 553  *      Number of channels for the device
 554  */
 555 static int
 556 audio1575_channels(void *arg)
 557 {
 558         audio1575_port_t *port = arg;
 559 
 560         return (port->nchan);
 561 }
 562 
 563 /*
 564  * audio1575_rate()
 565  *
 566  * Description:
 567  *      Called by the framework to query the sample rate for the device.
 568  *
 569  * Arguments:
 570  *      void    *arg            The DMA engine to query
 571  *
 572  * Returns:
 573  *      48000
 574  */
 575 static int
 576 audio1575_rate(void *arg)
 577 {
 578         _NOTE(ARGUNUSED(arg));
 579 
 580         return (48000);
 581 }
 582 
 583 /*
 584  * audio1575_count()
 585  *
 586  * Description:
 587  *      This is called by the framework to get the engine's frame counter
 588  *
 589  * Arguments:
 590  *      void    *arg            The DMA engine to query
 591  *
 592  * Returns:
 593  *      frame count for current engine
 594  */
 595 static uint64_t
 596 audio1575_count(void *arg)
 597 {
 598         audio1575_port_t        *port = arg;
 599         audio1575_state_t       *statep = port->statep;
 600         uint64_t                val;
 601         uint8_t                 civ;
 602         unsigned                n;
 603         int                     civoff;
 604         int                     lvioff;
 605         int                     picoff;
 606 
 607         mutex_enter(&statep->lock);
 608 
 609         if (port->num == M1575_REC) {
 610                 civoff = M1575_PCMICIV_REG;
 611                 lvioff = M1575_PCMILVIV_REG;
 612                 picoff = M1575_PCMIPICB_REG;
 613         } else {
 614                 civoff = M1575_PCMOCIV_REG;
 615                 lvioff = M1575_PCMOLVIV_REG;
 616                 picoff = M1575_PCMOPICB_REG;
 617         }
 618 
 619         /*
 620          * Read the position counters.  We also take this opportunity
 621          * to update the last valid index to the one just previous to
 622          * the one we're working on (so we'll fully loop.)
 623          */
 624         n = GET16(picoff);
 625         civ = GET8(civoff);
 626         PUT8(lvioff, (civ - 1) % M1575_BD_NUMS);
 627 
 628         n = port->samp_size - (n * sizeof (int16_t));
 629         if (n < port->offset) {
 630                 val = (port->samp_size - port->offset) + n;
 631         } else {
 632                 val = n - port->offset;
 633         }
 634         port->offset = n;
 635         port->count += (val / (port->nchan * sizeof (int16_t)));
 636         val = port->count;
 637         mutex_exit(&statep->lock);
 638 
 639         return (val);
 640 }
 641 
 642 /*
 643  * audio1575_sync()
 644  *
 645  * Description:
 646  *      This is called by the framework to synchronize DMA caches.
 647  *
 648  * Arguments:
 649  *      void    *arg            The DMA engine to sync
 650  */
 651 static void
 652 audio1575_sync(void *arg, unsigned nframes)
 653 {
 654         audio1575_port_t *port = arg;
 655         _NOTE(ARGUNUSED(nframes));
 656 
 657         (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
 658 }
 659 
 660 /*
 661  * audio1575_attach()
 662  *
 663  * Description:
 664  *      Attach an instance of the audio1575 driver. This routine does the
 665  *      device dependent attach tasks. When it is completed, it registers
 666  *      with the audio framework.
 667  *
 668  * Arguments:
 669  *      dev_info_t      *dip    Pointer to the device's dev_info struct
 670  *
 671  * Returns:
 672  *      DDI_SUCCESS             The driver was initialized properly
 673  *      DDI_FAILURE             The driver couldn't be initialized properly
 674  */
 675 static int
 676 audio1575_attach(dev_info_t *dip)
 677 {
 678         audio1575_state_t       *statep;
 679         audio_dev_t             *adev;
 680         uint32_t                devid;
 681         const char              *name;
 682         const char              *rev;
 683         int                     maxch;
 684 
 685         /* allocate the soft state structure */
 686         statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
 687         ddi_set_driver_private(dip, statep);
 688         statep->dip = dip;
 689 
 690         /*
 691          * We want the micboost enabled by default as well.
 692          */
 693         (void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, AC97_PROP_MICBOOST, 1);
 694 
 695         /* allocate common audio dev structure */
 696         adev = audio_dev_alloc(dip, 0);
 697         if (adev == NULL) {
 698                 audio_dev_warn(NULL, "unable to allocate audio dev");
 699                 goto error;
 700         }
 701         statep->adev = adev;
 702 
 703         /* map in the audio registers */
 704         if (audio1575_map_regs(statep) != DDI_SUCCESS) {
 705                 audio_dev_warn(adev, "couldn't map registers");
 706                 goto error;
 707         }
 708 
 709         /* Enable PCI I/O and Memory Spaces */
 710         audio1575_pci_enable(statep);
 711 
 712         devid = (pci_config_get16(statep->pcih, PCI_CONF_VENID) << 16) |
 713             pci_config_get16(statep->pcih, PCI_CONF_DEVID);
 714         switch (devid) {
 715         case 0x10b95455:
 716                 name = "Uli M1575 AC'97";
 717                 rev = "M5455";
 718                 break;
 719         default:
 720                 name = "Uli AC'97";
 721                 rev = "Unknown";
 722                 break;
 723         }
 724         /* set device information -- this should check PCI config space */
 725         audio_dev_set_description(adev, name);
 726         audio_dev_set_version(adev, rev);
 727 
 728         statep->ac97 = ac97_alloc(dip, audio1575_read_ac97,
 729             audio1575_write_ac97, statep);
 730         ASSERT(statep->ac97 != NULL);
 731 
 732         /*
 733          * Override "max-channels" property to prevent configuration
 734          * of 4 or 6 (or possibly even 8!) channel audio.  The default
 735          * is to support as many channels as the hardware can do.
 736          */
 737         maxch = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
 738             "max-channels", ac97_num_channels(statep->ac97));
 739         if (maxch < 2) {
 740                 maxch = 2;
 741         }
 742 
 743         statep->maxch = min(maxch, 6) & ~1;
 744 
 745         /* allocate port structures */
 746         if ((audio1575_alloc_port(statep, M1575_PLAY, statep->maxch) !=
 747             DDI_SUCCESS) ||
 748             (audio1575_alloc_port(statep, M1575_REC, 2) != DDI_SUCCESS)) {
 749                 goto error;
 750         }
 751 
 752         if (audio1575_chip_init(statep) != DDI_SUCCESS) {
 753                 audio_dev_warn(adev, "failed to init chip");
 754                 goto error;
 755         }
 756 
 757         if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
 758                 audio_dev_warn(adev, "ac'97 initialization failed");
 759                 goto error;
 760         }
 761 
 762         /* register with the framework */
 763         if (audio_dev_register(adev) != DDI_SUCCESS) {
 764                 audio_dev_warn(adev, "unable to register with framework");
 765                 goto error;
 766         }
 767 
 768         /* everything worked out, so report the device */
 769         ddi_report_dev(dip);
 770 
 771         return (DDI_SUCCESS);
 772 
 773 error:
 774         audio1575_destroy(statep);
 775         return (DDI_FAILURE);
 776 }
 777 
 778 /*
 779  * audio1575_detach()
 780  *
 781  * Description:
 782  *      Detach an instance of the audio1575 driver.
 783  *
 784  * Arguments:
 785  *      dev_info_t      *dip    Pointer to the device's dev_info struct
 786  *
 787  * Returns:
 788  *      DDI_SUCCESS     The driver was detached
 789  *      DDI_FAILURE     The driver couldn't be detached
 790  */
 791 static int
 792 audio1575_detach(dev_info_t *dip)
 793 {
 794         audio1575_state_t       *statep;
 795 
 796         statep = ddi_get_driver_private(dip);
 797 
 798         if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
 799                 return (DDI_FAILURE);
 800         }
 801 
 802         audio1575_destroy(statep);
 803         return (DDI_SUCCESS);
 804 }
 805 
 806 /* *********************** Local Routines *************************** */
 807 
 808 /*
 809  * audio1575_alloc_port()
 810  *
 811  * Description:
 812  *      This routine allocates the DMA handles and the memory for the
 813  *      DMA engines to use.  It also configures the BDL lists properly
 814  *      for use.
 815  *
 816  * Arguments:
 817  *      dev_info_t      *dip    Pointer to the device's devinfo
 818  *      int             num     M1575_PLAY or M1575_REC
 819  *      uint8_t         nchan   Number of channels (2 = stereo, 6 = 5.1, etc.)
 820  *
 821  * Returns:
 822  *      DDI_SUCCESS             Registers successfully mapped
 823  *      DDI_FAILURE             Registers not successfully mapped
 824  */
 825 static int
 826 audio1575_alloc_port(audio1575_state_t *statep, int num, uint8_t nchan)
 827 {
 828         ddi_dma_cookie_t        cookie;
 829         uint_t                  count;
 830         int                     dir;
 831         unsigned                caps;
 832         audio_dev_t             *adev;
 833         audio1575_port_t        *port;
 834         uint32_t                *kaddr;
 835         int                     rc;
 836         dev_info_t              *dip;
 837 
 838         adev = statep->adev;
 839         dip = statep->dip;
 840 
 841         port = kmem_zalloc(sizeof (*port), KM_SLEEP);
 842         statep->ports[num] = port;
 843         port->num = num;
 844         port->statep = statep;
 845         port->nchan = nchan;
 846 
 847         if (num == M1575_REC) {
 848                 dir = DDI_DMA_READ;
 849                 caps = ENGINE_INPUT_CAP;
 850                 port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
 851         } else {
 852                 dir = DDI_DMA_WRITE;
 853                 caps = ENGINE_OUTPUT_CAP;
 854                 port->sync_dir = DDI_DMA_SYNC_FORDEV;
 855         }
 856 
 857         /*
 858          * We use one big sample area.  The sample area must be larger
 859          * than about 1.5 framework fragment sizes.  (Currently 480 *
 860          * 1.5 = 720 frames.)  This is necessary to ensure that we
 861          * don't have to involve an interrupt service routine on our
 862          * own, to keep the last valid index updated reasonably.
 863          */
 864         port->nframes = 2048;
 865         port->samp_size = port->nframes * port->nchan * sizeof (int16_t);
 866 
 867         /* allocate dma handle */
 868         rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
 869             NULL, &port->samp_dmah);
 870         if (rc != DDI_SUCCESS) {
 871                 audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
 872                 return (DDI_FAILURE);
 873         }
 874         /* allocate DMA buffer */
 875         rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
 876             DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
 877             &port->samp_size, &port->samp_acch);
 878         if (rc == DDI_FAILURE) {
 879                 audio_dev_warn(adev, "dma_mem_alloc failed");
 880                 return (DDI_FAILURE);
 881         }
 882 
 883         /* bind DMA buffer */
 884         rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
 885             port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
 886             DDI_DMA_SLEEP, NULL, &cookie, &count);
 887         if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
 888                 audio_dev_warn(adev,
 889                     "ddi_dma_addr_bind_handle failed: %d", rc);
 890                 return (DDI_FAILURE);
 891         }
 892         port->samp_paddr = cookie.dmac_address;
 893 
 894         /*
 895          * now, from here we allocate DMA memory for buffer descriptor list.
 896          * we allocate adjacent DMA memory for all DMA engines.
 897          */
 898         rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
 899             NULL, &port->bdl_dmah);
 900         if (rc != DDI_SUCCESS) {
 901                 audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
 902                 return (DDI_FAILURE);
 903         }
 904 
 905         /*
 906          * we allocate all buffer descriptors lists in continuous dma memory.
 907          */
 908         port->bdl_size = sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
 909         rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
 910             &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
 911             &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
 912         if (rc != DDI_SUCCESS) {
 913                 audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
 914                 return (DDI_FAILURE);
 915         }
 916 
 917         /*
 918          * Wire up the BD list.  We do this *before* binding the BD list
 919          * so that we don't have to do an extra ddi_dma_sync.
 920          */
 921         kaddr = (void *)port->bdl_kaddr;
 922         for (int i = 0; i < M1575_BD_NUMS; i++) {
 923 
 924                 /* set base address of buffer */
 925                 ddi_put32(port->bdl_acch, kaddr, port->samp_paddr);
 926                 kaddr++;
 927 
 928                 /* set size in frames, and enable IOC interrupt */
 929                 ddi_put32(port->bdl_acch, kaddr,
 930                     ((port->samp_size / sizeof (int16_t)) | (1U << 31)));
 931                 kaddr++;
 932         }
 933 
 934         rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
 935             port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
 936             NULL, &cookie, &count);
 937         if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
 938                 audio_dev_warn(adev, "addr_bind_handle failed");
 939                 return (DDI_FAILURE);
 940         }
 941         port->bdl_paddr = cookie.dmac_address;
 942 
 943         port->engine = audio_engine_alloc(&audio1575_engine_ops, caps);
 944         if (port->engine == NULL) {
 945                 audio_dev_warn(adev, "audio_engine_alloc failed");
 946                 return (DDI_FAILURE);
 947         }
 948 
 949         audio_engine_set_private(port->engine, port);
 950         audio_dev_add_engine(adev, port->engine);
 951 
 952         return (DDI_SUCCESS);
 953 }
 954 
 955 /*
 956  * audio1575_free_port()
 957  *
 958  * Description:
 959  *      This routine unbinds the DMA cookies, frees the DMA buffers,
 960  *      deallocates the DMA handles.
 961  *
 962  * Arguments:
 963  *      audio1575_port_t        *port   The port structure for a DMA engine.
 964  */
 965 static void
 966 audio1575_free_port(audio1575_port_t *port)
 967 {
 968         if (port == NULL)
 969                 return;
 970 
 971         if (port->engine) {
 972                 audio_dev_remove_engine(port->statep->adev, port->engine);
 973                 audio_engine_free(port->engine);
 974         }
 975         if (port->bdl_paddr) {
 976                 (void) ddi_dma_unbind_handle(port->bdl_dmah);
 977         }
 978         if (port->bdl_acch) {
 979                 ddi_dma_mem_free(&port->bdl_acch);
 980         }
 981         if (port->bdl_dmah) {
 982                 ddi_dma_free_handle(&port->bdl_dmah);
 983         }
 984         if (port->samp_paddr) {
 985                 (void) ddi_dma_unbind_handle(port->samp_dmah);
 986         }
 987         if (port->samp_acch) {
 988                 ddi_dma_mem_free(&port->samp_acch);
 989         }
 990         if (port->samp_dmah) {
 991                 ddi_dma_free_handle(&port->samp_dmah);
 992         }
 993         kmem_free(port, sizeof (*port));
 994 }
 995 
 996 /*
 997  * audio1575_map_regs()
 998  *
 999  * Description:
1000  *      The registers are mapped in.
1001  *
1002  * Arguments:
1003  *      dev_info_t      *dip    Pointer to the device's devinfo
1004  *
1005  * Returns:
1006  *      DDI_SUCCESS             Registers successfully mapped
1007  *      DDI_FAILURE             Registers not successfully mapped
1008  */
1009 static int
1010 audio1575_map_regs(audio1575_state_t *statep)
1011 {
1012         dev_info_t              *dip = statep->dip;
1013 
1014         /* map the M1575 Audio PCI Cfg Space */
1015         if (pci_config_setup(dip, &statep->pcih) != DDI_SUCCESS) {
1016                 audio_dev_warn(statep->adev, "PCI config map failure");
1017                 goto error;
1018         }
1019 
1020         /* map the M1575 Audio registers in PCI IO Space */
1021         if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE, &statep->regsp,
1022             0, 0, &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
1023                 audio_dev_warn(statep->adev, "Audio IO mapping failure");
1024                 goto error;
1025         }
1026         return (DDI_SUCCESS);
1027 
1028 error:
1029         audio1575_unmap_regs(statep);
1030 
1031         return (DDI_FAILURE);
1032 }
1033 
1034 /*
1035  * audio1575_unmap_regs()
1036  *
1037  * Description:
1038  *      This routine unmaps control registers.
1039  *
1040  * Arguments:
1041  *      audio1575_state_t       *state  The device's state structure
1042  */
1043 static void
1044 audio1575_unmap_regs(audio1575_state_t *statep)
1045 {
1046         if (statep->regsh) {
1047                 ddi_regs_map_free(&statep->regsh);
1048         }
1049 
1050         if (statep->pcih) {
1051                 pci_config_teardown(&statep->pcih);
1052         }
1053 }
1054 
1055 /*
1056  * audio1575_chip_init()
1057  *
1058  * Description:
1059  *      This routine initializes the M1575 AC97 audio controller and the AC97
1060  *      codec.  The AC97 codec registers are programmed from codec_shadow[].
1061  *      If we are not doing a restore, we initialize codec_shadow[], otherwise
1062  *      we use the current values of shadow.    This routine expects that the
1063  *      PCI IO and Memory spaces have been mapped and enabled already.
1064  * Arguments:
1065  *      audio1575_state_t       *state          The device's state structure
1066  *                                              restore from codec_shadow[]
1067  * Returns:
1068  *      DDI_SUCCESS     The hardware was initialized properly
1069  *      DDI_FAILURE     The hardware couldn't be initialized properly
1070  */
1071 static int
1072 audio1575_chip_init(audio1575_state_t *statep)
1073 {
1074         uint32_t                ssr;
1075         uint32_t                rtsr;
1076         uint32_t                intrsr;
1077         int                     i;
1078         int                     j;
1079 #ifdef  __sparc
1080         uint8_t                 clk_detect;
1081         ddi_acc_handle_t        pcih;
1082 #endif
1083         clock_t                 ticks;
1084 
1085         /*
1086          * clear the interrupt control and status register
1087          * READ/WRITE/READ workaround required
1088          * for buggy hardware
1089          */
1090 
1091         PUT32(M1575_INTRCR_REG, 0);
1092         (void) GET32(M1575_INTRCR_REG);
1093 
1094         intrsr = GET32(M1575_INTRSR_REG);
1095         PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
1096         (void) GET32(M1575_INTRSR_REG);
1097 
1098         ticks = drv_usectohz(M1575_LOOP_CTR);
1099 
1100         /*
1101          * SADA only supports stereo, so we set the channel bits
1102          * to "00" to select 2 channels.
1103          * will also set the following:
1104          *
1105          * Disable double rate enable
1106          * no SPDIF output selected
1107          * 16 bit audio record mode
1108          * 16 bit pcm out mode
1109          * PCM Out 6 chan mode FL FR CEN BL BR LFE
1110          * PCM Out 2 channel mode (00)
1111          */
1112         for (i = 0; i < M1575_LOOP_CTR; i++) {
1113                 /* Reset the AC97 Codec and default to 2 channel 16 bit mode */
1114                 PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1115                 delay(ticks<<1);
1116 
1117                 /* Read the System Status Reg */
1118                 ssr = GET32(M1575_SSR_REG);
1119 
1120                 /* make sure and release the blocked reset bit */
1121                 if (ssr & M1575_SSR_RSTBLK) {
1122                         SET32(M1575_INTFCR_REG, M1575_INTFCR_RSTREL);
1123                         delay(ticks);
1124 
1125                         /* Read the System Status Reg */
1126                         ssr = GET32(M1575_SSR_REG);
1127 
1128                         /* make sure and release the blocked reset bit */
1129                         if (ssr & M1575_SSR_RSTBLK) {
1130                                 return (DDI_FAILURE);
1131                         }
1132 
1133                         /* Reset the controller */
1134                         PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1135                         delay(ticks);
1136                 }
1137 
1138                 /* according AC'97 spec, wait for codec reset */
1139                 for (j = 0; j < M1575_LOOP_CTR; j++) {
1140                         if ((GET32(M1575_SCR_REG) & M1575_SCR_COLDRST) == 0) {
1141                                 break;
1142                         }
1143                         delay(ticks);
1144                 }
1145 
1146                 /* codec reset failed */
1147                 if (j >= M1575_LOOP_CTR) {
1148                         audio_dev_warn(statep->adev,
1149                             "failure to reset codec");
1150                         return (DDI_FAILURE);
1151                 }
1152 
1153                 /*
1154                  * Wait for FACRDY First codec ready. The hardware can
1155                  * provide the state of
1156                  * codec ready bit on SDATA_IN[0] and as reflected in
1157                  * the Recv Tag Slot Reg.
1158                  */
1159                 rtsr = GET32(M1575_RTSR_REG);
1160                 if (rtsr & M1575_RTSR_FACRDY) {
1161                         break;
1162                 } else { /* reset the status and wait for new status to set */
1163                         rtsr |= M1575_RTSR_FACRDY;
1164                         PUT32(M1575_RTSR_REG, rtsr);
1165                         drv_usecwait(10);
1166                 }
1167         }
1168 
1169         /* if we could not reset the AC97 codec then report failure */
1170         if (i >= M1575_LOOP_CTR) {
1171                 audio_dev_warn(statep->adev,
1172                     "no codec ready signal received");
1173                 return (DDI_FAILURE);
1174         }
1175 
1176 #ifdef  __sparc
1177         /* Magic code from ULi to Turn on the AC_LINK clock */
1178         pcih = statep->pcih;
1179         pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1180         pci_config_put8(pcih, M1575_PCIACD_REG, 4);
1181         pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1182         (void) pci_config_get8(pcih, M1575_PCIACD_REG);
1183         pci_config_put8(pcih, M1575_PCIACD_REG, 2);
1184         pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1185         clk_detect = pci_config_get8(pcih, M1575_PCIACD_REG);
1186 
1187         if (clk_detect != 1) {
1188                 audio_dev_warn(statep->adev, "No AC97 Clock Detected");
1189                 return (DDI_FAILURE);
1190         }
1191 #endif
1192 
1193         /* Magic code from Uli to Init FIFO1 and FIFO2 */
1194         PUT32(M1575_FIFOCR1_REG, 0x81818181);
1195         PUT32(M1575_FIFOCR2_REG, 0x81818181);
1196         PUT32(M1575_FIFOCR3_REG, 0x81818181);
1197 
1198         /* Make sure that PCM in and PCM out are enabled */
1199         SET32(M1575_INTFCR_REG, (M1575_INTFCR_PCMIENB | M1575_INTFCR_PCMOENB));
1200 
1201         audio1575_dma_stop(statep, B_FALSE);
1202 
1203         return (DDI_SUCCESS);
1204 }
1205 
1206 /*
1207  * audio1575_dma_stop()
1208  *
1209  * Description:
1210  *      This routine is used to put each DMA engine into the quiet state.
1211  *
1212  * Arguments:
1213  *      audio1575_state_t *statep       The device's state structure
1214  */
1215 static void
1216 audio1575_dma_stop(audio1575_state_t *statep, boolean_t quiesce)
1217 {
1218         uint32_t        intrsr;
1219         int             i;
1220 
1221         if (statep->regsh == NULL) {
1222                 return;
1223         }
1224 
1225         /* pause bus master (needed for the following reset register) */
1226         for (i = 0; i < M1575_LOOP_CTR; i++) {
1227 
1228                 SET32(M1575_DMACR_REG, M1575_DMACR_PAUSE_ALL);
1229                 if (GET32(M1575_DMACR_REG) & M1575_DMACR_PAUSE_ALL) {
1230                         break;
1231                 }
1232                 drv_usecwait(10);
1233         }
1234 
1235         if (i >= M1575_LOOP_CTR) {
1236                 if (!quiesce)
1237                         audio_dev_warn(statep->adev, "failed to stop DMA");
1238                 return;
1239         }
1240 
1241         /* Pause bus master (needed for the following reset register) */
1242         PUT8(M1575_PCMICR_REG, 0);
1243         PUT8(M1575_PCMOCR_REG, 0);
1244         PUT8(M1575_MICICR_REG, 0);
1245         PUT8(M1575_CSPOCR_REG, 0);
1246         PUT8(M1575_PCMI2CR_RR, 0);
1247         PUT8(M1575_MICI2CR_RR, 0);
1248 
1249         /* Reset the bus master registers for all DMA engines */
1250         PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
1251         PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
1252         PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
1253         PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
1254         PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
1255         PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
1256 
1257         /* Reset FIFOS */
1258         PUT32(M1575_FIFOCR1_REG, 0x81818181);
1259         PUT32(M1575_FIFOCR2_REG, 0x81818181);
1260         PUT32(M1575_FIFOCR3_REG, 0x81818181);
1261 
1262         /* Clear Interrupts */
1263         SET16(M1575_PCMISR_REG, M1575_SR_CLR);
1264         SET16(M1575_PCMOSR_REG, M1575_SR_CLR);
1265         SET16(M1575_MICISR_REG, M1575_SR_CLR);
1266         SET16(M1575_CSPOSR_REG, M1575_SR_CLR);
1267         SET16(M1575_PCMI2SR_REG, M1575_SR_CLR);
1268         SET16(M1575_MICI2SR_REG, M1575_SR_CLR);
1269 
1270         /*
1271          * clear the interrupt control and status register
1272          * READ/WRITE/READ workaround required to flush PCI caches
1273          */
1274 
1275         PUT32(M1575_INTRCR_REG, 0);
1276         (void) GET32(M1575_INTRCR_REG);
1277 
1278         intrsr = GET32(M1575_INTRSR_REG);
1279         PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
1280         (void) GET32(M1575_INTRSR_REG);
1281 }
1282 
1283 /*
1284  * audio1575_codec_sync()
1285  *
1286  * Description:
1287  *      Serialize access to the AC97 audio mixer registers.
1288  *
1289  * Arguments:
1290  *      audio1575_state_t       *state          The device's state structure
1291  *
1292  * Returns:
1293  *      DDI_SUCCESS             Ready for an I/O access to the codec
1294  *      DDI_FAILURE             An I/O access is currently in progress, can't
1295  *                              perform another I/O access.
1296  */
1297 static int
1298 audio1575_codec_sync(audio1575_state_t *statep)
1299 {
1300         /* do the Uli Shuffle ... */
1301         for (int i = 0; i < M1575_LOOP_CTR; i++) {
1302                 /* Read the semaphore, and loop till we own it */
1303                 if ((GET32(M1575_CASR_REG) & 1) == 0) {
1304                         for (int j = 0; j < M1575_LOOP_CTR; j++) {
1305                                 /* Wait for CWRSUCC 0x8 */
1306                                 if (GET32(M1575_CSPSR_REG) &
1307                                     M1575_CSPSR_SUCC) {
1308                                         return (DDI_SUCCESS);
1309                                 }
1310                                 drv_usecwait(1);
1311                         }
1312                 }
1313                 drv_usecwait(10);
1314         }
1315 
1316         return (DDI_FAILURE);
1317 }
1318 
1319 /*
1320  * audio1575_write_ac97()
1321  *
1322  * Description:
1323  *      Set the specific AC97 Codec register.
1324  *
1325  * Arguments:
1326  *      void            *arg            The device's state structure
1327  *      uint8_t         reg             AC97 register number
1328  *      uint16_t        data            The data want to be set
1329  */
1330 static void
1331 audio1575_write_ac97(void *arg, uint8_t reg, uint16_t data)
1332 {
1333         audio1575_state_t       *statep = arg;
1334         int                     i;
1335 
1336         if (audio1575_codec_sync(statep) != DDI_SUCCESS) {
1337                 return;
1338         }
1339 
1340         /* write the data to WRITE to the lo word of the CPR register */
1341         PUT16(M1575_CPR_REG, data);
1342 
1343         /* write the address to WRITE to the hi word of the CPR register */
1344         PUT16(M1575_CPR_REG+2, reg);
1345 
1346         /* wait until command is completed sucessfully */
1347         for (i = 0; i < M1575_LOOP_CTR; i++) {
1348                 /* Wait for Write Ready 0x01 */
1349                 if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_WRRDY) {
1350                         break;
1351                 }
1352                 drv_usecwait(1);
1353         }
1354 
1355         if (i < M1575_LOOP_CTR) {
1356                 (void) audio1575_read_ac97(statep, reg);
1357         }
1358 }
1359 
1360 /*
1361  * audio1575_read_ac97()
1362  *
1363  * Description:
1364  *      Get the specific AC97 Codec register. It also updates codec_shadow[]
1365  *      with the register value.
1366  *
1367  * Arguments:
1368  *      void            *arg            The device's state structure
1369  *      uint8_t         reg             AC97 register number
1370  *
1371  * Returns:
1372  *      Value of AC97 register.  (0xffff in failure situations).
1373  */
1374 static uint16_t
1375 audio1575_read_ac97(void *arg, uint8_t reg)
1376 {
1377         audio1575_state_t       *statep = arg;
1378         uint16_t                addr = 0;
1379         uint16_t                data = 0xffff;
1380         int                     i;
1381 
1382         if ((audio1575_codec_sync(statep)) != DDI_SUCCESS) {
1383                 return (data);
1384         }
1385 
1386         /*
1387          * at this point we have the CASR semaphore
1388          * and the codec is r/w ready
1389          * OR in the READ opcode into the address field
1390          */
1391 
1392         addr = (reg | M1575_CPR_READ);
1393 
1394         /* write the address to READ to the hi word of the CPR register */
1395         PUT16(M1575_CPR_REG+2, addr);
1396 
1397         /* wait until command is completed sucessfully */
1398         for (i = 0; i < M1575_LOOP_CTR; i++) {
1399                 /* Wait for Read Ready  0x02 */
1400                 if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_RDRDY) {
1401                         break;
1402                 }
1403                 drv_usecwait(1);
1404         }
1405 
1406         if (i < M1575_LOOP_CTR) {
1407                 /* read back the data and address */
1408                 data = GET16(M1575_SPR_REG);
1409                 addr = GET16(M1575_SPR_REG+2);
1410                 if (addr != reg) {
1411                         data = 0xffff;
1412                 }
1413         }
1414 
1415         return (data);
1416 }
1417 
1418 /*
1419  * audio1575_pci_enable()
1420  *
1421  * Description:
1422  *      This routine Enables all PCI IO and MEMORY accesses
1423  *
1424  * Arguments:
1425  *      audio1575_state_t *statep        The device's state structure
1426  */
1427 static void
1428 audio1575_pci_enable(audio1575_state_t *statep)
1429 {
1430         uint16_t pcics_reg;
1431 
1432         pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
1433         pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
1434         pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
1435 }
1436 
1437 /*
1438  * audio1575_pci_disable()
1439  *
1440  * Description:
1441  *      This routine Disables all PCI IO and MEMORY accesses
1442  *
1443  * Arguments:
1444  *      audio1575_state_t *statep       The device's state structure
1445  */
1446 static void
1447 audio1575_pci_disable(audio1575_state_t *statep)
1448 {
1449         uint16_t pcics_reg;
1450 
1451         if (statep->pcih == NULL)
1452                 return;
1453         pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
1454         pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
1455         pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
1456 }
1457 
1458 /*
1459  * audio1575_resume()
1460  *
1461  * Description:
1462  *      Resume operation of the device after sleeping or hibernating.
1463  *      Note that this should never fail, even if hardware goes wonky,
1464  *      because the current PM framework will panic if it does.
1465  *
1466  * Arguments:
1467  *      dev_info_t      *dip    Pointer to the device's dev_info struct
1468  *
1469  * Returns:
1470  *      DDI_SUCCESS             The driver was resumed
1471  */
1472 static int
1473 audio1575_resume(dev_info_t *dip)
1474 {
1475         audio1575_state_t       *statep;
1476         audio_dev_t             *adev;
1477 
1478         /* we've already allocated the state structure so get ptr */
1479         statep = ddi_get_driver_private(dip);
1480         adev = statep->adev;
1481         ASSERT(!mutex_owned(&statep->lock));
1482 
1483         if (audio1575_chip_init(statep) != DDI_SUCCESS) {
1484                 /*
1485                  * Note that PM gurus say we should return
1486                  * success here.  Failure of audio shouldn't
1487                  * be considered FATAL to the system.  The
1488                  * upshot is that audio will not progress.
1489                  */
1490                 audio_dev_warn(adev, "DDI_RESUME failed to init chip");
1491                 return (DDI_SUCCESS);
1492         }
1493 
1494         /* allow ac97 operations again */
1495         ac97_reset(statep->ac97);
1496 
1497         audio_dev_resume(adev);
1498 
1499         return (DDI_SUCCESS);
1500 }
1501 
1502 /*
1503  * audio1575_suspend()
1504  *
1505  * Description:
1506  *      Suspend an instance of the audio1575 driver.
1507  *
1508  * Arguments:
1509  *      dev_info_t      *dip    Pointer to the device's dev_info struct
1510  *
1511  * Returns:
1512  *      DDI_SUCCESS     The driver was suspended
1513  */
1514 static int
1515 audio1575_suspend(dev_info_t *dip)
1516 {
1517         audio1575_state_t       *statep;
1518 
1519         statep = ddi_get_driver_private(dip);
1520 
1521         audio_dev_suspend(statep->adev);
1522 
1523         return (DDI_SUCCESS);
1524 }
1525 
1526 /*
1527  * audio1575_destroy()
1528  *
1529  * Description:
1530  *      This routine releases all resources held by the device instance,
1531  *      as part of either detach or a failure in attach.
1532  *
1533  * Arguments:
1534  *      audio1575_state_t       *state  The device soft state.
1535  */
1536 void
1537 audio1575_destroy(audio1575_state_t *statep)
1538 {
1539         ddi_acc_handle_t        pcih;
1540 
1541         /* stop DMA engines */
1542         audio1575_dma_stop(statep, B_FALSE);
1543 
1544         if (statep->regsh != NULL) {
1545                 /* reset the codec */
1546                 PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1547         }
1548 
1549         if ((pcih = statep->pcih) != NULL) {
1550                 /* turn off the AC_LINK clock */
1551                 pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1552                 pci_config_put8(pcih, M1575_PCIACD_REG, 4);
1553                 pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1554         }
1555 
1556         /* Disable PCI I/O and Memory Spaces */
1557         audio1575_pci_disable(statep);
1558 
1559         audio1575_free_port(statep->ports[M1575_PLAY]);
1560         audio1575_free_port(statep->ports[M1575_REC]);
1561 
1562         audio1575_unmap_regs(statep);
1563 
1564         if (statep->ac97 != NULL) {
1565                 ac97_free(statep->ac97);
1566         }
1567 
1568         if (statep->adev != NULL) {
1569                 audio_dev_free(statep->adev);
1570         }
1571 
1572         kmem_free(statep, sizeof (*statep));
1573 }