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

Commit e784539f authored by Jarkko Nikula's avatar Jarkko Nikula Committed by Takashi Iwai
Browse files

ALSA: ASoC: Fix error paths in N810 machine driver init and release clocks at exit



Thanks to Felipe Balbi <felipe.balbi@nokia.com> by noticing that if clk_get
to sys_clkout2_src fails, then n810_snd_device is never released.

Add also sys_clkout2_src release into error path, error code return and
release the clocks at exit.

Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@nokia.com>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3d839e5b
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -329,12 +329,14 @@ static int __init n810_soc_init(void)
	sys_clkout2_src = clk_get(dev, "sys_clkout2_src");
	sys_clkout2_src = clk_get(dev, "sys_clkout2_src");
	if (IS_ERR(sys_clkout2_src)) {
	if (IS_ERR(sys_clkout2_src)) {
		dev_err(dev, "Could not get sys_clkout2_src clock\n");
		dev_err(dev, "Could not get sys_clkout2_src clock\n");
		return -ENODEV;
		err = PTR_ERR(sys_clkout2_src);
		goto err2;
	}
	}
	sys_clkout2 = clk_get(dev, "sys_clkout2");
	sys_clkout2 = clk_get(dev, "sys_clkout2");
	if (IS_ERR(sys_clkout2)) {
	if (IS_ERR(sys_clkout2)) {
		dev_err(dev, "Could not get sys_clkout2\n");
		dev_err(dev, "Could not get sys_clkout2\n");
		goto err1;
		err = PTR_ERR(sys_clkout2);
		goto err3;
	}
	}
	/*
	/*
	 * Configure 12 MHz output on SYS_CLKOUT2. Therefore we must use
	 * Configure 12 MHz output on SYS_CLKOUT2. Therefore we must use
@@ -343,7 +345,8 @@ static int __init n810_soc_init(void)
	func96m_clk = clk_get(dev, "func_96m_ck");
	func96m_clk = clk_get(dev, "func_96m_ck");
	if (IS_ERR(func96m_clk)) {
	if (IS_ERR(func96m_clk)) {
		dev_err(dev, "Could not get func 96M clock\n");
		dev_err(dev, "Could not get func 96M clock\n");
		goto err2;
		err = PTR_ERR(func96m_clk);
		goto err4;
	}
	}
	clk_set_parent(sys_clkout2_src, func96m_clk);
	clk_set_parent(sys_clkout2_src, func96m_clk);
	clk_set_rate(sys_clkout2, 12000000);
	clk_set_rate(sys_clkout2, 12000000);
@@ -356,20 +359,25 @@ static int __init n810_soc_init(void)
	gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0);
	gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0);


	return 0;
	return 0;
err2:
err4:
	clk_put(sys_clkout2);
	clk_put(sys_clkout2);
err3:
	clk_put(sys_clkout2_src);
err2:
	platform_device_del(n810_snd_device);
	platform_device_del(n810_snd_device);
err1:
err1:
	platform_device_put(n810_snd_device);
	platform_device_put(n810_snd_device);


	return err;
	return err;

}
}


static void __exit n810_soc_exit(void)
static void __exit n810_soc_exit(void)
{
{
	gpio_free(N810_SPEAKER_AMP_GPIO);
	gpio_free(N810_SPEAKER_AMP_GPIO);
	gpio_free(N810_HEADSET_AMP_GPIO);
	gpio_free(N810_HEADSET_AMP_GPIO);
	clk_put(sys_clkout2_src);
	clk_put(sys_clkout2);
	clk_put(func96m_clk);


	platform_device_unregister(n810_snd_device);
	platform_device_unregister(n810_snd_device);
}
}