sound/soc/codecs/wm8958-dsp2.c

Source file repositories/reference/linux-study-clean/sound/soc/codecs/wm8958-dsp2.c

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/wm8958-dsp2.c
Extension
.c
Size
28801 bytes
Lines
1033
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: implementation source
Status
source 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

if (len < 12) {
			dev_err(component->dev, "%s short data block of %zd\n",
				name, len);
			goto err;
		}

		block_len = get_unaligned_be32(data + 4);
		if (block_len + 8 > len) {
			dev_err(component->dev, "%zd byte block longer than file\n",
				block_len);
			goto err;
		}
		if (block_len == 0) {
			dev_err(component->dev, "Zero length block\n");
			goto err;
		}

		data32 = get_unaligned_be32(data);

		switch ((data32 >> 24) & 0xff) {
		case WM_FW_BLOCK_INFO:
			/* Informational text */
			if (!check)
				break;

			str = kzalloc(block_len + 1, GFP_KERNEL);
			if (str) {
				memcpy(str, data + 8, block_len);
				dev_info(component->dev, "%s: %s\n", name, str);
				kfree(str);
			} else {
				dev_err(component->dev, "Out of memory\n");
			}
			break;
		case WM_FW_BLOCK_PM:
		case WM_FW_BLOCK_X:
		case WM_FW_BLOCK_Y:
		case WM_FW_BLOCK_Z:
		case WM_FW_BLOCK_I:
		case WM_FW_BLOCK_A:
		case WM_FW_BLOCK_C:
			dev_dbg(component->dev, "%s: %zd bytes of %x@%x\n", name,
				block_len, (data32 >> 24) & 0xff,
				data32 & 0xffffff);

			if (check)
				break;

			data32 &= 0xffffff;

			wm8994_bulk_write(wm8994->wm8994,
					  data32 & 0xffffff,
					  block_len / 2,
					  (void *)(data + 8));

			break;
		default:
			dev_warn(component->dev, "%s: unknown block type %d\n",
				 name, (data32 >> 24) & 0xff);
			break;
		}

		/* Round up to the next 32 bit word */
		block_len += block_len % 4;

		data += block_len + 8;
		len -= block_len + 8;
	}

	if (!check) {
		dev_dbg(component->dev, "%s: download done\n", name);
		wm8994->cur_fw = fw;
	} else {
		dev_info(component->dev, "%s: got firmware\n", name);
	}

	goto ok;

err:
	ret = -EINVAL;
ok:
	if (!check) {
		snd_soc_component_write(component, 0x900, 0x0);
		snd_soc_component_write(component, 0x102, 0x0);
	}

	return ret;
}

static void wm8958_dsp_start_mbc(struct snd_soc_component *component, int path)

Annotation

Implementation Notes