diff options
Diffstat (limited to 'sound/soc/codecs/lpass-tx-macro.c')
| -rw-r--r-- | sound/soc/codecs/lpass-tx-macro.c | 56 | 
1 files changed, 37 insertions, 19 deletions
diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c index bf27bdd5be20..da6fcf7f0991 100644 --- a/sound/soc/codecs/lpass-tx-macro.c +++ b/sound/soc/codecs/lpass-tx-macro.c @@ -242,7 +242,7 @@ enum {  struct tx_mute_work {  	struct tx_macro *tx; -	u32 decimator; +	u8 decimator;  	struct delayed_work dwork;  }; @@ -635,7 +635,7 @@ exit:  	return 0;  } -static bool is_amic_enabled(struct snd_soc_component *component, int decimator) +static bool is_amic_enabled(struct snd_soc_component *component, u8 decimator)  {  	u16 adc_mux_reg, adc_reg, adc_n; @@ -849,7 +849,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,  			       struct snd_kcontrol *kcontrol, int event)  {  	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); -	unsigned int decimator; +	u8 decimator;  	u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg, tx_gain_ctl_reg;  	u8 hpf_cut_off_freq;  	int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS; @@ -1064,7 +1064,8 @@ static int tx_macro_hw_params(struct snd_pcm_substream *substream,  			      struct snd_soc_dai *dai)  {  	struct snd_soc_component *component = dai->component; -	u32 decimator, sample_rate; +	u32 sample_rate; +	u8 decimator;  	int tx_fs_rate;  	struct tx_macro *tx = snd_soc_component_get_drvdata(component); @@ -1128,7 +1129,7 @@ static int tx_macro_digital_mute(struct snd_soc_dai *dai, int mute, int stream)  {  	struct snd_soc_component *component = dai->component;  	struct tx_macro *tx = snd_soc_component_get_drvdata(component); -	u16 decimator; +	u8 decimator;  	/* active decimator not set yet */  	if (tx->active_decimator[dai->id] == -1) @@ -1914,7 +1915,10 @@ static int tx_macro_register_mclk_output(struct tx_macro *tx)  	struct clk_init_data init;  	int ret; -	parent_clk_name = __clk_get_name(tx->npl); +	if (tx->npl) +		parent_clk_name = __clk_get_name(tx->npl); +	else +		parent_clk_name = __clk_get_name(tx->mclk);  	init.name = clk_name;  	init.ops = &swclk_gate_ops; @@ -1945,10 +1949,13 @@ static int tx_macro_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct device_node *np = dev->of_node; +	kernel_ulong_t flags;  	struct tx_macro *tx;  	void __iomem *base;  	int ret, reg; +	flags = (kernel_ulong_t)device_get_match_data(dev); +  	tx = devm_kzalloc(dev, sizeof(*tx), GFP_KERNEL);  	if (!tx)  		return -ENOMEM; @@ -1965,9 +1972,11 @@ static int tx_macro_probe(struct platform_device *pdev)  	if (IS_ERR(tx->mclk))  		return PTR_ERR(tx->mclk); -	tx->npl = devm_clk_get(dev, "npl"); -	if (IS_ERR(tx->npl)) -		return PTR_ERR(tx->npl); +	if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) { +		tx->npl = devm_clk_get(dev, "npl"); +		if (IS_ERR(tx->npl)) +			return PTR_ERR(tx->npl); +	}  	tx->fsgen = devm_clk_get(dev, "fsgen");  	if (IS_ERR(tx->fsgen)) @@ -2075,7 +2084,7 @@ err:  	return ret;  } -static int tx_macro_remove(struct platform_device *pdev) +static void tx_macro_remove(struct platform_device *pdev)  {  	struct tx_macro *tx = dev_get_drvdata(&pdev->dev); @@ -2086,8 +2095,6 @@ static int tx_macro_remove(struct platform_device *pdev)  	clk_disable_unprepare(tx->fsgen);  	lpass_macro_pds_exit(tx->pds); - -	return 0;  }  static int __maybe_unused tx_macro_runtime_suspend(struct device *dev) @@ -2097,9 +2104,9 @@ static int __maybe_unused tx_macro_runtime_suspend(struct device *dev)  	regcache_cache_only(tx->regmap, true);  	regcache_mark_dirty(tx->regmap); -	clk_disable_unprepare(tx->mclk); -	clk_disable_unprepare(tx->npl);  	clk_disable_unprepare(tx->fsgen); +	clk_disable_unprepare(tx->npl); +	clk_disable_unprepare(tx->mclk);  	return 0;  } @@ -2144,10 +2151,21 @@ static const struct dev_pm_ops tx_macro_pm_ops = {  };  static const struct of_device_id tx_macro_dt_match[] = { -	{ .compatible = "qcom,sc7280-lpass-tx-macro" }, -	{ .compatible = "qcom,sm8250-lpass-tx-macro" }, -	{ .compatible = "qcom,sm8450-lpass-tx-macro" }, -	{ .compatible = "qcom,sc8280xp-lpass-tx-macro" }, +	{ +		.compatible = "qcom,sc7280-lpass-tx-macro", +		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, +	}, { +		.compatible = "qcom,sm8250-lpass-tx-macro", +		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, +	}, { +		.compatible = "qcom,sm8450-lpass-tx-macro", +		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, +	}, { +		.compatible = "qcom,sm8550-lpass-tx-macro", +	}, { +		.compatible = "qcom,sc8280xp-lpass-tx-macro", +		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK, +	},  	{ }  };  MODULE_DEVICE_TABLE(of, tx_macro_dt_match); @@ -2159,7 +2177,7 @@ static struct platform_driver tx_macro_driver = {  		.pm = &tx_macro_pm_ops,  	},  	.probe = tx_macro_probe, -	.remove = tx_macro_remove, +	.remove_new = tx_macro_remove,  };  module_platform_driver(tx_macro_driver);  |