1a5c9c3baSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only 2a5c9c3baSSrinivas Kandagatla /* 3a5c9c3baSSrinivas Kandagatla * Copyright (c) 2022, Linaro Limited 4a5c9c3baSSrinivas Kandagatla */ 5a5c9c3baSSrinivas Kandagatla 6a5c9c3baSSrinivas Kandagatla #include <linux/clk-provider.h> 7a5c9c3baSSrinivas Kandagatla #include <linux/err.h> 8a5c9c3baSSrinivas Kandagatla #include <linux/kernel.h> 9a5c9c3baSSrinivas Kandagatla #include <linux/module.h> 10a5c9c3baSSrinivas Kandagatla #include <linux/of_device.h> 11a5c9c3baSSrinivas Kandagatla #include <linux/regmap.h> 12a5c9c3baSSrinivas Kandagatla 13a5c9c3baSSrinivas Kandagatla #include <dt-bindings/clock/qcom,sc8280xp-lpasscc.h> 14a5c9c3baSSrinivas Kandagatla 15a5c9c3baSSrinivas Kandagatla #include "common.h" 16a5c9c3baSSrinivas Kandagatla #include "reset.h" 17a5c9c3baSSrinivas Kandagatla 18*c2ef1ec9SSrinivas Kandagatla static const struct qcom_reset_map lpass_audiocc_sc8280xp_resets[] = { 19*c2ef1ec9SSrinivas Kandagatla [LPASS_AUDIO_SWR_RX_CGCR] = { 0xa0, 1 }, 20*c2ef1ec9SSrinivas Kandagatla [LPASS_AUDIO_SWR_WSA_CGCR] = { 0xb0, 1 }, 21*c2ef1ec9SSrinivas Kandagatla [LPASS_AUDIO_SWR_WSA2_CGCR] = { 0xd8, 1 }, 22*c2ef1ec9SSrinivas Kandagatla }; 23*c2ef1ec9SSrinivas Kandagatla 24*c2ef1ec9SSrinivas Kandagatla static struct regmap_config lpass_audiocc_sc8280xp_regmap_config = { 25*c2ef1ec9SSrinivas Kandagatla .reg_bits = 32, 26*c2ef1ec9SSrinivas Kandagatla .reg_stride = 4, 27*c2ef1ec9SSrinivas Kandagatla .val_bits = 32, 28*c2ef1ec9SSrinivas Kandagatla .name = "lpass-audio-csr", 29*c2ef1ec9SSrinivas Kandagatla .max_register = 0x1000, 30*c2ef1ec9SSrinivas Kandagatla }; 31*c2ef1ec9SSrinivas Kandagatla 32*c2ef1ec9SSrinivas Kandagatla static const struct qcom_cc_desc lpass_audiocc_sc8280xp_reset_desc = { 33*c2ef1ec9SSrinivas Kandagatla .config = &lpass_audiocc_sc8280xp_regmap_config, 34*c2ef1ec9SSrinivas Kandagatla .resets = lpass_audiocc_sc8280xp_resets, 35*c2ef1ec9SSrinivas Kandagatla .num_resets = ARRAY_SIZE(lpass_audiocc_sc8280xp_resets), 36*c2ef1ec9SSrinivas Kandagatla }; 37*c2ef1ec9SSrinivas Kandagatla 38a5c9c3baSSrinivas Kandagatla static const struct qcom_reset_map lpasscc_sc8280xp_resets[] = { 39a5c9c3baSSrinivas Kandagatla [LPASS_AUDIO_SWR_TX_CGCR] = { 0xc010, 1 }, 40a5c9c3baSSrinivas Kandagatla }; 41a5c9c3baSSrinivas Kandagatla 42a5c9c3baSSrinivas Kandagatla static struct regmap_config lpasscc_sc8280xp_regmap_config = { 43a5c9c3baSSrinivas Kandagatla .reg_bits = 32, 44a5c9c3baSSrinivas Kandagatla .reg_stride = 4, 45a5c9c3baSSrinivas Kandagatla .val_bits = 32, 46a5c9c3baSSrinivas Kandagatla .name = "lpass-tcsr", 47a5c9c3baSSrinivas Kandagatla .max_register = 0x12000, 48a5c9c3baSSrinivas Kandagatla }; 49a5c9c3baSSrinivas Kandagatla 50a5c9c3baSSrinivas Kandagatla static const struct qcom_cc_desc lpasscc_sc8280xp_reset_desc = { 51a5c9c3baSSrinivas Kandagatla .config = &lpasscc_sc8280xp_regmap_config, 52a5c9c3baSSrinivas Kandagatla .resets = lpasscc_sc8280xp_resets, 53a5c9c3baSSrinivas Kandagatla .num_resets = ARRAY_SIZE(lpasscc_sc8280xp_resets), 54a5c9c3baSSrinivas Kandagatla }; 55a5c9c3baSSrinivas Kandagatla 56a5c9c3baSSrinivas Kandagatla static const struct of_device_id lpasscc_sc8280xp_match_table[] = { 57a5c9c3baSSrinivas Kandagatla { 58*c2ef1ec9SSrinivas Kandagatla .compatible = "qcom,sc8280xp-lpassaudiocc", 59*c2ef1ec9SSrinivas Kandagatla .data = &lpass_audiocc_sc8280xp_reset_desc, 60*c2ef1ec9SSrinivas Kandagatla }, { 61a5c9c3baSSrinivas Kandagatla .compatible = "qcom,sc8280xp-lpasscc", 62a5c9c3baSSrinivas Kandagatla .data = &lpasscc_sc8280xp_reset_desc, 63a5c9c3baSSrinivas Kandagatla }, 64a5c9c3baSSrinivas Kandagatla { } 65a5c9c3baSSrinivas Kandagatla }; 66a5c9c3baSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, lpasscc_sc8280xp_match_table); 67a5c9c3baSSrinivas Kandagatla 68a5c9c3baSSrinivas Kandagatla static int lpasscc_sc8280xp_probe(struct platform_device *pdev) 69a5c9c3baSSrinivas Kandagatla { 70a5c9c3baSSrinivas Kandagatla const struct qcom_cc_desc *desc = of_device_get_match_data(&pdev->dev); 71a5c9c3baSSrinivas Kandagatla 72a5c9c3baSSrinivas Kandagatla return qcom_cc_probe_by_index(pdev, 0, desc); 73a5c9c3baSSrinivas Kandagatla } 74a5c9c3baSSrinivas Kandagatla 75a5c9c3baSSrinivas Kandagatla static struct platform_driver lpasscc_sc8280xp_driver = { 76a5c9c3baSSrinivas Kandagatla .probe = lpasscc_sc8280xp_probe, 77a5c9c3baSSrinivas Kandagatla .driver = { 78a5c9c3baSSrinivas Kandagatla .name = "lpasscc-sc8280xp", 79a5c9c3baSSrinivas Kandagatla .of_match_table = lpasscc_sc8280xp_match_table, 80a5c9c3baSSrinivas Kandagatla }, 81a5c9c3baSSrinivas Kandagatla }; 82a5c9c3baSSrinivas Kandagatla 83a5c9c3baSSrinivas Kandagatla module_platform_driver(lpasscc_sc8280xp_driver); 84a5c9c3baSSrinivas Kandagatla 85a5c9c3baSSrinivas Kandagatla MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org>"); 86a5c9c3baSSrinivas Kandagatla MODULE_DESCRIPTION("QTI LPASSCC SC8280XP Driver"); 87a5c9c3baSSrinivas Kandagatla MODULE_LICENSE("GPL"); 88