sound/hda/codecs/side-codecs/cirrus_scodec_test.c

Source file repositories/reference/linux-study-clean/sound/hda/codecs/side-codecs/cirrus_scodec_test.c

File Facts

System
Linux kernel
Corpus path
sound/hda/codecs/side-codecs/cirrus_scodec_test.c
Extension
.c
Size
10516 bytes
Lines
331
Domain
Driver Families
Bucket
sound/hda
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

struct cirrus_scodec_test_gpio {
	unsigned int pin_state;
	struct gpio_chip chip;
};

struct cirrus_scodec_test_priv {
	struct faux_device *amp_dev;
	struct faux_device *gpio_dev;
	struct cirrus_scodec_test_gpio *gpio_priv;
};

static int cirrus_scodec_test_gpio_get_direction(struct gpio_chip *chip,
						 unsigned int offset)
{
	return GPIO_LINE_DIRECTION_IN;
}

static int cirrus_scodec_test_gpio_direction_in(struct gpio_chip *chip,
						unsigned int offset)
{
	return 0;
}

static int cirrus_scodec_test_gpio_get(struct gpio_chip *chip, unsigned int offset)
{
	struct cirrus_scodec_test_gpio *gpio_priv = gpiochip_get_data(chip);

	return !!(gpio_priv->pin_state & BIT(offset));
}

static int cirrus_scodec_test_gpio_direction_out(struct gpio_chip *chip,
						 unsigned int offset, int value)
{
	return -EOPNOTSUPP;
}

static int cirrus_scodec_test_gpio_set(struct gpio_chip *chip,
				       unsigned int offset, int value)
{
	return -EOPNOTSUPP;
}

static int cirrus_scodec_test_gpio_set_config(struct gpio_chip *gc,
					      unsigned int offset,
					      unsigned long config)
{
	switch (pinconf_to_config_param(config)) {
	case PIN_CONFIG_LEVEL:
	case PIN_CONFIG_OUTPUT_ENABLE:
		return -EOPNOTSUPP;
	default:
		return 0;
	}
}

static const struct gpio_chip cirrus_scodec_test_gpio_chip = {
	.label			= "cirrus_scodec_test_gpio",
	.owner			= THIS_MODULE,
	.request		= gpiochip_generic_request,
	.free			= gpiochip_generic_free,
	.get_direction		= cirrus_scodec_test_gpio_get_direction,
	.direction_input	= cirrus_scodec_test_gpio_direction_in,
	.get			= cirrus_scodec_test_gpio_get,
	.direction_output	= cirrus_scodec_test_gpio_direction_out,
	.set			= cirrus_scodec_test_gpio_set,
	.set_config		= cirrus_scodec_test_gpio_set_config,
	.base			= -1,
	.ngpio			= 32,
};

/* software_node referencing the gpio driver */
static const struct software_node cirrus_scodec_test_gpio_swnode = {
	.name = "cirrus_scodec_test_gpio",
};

static int cirrus_scodec_test_gpio_probe(struct faux_device *fdev)
{
	struct cirrus_scodec_test_gpio *gpio_priv;
	int ret;

	gpio_priv = devm_kzalloc(&fdev->dev, sizeof(*gpio_priv), GFP_KERNEL);
	if (!gpio_priv)
		return -ENOMEM;

	ret = device_add_software_node(&fdev->dev, &cirrus_scodec_test_gpio_swnode);
	if (ret)
		return ret;

	ret = devm_add_action_or_reset(&fdev->dev, device_remove_software_node_wrapper,
				       &fdev->dev);

Annotation

Implementation Notes