sound/soc/intel/atom/sst/sst_acpi.c

Source file repositories/reference/linux-study-clean/sound/soc/intel/atom/sst/sst_acpi.c

File Facts

System
Linux kernel
Corpus path
sound/soc/intel/atom/sst/sst_acpi.c
Extension
.c
Size
11832 bytes
Lines
418
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 (!rsrc) {
			dev_err(dev, "Invalid SHIM base\n");
			return -EIO;
		}
		rsrc->start -= pdata->res_info->shim_offset;
		rsrc->end = rsrc->start + 0x200000 - 1;
	} else {
		ret = kstrtouint(id->id, 16, &dev_id);
		if (ret < 0) {
			dev_err(dev, "Unique device id conversion error: %d\n", ret);
			return ret;
		}

		if (soc_intel_is_byt_cr(pdev))
			byt_rvp_platform_data.res_info = &bytcr_res_info;
	}

	dev_dbg(dev, "ACPI device id: %x\n", dev_id);

	ret = sst_alloc_drv_context(&ctx, dev, dev_id);
	if (ret < 0)
		return ret;

	/* update machine parameters */
	mach->mach_params.acpi_ipc_irq_index =
		pdata->res_info->acpi_ipc_irq_index;

	plat_dev = platform_device_register_data(dev, pdata->platform, -1,
						NULL, 0);
	if (IS_ERR(plat_dev)) {
		dev_err(dev, "Failed to create machine device: %s\n",
			pdata->platform);
		return PTR_ERR(plat_dev);
	}

	/*
	 * Create platform device for sst machine driver,
	 * pass machine info as pdata
	 */
	mdev = platform_device_register_data(dev, mach->drv_name, -1,
					(const void *)mach, sizeof(*mach));
	if (IS_ERR(mdev)) {
		dev_err(dev, "Failed to create machine device: %s\n",
			mach->drv_name);
		return PTR_ERR(mdev);
	}

	/* Fill sst platform data */
	ctx->pdata = pdata;
	strscpy(ctx->firmware_name, mach->fw_filename);

	ret = sst_platform_get_resources(ctx);
	if (ret)
		return ret;

	ret = sst_context_init(ctx);
	if (ret < 0)
		return ret;

	sst_configure_runtime_pm(ctx);
	platform_set_drvdata(pdev, ctx);
	return ret;
}

/**
* sst_acpi_remove - remove function
*
* @pdev:	platform device structure
*
* This function is called by OS when a device is unloaded
* This frees the interrupt etc
*/
static void sst_acpi_remove(struct platform_device *pdev)
{
	struct intel_sst_drv *ctx;

	ctx = platform_get_drvdata(pdev);
	sst_context_cleanup(ctx);
	platform_set_drvdata(pdev, NULL);
}

static const struct acpi_device_id sst_acpi_ids[] = {
	{ "LPE0F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
	{ "80860F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
	{ "808622A8", (unsigned long)&snd_soc_acpi_intel_cherrytrail_machines},
	{ },
};

MODULE_DEVICE_TABLE(acpi, sst_acpi_ids);

Annotation

Implementation Notes