Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 150
RT5682 sdw unified mach#1912
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
RT5682 sdw unified mach #1912
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,126 @@ | ||
| // SPDX-License-Identifier: GPL-2.0 | ||
| // Copyright (c) 2020 Intel Corporation | ||
| /* | ||
| * sof_sdw_rt5682 - Helpers to handle RT5682 from generic machine driver | ||
| */ | ||
| #include <linux/device.h> | ||
| #include <linux/errno.h> | ||
| #include <linux/input.h> | ||
| #include <linux/soundwire/sdw.h> | ||
| #include <linux/soundwire/sdw_type.h> | ||
| #include <sound/soc.h> | ||
| #include <sound/soc-acpi.h> | ||
| #include <sound/jack.h> | ||
| #include "sof_sdw_common.h" | ||
naveen-manohar marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| static const struct snd_soc_dapm_widget rt5682_widgets[] = { | ||
| SND_SOC_DAPM_HP("Headphone", NULL), | ||
| SND_SOC_DAPM_MIC("Headset Mic", NULL), | ||
| }; | ||
| static const struct snd_soc_dapm_route rt5682_map[] = { | ||
| /*Headphones*/ | ||
| { "Headphone", NULL, "rt5682 HPOL" }, | ||
| { "Headphone", NULL, "rt5682 HPOR" }, | ||
| { "rt5682 IN1P", NULL, "Headset Mic" }, | ||
| }; | ||
| static const struct snd_kcontrol_new rt5682_controls[] = { | ||
| SOC_DAPM_PIN_SWITCH("Headphone"), | ||
| SOC_DAPM_PIN_SWITCH("Headset Mic"), | ||
| }; | ||
| static struct snd_soc_jack_pin rt5682_jack_pins[] = { | ||
| { | ||
| .pin = "Headphone", | ||
| .mask = SND_JACK_HEADPHONE, | ||
| }, | ||
| { | ||
| .pin = "Headset Mic", | ||
| .mask = SND_JACK_MICROPHONE, | ||
| }, | ||
| }; | ||
| static int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd) | ||
| { | ||
| struct snd_soc_card *card = rtd->card; | ||
| struct mc_private *ctx = snd_soc_card_get_drvdata(card); | ||
| struct snd_soc_component *component = rtd->codec_dai->component; | ||
| struct snd_soc_jack *jack; | ||
| int ret; | ||
| card->components = devm_kasprintf(card->dev, GFP_KERNEL, | ||
| "%s hs:rt5682", | ||
| card->components); | ||
| if (!card->components) | ||
| return -ENOMEM; | ||
| ret = snd_soc_add_card_controls(card, rt5682_controls, | ||
| ARRAY_SIZE(rt5682_controls)); | ||
| if (ret) { | ||
| dev_err(card->dev, "rt5682 control addition failed: %d\n", ret); | ||
| return ret; | ||
| } | ||
| ret = snd_soc_dapm_new_controls(&card->dapm, rt5682_widgets, | ||
| ARRAY_SIZE(rt5682_widgets)); | ||
| if (ret) { | ||
| dev_err(card->dev, "rt5682 widgets addition failed: %d\n", ret); | ||
| return ret; | ||
| } | ||
| ret = snd_soc_dapm_add_routes(&card->dapm, rt5682_map, | ||
| ARRAY_SIZE(rt5682_map)); | ||
Collaborator There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. see comment below | ||
| if (ret) { | ||
| dev_err(card->dev, "rt5682 map addition failed: %d\n", ret); | ||
| return ret; | ||
| } | ||
| ret = snd_soc_card_jack_new(rtd->card, "Headset Jack", | ||
| SND_JACK_HEADSET | SND_JACK_BTN_0 | | ||
| SND_JACK_BTN_1 | SND_JACK_BTN_2 | | ||
| SND_JACK_BTN_3, | ||
| &ctx->sdw_headset, | ||
| rt5682_jack_pins, | ||
| ARRAY_SIZE(rt5682_jack_pins)); | ||
| if (ret) { | ||
| dev_err(rtd->card->dev, "Headset Jack creation failed: %d\n", | ||
| ret); | ||
| return ret; | ||
| } | ||
| jack = &ctx->sdw_headset; | ||
| snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); | ||
| snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); | ||
| snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); | ||
| snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); | ||
naveen-manohar marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| ret = snd_soc_component_set_jack(component, jack, NULL); | ||
naveen-manohar marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| if (ret) | ||
| dev_err(rtd->card->dev, "Headset Jack call-back failed: %d\n", | ||
| ret); | ||
| return ret; | ||
| } | ||
| int sof_sdw_rt5682_init(const struct snd_soc_acpi_link_adr *link, | ||
| struct snd_soc_dai_link *dai_links, | ||
| struct sof_sdw_codec_info *info, | ||
| bool playback) | ||
| { | ||
| /* | ||
| * headset should be initialized once. | ||
| * Do it with dai link for playback. | ||
| */ | ||
| if (!playback) | ||
| return 0; | ||
| dai_links->init = rt5682_rtd_init; | ||
| return 0; | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.