[PATCH v2 5/6] ASoC: sirf-inner: add mach driver for SiRFSoC internal codec

Mark Brown broonie at kernel.org
Tue Oct 29 18:09:53 EDT 2013


On Tue, Oct 29, 2013 at 07:15:59AM +0800, Barry Song wrote:

> +	if (sinner_card->extcon_info.state_changed) {
> +		sinner_card->extcon_info.state_changed = 0;
> +		if (!sinner_card->extcon_info.last_state)
> +			gpio_direction_output(sinner_card->gpio_spk_pa, 0);
> +		else
> +			gpio_direction_output(sinner_card->gpio_spk_pa, 1);

What's this extcon stuff all about?

> +	sinner_card->sirf_inner_device = platform_device_alloc("soc-audio", -1);
> +	if (!sinner_card->sirf_inner_device)
> +		return -ENOMEM;

You shouldn't be using soc-audio - use devm_snd_soc_register_card() for
new drivers.

> +	sirf_inner_dai_links[0].cpu_of_node =
> +		of_parse_phandle(pdev->dev.of_node, "sirf,inner-platform", 0);

You need to add binding documents for new bindings.

> +	if (gpio_is_valid(sinner_card->gpio_spk_pa))
> +		gpio_request(sinner_card->gpio_spk_pa, "SPA_PA_SD");
> +	if (gpio_is_valid(sinner_card->gpio_hp_pa))
> +		gpio_request(sinner_card->gpio_hp_pa, "HP_PA_SD");

devm_gpio_request_one().

> +	sinner_card->extcon_info.pdev.name = "extcon-gpio";
> +	sinner_card->extcon_info.pdev.id = pdev->id;
> +	sinner_card->extcon_info.pdev.dev.platform_data =
> +		&sinner_card->extcon_info.extcon_data;

Use the ASoC jack support so this behaves like other cards.  Hooking the
ALSA core jack support into extcon would be a good idea but it should be
done there.

> +#ifdef CONFIG_PM_SLEEP
> +static int sirf_inner_resume(struct device *dev)
> +{
> +	struct snd_soc_card *card = dev_get_drvdata(dev);
> +	struct sirf_inner_card *sinner_card = snd_soc_card_get_drvdata(card);
> +	struct extcon_dev *edev;
> +	int state;
> +
> +	edev = extcon_get_extcon_dev(sinner_card->extcon_info.extcon_data.name);
> +	state = gpio_get_value(sinner_card->extcon_info.extcon_data.gpio);
> +	if (state != sinner_card->extcon_info.last_state) {
> +		sinner_card->extcon_info.state_changed = 1;
> +		sinner_card->extcon_info.last_state = state;
> +		extcon_set_state(edev, state);

Even if you're using extcon this looks like something that extcon-gpio
ought to be handling...

> +static int sirf_inner_suspend(struct device *dev)
> +{
> +	struct snd_soc_card *card = dev_get_drvdata(dev);
> +	struct sirf_inner_card *sinner_card = snd_soc_card_get_drvdata(card);
> +	sinner_card->extcon_info.last_state = gpio_get_value(sinner_card->extcon_info.extcon_data.gpio);
> +	if (gpio_is_valid(sinner_card->gpio_spk_pa))
> +		gpio_direction_output(sinner_card->gpio_spk_pa, 0);

DAPM will do this for you.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20131029/fd8d86dd/attachment.sig>


More information about the linux-arm-kernel mailing list