ASoC: tegra-alt: unify tegra-alt driver

Unify adsp and i2s driver to support kernel unification.

Bug 200257345

Change-Id: Ic472c4fec0e1febf9b26a9a0ad67138329a25884
Signed-off-by: Mohan Kumar <mkumard@nvidia.com>
Reviewed-on: http://git-master/r/1477310
GVS: Gerrit_Virtual_Submit
Reviewed-by: Sameer Pujar <spujar@nvidia.com>
Reviewed-by: Dipesh Gandhi <dipeshg@nvidia.com>
Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com>
This commit is contained in:
Mohan Kumar
2017-05-08 14:59:28 +05:30
committed by Sameer Pujar
parent f070dc4c40
commit 9a3f4fe1d7
2 changed files with 43 additions and 23 deletions

View File

@@ -143,8 +143,13 @@ struct tegra210_adsp_compr_rtd {
int is_draining;
};
struct adsp_soc_data {
bool is_soc_t210;
};
struct tegra210_adsp {
struct device *dev;
struct adsp_soc_data *soc_data;
struct tegra210_adsp_app apps[TEGRA210_ADSP_VIRT_REG_MAX];
atomic_t reg_val[TEGRA210_ADSP_VIRT_REG_MAX];
DECLARE_BITMAP(adma_usage, TEGRA210_ADSP_ADMA_CHANNEL_COUNT);
@@ -2619,7 +2624,7 @@ static int tegra210_adsp_runtime_suspend(struct device *dev)
adsp->adsp_started = 0;
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
if (IS_ENABLED(CONFIG_ARCH_TEGRA_18x_SOC))
if (!adsp->soc_data->is_soc_t210)
clk_disable_unprepare(adsp->apb2ape_clk);
clk_disable_unprepare(adsp->ahub_clk);
clk_disable_unprepare(adsp->ape_clk);
@@ -2650,7 +2655,7 @@ static int tegra210_adsp_runtime_resume(struct device *dev)
return ret;
}
if (IS_ENABLED(CONFIG_ARCH_TEGRA_18x_SOC)) {
if (!adsp->soc_data->is_soc_t210) {
ret = clk_prepare_enable(adsp->apb2ape_clk);
if (ret < 0) {
dev_err(dev, "apb2ape clk_enable failed: %d\n"
@@ -4368,9 +4373,18 @@ static struct snd_soc_platform_driver tegra210_adsp_platform = {
static u64 tegra_dma_mask = DMA_BIT_MASK(32);
static struct adsp_soc_data adsp_soc_data_t210 = {
.is_soc_t210 = true,
};
static struct adsp_soc_data adsp_soc_data_t186 = {
.is_soc_t210 = false,
};
static const struct of_device_id tegra210_adsp_audio_of_match[] = {
{ .compatible = "nvidia,tegra210-adsp-audio", },
{ .compatible = "nvidia,tegra210-adsp-audio-hv", },
{ .compatible = "nvidia,tegra210-adsp-audio", .data = &adsp_soc_data_t210},
{ .compatible = "nvidia,tegra186-adsp-audio", .data = &adsp_soc_data_t186},
{ .compatible = "nvidia,tegra210-adsp-audio-hv", .data = &adsp_soc_data_t186},
{},
};
@@ -4423,6 +4437,7 @@ static int tegra210_adsp_audio_platform_probe(struct platform_device *pdev)
}
dev_set_drvdata(&pdev->dev, adsp);
adsp->dev = &pdev->dev;
adsp->soc_data = (struct adsp_soc_data *)match->data;
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
@@ -4440,7 +4455,7 @@ static int tegra210_adsp_audio_platform_probe(struct platform_device *pdev)
goto err;
}
if (!IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)) {
if (!adsp->soc_data->is_soc_t210) {
adsp->apb2ape_clk = devm_clk_get(&pdev->dev, "apb2ape");
if (IS_ERR(adsp->apb2ape_clk)) {
dev_err(&pdev->dev, "Error: Missing APB2APE clock\n");
@@ -4619,7 +4634,7 @@ err_unregister_platform:
err_pm_disable:
pm_runtime_disable(&pdev->dev);
err:
if (IS_ENABLED(CONFIG_ARCH_TEGRA_18x_SOC))
if (!adsp->soc_data->is_soc_t210)
if (!IS_ERR_OR_NULL(adsp->apb2ape_clk))
tegra_alt_asoc_utils_clk_put
(&pdev->dev, adsp->apb2ape_clk);
@@ -4639,7 +4654,7 @@ static int __maybe_unused tegra210_adsp_audio_platform_remove(
struct tegra210_adsp *adsp = dev_get_drvdata(&pdev->dev);
pm_runtime_disable(&pdev->dev);
if (IS_ENABLED(CONFIG_ARCH_TEGRA_18x_SOC))
if (!adsp->soc_data->is_soc_t210)
if (!IS_ERR_OR_NULL(adsp->apb2ape_clk))
tegra_alt_asoc_utils_clk_put
(&pdev->dev, adsp->apb2ape_clk);

View File

@@ -46,14 +46,12 @@
#define DRV_NAME "tegra210-i2s"
#if defined(CONFIG_ARCH_TEGRA_21X_SOC)
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
static struct of_device_id tegra_ape_pd[] = {
{ .compatible = "nvidia,tegra210-ape-pd", },
{},
};
#endif
#endif
static const struct reg_default tegra210_i2s_reg_defaults[] = {
{ TEGRA210_I2S_AXBAR_RX_INT_MASK, 0x00000003},
@@ -981,10 +979,18 @@ static const struct regmap_config tegra210_i2s_regmap_config = {
static const struct tegra210_i2s_soc_data soc_data_tegra210 = {
.set_audio_cif = tegra210_xbar_set_cif,
.set_slot_ctrl = tegra210_i2s_set_slot_ctrl,
.is_soc_t210 = true,
};
static const struct tegra210_i2s_soc_data soc_data_tegra186 = {
.set_audio_cif = tegra210_xbar_set_cif,
.set_slot_ctrl = tegra210_i2s_set_slot_ctrl,
.is_soc_t210 = false,
};
static const struct of_device_id tegra210_i2s_of_match[] = {
{ .compatible = "nvidia,tegra210-i2s", .data = &soc_data_tegra210 },
{ .compatible = "nvidia,tegra186-i2s", .data = &soc_data_tegra186 },
{},
};
@@ -999,17 +1005,7 @@ static int tegra210_i2s_platform_probe(struct platform_device *pdev)
void __iomem *regs;
int ret = 0, count = 0, num_supplies;
const char *supply, *prod_name;
#if defined(CONFIG_ARCH_TEGRA_21X_SOC)
int partition_id;
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
partition_id = tegra_pd_get_powergate_id(tegra_ape_pd);
if (partition_id < 0)
return -EINVAL;
#else
partition_id = TEGRA_POWERGATE_APE;
#endif
#endif
int partition_id = 0;
match = of_match_device(tegra210_i2s_of_match, &pdev->dev);
if (!match) {
@@ -1032,6 +1028,16 @@ static int tegra210_i2s_platform_probe(struct platform_device *pdev)
i2s->enable_cya = false;
i2s->loopback = 0;
if (i2s->soc_data->is_soc_t210) {
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
partition_id = tegra_pd_get_powergate_id(tegra_ape_pd);
if (partition_id < 0)
return -EINVAL;
#else
partition_id = TEGRA_POWERGATE_APE;
#endif
}
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
i2s->clk_i2s = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(i2s->clk_i2s)) {
@@ -1092,10 +1098,9 @@ static int tegra210_i2s_platform_probe(struct platform_device *pdev)
}
i2s->slgc_notifier.notifier_call = _tegra210_i2s_slcg_notifier;
#if defined(CONFIG_ARCH_TEGRA_21X_SOC)
slcg_register_notifier(partition_id, &i2s->slgc_notifier);
#endif
if (i2s->soc_data->is_soc_t210)
slcg_register_notifier(partition_id, &i2s->slgc_notifier);
regcache_cache_only(i2s->regmap, true);