sound/core/pcm_iec958.c

Source file repositories/reference/linux-study-clean/sound/core/pcm_iec958.c

File Facts

System
Linux kernel
Corpus path
sound/core/pcm_iec958.c
Extension
.c
Size
6074 bytes
Lines
214
Domain
Driver Families
Bucket
sound/core
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (rate) {
			case 32000:
				fs = IEC958_AES3_CON_FS_32000;
				break;
			case 44100:
				fs = IEC958_AES3_CON_FS_44100;
				break;
			case 48000:
				fs = IEC958_AES3_CON_FS_48000;
				break;
			case 88200:
				fs = IEC958_AES3_CON_FS_88200;
				break;
			case 96000:
				fs = IEC958_AES3_CON_FS_96000;
				break;
			case 176400:
				fs = IEC958_AES3_CON_FS_176400;
				break;
			case 192000:
				fs = IEC958_AES3_CON_FS_192000;
				break;
			default:
				return -EINVAL;
		}

		cs[3] &= ~IEC958_AES3_CON_FS;
		cs[3] |= fs;
	}

	if (len > 4 &&
	    (cs[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) {
		unsigned int ws;

		switch (sample_width) {
		case 16:
			ws = IEC958_AES4_CON_WORDLEN_20_16;
			break;
		case 18:
			ws = IEC958_AES4_CON_WORDLEN_22_18;
			break;
		case 20:
			ws = IEC958_AES4_CON_WORDLEN_20_16 |
			     IEC958_AES4_CON_MAX_WORDLEN_24;
			break;
		case 24:
		case 32: /* Assume 24-bit width for 32-bit samples. */
			ws = IEC958_AES4_CON_WORDLEN_24_20 |
			     IEC958_AES4_CON_MAX_WORDLEN_24;
			break;

		default:
			return -EINVAL;
		}

		cs[4] &= ~IEC958_AES4_CON_WORDLEN;
		cs[4] |= ws;
	}

	return len;
}

/**
 * snd_pcm_fill_iec958_consumer - Fill consumer format IEC958 channel status
 * @runtime: pcm runtime structure with ->rate filled in
 * @cs: channel status buffer, at least four bytes
 * @len: length of channel status buffer
 *
 * Fill the unspecified bits in an IEC958 status bits array using the
 * parameters of the PCM runtime @runtime.
 *
 * Drivers may wish to tweak the contents of the buffer after its been
 * filled.
 *
 * Returns: length of buffer, or negative error code if something failed.
 */
int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime,
				 u8 *cs, size_t len)
{
	return fill_iec958_consumer(runtime->rate,
				    snd_pcm_format_width(runtime->format),
				    cs, len);
}
EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer);

/**
 * snd_pcm_fill_iec958_consumer_hw_params - Fill consumer format IEC958 channel status
 * @params: the hw_params instance for extracting rate and sample format
 * @cs: channel status buffer, at least four bytes
 * @len: length of channel status buffer

Annotation

Implementation Notes