IEC958 (S/PDIF)

Usually the controls for IEC958 devices are implemented via the control interface. There is a macro to compose a name string for IEC958 controls, SNDRV_CTL_NAME_IEC958() defined in <include/asound.h>.

There are some standard controls for IEC958 status bits. These controls use the type SNDRV_CTL_ELEM_TYPE_IEC958, and the size of element is fixed as 4 bytes array (value.iec958.status[x]). For the info callback, you don't specify the value field for this type (the count field must be set, though).

IEC958 Playback Con Mask is used to return the bit-mask for the IEC958 status bits of consumer mode. Similarly, IEC958 Playback Pro Mask returns the bitmask for professional mode. They are read-only controls, and are defined as MIXER controls (iface = SNDRV_CTL_ELEM_IFACE_MIXER).

Meanwhile, IEC958 Playback Default control is defined for getting and setting the current default IEC958 bits. Note that this one is usually defined as a PCM control (iface = SNDRV_CTL_ELEM_IFACE_PCM), although in some places it's defined as a MIXER control.

In addition, you can define the control switches to enable/disable or to set the raw bit mode. The implementation will depend on the chip, but the control should be named as IEC958 xxx, preferably using the SNDRV_CTL_NAME_IEC958() macro.

You can find several cases, for example, pci/emu10k1, pci/ice1712, or pci/cmipci.c.