Hi Lars,
Thanks for the information, that really clears things up for me! Having the max9768 and lm4857 as examples should get me where I need to be.
~Matt
On Wed, Aug 12, 2015 at 11:14 AM, Lars-Peter Clausen lars@metafoo.de wrote:
Hi,
On 08/12/2015 04:01 PM, Matt Campbell wrote:
Hi All,
I'm diving into adding support for a new codec (AK4621) targeting IMX6
SoC
and as this is my first dive into ALSA driver code (and first deep dive
in
to Linux driver development) I've come up with a few questions. I've
done a
lot of digging in available documentation as well as reading a lot of
code,
but some things remain unclear.
First, I'm a little confused with what appears to be inconsistent terminology. The SoC overview.txt lists three types of component drivers: codec, platform and machine. However, in the code there are four types of snd_soc_register_* functions: card, platform, codec and component. From looking at the underlying structs and how these are used in existing code this is my best guess but please correct me if I'm wrong:
codec -> snd_soc_register_codec machine -> snd_soc_register_card platform -> snd_soc_register_component and snd_soc_register_platform?
(not
sure about this, from what I can gather at some point there was an API switch to using component rather than platforms for the DAIs)
There used to be a lot of similarity between platforms and CODECs and some code duplication. snd_soc_component was introduced is a new common base class for both CODEC and platform. It can also be used standalone if none of the platform or CODEC specific functionality is need.
My second question is around adding support for an amplifier external to the codec. The amplifier is a PGA controlled over SPI. One possible way I can see to adding this is to create a SPI based codec driver for the PGA that exposes an ALSA control for the gain level and give it a dummy DAI then add it to the card as an aux_dev. This feels a little kludgy as the PGA isn't a perfect fit for the codec class.
You don't need to register a DAI with your CODEC it will work just fine without. Although in this case you don't need any CODEC specific features so the best is to just go with snd_soc_component. There are a few examples of snd_soc_component based drivers for external analog amplifiers, e.g. max9768 or lm4857.
- Lars