162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2022, Linaro Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/clk-provider.h>
762306a36Sopenharmony_ci#include <linux/err.h>
862306a36Sopenharmony_ci#include <linux/kernel.h>
962306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/of.h>
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci#include <linux/regmap.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <dt-bindings/clock/qcom,sc8280xp-lpasscc.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include "common.h"
1862306a36Sopenharmony_ci#include "reset.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic const struct qcom_reset_map lpass_audiocc_sc8280xp_resets[] = {
2162306a36Sopenharmony_ci	[LPASS_AUDIO_SWR_RX_CGCR] =  { 0xa0, 1 },
2262306a36Sopenharmony_ci	[LPASS_AUDIO_SWR_WSA_CGCR] = { 0xb0, 1 },
2362306a36Sopenharmony_ci	[LPASS_AUDIO_SWR_WSA2_CGCR] =  { 0xd8, 1 },
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic struct regmap_config lpass_audiocc_sc8280xp_regmap_config = {
2762306a36Sopenharmony_ci	.reg_bits = 32,
2862306a36Sopenharmony_ci	.reg_stride = 4,
2962306a36Sopenharmony_ci	.val_bits = 32,
3062306a36Sopenharmony_ci	.name = "lpass-audio-csr",
3162306a36Sopenharmony_ci	.max_register = 0x1000,
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic const struct qcom_cc_desc lpass_audiocc_sc8280xp_reset_desc = {
3562306a36Sopenharmony_ci	.config = &lpass_audiocc_sc8280xp_regmap_config,
3662306a36Sopenharmony_ci	.resets = lpass_audiocc_sc8280xp_resets,
3762306a36Sopenharmony_ci	.num_resets = ARRAY_SIZE(lpass_audiocc_sc8280xp_resets),
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic const struct qcom_reset_map lpasscc_sc8280xp_resets[] = {
4162306a36Sopenharmony_ci	[LPASS_AUDIO_SWR_TX_CGCR] = { 0xc010, 1 },
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic struct regmap_config lpasscc_sc8280xp_regmap_config = {
4562306a36Sopenharmony_ci	.reg_bits = 32,
4662306a36Sopenharmony_ci	.reg_stride = 4,
4762306a36Sopenharmony_ci	.val_bits = 32,
4862306a36Sopenharmony_ci	.name = "lpass-tcsr",
4962306a36Sopenharmony_ci	.max_register = 0x12000,
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic const struct qcom_cc_desc lpasscc_sc8280xp_reset_desc = {
5362306a36Sopenharmony_ci	.config = &lpasscc_sc8280xp_regmap_config,
5462306a36Sopenharmony_ci	.resets = lpasscc_sc8280xp_resets,
5562306a36Sopenharmony_ci	.num_resets = ARRAY_SIZE(lpasscc_sc8280xp_resets),
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic const struct of_device_id lpasscc_sc8280xp_match_table[] = {
5962306a36Sopenharmony_ci	{
6062306a36Sopenharmony_ci		.compatible = "qcom,sc8280xp-lpassaudiocc",
6162306a36Sopenharmony_ci		.data = &lpass_audiocc_sc8280xp_reset_desc,
6262306a36Sopenharmony_ci	}, {
6362306a36Sopenharmony_ci		.compatible = "qcom,sc8280xp-lpasscc",
6462306a36Sopenharmony_ci		.data = &lpasscc_sc8280xp_reset_desc,
6562306a36Sopenharmony_ci	},
6662306a36Sopenharmony_ci	{ }
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, lpasscc_sc8280xp_match_table);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic int lpasscc_sc8280xp_probe(struct platform_device *pdev)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	const struct qcom_cc_desc *desc = of_device_get_match_data(&pdev->dev);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	return qcom_cc_probe_by_index(pdev, 0, desc);
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic struct platform_driver lpasscc_sc8280xp_driver = {
7862306a36Sopenharmony_ci	.probe = lpasscc_sc8280xp_probe,
7962306a36Sopenharmony_ci	.driver = {
8062306a36Sopenharmony_ci		.name = "lpasscc-sc8280xp",
8162306a36Sopenharmony_ci		.of_match_table = lpasscc_sc8280xp_match_table,
8262306a36Sopenharmony_ci	},
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cimodule_platform_driver(lpasscc_sc8280xp_driver);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciMODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org>");
8862306a36Sopenharmony_ciMODULE_DESCRIPTION("QTI LPASSCC SC8280XP Driver");
8962306a36Sopenharmony_ciMODULE_LICENSE("GPL");
90