diff options
| author | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
|---|---|---|
| committer | Rodrigo Vivi <[email protected]> | 2018-07-23 09:13:12 -0700 | 
| commit | c74a7469f97c0f40b46e82ee979f9fb1bb6e847c (patch) | |
| tree | f2690a1a916b73ef94657fbf0e0141ae57701825 /sound/soc/codecs/ssm2305.c | |
| parent | 6f15a7de86c8cf2dc09fc9e6d07047efa40ef809 (diff) | |
| parent | 500775074f88d9cf5416bed2ca19592812d62c41 (diff) | |
Merge drm/drm-next into drm-intel-next-queued
We need a backmerge to get DP_DPCD_REV_14 before we push other
i915 changes to dinq that could break compilation.
Signed-off-by: Rodrigo Vivi <[email protected]>
Diffstat (limited to 'sound/soc/codecs/ssm2305.c')
| -rw-r--r-- | sound/soc/codecs/ssm2305.c | 104 | 
1 files changed, 104 insertions, 0 deletions
| diff --git a/sound/soc/codecs/ssm2305.c b/sound/soc/codecs/ssm2305.c new file mode 100644 index 000000000000..2968959c4b75 --- /dev/null +++ b/sound/soc/codecs/ssm2305.c @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Analog Devices SSM2305 Amplifier Driver +// +// Copyright (C) 2018 Pengutronix, Marco Felsch <[email protected]> +// + +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <sound/soc.h> + +#define DRV_NAME "ssm2305" + +struct ssm2305 { +	/* shutdown gpio  */ +	struct gpio_desc *gpiod_shutdown; +}; + +static int ssm2305_power_event(struct snd_soc_dapm_widget *w, +			       struct snd_kcontrol *kctrl, int event) +{ +	struct snd_soc_component *c = snd_soc_dapm_to_component(w->dapm); +	struct ssm2305 *data = snd_soc_component_get_drvdata(c); + +	gpiod_set_value_cansleep(data->gpiod_shutdown, +				 SND_SOC_DAPM_EVENT_ON(event)); + +	return 0; +} + +static const struct snd_soc_dapm_widget ssm2305_dapm_widgets[] = { +	/* Stereo input/output */ +	SND_SOC_DAPM_INPUT("L_IN"), +	SND_SOC_DAPM_INPUT("R_IN"), +	SND_SOC_DAPM_OUTPUT("L_OUT"), +	SND_SOC_DAPM_OUTPUT("R_OUT"), + +	SND_SOC_DAPM_SUPPLY("Power", SND_SOC_NOPM, 0, 0, ssm2305_power_event, +			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), +}; + +static const struct snd_soc_dapm_route ssm2305_dapm_routes[] = { +	{ "L_OUT", NULL, "L_IN" }, +	{ "R_OUT", NULL, "R_IN" }, +	{ "L_IN", NULL, "Power" }, +	{ "R_IN", NULL, "Power" }, +}; + +static const struct snd_soc_component_driver ssm2305_component_driver = { +	.dapm_widgets		= ssm2305_dapm_widgets, +	.num_dapm_widgets	= ARRAY_SIZE(ssm2305_dapm_widgets), +	.dapm_routes		= ssm2305_dapm_routes, +	.num_dapm_routes	= ARRAY_SIZE(ssm2305_dapm_routes), +}; + +static int ssm2305_probe(struct platform_device *pdev) +{ +	struct device *dev = &pdev->dev; +	struct ssm2305 *priv; +	int err; + +	/* Allocate the private data */ +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); +	if (!priv) +		return -ENOMEM; + +	platform_set_drvdata(pdev, priv); + +	/* Get shutdown gpio */ +	priv->gpiod_shutdown = devm_gpiod_get(dev, "shutdown", +					      GPIOD_OUT_LOW); +	if (IS_ERR(priv->gpiod_shutdown)) { +		err = PTR_ERR(priv->gpiod_shutdown); +		if (err != -EPROBE_DEFER) +			dev_err(dev, "Failed to get 'shutdown' gpio: %d\n", +				err); +		return err; +	} + +	return devm_snd_soc_register_component(dev, &ssm2305_component_driver, +					       NULL, 0); +} + +#ifdef CONFIG_OF +static const struct of_device_id ssm2305_of_match[] = { +	{ .compatible = "adi,ssm2305", }, +	{ } +}; +MODULE_DEVICE_TABLE(of, ssm2305_of_match); +#endif + +static struct platform_driver ssm2305_driver = { +	.driver = { +		.name = DRV_NAME, +		.of_match_table = of_match_ptr(ssm2305_of_match), +	}, +	.probe = ssm2305_probe, +}; + +module_platform_driver(ssm2305_driver); + +MODULE_DESCRIPTION("ASoC SSM2305 amplifier driver"); +MODULE_AUTHOR("Marco Felsch <[email protected]>"); +MODULE_LICENSE("GPL v2"); |