OSDN Git Service

ASoC: cs42l42: Add support for set_jack calls
authorLucas Tanure <tanureal@opensource.cirrus.com>
Mon, 26 Apr 2021 15:53:01 +0000 (16:53 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 10 May 2021 16:06:08 +0000 (17:06 +0100)
Replace the internal jack creation by set_jack call, so users can map
buttons in their machine driver
Also only enable jack detection IRQ after set_jack call

Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20210426155303.853236-1-tanureal@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l42.c
sound/soc/codecs/cs42l42.h

index bf982e1..2143957 100644 (file)
@@ -518,26 +518,33 @@ static const struct snd_soc_dapm_route cs42l42_audio_map[] = {
        { "SDOUT2", NULL, "ASP TX EN" },
 };
 
+static int cs42l42_set_jack(struct snd_soc_component *component, struct snd_soc_jack *jk, void *d)
+{
+       struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
+
+       cs42l42->jack = jk;
+
+       regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK,
+                          CS42L42_RS_PLUG_MASK | CS42L42_RS_UNPLUG_MASK |
+                          CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK,
+                          (1 << CS42L42_RS_PLUG_SHIFT) | (1 << CS42L42_RS_UNPLUG_SHIFT) |
+                          (0 << CS42L42_TS_PLUG_SHIFT) | (0 << CS42L42_TS_UNPLUG_SHIFT));
+
+       return 0;
+}
+
 static int cs42l42_component_probe(struct snd_soc_component *component)
 {
-       struct cs42l42_private *cs42l42 =
-               (struct cs42l42_private *)snd_soc_component_get_drvdata(component);
-       struct snd_soc_card *crd = component->card;
-       int ret = 0;
+       struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
 
        cs42l42->component = component;
 
-       ret = snd_soc_card_jack_new(crd, "CS42L42 Headset", SND_JACK_HEADSET | SND_JACK_BTN_0 |
-                                   SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3,
-                                   &cs42l42->jack, NULL, 0);
-       if (ret < 0)
-               dev_err(component->dev, "Cannot create CS42L42 Headset: %d\n", ret);
-
-       return ret;
+       return 0;
 }
 
 static const struct snd_soc_component_driver soc_component_dev_cs42l42 = {
        .probe                  = cs42l42_component_probe,
+       .set_jack               = cs42l42_set_jack,
        .dapm_widgets           = cs42l42_dapm_widgets,
        .num_dapm_widgets       = ARRAY_SIZE(cs42l42_dapm_widgets),
        .dapm_routes            = cs42l42_audio_map,
@@ -1410,11 +1417,11 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data)
                        switch(cs42l42->hs_type){
                        case CS42L42_PLUG_CTIA:
                        case CS42L42_PLUG_OMTP:
-                               snd_soc_jack_report(&cs42l42->jack, SND_JACK_HEADSET,
+                               snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADSET,
                                                    SND_JACK_HEADSET);
                                break;
                        case CS42L42_PLUG_HEADPHONE:
-                               snd_soc_jack_report(&cs42l42->jack, SND_JACK_HEADPHONE,
+                               snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADPHONE,
                                                    SND_JACK_HEADPHONE);
                                break;
                        default:
@@ -1442,10 +1449,10 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data)
                                switch(cs42l42->hs_type){
                                case CS42L42_PLUG_CTIA:
                                case CS42L42_PLUG_OMTP:
-                                       snd_soc_jack_report(&cs42l42->jack, 0, SND_JACK_HEADSET);
+                                       snd_soc_jack_report(cs42l42->jack, 0, SND_JACK_HEADSET);
                                        break;
                                case CS42L42_PLUG_HEADPHONE:
-                                       snd_soc_jack_report(&cs42l42->jack, 0, SND_JACK_HEADPHONE);
+                                       snd_soc_jack_report(cs42l42->jack, 0, SND_JACK_HEADPHONE);
                                        break;
                                default:
                                        break;
@@ -1472,7 +1479,7 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data)
                                report = cs42l42_handle_button_press(cs42l42);
 
                        }
-                       snd_soc_jack_report(&cs42l42->jack, report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+                       snd_soc_jack_report(cs42l42->jack, report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
                                                                   SND_JACK_BTN_2 | SND_JACK_BTN_3);
                }
        }
@@ -1579,8 +1586,8 @@ static void cs42l42_set_interrupt_masks(struct cs42l42_private *cs42l42)
                        CS42L42_TS_UNPLUG_MASK,
                        (1 << CS42L42_RS_PLUG_SHIFT) |
                        (1 << CS42L42_RS_UNPLUG_SHIFT) |
-                       (0 << CS42L42_TS_PLUG_SHIFT) |
-                       (0 << CS42L42_TS_UNPLUG_SHIFT));
+                       (1 << CS42L42_TS_PLUG_SHIFT) |
+                       (1 << CS42L42_TS_UNPLUG_SHIFT));
 }
 
 static void cs42l42_setup_hs_type_detect(struct cs42l42_private *cs42l42)
index 36b763f..2e0d383 100644 (file)
@@ -773,7 +773,7 @@ struct  cs42l42_private {
        struct regulator_bulk_data supplies[CS42L42_NUM_SUPPLIES];
        struct gpio_desc *reset_gpio;
        struct completion pdn_done;
-       struct snd_soc_jack jack;
+       struct snd_soc_jack *jack;
        int bclk;
        u32 sclk;
        u32 srate;