Unverified Commit c26a5289 authored by Lucas Tanure's avatar Lucas Tanure Committed by Mark Brown
Browse files

ASoC: cs42l42: Add support for set_jack calls



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: default avatarLucas Tanure <tanureal@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20210426155303.853236-1-tanureal@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 87b42aba
Loading
Loading
Loading
Loading
+25 −18
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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;