1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2014,2015, Linaro Ltd.
6 * SAW power controller driver
9 #include <linux/bitfield.h>
10 #include <linux/err.h>
11 #include <linux/init.h>
13 #include <linux/iopoll.h>
14 #include <linux/kernel.h>
15 #include <linux/linear_range.h>
16 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/smp.h>
22 #include <linux/regulator/driver.h>
24 #include <soc/qcom/spm.h>
26 #define FIELD_SET(current, mask, val) \
27 (((current) & ~(mask)) | FIELD_PREP((mask), (val)))
29 #define SPM_CTL_INDEX 0x7f
30 #define SPM_CTL_INDEX_SHIFT 4
31 #define SPM_CTL_EN BIT(0)
33 /* These registers might be specific to SPM 1.1 */
34 #define SPM_VCTL_VLVL GENMASK(7, 0)
35 #define SPM_PMIC_DATA_0_VLVL GENMASK(7, 0)
36 #define SPM_PMIC_DATA_1_MIN_VSEL GENMASK(5, 0)
37 #define SPM_PMIC_DATA_1_MAX_VSEL GENMASK(21, 16)
39 #define SPM_1_1_AVS_CTL_AVS_ENABLED BIT(27)
40 #define SPM_AVS_CTL_MAX_VLVL GENMASK(22, 17)
41 #define SPM_AVS_CTL_MIN_VLVL GENMASK(15, 10)
61 #define MAX_PMIC_DATA 2
62 #define MAX_SEQ_DATA 64
65 const u16
*reg_offset
;
69 u32 pmic_data
[MAX_PMIC_DATA
];
73 u8 start_index
[PM_SLEEP_MODE_NR
];
75 smp_call_func_t set_vdd
;
76 /* for now we support only a single range */
77 struct linear_range
*range
;
78 unsigned int ramp_delay
;
82 struct spm_driver_data
{
83 void __iomem
*reg_base
;
84 const struct spm_reg_data
*reg_data
;
86 unsigned int volt_sel
;
90 static const u16 spm_reg_offset_v4_1
[SPM_REG_NR
] = {
91 [SPM_REG_AVS_CTL
] = 0x904,
92 [SPM_REG_AVS_LIMIT
] = 0x908,
95 static const struct spm_reg_data spm_reg_660_gold_l2
= {
96 .reg_offset
= spm_reg_offset_v4_1
,
98 .avs_limit
= 0x4580458,
101 static const struct spm_reg_data spm_reg_660_silver_l2
= {
102 .reg_offset
= spm_reg_offset_v4_1
,
103 .avs_ctl
= 0x101c031,
104 .avs_limit
= 0x4580458,
107 static const struct spm_reg_data spm_reg_8998_gold_l2
= {
108 .reg_offset
= spm_reg_offset_v4_1
,
109 .avs_ctl
= 0x1010031,
110 .avs_limit
= 0x4700470,
113 static const struct spm_reg_data spm_reg_8998_silver_l2
= {
114 .reg_offset
= spm_reg_offset_v4_1
,
115 .avs_ctl
= 0x1010031,
116 .avs_limit
= 0x4200420,
119 static const u16 spm_reg_offset_v3_0
[SPM_REG_NR
] = {
120 [SPM_REG_CFG
] = 0x08,
121 [SPM_REG_SPM_CTL
] = 0x30,
122 [SPM_REG_DLY
] = 0x34,
123 [SPM_REG_SEQ_ENTRY
] = 0x400,
126 /* SPM register data for 8909 */
127 static const struct spm_reg_data spm_reg_8909_cpu
= {
128 .reg_offset
= spm_reg_offset_v3_0
,
130 .spm_dly
= 0x3C102800,
131 .seq
= { 0x60, 0x03, 0x60, 0x0B, 0x0F, 0x20, 0x10, 0x80, 0x30, 0x90,
132 0x5B, 0x60, 0x03, 0x60, 0x76, 0x76, 0x0B, 0x94, 0x5B, 0x80,
133 0x10, 0x26, 0x30, 0x0F },
134 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
135 .start_index
[PM_SLEEP_MODE_SPC
] = 5,
138 /* SPM register data for 8916 */
139 static const struct spm_reg_data spm_reg_8916_cpu
= {
140 .reg_offset
= spm_reg_offset_v3_0
,
142 .spm_dly
= 0x3C102800,
143 .seq
= { 0x60, 0x03, 0x60, 0x0B, 0x0F, 0x20, 0x10, 0x80, 0x30, 0x90,
144 0x5B, 0x60, 0x03, 0x60, 0x3B, 0x76, 0x76, 0x0B, 0x94, 0x5B,
145 0x80, 0x10, 0x26, 0x30, 0x0F },
146 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
147 .start_index
[PM_SLEEP_MODE_SPC
] = 5,
150 static const struct spm_reg_data spm_reg_8939_cpu
= {
151 .reg_offset
= spm_reg_offset_v3_0
,
153 .spm_dly
= 0x3C102800,
154 .seq
= { 0x60, 0x03, 0x60, 0x0B, 0x0F, 0x20, 0x50, 0x1B, 0x10, 0x80,
155 0x30, 0x90, 0x5B, 0x60, 0x50, 0x03, 0x60, 0x76, 0x76, 0x0B,
156 0x50, 0x1B, 0x94, 0x5B, 0x80, 0x10, 0x26, 0x30, 0x50, 0x0F },
157 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
158 .start_index
[PM_SLEEP_MODE_SPC
] = 5,
161 static const u16 spm_reg_offset_v2_3
[SPM_REG_NR
] = {
162 [SPM_REG_CFG
] = 0x08,
163 [SPM_REG_SPM_CTL
] = 0x30,
164 [SPM_REG_DLY
] = 0x34,
165 [SPM_REG_PMIC_DATA_0
] = 0x40,
166 [SPM_REG_PMIC_DATA_1
] = 0x44,
169 /* SPM register data for 8976 */
170 static const struct spm_reg_data spm_reg_8976_gold_l2
= {
171 .reg_offset
= spm_reg_offset_v2_3
,
173 .spm_dly
= 0x3c11840a,
174 .pmic_data
[0] = 0x03030080,
175 .pmic_data
[1] = 0x00030000,
176 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
177 .start_index
[PM_SLEEP_MODE_SPC
] = 3,
180 static const struct spm_reg_data spm_reg_8976_silver_l2
= {
181 .reg_offset
= spm_reg_offset_v2_3
,
183 .spm_dly
= 0x3c102800,
184 .pmic_data
[0] = 0x03030080,
185 .pmic_data
[1] = 0x00030000,
186 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
187 .start_index
[PM_SLEEP_MODE_SPC
] = 2,
190 static const u16 spm_reg_offset_v2_1
[SPM_REG_NR
] = {
191 [SPM_REG_CFG
] = 0x08,
192 [SPM_REG_SPM_CTL
] = 0x30,
193 [SPM_REG_DLY
] = 0x34,
194 [SPM_REG_SEQ_ENTRY
] = 0x80,
197 /* SPM register data for 8974, 8084 */
198 static const struct spm_reg_data spm_reg_8974_8084_cpu
= {
199 .reg_offset
= spm_reg_offset_v2_1
,
201 .spm_dly
= 0x3C102800,
202 .seq
= { 0x03, 0x0B, 0x0F, 0x00, 0x20, 0x80, 0x10, 0xE8, 0x5B, 0x03,
203 0x3B, 0xE8, 0x5B, 0x82, 0x10, 0x0B, 0x30, 0x06, 0x26, 0x30,
205 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
206 .start_index
[PM_SLEEP_MODE_SPC
] = 3,
209 /* SPM register data for 8226 */
210 static const struct spm_reg_data spm_reg_8226_cpu
= {
211 .reg_offset
= spm_reg_offset_v2_1
,
213 .spm_dly
= 0x3C102800,
214 .seq
= { 0x60, 0x03, 0x60, 0x0B, 0x0F, 0x20, 0x10, 0x80, 0x30, 0x90,
215 0x5B, 0x60, 0x03, 0x60, 0x3B, 0x76, 0x76, 0x0B, 0x94, 0x5B,
216 0x80, 0x10, 0x26, 0x30, 0x0F },
217 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
218 .start_index
[PM_SLEEP_MODE_SPC
] = 5,
221 static const u16 spm_reg_offset_v1_1
[SPM_REG_NR
] = {
222 [SPM_REG_CFG
] = 0x08,
223 [SPM_REG_STS0
] = 0x0c,
224 [SPM_REG_STS1
] = 0x10,
225 [SPM_REG_VCTL
] = 0x14,
226 [SPM_REG_AVS_CTL
] = 0x18,
227 [SPM_REG_SPM_CTL
] = 0x20,
228 [SPM_REG_PMIC_DLY
] = 0x24,
229 [SPM_REG_PMIC_DATA_0
] = 0x28,
230 [SPM_REG_PMIC_DATA_1
] = 0x2C,
231 [SPM_REG_SEQ_ENTRY
] = 0x80,
234 static void smp_set_vdd_v1_1(void *data
);
236 /* SPM register data for 8064 */
237 static struct linear_range spm_v1_1_regulator_range
=
238 REGULATOR_LINEAR_RANGE(700000, 0, 56, 12500);
240 static const struct spm_reg_data spm_reg_8064_cpu
= {
241 .reg_offset
= spm_reg_offset_v1_1
,
243 .pmic_dly
= 0x02020004,
244 .pmic_data
[0] = 0x0084009C,
245 .pmic_data
[1] = 0x00A4001C,
246 .seq
= { 0x03, 0x0F, 0x00, 0x24, 0x54, 0x10, 0x09, 0x03, 0x01,
247 0x10, 0x54, 0x30, 0x0C, 0x24, 0x30, 0x0F },
248 .start_index
[PM_SLEEP_MODE_STBY
] = 0,
249 .start_index
[PM_SLEEP_MODE_SPC
] = 2,
250 .set_vdd
= smp_set_vdd_v1_1
,
251 .range
= &spm_v1_1_regulator_range
,
256 static inline void spm_register_write(struct spm_driver_data
*drv
,
257 enum spm_reg reg
, u32 val
)
259 if (drv
->reg_data
->reg_offset
[reg
])
260 writel_relaxed(val
, drv
->reg_base
+
261 drv
->reg_data
->reg_offset
[reg
]);
264 /* Ensure a guaranteed write, before return */
265 static inline void spm_register_write_sync(struct spm_driver_data
*drv
,
266 enum spm_reg reg
, u32 val
)
270 if (!drv
->reg_data
->reg_offset
[reg
])
274 writel_relaxed(val
, drv
->reg_base
+
275 drv
->reg_data
->reg_offset
[reg
]);
276 ret
= readl_relaxed(drv
->reg_base
+
277 drv
->reg_data
->reg_offset
[reg
]);
284 static inline u32
spm_register_read(struct spm_driver_data
*drv
,
287 return readl_relaxed(drv
->reg_base
+ drv
->reg_data
->reg_offset
[reg
]);
290 void spm_set_low_power_mode(struct spm_driver_data
*drv
,
291 enum pm_sleep_mode mode
)
296 start_index
= drv
->reg_data
->start_index
[mode
];
298 ctl_val
= spm_register_read(drv
, SPM_REG_SPM_CTL
);
299 ctl_val
&= ~(SPM_CTL_INDEX
<< SPM_CTL_INDEX_SHIFT
);
300 ctl_val
|= start_index
<< SPM_CTL_INDEX_SHIFT
;
301 ctl_val
|= SPM_CTL_EN
;
302 spm_register_write_sync(drv
, SPM_REG_SPM_CTL
, ctl_val
);
305 static int spm_set_voltage_sel(struct regulator_dev
*rdev
, unsigned int selector
)
307 struct spm_driver_data
*drv
= rdev_get_drvdata(rdev
);
309 drv
->volt_sel
= selector
;
311 /* Always do the SAW register writes on the corresponding CPU */
312 return smp_call_function_single(drv
->reg_cpu
, drv
->reg_data
->set_vdd
, drv
, true);
315 static int spm_get_voltage_sel(struct regulator_dev
*rdev
)
317 struct spm_driver_data
*drv
= rdev_get_drvdata(rdev
);
319 return drv
->volt_sel
;
322 static const struct regulator_ops spm_reg_ops
= {
323 .set_voltage_sel
= spm_set_voltage_sel
,
324 .get_voltage_sel
= spm_get_voltage_sel
,
325 .list_voltage
= regulator_list_voltage_linear_range
,
326 .set_voltage_time_sel
= regulator_set_voltage_time_sel
,
329 static void smp_set_vdd_v1_1(void *data
)
331 struct spm_driver_data
*drv
= data
;
332 unsigned int vctl
, data0
, data1
, avs_ctl
, sts
;
333 unsigned int vlevel
, volt_sel
;
336 volt_sel
= drv
->volt_sel
;
337 vlevel
= volt_sel
| 0x80; /* band */
339 avs_ctl
= spm_register_read(drv
, SPM_REG_AVS_CTL
);
340 vctl
= spm_register_read(drv
, SPM_REG_VCTL
);
341 data0
= spm_register_read(drv
, SPM_REG_PMIC_DATA_0
);
342 data1
= spm_register_read(drv
, SPM_REG_PMIC_DATA_1
);
344 avs_enabled
= avs_ctl
& SPM_1_1_AVS_CTL_AVS_ENABLED
;
346 /* If AVS is enabled, switch it off during the voltage change */
348 avs_ctl
&= ~SPM_1_1_AVS_CTL_AVS_ENABLED
;
349 spm_register_write(drv
, SPM_REG_AVS_CTL
, avs_ctl
);
352 /* Kick the state machine back to idle */
353 spm_register_write(drv
, SPM_REG_RST
, 1);
355 vctl
= FIELD_SET(vctl
, SPM_VCTL_VLVL
, vlevel
);
356 data0
= FIELD_SET(data0
, SPM_PMIC_DATA_0_VLVL
, vlevel
);
357 data1
= FIELD_SET(data1
, SPM_PMIC_DATA_1_MIN_VSEL
, volt_sel
);
358 data1
= FIELD_SET(data1
, SPM_PMIC_DATA_1_MAX_VSEL
, volt_sel
);
360 spm_register_write(drv
, SPM_REG_VCTL
, vctl
);
361 spm_register_write(drv
, SPM_REG_PMIC_DATA_0
, data0
);
362 spm_register_write(drv
, SPM_REG_PMIC_DATA_1
, data1
);
364 if (read_poll_timeout_atomic(spm_register_read
,
367 drv
, SPM_REG_STS1
)) {
368 dev_err_ratelimited(drv
->dev
, "timeout setting the voltage (%x %x)!\n", sts
, vlevel
);
373 unsigned int max_avs
= volt_sel
;
374 unsigned int min_avs
= max(max_avs
, 4U) - 4;
376 avs_ctl
= FIELD_SET(avs_ctl
, SPM_AVS_CTL_MIN_VLVL
, min_avs
);
377 avs_ctl
= FIELD_SET(avs_ctl
, SPM_AVS_CTL_MAX_VLVL
, max_avs
);
378 spm_register_write(drv
, SPM_REG_AVS_CTL
, avs_ctl
);
383 avs_ctl
|= SPM_1_1_AVS_CTL_AVS_ENABLED
;
384 spm_register_write(drv
, SPM_REG_AVS_CTL
, avs_ctl
);
388 static int spm_get_cpu(struct device
*dev
)
393 for_each_possible_cpu(cpu
) {
394 struct device_node
*cpu_node
, *saw_node
;
396 cpu_node
= of_cpu_device_node_get(cpu
);
400 saw_node
= of_parse_phandle(cpu_node
, "qcom,saw", 0);
401 found
= (saw_node
== dev
->of_node
);
402 of_node_put(saw_node
);
403 of_node_put(cpu_node
);
409 /* L2 SPM is not bound to any CPU, voltage setting is not supported */
414 static int spm_register_regulator(struct device
*dev
, struct spm_driver_data
*drv
)
416 struct regulator_config config
= {
420 struct regulator_desc
*rdesc
;
421 struct regulator_dev
*rdev
;
425 if (!drv
->reg_data
->set_vdd
)
428 rdesc
= devm_kzalloc(dev
, sizeof(*rdesc
), GFP_KERNEL
);
433 rdesc
->of_match
= of_match_ptr("regulator");
434 rdesc
->type
= REGULATOR_VOLTAGE
;
435 rdesc
->owner
= THIS_MODULE
;
436 rdesc
->ops
= &spm_reg_ops
;
438 rdesc
->linear_ranges
= drv
->reg_data
->range
;
439 rdesc
->n_linear_ranges
= 1;
440 rdesc
->n_voltages
= rdesc
->linear_ranges
[rdesc
->n_linear_ranges
- 1].max_sel
+ 1;
441 rdesc
->ramp_delay
= drv
->reg_data
->ramp_delay
;
443 ret
= spm_get_cpu(dev
);
448 dev_dbg(dev
, "SAW2 bound to CPU %d\n", drv
->reg_cpu
);
451 * Program initial voltage, otherwise registration will also try
452 * setting the voltage, which might result in undervolting the CPU.
454 drv
->volt_sel
= DIV_ROUND_UP(drv
->reg_data
->init_uV
- rdesc
->min_uV
,
456 ret
= linear_range_get_selector_high(drv
->reg_data
->range
,
457 drv
->reg_data
->init_uV
,
461 dev_err(dev
, "Initial uV value out of bounds\n");
465 /* Always do the SAW register writes on the corresponding CPU */
466 smp_call_function_single(drv
->reg_cpu
, drv
->reg_data
->set_vdd
, drv
, true);
468 rdev
= devm_regulator_register(dev
, rdesc
, &config
);
470 dev_err(dev
, "failed to register regulator\n");
471 return PTR_ERR(rdev
);
477 static const struct of_device_id spm_match_table
[] = {
478 { .compatible
= "qcom,sdm660-gold-saw2-v4.1-l2",
479 .data
= &spm_reg_660_gold_l2
},
480 { .compatible
= "qcom,sdm660-silver-saw2-v4.1-l2",
481 .data
= &spm_reg_660_silver_l2
},
482 { .compatible
= "qcom,msm8226-saw2-v2.1-cpu",
483 .data
= &spm_reg_8226_cpu
},
484 { .compatible
= "qcom,msm8909-saw2-v3.0-cpu",
485 .data
= &spm_reg_8909_cpu
},
486 { .compatible
= "qcom,msm8916-saw2-v3.0-cpu",
487 .data
= &spm_reg_8916_cpu
},
488 { .compatible
= "qcom,msm8939-saw2-v3.0-cpu",
489 .data
= &spm_reg_8939_cpu
},
490 { .compatible
= "qcom,msm8974-saw2-v2.1-cpu",
491 .data
= &spm_reg_8974_8084_cpu
},
492 { .compatible
= "qcom,msm8976-gold-saw2-v2.3-l2",
493 .data
= &spm_reg_8976_gold_l2
},
494 { .compatible
= "qcom,msm8976-silver-saw2-v2.3-l2",
495 .data
= &spm_reg_8976_silver_l2
},
496 { .compatible
= "qcom,msm8998-gold-saw2-v4.1-l2",
497 .data
= &spm_reg_8998_gold_l2
},
498 { .compatible
= "qcom,msm8998-silver-saw2-v4.1-l2",
499 .data
= &spm_reg_8998_silver_l2
},
500 { .compatible
= "qcom,apq8084-saw2-v2.1-cpu",
501 .data
= &spm_reg_8974_8084_cpu
},
502 { .compatible
= "qcom,apq8064-saw2-v1.1-cpu",
503 .data
= &spm_reg_8064_cpu
},
506 MODULE_DEVICE_TABLE(of
, spm_match_table
);
508 static int spm_dev_probe(struct platform_device
*pdev
)
510 const struct of_device_id
*match_id
;
511 struct spm_driver_data
*drv
;
514 drv
= devm_kzalloc(&pdev
->dev
, sizeof(*drv
), GFP_KERNEL
);
518 drv
->reg_base
= devm_platform_ioremap_resource(pdev
, 0);
519 if (IS_ERR(drv
->reg_base
))
520 return PTR_ERR(drv
->reg_base
);
522 match_id
= of_match_node(spm_match_table
, pdev
->dev
.of_node
);
526 drv
->reg_data
= match_id
->data
;
527 drv
->dev
= &pdev
->dev
;
528 platform_set_drvdata(pdev
, drv
);
530 /* Write the SPM sequences first.. */
531 addr
= drv
->reg_base
+ drv
->reg_data
->reg_offset
[SPM_REG_SEQ_ENTRY
];
532 __iowrite32_copy(addr
, drv
->reg_data
->seq
,
533 ARRAY_SIZE(drv
->reg_data
->seq
) / 4);
536 * ..and then the control registers.
537 * On some SoC if the control registers are written first and if the
538 * CPU was held in reset, the reset signal could trigger the SPM state
539 * machine, before the sequences are completely written.
541 spm_register_write(drv
, SPM_REG_AVS_CTL
, drv
->reg_data
->avs_ctl
);
542 spm_register_write(drv
, SPM_REG_AVS_LIMIT
, drv
->reg_data
->avs_limit
);
543 spm_register_write(drv
, SPM_REG_CFG
, drv
->reg_data
->spm_cfg
);
544 spm_register_write(drv
, SPM_REG_DLY
, drv
->reg_data
->spm_dly
);
545 spm_register_write(drv
, SPM_REG_PMIC_DLY
, drv
->reg_data
->pmic_dly
);
546 spm_register_write(drv
, SPM_REG_PMIC_DATA_0
,
547 drv
->reg_data
->pmic_data
[0]);
548 spm_register_write(drv
, SPM_REG_PMIC_DATA_1
,
549 drv
->reg_data
->pmic_data
[1]);
551 /* Set up Standby as the default low power mode */
552 if (drv
->reg_data
->reg_offset
[SPM_REG_SPM_CTL
])
553 spm_set_low_power_mode(drv
, PM_SLEEP_MODE_STBY
);
555 if (IS_ENABLED(CONFIG_REGULATOR
))
556 return spm_register_regulator(&pdev
->dev
, drv
);
561 static struct platform_driver spm_driver
= {
562 .probe
= spm_dev_probe
,
565 .of_match_table
= spm_match_table
,
569 static int __init
qcom_spm_init(void)
571 return platform_driver_register(&spm_driver
);
573 arch_initcall(qcom_spm_init
);
575 MODULE_DESCRIPTION("Qualcomm Subsystem Power Manager (SPM)");
576 MODULE_LICENSE("GPL v2");