1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2018 The Linux Foundation. All rights reserved.
6 #include <linux/module.h>
7 #include <linux/of_device.h>
8 #include <linux/platform_device.h>
9 #include <linux/regmap.h>
10 #include <linux/reset-controller.h>
12 #include <dt-bindings/reset/qcom,sdm845-pdc.h>
14 #define RPMH_PDC_SYNC_RESET 0x100
16 struct qcom_pdc_reset_map
{
20 struct qcom_pdc_reset_data
{
21 struct reset_controller_dev rcdev
;
22 struct regmap
*regmap
;
25 static const struct regmap_config sdm845_pdc_regmap_config
= {
30 .max_register
= 0x20000,
34 static const struct qcom_pdc_reset_map sdm845_pdc_resets
[] = {
35 [PDC_APPS_SYNC_RESET
] = {0},
36 [PDC_SP_SYNC_RESET
] = {1},
37 [PDC_AUDIO_SYNC_RESET
] = {2},
38 [PDC_SENSORS_SYNC_RESET
] = {3},
39 [PDC_AOP_SYNC_RESET
] = {4},
40 [PDC_DEBUG_SYNC_RESET
] = {5},
41 [PDC_GPU_SYNC_RESET
] = {6},
42 [PDC_DISPLAY_SYNC_RESET
] = {7},
43 [PDC_COMPUTE_SYNC_RESET
] = {8},
44 [PDC_MODEM_SYNC_RESET
] = {9},
47 static inline struct qcom_pdc_reset_data
*to_qcom_pdc_reset_data(
48 struct reset_controller_dev
*rcdev
)
50 return container_of(rcdev
, struct qcom_pdc_reset_data
, rcdev
);
53 static int qcom_pdc_control_assert(struct reset_controller_dev
*rcdev
,
56 struct qcom_pdc_reset_data
*data
= to_qcom_pdc_reset_data(rcdev
);
58 return regmap_update_bits(data
->regmap
, RPMH_PDC_SYNC_RESET
,
59 BIT(sdm845_pdc_resets
[idx
].bit
),
60 BIT(sdm845_pdc_resets
[idx
].bit
));
63 static int qcom_pdc_control_deassert(struct reset_controller_dev
*rcdev
,
66 struct qcom_pdc_reset_data
*data
= to_qcom_pdc_reset_data(rcdev
);
68 return regmap_update_bits(data
->regmap
, RPMH_PDC_SYNC_RESET
,
69 BIT(sdm845_pdc_resets
[idx
].bit
), 0);
72 static const struct reset_control_ops qcom_pdc_reset_ops
= {
73 .assert = qcom_pdc_control_assert
,
74 .deassert
= qcom_pdc_control_deassert
,
77 static int qcom_pdc_reset_probe(struct platform_device
*pdev
)
79 struct qcom_pdc_reset_data
*data
;
80 struct device
*dev
= &pdev
->dev
;
84 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
88 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
89 base
= devm_ioremap_resource(dev
, res
);
93 data
->regmap
= devm_regmap_init_mmio(dev
, base
,
94 &sdm845_pdc_regmap_config
);
95 if (IS_ERR(data
->regmap
)) {
96 dev_err(dev
, "Unable to initialize regmap\n");
97 return PTR_ERR(data
->regmap
);
100 data
->rcdev
.owner
= THIS_MODULE
;
101 data
->rcdev
.ops
= &qcom_pdc_reset_ops
;
102 data
->rcdev
.nr_resets
= ARRAY_SIZE(sdm845_pdc_resets
);
103 data
->rcdev
.of_node
= dev
->of_node
;
105 return devm_reset_controller_register(dev
, &data
->rcdev
);
108 static const struct of_device_id qcom_pdc_reset_of_match
[] = {
109 { .compatible
= "qcom,sdm845-pdc-global" },
112 MODULE_DEVICE_TABLE(of
, qcom_pdc_reset_of_match
);
114 static struct platform_driver qcom_pdc_reset_driver
= {
115 .probe
= qcom_pdc_reset_probe
,
117 .name
= "qcom_pdc_reset",
118 .of_match_table
= qcom_pdc_reset_of_match
,
121 module_platform_driver(qcom_pdc_reset_driver
);
123 MODULE_DESCRIPTION("Qualcomm PDC Reset Driver");
124 MODULE_LICENSE("GPL v2");