1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright (c) 2023 Intel Corporation 3 4 /* 5 * sof_sdw_cs42l42 - Helpers to handle CS42L42 from generic machine driver 6 */ 7 8 #include <linux/device.h> 9 #include <linux/errno.h> 10 #include <linux/input.h> 11 #include <linux/soundwire/sdw.h> 12 #include <linux/soundwire/sdw_type.h> 13 #include <sound/control.h> 14 #include <sound/soc.h> 15 #include <sound/soc-acpi.h> 16 #include <sound/soc-dapm.h> 17 #include <sound/jack.h> 18 #include "sof_sdw_common.h" 19 20 static const struct snd_soc_dapm_route cs42l42_map[] = { 21 /* HP jack connectors - unknown if we have jack detection */ 22 {"Headphone", NULL, "cs42l42 HP"}, 23 24 /* other jacks */ 25 {"cs42l42 HS", NULL, "Headset Mic"}, 26 }; 27 28 static struct snd_soc_jack_pin cs42l42_jack_pins[] = { 29 { 30 .pin = "Headphone", 31 .mask = SND_JACK_HEADPHONE, 32 }, 33 { 34 .pin = "Headset Mic", 35 .mask = SND_JACK_MICROPHONE, 36 }, 37 }; 38 39 int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai) 40 { 41 struct snd_soc_card *card = rtd->card; 42 struct mc_private *ctx = snd_soc_card_get_drvdata(card); 43 struct snd_soc_component *component; 44 struct snd_soc_jack *jack; 45 int ret; 46 47 component = dai->component; 48 card->components = devm_kasprintf(card->dev, GFP_KERNEL, 49 "%s hs:cs42l42", 50 card->components); 51 if (!card->components) 52 return -ENOMEM; 53 54 ret = snd_soc_dapm_add_routes(&card->dapm, cs42l42_map, 55 ARRAY_SIZE(cs42l42_map)); 56 57 if (ret) { 58 dev_err(card->dev, "cs42l42 map addition failed: %d\n", ret); 59 return ret; 60 } 61 62 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 63 SND_JACK_HEADSET | SND_JACK_BTN_0 | 64 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 65 SND_JACK_BTN_3, 66 &ctx->sdw_headset, 67 cs42l42_jack_pins, 68 ARRAY_SIZE(cs42l42_jack_pins)); 69 if (ret) { 70 dev_err(rtd->card->dev, "Headset Jack creation failed: %d\n", 71 ret); 72 return ret; 73 } 74 75 jack = &ctx->sdw_headset; 76 77 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 78 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); 79 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); 80 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); 81 82 ret = snd_soc_component_set_jack(component, jack, NULL); 83 84 if (ret) 85 dev_err(rtd->card->dev, "Headset Jack call-back failed: %d\n", 86 ret); 87 88 return ret; 89 } 90 MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_BOARD_HELPERS); 91
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.