Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

greybus: audio: Fetch jack_mask, button_mask from module's topology data

Added extra fields namely jack_mask & button_mask for each module_info.
These fields are required while registering jack & reporting jack
events.

Earlier, these were hard coded values assuming fixed capabilities say
HEADSET, LINEOUT, etc. supported by GB-codec driver. Now these are
computed dynamically based on module's jack capability shared via
topology data.

Signed-off-by: Vaibhav Agarwal <vaibhav.agarwal@linaro.org>
Reviewed-by: Mark Greer <mgreer@animalcreek.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>

authored by

Vaibhav Agarwal and committed by
Greg Kroah-Hartman
847175e8 a695c302

+63 -35
+45 -23
drivers/staging/greybus/audio_codec.c
··· 707 707 { 708 708 int ret; 709 709 710 + if (!module->jack_mask) 711 + return 0; 712 + 710 713 snprintf(module->jack_name, NAME_SIZE, "GB %d Headset Jack", 711 714 module->dev_id); 712 - ret = snd_soc_jack_new(codec, module->jack_name, GBCODEC_JACK_MASK, 715 + ret = snd_soc_jack_new(codec, module->jack_name, module->jack_mask, 713 716 &module->headset_jack); 714 717 if (ret) { 715 718 dev_err(module->dev, "Failed to create new jack\n"); 716 719 return ret; 717 720 } 718 721 722 + if (!module->button_mask) 723 + return 0; 724 + 719 725 snprintf(module->button_name, NAME_SIZE, "GB %d Button Jack", 720 726 module->dev_id); 721 - ret = snd_soc_jack_new(codec, module->button_name, 722 - GBCODEC_JACK_BUTTON_MASK, &module->button_jack); 727 + ret = snd_soc_jack_new(codec, module->button_name, module->button_mask, 728 + &module->button_jack); 723 729 if (ret) { 724 730 dev_err(module->dev, "Failed to create button jack\n"); 725 731 return ret; 726 732 } 727 733 728 - ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0, 729 - KEY_MEDIA); 730 - if (ret) { 731 - dev_err(module->dev, "Failed to set BTN_0\n"); 732 - return ret; 734 + /* 735 + * Currently, max 4 buttons are supported with following key mapping 736 + * BTN_0 = KEY_MEDIA 737 + * BTN_1 = KEY_VOICECOMMAND 738 + * BTN_2 = KEY_VOLUMEUP 739 + * BTN_3 = KEY_VOLUMEDOWN 740 + */ 741 + 742 + if (module->button_mask & SND_JACK_BTN_0) { 743 + ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_0, 744 + KEY_MEDIA); 745 + if (ret) { 746 + dev_err(module->dev, "Failed to set BTN_0\n"); 747 + return ret; 748 + } 733 749 } 734 750 735 - ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1, 736 - KEY_VOICECOMMAND); 737 - if (ret) { 738 - dev_err(module->dev, "Failed to set BTN_1\n"); 739 - return ret; 751 + if (module->button_mask & SND_JACK_BTN_1) { 752 + ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_1, 753 + KEY_VOICECOMMAND); 754 + if (ret) { 755 + dev_err(module->dev, "Failed to set BTN_1\n"); 756 + return ret; 757 + } 740 758 } 741 759 742 - ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2, 743 - KEY_VOLUMEUP); 744 - if (ret) { 745 - dev_err(module->dev, "Failed to set BTN_2\n"); 746 - return ret; 760 + if (module->button_mask & SND_JACK_BTN_2) { 761 + ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_2, 762 + KEY_VOLUMEUP); 763 + if (ret) { 764 + dev_err(module->dev, "Failed to set BTN_2\n"); 765 + return ret; 766 + } 747 767 } 748 768 749 - ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3, 750 - KEY_VOLUMEDOWN); 751 - if (ret) { 752 - dev_err(module->dev, "Failed to set BTN_0\n"); 753 - return ret; 769 + if (module->button_mask & SND_JACK_BTN_3) { 770 + ret = snd_jack_set_key(module->button_jack.jack, SND_JACK_BTN_3, 771 + KEY_VOLUMEDOWN); 772 + if (ret) { 773 + dev_err(module->dev, "Failed to set BTN_0\n"); 774 + return ret; 775 + } 754 776 } 755 777 756 778 /* FIXME
+4 -4
drivers/staging/greybus/audio_codec.h
··· 73 73 #define GBCODEC_APB1_MUX_REG_DEFAULT 0x00 74 74 #define GBCODEC_APB2_MUX_REG_DEFAULT 0x00 75 75 76 - #define GBCODEC_JACK_MASK (SND_JACK_HEADSET | SND_JACK_LINEOUT | \ 77 - SND_JACK_LINEIN | SND_JACK_UNSUPPORTED) 78 - #define GBCODEC_JACK_BUTTON_MASK (SND_JACK_BTN_0 | SND_JACK_BTN_1 | \ 79 - SND_JACK_BTN_2 | SND_JACK_BTN_3) 76 + #define GBCODEC_JACK_MASK 0x0000FFFF 77 + #define GBCODEC_JACK_BUTTON_MASK 0xFFFF0000 80 78 81 79 static const u8 gbcodec_reg_defaults[GBCODEC_REG_COUNT] = { 82 80 GBCODEC_CTL_REG_DEFAULT, ··· 174 176 char jack_name[NAME_SIZE]; 175 177 char button_name[NAME_SIZE]; 176 178 int jack_type; 179 + int jack_mask; 180 + int button_mask; 177 181 int button_status; 178 182 struct snd_soc_jack headset_jack; 179 183 struct snd_soc_jack button_jack;
+7 -8
drivers/staging/greybus/audio_module.c
··· 33 33 module->button_status = 0; 34 34 if (button_status) 35 35 snd_soc_jack_report(&module->button_jack, 0, 36 - GBCODEC_JACK_BUTTON_MASK); 36 + module->button_mask); 37 37 snd_soc_jack_report(&module->headset_jack, 0, 38 - GBCODEC_JACK_MASK); 38 + module->jack_mask); 39 39 return 0; 40 40 } 41 41 42 42 /* currently supports Headphone, Headset & Lineout only */ 43 - report &= ~GBCODEC_JACK_MASK; 44 - report |= req->jack_attribute & GBCODEC_JACK_MASK; 43 + report &= ~module->jack_mask; 44 + report |= req->jack_attribute & module->jack_mask; 45 45 if (module->jack_type) 46 46 dev_warn_ratelimited(module->dev, 47 47 "Modifying jack from %d to %d\n", 48 48 module->jack_type, report); 49 49 50 50 module->jack_type = report; 51 - snd_soc_jack_report(&module->headset_jack, report, GBCODEC_JACK_MASK); 51 + snd_soc_jack_report(&module->headset_jack, report, module->jack_mask); 52 52 53 53 return 0; 54 54 } ··· 69 69 return -EINVAL; 70 70 } 71 71 72 - report = module->button_status & GBCODEC_JACK_BUTTON_MASK; 72 + report = module->button_status & module->button_mask; 73 73 74 74 switch (req->button_id) { 75 75 case 1: ··· 100 100 101 101 module->button_status = report; 102 102 103 - snd_soc_jack_report(&module->button_jack, report, 104 - GBCODEC_JACK_BUTTON_MASK); 103 + snd_soc_jack_report(&module->button_jack, report, module->button_mask); 105 104 106 105 return 0; 107 106 }
+7
drivers/staging/greybus/audio_topology.c
··· 1393 1393 } 1394 1394 dev_dbg(module->dev, "Route parsing finished\n"); 1395 1395 1396 + /* parse jack capabilities */ 1397 + if (tplg_data->jack_type) { 1398 + module->jack_mask = tplg_data->jack_type & GBCODEC_JACK_MASK; 1399 + module->button_mask = tplg_data->jack_type & 1400 + GBCODEC_JACK_BUTTON_MASK; 1401 + } 1402 + 1396 1403 return ret; 1397 1404 } 1398 1405