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

Commit 09f3c6d7 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: audio-ext-clk: Add pmi clk support for tasha"

parents 80a0e4c5 3124d60c
Loading
Loading
Loading
Loading
+44 −2
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
/*
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/kernel.h>
@@ -9,6 +10,8 @@
#include <linux/of.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include "../../../drivers/clk/qcom/common.h"
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
@@ -29,6 +32,7 @@ enum {
	AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE,
	AUDIO_EXT_CLK_LPASS8,
	AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE,
	AUDIO_EXT_CLK_PM660_PMI,
	AUDIO_EXT_CLK_LPASS_MAX,
	AUDIO_EXT_CLK_EXTERNAL_PLL = AUDIO_EXT_CLK_LPASS_MAX,
	AUDIO_EXT_CLK_MAX,
@@ -44,6 +48,7 @@ struct pinctrl_info {
struct audio_ext_clk {
	struct pinctrl_info pnctrl_info;
	struct clk_fixed_factor fact;
	int gpio;
};

struct audio_ext_clk_priv {
@@ -387,6 +392,19 @@ static struct audio_ext_clk audio_clk_array[] = {
			},
		},
	},
	{
		.gpio = -EINVAL,
		.fact = {
			.mult = 1,
			.div = 1,
			.hw.init = &(struct clk_init_data){
				.name = "audio_ext_pm660_pmi_clk",
				.parent_names = (const char *[]){ "div_clk1" },
				.num_parents = 1,
				.ops = &audio_ext_clk_dummy_ops,
			},
		},
	},
};

static int audio_get_pinctrl(struct platform_device *pdev)
@@ -510,6 +528,7 @@ static int audio_ref_clk_probe(struct platform_device *pdev)
	int ret;
	struct audio_ext_clk_priv *clk_priv;
	u32 clk_freq = 0, clk_id = 0, clk_src = 0, use_pinctrl = 0;
	int clk_gpio;

	clk_priv = devm_kzalloc(&pdev->dev, sizeof(*clk_priv), GFP_KERNEL);
	if (!clk_priv)
@@ -581,11 +600,30 @@ static int audio_ref_clk_probe(struct platform_device *pdev)
		}
	}

	clk_gpio = of_get_named_gpio(pdev->dev.of_node,
				"qcom,audio-ref-clk-gpio", 0);
	if (clk_gpio > 0) {
		ret = gpio_request(clk_gpio, "EXT_CLK");
		if (ret) {
			dev_err(&pdev->dev,
				"Request ext clk gpio failed %d, err:%d\n",
				clk_gpio, ret);
			return ret;
		}
		if (of_property_read_bool(pdev->dev.of_node,
				"qcom,node_has_rpm_clock")) {
			clk_priv->audio_clk.gpio = clk_gpio;
		}
	}

	ret = audio_get_clk_data(pdev);
	if (ret) {
		dev_err(&pdev->dev, "%s: clk_init is failed\n",
			__func__);
		if (use_pinctrl)
			audio_put_pinctrl(pdev);
		if (clk_priv->audio_clk.gpio > 0)
			gpio_free(clk_priv->audio_clk.gpio);
		return ret;
	}
	return 0;
@@ -593,7 +631,11 @@ static int audio_ref_clk_probe(struct platform_device *pdev)

static int audio_ref_clk_remove(struct platform_device *pdev)
{
	struct audio_ext_clk_priv *clk_priv = platform_get_drvdata(pdev);

	audio_put_pinctrl(pdev);
	if (clk_priv->audio_clk.gpio > 0)
		gpio_free(clk_priv->audio_clk.gpio);

	return 0;
}