162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2020, The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * lpass-sc7180.c -- ALSA SoC platform-machine driver for QTi LPASS
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/clk.h>
962306a36Sopenharmony_ci#include <linux/device.h>
1062306a36Sopenharmony_ci#include <linux/err.h>
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/module.h>
1362306a36Sopenharmony_ci#include <linux/of.h>
1462306a36Sopenharmony_ci#include <linux/platform_device.h>
1562306a36Sopenharmony_ci#include <linux/pm.h>
1662306a36Sopenharmony_ci#include <dt-bindings/sound/sc7180-lpass.h>
1762306a36Sopenharmony_ci#include <sound/pcm.h>
1862306a36Sopenharmony_ci#include <sound/soc.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "lpass-lpaif-reg.h"
2162306a36Sopenharmony_ci#include "lpass.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = {
2462306a36Sopenharmony_ci	{
2562306a36Sopenharmony_ci		.id = MI2S_PRIMARY,
2662306a36Sopenharmony_ci		.name = "Primary MI2S",
2762306a36Sopenharmony_ci		.playback = {
2862306a36Sopenharmony_ci			.stream_name = "Primary Playback",
2962306a36Sopenharmony_ci			.formats	= SNDRV_PCM_FMTBIT_S16,
3062306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_48000,
3162306a36Sopenharmony_ci			.rate_min	= 48000,
3262306a36Sopenharmony_ci			.rate_max	= 48000,
3362306a36Sopenharmony_ci			.channels_min	= 2,
3462306a36Sopenharmony_ci			.channels_max	= 2,
3562306a36Sopenharmony_ci		},
3662306a36Sopenharmony_ci		.capture = {
3762306a36Sopenharmony_ci			.stream_name = "Primary Capture",
3862306a36Sopenharmony_ci			.formats = SNDRV_PCM_FMTBIT_S16 |
3962306a36Sopenharmony_ci				SNDRV_PCM_FMTBIT_S32,
4062306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_48000,
4162306a36Sopenharmony_ci			.rate_min	= 48000,
4262306a36Sopenharmony_ci			.rate_max	= 48000,
4362306a36Sopenharmony_ci			.channels_min	= 2,
4462306a36Sopenharmony_ci			.channels_max	= 2,
4562306a36Sopenharmony_ci		},
4662306a36Sopenharmony_ci		.ops    = &asoc_qcom_lpass_cpu_dai_ops,
4762306a36Sopenharmony_ci	}, {
4862306a36Sopenharmony_ci		.id = MI2S_SECONDARY,
4962306a36Sopenharmony_ci		.name = "Secondary MI2S",
5062306a36Sopenharmony_ci		.playback = {
5162306a36Sopenharmony_ci			.stream_name = "Secondary Playback",
5262306a36Sopenharmony_ci			.formats	= SNDRV_PCM_FMTBIT_S16,
5362306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_48000,
5462306a36Sopenharmony_ci			.rate_min	= 48000,
5562306a36Sopenharmony_ci			.rate_max	= 48000,
5662306a36Sopenharmony_ci			.channels_min	= 2,
5762306a36Sopenharmony_ci			.channels_max	= 2,
5862306a36Sopenharmony_ci		},
5962306a36Sopenharmony_ci		.ops    = &asoc_qcom_lpass_cpu_dai_ops2,
6062306a36Sopenharmony_ci	}, {
6162306a36Sopenharmony_ci		.id = LPASS_DP_RX,
6262306a36Sopenharmony_ci		.name = "Hdmi",
6362306a36Sopenharmony_ci		.playback = {
6462306a36Sopenharmony_ci			.stream_name = "Hdmi Playback",
6562306a36Sopenharmony_ci			.formats	= SNDRV_PCM_FMTBIT_S24,
6662306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_48000,
6762306a36Sopenharmony_ci			.rate_min	= 48000,
6862306a36Sopenharmony_ci			.rate_max	= 48000,
6962306a36Sopenharmony_ci			.channels_min	= 2,
7062306a36Sopenharmony_ci			.channels_max	= 2,
7162306a36Sopenharmony_ci		},
7262306a36Sopenharmony_ci		.ops    = &asoc_qcom_lpass_hdmi_dai_ops,
7362306a36Sopenharmony_ci	},
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic int sc7180_lpass_alloc_dma_channel(struct lpass_data *drvdata,
7762306a36Sopenharmony_ci					   int direction, unsigned int dai_id)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	struct lpass_variant *v = drvdata->variant;
8062306a36Sopenharmony_ci	int chan = 0;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	if (dai_id == LPASS_DP_RX) {
8362306a36Sopenharmony_ci		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
8462306a36Sopenharmony_ci			chan = find_first_zero_bit(&drvdata->hdmi_dma_ch_bit_map,
8562306a36Sopenharmony_ci						v->hdmi_rdma_channels);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci			if (chan >= v->hdmi_rdma_channels)
8862306a36Sopenharmony_ci				return -EBUSY;
8962306a36Sopenharmony_ci		}
9062306a36Sopenharmony_ci		set_bit(chan, &drvdata->hdmi_dma_ch_bit_map);
9162306a36Sopenharmony_ci	} else {
9262306a36Sopenharmony_ci		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
9362306a36Sopenharmony_ci			chan = find_first_zero_bit(&drvdata->dma_ch_bit_map,
9462306a36Sopenharmony_ci						v->rdma_channels);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci			if (chan >= v->rdma_channels)
9762306a36Sopenharmony_ci				return -EBUSY;
9862306a36Sopenharmony_ci		} else {
9962306a36Sopenharmony_ci			chan = find_next_zero_bit(&drvdata->dma_ch_bit_map,
10062306a36Sopenharmony_ci					v->wrdma_channel_start +
10162306a36Sopenharmony_ci					v->wrdma_channels,
10262306a36Sopenharmony_ci					v->wrdma_channel_start);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci			if (chan >=  v->wrdma_channel_start + v->wrdma_channels)
10562306a36Sopenharmony_ci				return -EBUSY;
10662306a36Sopenharmony_ci		}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci		set_bit(chan, &drvdata->dma_ch_bit_map);
10962306a36Sopenharmony_ci	}
11062306a36Sopenharmony_ci	return chan;
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic int sc7180_lpass_free_dma_channel(struct lpass_data *drvdata, int chan, unsigned int dai_id)
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci	if (dai_id == LPASS_DP_RX)
11662306a36Sopenharmony_ci		clear_bit(chan, &drvdata->hdmi_dma_ch_bit_map);
11762306a36Sopenharmony_ci	else
11862306a36Sopenharmony_ci		clear_bit(chan, &drvdata->dma_ch_bit_map);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	return 0;
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic int sc7180_lpass_init(struct platform_device *pdev)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci	struct lpass_data *drvdata = platform_get_drvdata(pdev);
12662306a36Sopenharmony_ci	struct lpass_variant *variant = drvdata->variant;
12762306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
12862306a36Sopenharmony_ci	int ret, i;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	drvdata->clks = devm_kcalloc(dev, variant->num_clks,
13162306a36Sopenharmony_ci				     sizeof(*drvdata->clks), GFP_KERNEL);
13262306a36Sopenharmony_ci	if (!drvdata->clks)
13362306a36Sopenharmony_ci		return -ENOMEM;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	drvdata->num_clks = variant->num_clks;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	for (i = 0; i < drvdata->num_clks; i++)
13862306a36Sopenharmony_ci		drvdata->clks[i].id = variant->clk_name[i];
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	ret = devm_clk_bulk_get(dev, drvdata->num_clks, drvdata->clks);
14162306a36Sopenharmony_ci	if (ret) {
14262306a36Sopenharmony_ci		dev_err(dev, "Failed to get clocks %d\n", ret);
14362306a36Sopenharmony_ci		return ret;
14462306a36Sopenharmony_ci	}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	ret = clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks);
14762306a36Sopenharmony_ci	if (ret) {
14862306a36Sopenharmony_ci		dev_err(dev, "sc7180 clk_enable failed\n");
14962306a36Sopenharmony_ci		return ret;
15062306a36Sopenharmony_ci	}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	return 0;
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic int sc7180_lpass_exit(struct platform_device *pdev)
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	struct lpass_data *drvdata = platform_get_drvdata(pdev);
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks);
16062306a36Sopenharmony_ci	return 0;
16162306a36Sopenharmony_ci}
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cistatic int __maybe_unused sc7180_lpass_dev_resume(struct device *dev)
16462306a36Sopenharmony_ci{
16562306a36Sopenharmony_ci	struct lpass_data *drvdata = dev_get_drvdata(dev);
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	return clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks);
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cistatic int __maybe_unused sc7180_lpass_dev_suspend(struct device *dev)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	struct lpass_data *drvdata = dev_get_drvdata(dev);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks);
17562306a36Sopenharmony_ci	return 0;
17662306a36Sopenharmony_ci}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cistatic const struct dev_pm_ops sc7180_lpass_pm_ops = {
17962306a36Sopenharmony_ci	SET_SYSTEM_SLEEP_PM_OPS(sc7180_lpass_dev_suspend, sc7180_lpass_dev_resume)
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cistatic struct lpass_variant sc7180_data = {
18362306a36Sopenharmony_ci	.i2sctrl_reg_base	= 0x1000,
18462306a36Sopenharmony_ci	.i2sctrl_reg_stride	= 0x1000,
18562306a36Sopenharmony_ci	.i2s_ports		= 3,
18662306a36Sopenharmony_ci	.irq_reg_base		= 0x9000,
18762306a36Sopenharmony_ci	.irq_reg_stride		= 0x1000,
18862306a36Sopenharmony_ci	.irq_ports		= 3,
18962306a36Sopenharmony_ci	.rdma_reg_base		= 0xC000,
19062306a36Sopenharmony_ci	.rdma_reg_stride	= 0x1000,
19162306a36Sopenharmony_ci	.rdma_channels		= 5,
19262306a36Sopenharmony_ci	.hdmi_rdma_reg_base		= 0x64000,
19362306a36Sopenharmony_ci	.hdmi_rdma_reg_stride	= 0x1000,
19462306a36Sopenharmony_ci	.hdmi_rdma_channels		= 4,
19562306a36Sopenharmony_ci	.dmactl_audif_start	= 1,
19662306a36Sopenharmony_ci	.wrdma_reg_base		= 0x18000,
19762306a36Sopenharmony_ci	.wrdma_reg_stride	= 0x1000,
19862306a36Sopenharmony_ci	.wrdma_channel_start	= 5,
19962306a36Sopenharmony_ci	.wrdma_channels		= 4,
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	.loopback		= REG_FIELD_ID(0x1000, 17, 17, 3, 0x1000),
20262306a36Sopenharmony_ci	.spken			= REG_FIELD_ID(0x1000, 16, 16, 3, 0x1000),
20362306a36Sopenharmony_ci	.spkmode		= REG_FIELD_ID(0x1000, 11, 15, 3, 0x1000),
20462306a36Sopenharmony_ci	.spkmono		= REG_FIELD_ID(0x1000, 10, 10, 3, 0x1000),
20562306a36Sopenharmony_ci	.micen			= REG_FIELD_ID(0x1000, 9, 9, 3, 0x1000),
20662306a36Sopenharmony_ci	.micmode		= REG_FIELD_ID(0x1000, 4, 8, 3, 0x1000),
20762306a36Sopenharmony_ci	.micmono		= REG_FIELD_ID(0x1000, 3, 3, 3, 0x1000),
20862306a36Sopenharmony_ci	.wssrc			= REG_FIELD_ID(0x1000, 2, 2, 3, 0x1000),
20962306a36Sopenharmony_ci	.bitwidth		= REG_FIELD_ID(0x1000, 0, 1, 3, 0x1000),
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	.rdma_dyncclk		= REG_FIELD_ID(0xC000, 21, 21, 5, 0x1000),
21262306a36Sopenharmony_ci	.rdma_bursten		= REG_FIELD_ID(0xC000, 20, 20, 5, 0x1000),
21362306a36Sopenharmony_ci	.rdma_wpscnt		= REG_FIELD_ID(0xC000, 16, 19, 5, 0x1000),
21462306a36Sopenharmony_ci	.rdma_intf			= REG_FIELD_ID(0xC000, 12, 15, 5, 0x1000),
21562306a36Sopenharmony_ci	.rdma_fifowm		= REG_FIELD_ID(0xC000, 1, 5, 5, 0x1000),
21662306a36Sopenharmony_ci	.rdma_enable		= REG_FIELD_ID(0xC000, 0, 0, 5, 0x1000),
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	.wrdma_dyncclk		= REG_FIELD_ID(0x18000, 22, 22, 4, 0x1000),
21962306a36Sopenharmony_ci	.wrdma_bursten		= REG_FIELD_ID(0x18000, 21, 21, 4, 0x1000),
22062306a36Sopenharmony_ci	.wrdma_wpscnt		= REG_FIELD_ID(0x18000, 17, 20, 4, 0x1000),
22162306a36Sopenharmony_ci	.wrdma_intf		= REG_FIELD_ID(0x18000, 12, 16, 4, 0x1000),
22262306a36Sopenharmony_ci	.wrdma_fifowm		= REG_FIELD_ID(0x18000, 1, 5, 4, 0x1000),
22362306a36Sopenharmony_ci	.wrdma_enable		= REG_FIELD_ID(0x18000, 0, 0, 4, 0x1000),
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	.hdmi_tx_ctl_addr	= 0x1000,
22662306a36Sopenharmony_ci	.hdmi_legacy_addr	= 0x1008,
22762306a36Sopenharmony_ci	.hdmi_vbit_addr		= 0x610c0,
22862306a36Sopenharmony_ci	.hdmi_ch_lsb_addr	= 0x61048,
22962306a36Sopenharmony_ci	.hdmi_ch_msb_addr	= 0x6104c,
23062306a36Sopenharmony_ci	.ch_stride		= 0x8,
23162306a36Sopenharmony_ci	.hdmi_parity_addr	= 0x61034,
23262306a36Sopenharmony_ci	.hdmi_dmactl_addr	= 0x61038,
23362306a36Sopenharmony_ci	.hdmi_dma_stride	= 0x4,
23462306a36Sopenharmony_ci	.hdmi_DP_addr		= 0x610c8,
23562306a36Sopenharmony_ci	.hdmi_sstream_addr	= 0x6101c,
23662306a36Sopenharmony_ci	.hdmi_irq_reg_base		= 0x63000,
23762306a36Sopenharmony_ci	.hdmi_irq_ports		= 1,
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	.hdmi_rdma_dyncclk		= REG_FIELD_ID(0x64000, 14, 14, 4, 0x1000),
24062306a36Sopenharmony_ci	.hdmi_rdma_bursten		= REG_FIELD_ID(0x64000, 13, 13, 4, 0x1000),
24162306a36Sopenharmony_ci	.hdmi_rdma_burst8		= REG_FIELD_ID(0x64000, 15, 15, 4, 0x1000),
24262306a36Sopenharmony_ci	.hdmi_rdma_burst16		= REG_FIELD_ID(0x64000, 16, 16, 4, 0x1000),
24362306a36Sopenharmony_ci	.hdmi_rdma_dynburst		= REG_FIELD_ID(0x64000, 18, 18, 4, 0x1000),
24462306a36Sopenharmony_ci	.hdmi_rdma_wpscnt		= REG_FIELD_ID(0x64000, 10, 12, 4, 0x1000),
24562306a36Sopenharmony_ci	.hdmi_rdma_fifowm		= REG_FIELD_ID(0x64000, 1, 5, 4, 0x1000),
24662306a36Sopenharmony_ci	.hdmi_rdma_enable		= REG_FIELD_ID(0x64000, 0, 0, 4, 0x1000),
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	.sstream_en		= REG_FIELD(0x6101c, 0, 0),
24962306a36Sopenharmony_ci	.dma_sel			= REG_FIELD(0x6101c, 1, 2),
25062306a36Sopenharmony_ci	.auto_bbit_en	= REG_FIELD(0x6101c, 3, 3),
25162306a36Sopenharmony_ci	.layout			= REG_FIELD(0x6101c, 4, 4),
25262306a36Sopenharmony_ci	.layout_sp		= REG_FIELD(0x6101c, 5, 8),
25362306a36Sopenharmony_ci	.set_sp_on_en	= REG_FIELD(0x6101c, 10, 10),
25462306a36Sopenharmony_ci	.dp_audio		= REG_FIELD(0x6101c, 11, 11),
25562306a36Sopenharmony_ci	.dp_staffing_en	= REG_FIELD(0x6101c, 12, 12),
25662306a36Sopenharmony_ci	.dp_sp_b_hw_en	= REG_FIELD(0x6101c, 13, 13),
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	.mute			= REG_FIELD(0x610c8, 0, 0),
25962306a36Sopenharmony_ci	.as_sdp_cc		= REG_FIELD(0x610c8, 1, 3),
26062306a36Sopenharmony_ci	.as_sdp_ct		= REG_FIELD(0x610c8, 4, 7),
26162306a36Sopenharmony_ci	.aif_db4			= REG_FIELD(0x610c8, 8, 15),
26262306a36Sopenharmony_ci	.frequency		= REG_FIELD(0x610c8, 16, 21),
26362306a36Sopenharmony_ci	.mst_index		= REG_FIELD(0x610c8, 28, 29),
26462306a36Sopenharmony_ci	.dptx_index		= REG_FIELD(0x610c8, 30, 31),
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	.soft_reset		= REG_FIELD(0x1000, 31, 31),
26762306a36Sopenharmony_ci	.force_reset	= REG_FIELD(0x1000, 30, 30),
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	.use_hw_chs		= REG_FIELD(0x61038, 0, 0),
27062306a36Sopenharmony_ci	.use_hw_usr		= REG_FIELD(0x61038, 1, 1),
27162306a36Sopenharmony_ci	.hw_chs_sel		= REG_FIELD(0x61038, 2, 4),
27262306a36Sopenharmony_ci	.hw_usr_sel		= REG_FIELD(0x61038, 5, 6),
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	.replace_vbit	= REG_FIELD(0x610c0, 0, 0),
27562306a36Sopenharmony_ci	.vbit_stream	= REG_FIELD(0x610c0, 1, 1),
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	.legacy_en		=  REG_FIELD(0x1008, 0, 0),
27862306a36Sopenharmony_ci	.calc_en		=  REG_FIELD(0x61034, 0, 0),
27962306a36Sopenharmony_ci	.lsb_bits		=  REG_FIELD(0x61048, 0, 31),
28062306a36Sopenharmony_ci	.msb_bits		=  REG_FIELD(0x6104c, 0, 31),
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	.clk_name		= (const char*[]) {
28462306a36Sopenharmony_ci				   "pcnoc-sway-clk",
28562306a36Sopenharmony_ci				   "audio-core",
28662306a36Sopenharmony_ci				   "pcnoc-mport-clk",
28762306a36Sopenharmony_ci				},
28862306a36Sopenharmony_ci	.num_clks		= 3,
28962306a36Sopenharmony_ci	.dai_driver		= sc7180_lpass_cpu_dai_driver,
29062306a36Sopenharmony_ci	.num_dai		= ARRAY_SIZE(sc7180_lpass_cpu_dai_driver),
29162306a36Sopenharmony_ci	.dai_osr_clk_names      = (const char *[]) {
29262306a36Sopenharmony_ci				   "mclk0",
29362306a36Sopenharmony_ci				   "null",
29462306a36Sopenharmony_ci				},
29562306a36Sopenharmony_ci	.dai_bit_clk_names      = (const char *[]) {
29662306a36Sopenharmony_ci				   "mi2s-bit-clk0",
29762306a36Sopenharmony_ci				   "mi2s-bit-clk1",
29862306a36Sopenharmony_ci				},
29962306a36Sopenharmony_ci	.init			= sc7180_lpass_init,
30062306a36Sopenharmony_ci	.exit			= sc7180_lpass_exit,
30162306a36Sopenharmony_ci	.alloc_dma_channel	= sc7180_lpass_alloc_dma_channel,
30262306a36Sopenharmony_ci	.free_dma_channel	= sc7180_lpass_free_dma_channel,
30362306a36Sopenharmony_ci};
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic const struct of_device_id sc7180_lpass_cpu_device_id[] __maybe_unused = {
30662306a36Sopenharmony_ci	{.compatible = "qcom,sc7180-lpass-cpu", .data = &sc7180_data},
30762306a36Sopenharmony_ci	{}
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, sc7180_lpass_cpu_device_id);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic struct platform_driver sc7180_lpass_cpu_platform_driver = {
31262306a36Sopenharmony_ci	.driver = {
31362306a36Sopenharmony_ci		.name = "sc7180-lpass-cpu",
31462306a36Sopenharmony_ci		.of_match_table = of_match_ptr(sc7180_lpass_cpu_device_id),
31562306a36Sopenharmony_ci		.pm = &sc7180_lpass_pm_ops,
31662306a36Sopenharmony_ci	},
31762306a36Sopenharmony_ci	.probe = asoc_qcom_lpass_cpu_platform_probe,
31862306a36Sopenharmony_ci	.remove = asoc_qcom_lpass_cpu_platform_remove,
31962306a36Sopenharmony_ci	.shutdown = asoc_qcom_lpass_cpu_platform_shutdown,
32062306a36Sopenharmony_ci};
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cimodule_platform_driver(sc7180_lpass_cpu_platform_driver);
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ciMODULE_DESCRIPTION("SC7180 LPASS CPU DRIVER");
32562306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
326