At Tue, 03 Feb 2004 12:40:20 -0300,
Manuel Jander wrote:
> 
> Hi Takashi,
> 
> > but a serious one is 
> > 
> > - au88x0_*.c have global functions vortex_*().
> > 
> > when you build multiple au88x0 drivers into kernel statically, they
> > will conflict with each other, because each au88[123]0_* includes the
> > same au88x0_* file.
> > 
> > i haven't notice this because alsa-drivers are supposed to be
> > modules...
> > 
> > 
> > to solve this situation, we'll need either:
> > 
> > - rename each function to a unique name for the card (maybe with the
> >   help of macro?)
> 
> I guess this can be done like the DRM kernel modules do:
> 
> #define DRM(x) snd_ati_##x
> 
> snd_ati_malloc(size_t size, int type)
> 
> p = DRM(malloc)(size, DRM_MEM_DRIVER)
> 
> That would be pretty easy to implement.
 
yes, that is also what i thought of.
but the resultant code looks a bit ugly.

> > - make them all static and implement as callbacks
> 
> As callbacks ? Hmm, do you mean some sort of function pointers that are
> assigned when the driver starts up to the corresponding function set ?
> I know what callbacks are, but i don't understand how callbacks fit in
> here (?).
 
well, this option isn't easy.  proposed just as a possible solution.

> > - make the h/w specific functions as callback functions (i.e. hwread,
> >   hwrite, etc), and each function calls these callbacks.
> > 
> > the last case would be the most elegant, but the module structure will
> > be changed in this way, namely, each snd-au88[123]0 and a core
> > (common) module snd-au88x0-lib.
> 
> Well, i will study the case, but whatever solution i take, i would not
> like to have to copy paste any code. That would be too bad.
> 
> All 3 aureal cards have the same architecture, the only things that
> change are the MMIO register offsets (but some feature relative offset
> are the same), and some of them have some features that others dont
> have.
> 
> Some time ago i thought about using dynamic offsets for the MMIO
> registers, and dynamic hardware function support, but i feared that the
> overhead could too bad. Im mean to have the offset addresses and
> "hardware feature is present" flags loaded into the vortex_t struct at
> runtime. But maybe its not too bad after all ? What do you think ?
> That way we would have one single driver for all 3 cards.

i vote for this one.

you can forget the overhead of offset calculation.  it must not be too
much (as long as you write the code rationally :)
an example implementation would be like this:

- prepare a static (constant) callback/data record for each chip type,

  struct au88x0_hw {
        int offset;     /* constant h/w offset */
        ...
        int (*codec_read)(au88x0_t *chip, int reg); /* some lowlevel callback */
        ...
        int (*build_eq)(au88x0_t *chip);        /* h/w specific constructor */
  };

  static struct au88x0_hw au8810_hw = {
        .offset = AU8810_OFFSET,
        ...
  };
 
  static struct au88x0_hw au8820_hw = {
        ...
  };

and you pass an enum (or the pointer of this record above) for each
type in the pci id list,

  static struct pci_device_id snd_vortex_ids[] = {
      {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AU8810,
       PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_AU8810,},
      {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AU8820,
       PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_AU8820,},
      {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AU8830,
       PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_AU8830,},
    {0,}
  };

the au88x0 chip record will have the pointer of this h/w information,

  struct snd_au88x0 {
        ...
        const struct au88x0_hw *hw;
        ...
  };

"the hardware feature present" can be determined simply by checking
whether the corresponding callback pointer exists.


Takashi


-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to