Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 755bb599 authored by Tanya Finkel's avatar Tanya Finkel
Browse files

sound: soc: Fix the docking station audio jack issues



Fix the audio dock detect on boot and connected the audio docking
station jack to docking station driver to avoid crashes when liquid is
plugged out of docking station.

Change-Id: Ia11d5dd1e7b8ed7c8af5f9af9f6dbd0fb260ac79
Signed-off-by: default avatarTanya Finkel <tfinkel@codeaurora.org>
parent 19c9d762
Loading
Loading
Loading
Loading
+53 −27
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <sound/q6afe-v2.h>
#include <sound/q6core.h>
#include <sound/pcm_params.h>
#include <soc/qcom/liquid_dock.h>
#include "device_event.h"
#include "qdsp6v2/msm-pcm-routing-v2.h"
#include "../codecs/wcd9xxx-common.h"
@@ -223,35 +224,20 @@ static void msm8994_liquid_docking_irq_work(struct work_struct *work)
static irqreturn_t msm8994_liquid_docking_irq_handler(int irq, void *dev)
{
	struct msm8994_liquid_dock_dev *dock_dev = dev;

	/* switch speakers should not run in interrupt context */
	schedule_work(&dock_dev->irq_work);
	return IRQ_HANDLED;
}

static int msm8994_liquid_init_docking(void)
static int msm8994_liquid_dock_notify_handler(struct notifier_block *this,
					unsigned long dock_event,
					void *unused)
{
	int ret = 0;
	int dock_plug_gpio = 0;

	/* plug in docking speaker+plug in device OR unplug one of them */
	u32 dock_plug_irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
					IRQF_SHARED;

	dock_plug_gpio = of_get_named_gpio(spdev->dev.of_node,
					   "qcom,dock-plug-det-irq", 0);

	if (dock_plug_gpio >= 0) {
		msm8994_liquid_dock_dev =
		 kzalloc(sizeof(*msm8994_liquid_dock_dev), GFP_KERNEL);
		if (!msm8994_liquid_dock_dev) {
			pr_err("msm8994_liquid_dock_dev alloc fail.\n");
			ret = -ENOMEM;
			goto exit;
		}

		msm8994_liquid_dock_dev->dock_plug_gpio = dock_plug_gpio;

	if (dock_event) {
		ret = gpio_request(msm8994_liquid_dock_dev->dock_plug_gpio,
					   "dock-plug-det-irq");
		if (ret) {
@@ -277,6 +263,51 @@ static int msm8994_liquid_init_docking(void)
			goto fail_dock_gpio;
		}

		switch_set_state(&msm8994_liquid_dock_dev->audio_sdev,
					msm8994_liquid_dock_dev->dock_plug_det);
		/*notify to audio deamon*/
		sysfs_notify(&msm8994_liquid_dock_dev->audio_sdev.dev->kobj,
					NULL, "state");

	} else {
		if (msm8994_liquid_dock_dev->dock_plug_irq)
			free_irq(msm8994_liquid_dock_dev->dock_plug_irq,
				 msm8994_liquid_dock_dev);

		if (msm8994_liquid_dock_dev->dock_plug_gpio)
			gpio_free(msm8994_liquid_dock_dev->dock_plug_gpio);
	}
	return NOTIFY_OK;

fail_dock_gpio:
	gpio_free(msm8994_liquid_dock_dev->dock_plug_gpio);

	return NOTIFY_DONE;
}


static struct notifier_block msm8994_liquid_docking_notifier = {
	.notifier_call  = msm8994_liquid_dock_notify_handler,
};

static int msm8994_liquid_init_docking(void)
{
	int ret = 0;
	int dock_plug_gpio = 0;

	dock_plug_gpio = of_get_named_gpio(spdev->dev.of_node,
					   "qcom,dock-plug-det-irq", 0);

	if (dock_plug_gpio >= 0) {
		msm8994_liquid_dock_dev =
		 kzalloc(sizeof(*msm8994_liquid_dock_dev), GFP_KERNEL);
		if (!msm8994_liquid_dock_dev) {
			pr_err("msm8994_liquid_dock_dev alloc fail.\n");
			ret = -ENOMEM;
			goto exit;
		}

		msm8994_liquid_dock_dev->dock_plug_gpio = dock_plug_gpio;
		msm8994_liquid_dock_dev->audio_sdev.name =
						QC_AUDIO_EXTERNAL_SPK_1_EVENT;

@@ -284,22 +315,17 @@ static int msm8994_liquid_init_docking(void)
			 &msm8994_liquid_dock_dev->audio_sdev) < 0) {
			pr_err("%s: dock device register in switch diretory failed\n",
				__func__);
			goto fail_switch_dev;
			goto exit;
		}

		INIT_WORK(
			&msm8994_liquid_dock_dev->irq_work,
			msm8994_liquid_docking_irq_work);

		register_liquid_dock_notify(&msm8994_liquid_docking_notifier);
	}
	return 0;

fail_switch_dev:
	free_irq(msm8994_liquid_dock_dev->dock_plug_irq,
				msm8994_liquid_dock_dev);
fail_dock_gpio:
	gpio_free(msm8994_liquid_dock_dev->dock_plug_gpio);
exit:
	kfree(msm8994_liquid_dock_dev);
	msm8994_liquid_dock_dev = NULL;
	return ret;
}