2 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/module.h>
15 #include <linux/err.h>
16 #include <linux/string.h>
17 #include <linux/kernel.h>
18 #include <linux/list.h>
19 #include <linux/init.h>
21 #include <linux/bitops.h>
22 #include <linux/slab.h>
24 #include <linux/of_device.h>
25 #include <linux/platform_device.h>
26 #include <linux/pm_opp.h>
27 #include <linux/interrupt.h>
28 #include <linux/regmap.h>
29 #include <linux/mfd/syscon.h>
30 #include <linux/regulator/driver.h>
31 #include <linux/regulator/machine.h>
32 #include <linux/cpufreq.h>
33 #include <linux/bitops.h>
34 #include <linux/regulator/qcom_smd-regulator.h>
36 /* Register Offsets for RB-CPR and Bit Definitions */
38 /* RBCPR Version Register */
39 #define REG_RBCPR_VERSION 0
40 #define RBCPR_VER_2 0x02
42 /* RBCPR Gate Count and Target Registers */
43 #define REG_RBCPR_GCNT_TARGET(n) (0x60 + 4 * (n))
45 #define RBCPR_GCNT_TARGET_TARGET_SHIFT 0
46 #define RBCPR_GCNT_TARGET_TARGET_MASK GENMASK(11, 0)
47 #define RBCPR_GCNT_TARGET_GCNT_SHIFT 12
48 #define RBCPR_GCNT_TARGET_GCNT_MASK GENMASK(9, 0)
50 /* RBCPR Timer Control */
51 #define REG_RBCPR_TIMER_INTERVAL 0x44
52 #define REG_RBIF_TIMER_ADJUST 0x4c
54 #define RBIF_TIMER_ADJ_CONS_UP_MASK GENMASK(3, 0)
55 #define RBIF_TIMER_ADJ_CONS_UP_SHIFT 0
56 #define RBIF_TIMER_ADJ_CONS_DOWN_MASK GENMASK(3, 0)
57 #define RBIF_TIMER_ADJ_CONS_DOWN_SHIFT 4
58 #define RBIF_TIMER_ADJ_CLAMP_INT_MASK GENMASK(7, 0)
59 #define RBIF_TIMER_ADJ_CLAMP_INT_SHIFT 8
61 /* RBCPR Config Register */
62 #define REG_RBIF_LIMIT 0x48
63 #define RBIF_LIMIT_CEILING_MASK GENMASK(5, 0)
64 #define RBIF_LIMIT_CEILING_SHIFT 6
65 #define RBIF_LIMIT_FLOOR_BITS 6
66 #define RBIF_LIMIT_FLOOR_MASK GENMASK(5, 0)
68 #define RBIF_LIMIT_CEILING_DEFAULT RBIF_LIMIT_CEILING_MASK
69 #define RBIF_LIMIT_FLOOR_DEFAULT 0
71 #define REG_RBIF_SW_VLEVEL 0x94
72 #define RBIF_SW_VLEVEL_DEFAULT 0x20
74 #define REG_RBCPR_STEP_QUOT 0x80
75 #define RBCPR_STEP_QUOT_STEPQUOT_MASK GENMASK(7, 0)
76 #define RBCPR_STEP_QUOT_IDLE_CLK_MASK GENMASK(3, 0)
77 #define RBCPR_STEP_QUOT_IDLE_CLK_SHIFT 8
79 /* RBCPR Control Register */
80 #define REG_RBCPR_CTL 0x90
82 #define RBCPR_CTL_LOOP_EN BIT(0)
83 #define RBCPR_CTL_TIMER_EN BIT(3)
84 #define RBCPR_CTL_SW_AUTO_CONT_ACK_EN BIT(5)
85 #define RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN BIT(6)
86 #define RBCPR_CTL_COUNT_MODE BIT(10)
87 #define RBCPR_CTL_UP_THRESHOLD_MASK GENMASK(3, 0)
88 #define RBCPR_CTL_UP_THRESHOLD_SHIFT 24
89 #define RBCPR_CTL_DN_THRESHOLD_MASK GENMASK(3, 0)
90 #define RBCPR_CTL_DN_THRESHOLD_SHIFT 28
92 /* RBCPR Ack/Nack Response */
93 #define REG_RBIF_CONT_ACK_CMD 0x98
94 #define REG_RBIF_CONT_NACK_CMD 0x9c
96 /* RBCPR Result status Register */
97 #define REG_RBCPR_RESULT_0 0xa0
99 #define RBCPR_RESULT0_BUSY_SHIFT 19
100 #define RBCPR_RESULT0_BUSY_MASK BIT(RBCPR_RESULT0_BUSY_SHIFT)
101 #define RBCPR_RESULT0_ERROR_LT0_SHIFT 18
102 #define RBCPR_RESULT0_ERROR_SHIFT 6
103 #define RBCPR_RESULT0_ERROR_MASK GENMASK(11, 0)
104 #define RBCPR_RESULT0_ERROR_STEPS_SHIFT 2
105 #define RBCPR_RESULT0_ERROR_STEPS_MASK GENMASK(3, 0)
106 #define RBCPR_RESULT0_STEP_UP_SHIFT 1
108 /* RBCPR Interrupt Control Register */
109 #define REG_RBIF_IRQ_EN(n) (0x100 + 4 * (n))
110 #define REG_RBIF_IRQ_CLEAR 0x110
111 #define REG_RBIF_IRQ_STATUS 0x114
113 #define CPR_INT_DONE BIT(0)
114 #define CPR_INT_MIN BIT(1)
115 #define CPR_INT_DOWN BIT(2)
116 #define CPR_INT_MID BIT(3)
117 #define CPR_INT_UP BIT(4)
118 #define CPR_INT_MAX BIT(5)
119 #define CPR_INT_CLAMP BIT(6)
120 #define CPR_INT_ALL (CPR_INT_DONE | CPR_INT_MIN | CPR_INT_DOWN | \
121 CPR_INT_MID | CPR_INT_UP | CPR_INT_MAX | CPR_INT_CLAMP)
122 #define CPR_INT_DEFAULT (CPR_INT_UP | CPR_INT_DOWN)
124 #define CPR_NUM_RING_OSC 8
126 /* RBCPR Clock Control Register */
127 #define RBCPR_CLK_SEL_MASK BIT(-1)
128 #define RBCPR_CLK_SEL_19P2_MHZ 0
129 #define RBCPR_CLK_SEL_AHB_CLK BIT(0)
131 /* CPR eFuse parameters */
132 #define CPR_FUSE_TARGET_QUOT_BITS_MASK GENMASK(11, 0)
134 #define CPR_FUSE_MIN_QUOT_DIFF 50
136 #define SPEED_BIN_NONE UINT_MAX
138 #define FUSE_REVISION_UNKNOWN (-1)
139 #define FUSE_MAP_NO_MATCH (-1)
140 #define FUSE_PARAM_MATCH_ANY 0xffffffff
143 * enum vdd_mx_vmin_method - Method to determine vmin for vdd-mx
144 * @VDD_MX_VMIN_APC: Use APC voltage
145 * @VDD_MX_VMIN_APC_CORNER_CEILING: Use PVS corner ceiling voltage
146 * @VDD_MX_VMIN_APC_SLOW_CORNER_CEILING: Use slow speed corner ceiling
147 * @VDD_MX_VMIN_MX_VMAX: Use specified vdd-mx-vmax voltage
148 * @VDD_MX_VMIN_APC_CORNER_MAP: Use APC corner mapped MX voltage
150 enum vdd_mx_vmin_method {
152 VDD_MX_VMIN_APC_CORNER_CEILING,
153 VDD_MX_VMIN_APC_SLOW_CORNER_CEILING,
155 VDD_MX_VMIN_APC_CORNER_MAP,
157 /* TODO: Trim these above to used values */
159 enum voltage_change_dir {
165 struct qfprom_offset {
172 struct qfprom_offset ring_osc;
173 struct qfprom_offset init_voltage;
174 struct qfprom_offset quotient;
175 struct qfprom_offset quotient_offset;
178 struct fuse_corner_data {
190 struct qfprom_offset redundant;
192 int init_voltage_step;
193 struct fuse_corner_data *fuse_corner_data;
194 struct cpr_fuse *cpr_fuse;
195 struct qfprom_offset *disable;
203 struct qfprom_offset redundant;
205 struct qfprom_offset *pvs_fuse;
206 struct pvs_bin *pvs_bins;
210 unsigned int fuse_corner;
217 const struct corner_data **plan;
220 struct fuse_conditional_min_volt {
221 struct qfprom_offset redundant;
226 struct fuse_uplift_wa {
227 struct qfprom_offset redundant;
235 struct corner_override {
242 struct corner_adjustment {
250 int *fuse_quot_offset;
254 bool disable_closed_loop;
258 unsigned int num_fuse_corners;
259 unsigned int num_corners;
260 enum vdd_mx_vmin_method vdd_mx_vmin_method;
264 struct cpr_fuses cpr_fuses;
265 struct qfprom_offset fuse_revision;
266 struct qfprom_offset speed_bin;
267 struct qfprom_offset pvs_version;
268 struct corner_data *corner_data;
269 struct freq_plan *freq_plans;
270 size_t num_freq_plans;
271 struct pvs_fuses *pvs_fuses;
272 struct fuse_conditional_min_volt *min_volt_fuse;
273 struct fuse_uplift_wa *uplift_wa;
274 struct corner_override *corner_overrides;
275 size_t num_corner_overrides;
276 struct corner_adjustment *adjustments;
277 size_t num_adjustments;
278 bool reduce_to_fuse_uV;
279 bool reduce_to_corner_uV;
283 unsigned int enable_reg;
286 struct reg_sequence *settings;
287 struct reg_sequence *override_settings;
288 int num_regs_per_fuse;
290 struct qfprom_offset override;
300 const struct reg_sequence *accs;
303 unsigned long max_freq;
316 struct fuse_corner *fuse_corner;
320 unsigned int num_fuse_corners;
321 unsigned int num_corners;
323 unsigned int nb_count;
324 struct notifier_block cpufreq_nb;
326 struct notifier_block reg_nb;
328 unsigned int ref_clk_khz;
329 unsigned int timer_delay_us;
330 unsigned int timer_cons_up;
331 unsigned int timer_cons_down;
332 unsigned int up_threshold;
333 unsigned int down_threshold;
334 unsigned int idle_clocks;
335 unsigned int gcnt_us;
336 unsigned int vdd_apc_step_up_limit;
337 unsigned int vdd_apc_step_down_limit;
338 unsigned int clamp_timer_interval;
340 enum vdd_mx_vmin_method vdd_mx_vmin_method;
345 struct corner *corner;
346 struct regulator *vdd_apc;
347 struct regulator *vdd_mx;
349 struct device *cpu_dev;
355 #define FLAGS_IGNORE_1ST_IRQ_STATUS BIT(0)
357 struct fuse_corner *fuse_corners;
358 struct corner *corners;
361 static bool cpr_is_allowed(struct cpr_drv *drv)
363 if (drv->loop_disabled) /* || disabled in software */
369 static void cpr_write(struct cpr_drv *drv, u32 offset, u32 value)
371 writel_relaxed(value, drv->base + offset);
374 static u32 cpr_read(struct cpr_drv *drv, u32 offset)
376 return readl_relaxed(drv->base + offset);
380 cpr_masked_write(struct cpr_drv *drv, u32 offset, u32 mask, u32 value)
384 val = readl_relaxed(drv->base + offset);
387 writel_relaxed(val, drv->base + offset);
390 static void cpr_irq_clr(struct cpr_drv *drv)
392 cpr_write(drv, REG_RBIF_IRQ_CLEAR, CPR_INT_ALL);
395 static void cpr_irq_clr_nack(struct cpr_drv *drv)
398 cpr_write(drv, REG_RBIF_CONT_NACK_CMD, 1);
401 static void cpr_irq_clr_ack(struct cpr_drv *drv)
404 cpr_write(drv, REG_RBIF_CONT_ACK_CMD, 1);
407 static void cpr_irq_set(struct cpr_drv *drv, u32 int_bits)
409 cpr_write(drv, REG_RBIF_IRQ_EN(0), int_bits);
412 static void cpr_ctl_modify(struct cpr_drv *drv, u32 mask, u32 value)
414 cpr_masked_write(drv, REG_RBCPR_CTL, mask, value);
417 static void cpr_ctl_enable(struct cpr_drv *drv, struct corner *corner)
424 /* Program Consecutive Up & Down */
425 val = drv->timer_cons_down << RBIF_TIMER_ADJ_CONS_DOWN_SHIFT;
426 val |= drv->timer_cons_up << RBIF_TIMER_ADJ_CONS_UP_SHIFT;
427 mask = RBIF_TIMER_ADJ_CONS_UP_MASK | RBIF_TIMER_ADJ_CONS_DOWN_MASK;
428 cpr_masked_write(drv, REG_RBIF_TIMER_ADJUST, mask, val);
429 cpr_masked_write(drv, REG_RBCPR_CTL,
430 RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN |
431 RBCPR_CTL_SW_AUTO_CONT_ACK_EN,
433 cpr_irq_set(drv, corner->save_irq);
435 if (cpr_is_allowed(drv) /*&& drv->vreg_enabled */ &&
436 corner->max_uV > corner->min_uV)
437 val = RBCPR_CTL_LOOP_EN;
440 cpr_ctl_modify(drv, RBCPR_CTL_LOOP_EN, val);
443 static void cpr_ctl_disable(struct cpr_drv *drv)
449 cpr_ctl_modify(drv, RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN |
450 RBCPR_CTL_SW_AUTO_CONT_ACK_EN, 0);
451 cpr_masked_write(drv, REG_RBIF_TIMER_ADJUST,
452 RBIF_TIMER_ADJ_CONS_UP_MASK |
453 RBIF_TIMER_ADJ_CONS_DOWN_MASK, 0);
455 cpr_write(drv, REG_RBIF_CONT_ACK_CMD, 1);
456 cpr_write(drv, REG_RBIF_CONT_NACK_CMD, 1);
457 cpr_ctl_modify(drv, RBCPR_CTL_LOOP_EN, 0);
460 static bool cpr_ctl_is_enabled(struct cpr_drv *drv)
464 reg_val = cpr_read(drv, REG_RBCPR_CTL);
465 return reg_val & RBCPR_CTL_LOOP_EN;
468 static bool cpr_ctl_is_busy(struct cpr_drv *drv)
472 reg_val = cpr_read(drv, REG_RBCPR_RESULT_0);
473 return reg_val & RBCPR_RESULT0_BUSY_MASK;
476 static void cpr_corner_save(struct cpr_drv *drv, struct corner *corner)
478 corner->save_ctl = cpr_read(drv, REG_RBCPR_CTL);
479 corner->save_irq = cpr_read(drv, REG_RBIF_IRQ_EN(0));
482 static void cpr_corner_restore(struct cpr_drv *drv, struct corner *corner)
484 u32 gcnt, ctl, irq, ro_sel, step_quot;
485 struct fuse_corner *fuse = corner->fuse_corner;
488 ro_sel = fuse->ring_osc_idx;
490 gcnt |= fuse->quot - corner->quot_adjust;
492 /* Program the step quotient and idle clocks */
493 step_quot = drv->idle_clocks << RBCPR_STEP_QUOT_IDLE_CLK_SHIFT;
494 step_quot |= fuse->step_quot;
495 cpr_write(drv, REG_RBCPR_STEP_QUOT, step_quot);
497 /* Clear the target quotient value and gate count of all ROs */
498 for (i = 0; i < CPR_NUM_RING_OSC; i++)
499 cpr_write(drv, REG_RBCPR_GCNT_TARGET(i), 0);
501 cpr_write(drv, REG_RBCPR_GCNT_TARGET(ro_sel), gcnt);
502 ctl = corner->save_ctl;
503 cpr_write(drv, REG_RBCPR_CTL, ctl);
504 irq = corner->save_irq;
505 cpr_irq_set(drv, irq);
506 pr_debug("gcnt = 0x%08x, ctl = 0x%08x, irq = 0x%08x\n", gcnt, ctl, irq);
509 static void cpr_corner_switch(struct cpr_drv *drv, struct corner *corner)
511 if (drv->corner == corner)
514 cpr_corner_restore(drv, corner);
518 cpr_mx_get(struct cpr_drv *drv, struct fuse_corner *fuse, int apc_volt)
521 struct fuse_corner *highest_fuse;
523 highest_fuse = &drv->fuse_corners[drv->num_fuse_corners - 1];
525 switch (drv->vdd_mx_vmin_method) {
526 case VDD_MX_VMIN_APC:
529 case VDD_MX_VMIN_APC_CORNER_CEILING:
530 vdd_mx = fuse->max_uV;
532 case VDD_MX_VMIN_APC_SLOW_CORNER_CEILING:
533 vdd_mx = highest_fuse->max_uV;
535 case VDD_MX_VMIN_MX_VMAX:
536 vdd_mx = drv->vdd_mx_vmax;
538 case VDD_MX_VMIN_APC_CORNER_MAP:
539 vdd_mx = fuse->vdd_mx_req;
548 static void cpr_set_acc(struct regmap *tcsr, struct fuse_corner *f,
549 struct fuse_corner *end)
552 for (f += 1; f <= end; f++)
553 regmap_multi_reg_write(tcsr, f->accs, f->num_accs);
555 for (f -= 1; f >= end; f--)
556 regmap_multi_reg_write(tcsr, f->accs, f->num_accs);
560 static int cpr_pre_voltage(struct cpr_drv *drv,
561 struct fuse_corner *fuse_corner,
562 enum voltage_change_dir dir, int vdd_mx_vmin)
565 struct fuse_corner *prev_fuse_corner = drv->corner->fuse_corner;
567 if (drv->tcsr && dir == DOWN)
568 cpr_set_acc(drv->tcsr, prev_fuse_corner, fuse_corner);
570 if (vdd_mx_vmin && dir == UP)
571 ret = qcom_rpm_set_corner(drv->vdd_mx, vdd_mx_vmin);
576 static int cpr_post_voltage(struct cpr_drv *drv,
577 struct fuse_corner *fuse_corner,
578 enum voltage_change_dir dir, int vdd_mx_vmin)
581 struct fuse_corner *prev_fuse_corner = drv->corner->fuse_corner;
583 if (drv->tcsr && dir == UP)
584 cpr_set_acc(drv->tcsr, prev_fuse_corner, fuse_corner);
586 if (vdd_mx_vmin && dir == DOWN)
587 ret = qcom_rpm_set_corner(drv->vdd_mx, vdd_mx_vmin);
592 static int cpr_regulator_notifier(struct notifier_block *nb,
593 unsigned long event, void *d)
595 struct cpr_drv *drv = container_of(nb, struct cpr_drv, reg_nb);
600 case REGULATOR_EVENT_VOLTAGE_CHANGE:
601 new_uV = (int)(uintptr_t)d;
607 mutex_lock(&drv->lock);
609 last_uV = drv->corner->last_uV;
611 if (drv->switching_opp) {
613 } else if (last_uV < new_uV) {
614 /* Disable auto nack down */
615 mask = RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN;
617 } else if (last_uV > new_uV) {
618 /* Restore default threshold for UP */
619 mask = RBCPR_CTL_UP_THRESHOLD_MASK;
620 mask <<= RBCPR_CTL_UP_THRESHOLD_SHIFT;
621 val = drv->up_threshold;
622 val <<= RBCPR_CTL_UP_THRESHOLD_SHIFT;
623 } else { /* Somehow it's the same? */
627 cpr_ctl_modify(drv, mask, val);
629 /* Re-enable default interrupts */
630 cpr_irq_set(drv, CPR_INT_DEFAULT);
633 cpr_irq_clr_ack(drv);
635 /* Save register values for the corner */
636 cpr_corner_save(drv, drv->corner);
637 drv->corner->last_uV = new_uV;
639 mutex_unlock(&drv->lock);
644 static int cpr_scale(struct cpr_drv *drv, enum voltage_change_dir dir)
646 u32 val, error_steps, reg_mask;
647 int last_uV, new_uV, step_uV;
648 struct corner *corner;
649 struct fuse_corner *fuse;
651 //step_uV = regulator_get_linear_step(drv->vdd_apc);
652 step_uV = 12500; /*TODO: Get step volt here */
653 corner = drv->corner;
654 fuse = corner->fuse_corner;
656 val = cpr_read(drv, REG_RBCPR_RESULT_0);
658 error_steps = val >> RBCPR_RESULT0_ERROR_STEPS_SHIFT;
659 error_steps &= RBCPR_RESULT0_ERROR_STEPS_MASK;
660 last_uV = corner->last_uV;
663 if (drv->clamp_timer_interval &&
664 error_steps < drv->up_threshold) {
666 * Handle the case where another measurement started
667 * after the interrupt was triggered due to a core
668 * exiting from power collapse.
670 error_steps = max(drv->up_threshold,
671 drv->vdd_apc_step_up_limit);
674 if (last_uV >= corner->max_uV) {
675 cpr_irq_clr_nack(drv);
677 /* Maximize the UP threshold */
678 reg_mask = RBCPR_CTL_UP_THRESHOLD_MASK;
679 reg_mask <<= RBCPR_CTL_UP_THRESHOLD_SHIFT;
681 cpr_ctl_modify(drv, reg_mask, val);
683 /* Disable UP interrupt */
684 cpr_irq_set(drv, CPR_INT_DEFAULT & ~CPR_INT_UP);
689 if (error_steps > drv->vdd_apc_step_up_limit)
690 error_steps = drv->vdd_apc_step_up_limit;
692 /* Calculate new voltage */
693 new_uV = last_uV + error_steps * step_uV;
694 if (new_uV > corner->max_uV)
695 new_uV = corner->max_uV;
696 } else if (dir == DOWN) {
697 if (drv->clamp_timer_interval
698 && error_steps < drv->down_threshold) {
700 * Handle the case where another measurement started
701 * after the interrupt was triggered due to a core
702 * exiting from power collapse.
704 error_steps = max(drv->down_threshold,
705 drv->vdd_apc_step_down_limit);
708 if (last_uV <= corner->min_uV) {
709 cpr_irq_clr_nack(drv);
711 /* Enable auto nack down */
712 reg_mask = RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN;
713 val = RBCPR_CTL_SW_AUTO_CONT_NACK_DN_EN;
715 cpr_ctl_modify(drv, reg_mask, val);
717 /* Disable DOWN interrupt */
718 cpr_irq_set(drv, CPR_INT_DEFAULT & ~CPR_INT_DOWN);
723 if (error_steps > drv->vdd_apc_step_down_limit)
724 error_steps = drv->vdd_apc_step_down_limit;
726 /* Calculate new voltage */
727 new_uV = last_uV - error_steps * step_uV;
728 if (new_uV < corner->min_uV)
729 new_uV = corner->min_uV;
735 static irqreturn_t cpr_irq_handler(int irq, void *dev)
737 struct cpr_drv *drv = dev;
740 struct corner *corner;
742 mutex_lock(&drv->lock);
744 val = cpr_read(drv, REG_RBIF_IRQ_STATUS);
745 if (drv->flags & FLAGS_IGNORE_1ST_IRQ_STATUS)
746 val = cpr_read(drv, REG_RBIF_IRQ_STATUS);
748 pr_debug("IRQ_STATUS = %#02x\n", val);
750 if (!cpr_ctl_is_enabled(drv)) {
751 pr_debug("CPR is disabled\n");
753 } else if (cpr_ctl_is_busy(drv) && !drv->clamp_timer_interval) {
754 pr_debug("CPR measurement is not ready\n");
756 } else if (!cpr_is_allowed(drv)) {
757 val = cpr_read(drv, REG_RBCPR_CTL);
758 pr_err_ratelimited("Interrupt broken? RBCPR_CTL = %#02x\n",
763 /* Following sequence of handling is as per each IRQ's priority */
764 if (val & CPR_INT_UP) {
765 new_uV = cpr_scale(drv, UP);
766 } else if (val & CPR_INT_DOWN) {
767 new_uV = cpr_scale(drv, DOWN);
768 } else if (val & CPR_INT_MIN) {
769 cpr_irq_clr_nack(drv);
770 } else if (val & CPR_INT_MAX) {
771 cpr_irq_clr_nack(drv);
772 } else if (val & CPR_INT_MID) {
773 /* RBCPR_CTL_SW_AUTO_CONT_ACK_EN is enabled */
774 pr_debug("IRQ occurred for Mid Flag\n");
776 pr_debug("IRQ occurred for unknown flag (%#08x)\n", val);
779 /* Save register values for the corner */
780 corner = drv->corner;
781 cpr_corner_save(drv, corner);
783 mutex_unlock(&drv->lock);
786 dev_pm_opp_adjust_voltage(drv->cpu_dev, corner->freq, new_uV);
792 * TODO: Register for hotplug notifier and turn on/off CPR when CPUs are offline
794 static int cpr_enable(struct cpr_drv *drv)
798 /* Enable dependency power before vdd_apc */
800 ret = regulator_enable(drv->vdd_mx);
805 ret = regulator_enable(drv->vdd_apc);
809 mutex_lock(&drv->lock);
810 //drv->vreg_enabled = true;
811 if (cpr_is_allowed(drv) && drv->corner) {
813 cpr_corner_restore(drv, drv->corner);
814 cpr_ctl_enable(drv, drv->corner);
816 mutex_unlock(&drv->lock);
817 pr_info("CPR is enabled!\n");
822 static int cpr_disable(struct cpr_drv *drv)
826 ret = regulator_disable(drv->vdd_apc);
831 ret = regulator_disable(drv->vdd_mx);
835 mutex_lock(&drv->lock);
836 //drv->vreg_enabled = false;
837 if (cpr_is_allowed(drv))
838 cpr_ctl_disable(drv);
839 mutex_unlock(&drv->lock);
844 #ifdef CONFIG_PM_SLEEP
845 static int cpr_suspend(struct device *dev)
847 struct cpr_drv *drv = platform_get_drvdata(to_platform_device(dev));
849 if (cpr_is_allowed(drv)) {
850 mutex_lock(&drv->lock);
851 cpr_ctl_disable(drv);
853 drv->suspended = true;
854 mutex_unlock(&drv->lock);
860 static int cpr_resume(struct device *dev)
862 struct cpr_drv *drv = platform_get_drvdata(to_platform_device(dev));
864 if (cpr_is_allowed(drv)) {
865 mutex_lock(&drv->lock);
866 drv->suspended = false;
868 cpr_ctl_enable(drv, drv->corner);
869 mutex_unlock(&drv->lock);
876 static SIMPLE_DEV_PM_OPS(cpr_pm_ops, cpr_suspend, cpr_resume);
878 static int cpr_config(struct cpr_drv *drv)
882 struct corner *corner;
884 /* Disable interrupt and CPR */
885 cpr_write(drv, REG_RBIF_IRQ_EN(0), 0);
886 cpr_write(drv, REG_RBCPR_CTL, 0);
888 /* Program the default HW Ceiling, Floor and vlevel */
889 val = RBIF_LIMIT_CEILING_DEFAULT << RBIF_LIMIT_CEILING_SHIFT;
890 val |= RBIF_LIMIT_FLOOR_DEFAULT;
891 cpr_write(drv, REG_RBIF_LIMIT, val);
892 cpr_write(drv, REG_RBIF_SW_VLEVEL, RBIF_SW_VLEVEL_DEFAULT);
894 /* Clear the target quotient value and gate count of all ROs */
895 for (i = 0; i < CPR_NUM_RING_OSC; i++)
896 cpr_write(drv, REG_RBCPR_GCNT_TARGET(i), 0);
898 /* Init and save gcnt */
899 gcnt = (drv->ref_clk_khz * drv->gcnt_us) / 1000;
900 gcnt = gcnt & RBCPR_GCNT_TARGET_GCNT_MASK;
901 gcnt <<= RBCPR_GCNT_TARGET_GCNT_SHIFT;
904 /* Program the delay count for the timer */
905 val = (drv->ref_clk_khz * drv->timer_delay_us) / 1000;
906 cpr_write(drv, REG_RBCPR_TIMER_INTERVAL, val);
907 pr_debug("Timer count: 0x%0x (for %d us)\n", val, drv->timer_delay_us);
909 /* Program Consecutive Up & Down */
910 val = drv->timer_cons_down << RBIF_TIMER_ADJ_CONS_DOWN_SHIFT;
911 val |= drv->timer_cons_up << RBIF_TIMER_ADJ_CONS_UP_SHIFT;
912 val |= drv->clamp_timer_interval << RBIF_TIMER_ADJ_CLAMP_INT_SHIFT;
913 cpr_write(drv, REG_RBIF_TIMER_ADJUST, val);
915 /* Program the control register */
916 val = drv->up_threshold << RBCPR_CTL_UP_THRESHOLD_SHIFT;
917 val |= drv->down_threshold << RBCPR_CTL_DN_THRESHOLD_SHIFT;
918 val |= RBCPR_CTL_TIMER_EN | RBCPR_CTL_COUNT_MODE;
919 val |= RBCPR_CTL_SW_AUTO_CONT_ACK_EN;
920 cpr_write(drv, REG_RBCPR_CTL, val);
922 for (i = 0; i < drv->num_corners; i++) {
923 corner = &drv->corners[i];
924 corner->save_ctl = val;
925 corner->save_irq = CPR_INT_DEFAULT;
928 cpr_irq_set(drv, CPR_INT_DEFAULT);
930 val = cpr_read(drv, REG_RBCPR_VERSION);
931 if (val <= RBCPR_VER_2)
932 drv->flags |= FLAGS_IGNORE_1ST_IRQ_STATUS;
937 /* Called twice for each CPU in policy, one pre and one post event */
939 cpr_cpufreq_notifier(struct notifier_block *nb, unsigned long event, void *f)
941 struct cpr_drv *drv = container_of(nb, struct cpr_drv, cpufreq_nb);
942 struct cpufreq_freqs *freqs = f;
943 unsigned long old = freqs->old * 1000;
944 unsigned long new = freqs->new * 1000;
945 struct corner *corner, *end;
946 enum voltage_change_dir dir;
949 struct fuse_corner *fuse_corner;
951 /* Determine direction */
959 /* Determine new corner we're going to */
960 corner = drv->corners;
961 end = &corner[drv->num_corners - 1];
962 for (; corner <= end; corner++)
963 if (corner->freq == new)
969 fuse_corner = corner->fuse_corner;
971 if (cpr_is_allowed(drv)) {
972 new_uV = corner->last_uV;
977 if (dir != NO_CHANGE && drv->vdd_mx)
978 vdd_mx_vmin = cpr_mx_get(drv, fuse_corner, new_uV);
980 mutex_lock(&drv->lock);
981 if (event == CPUFREQ_PRECHANGE) {
985 pr_debug("Pre change [%ld] %p @ %lu?\n", corner - drv->corners,
986 corner, corner->freq);
987 if (cpr_is_allowed(drv))
988 cpr_ctl_disable(drv);
990 ret = cpr_pre_voltage(drv, fuse_corner, dir, vdd_mx_vmin);
994 drv->switching_opp = true;
997 if (event == CPUFREQ_POSTCHANGE) {
1001 pr_debug("Post change [%ld] %p @ %lu?\n", corner - drv->corners,
1002 corner, corner->freq);
1004 ret = cpr_post_voltage(drv, fuse_corner, dir, vdd_mx_vmin);
1008 if (cpr_is_allowed(drv) /* && drv->vreg_enabled */) {
1010 cpr_corner_switch(drv, corner);
1011 cpr_ctl_enable(drv, corner);
1014 drv->corner = corner;
1015 drv->switching_opp = false;
1018 mutex_unlock(&drv->lock);
1023 static u32 cpr_read_efuse(void __iomem *prom, const struct qfprom_offset *efuse)
1029 num_bytes = DIV_ROUND_UP(efuse->width + efuse->shift, BITS_PER_BYTE);
1031 for (i = 0; i < num_bytes; i++) {
1032 val = readb_relaxed(prom + efuse->offset + i);
1033 buffer |= val << (i * BITS_PER_BYTE);
1036 buffer >>= efuse->shift;
1037 buffer &= BIT(efuse->width) - 1;
1043 cpr_populate_ring_osc_idx(const struct cpr_fuse *fuses, struct cpr_drv *drv,
1046 struct fuse_corner *fuse = drv->fuse_corners;
1047 struct fuse_corner *end = fuse + drv->num_fuse_corners;
1049 for (; fuse < end; fuse++, fuses++)
1050 fuse->ring_osc_idx = cpr_read_efuse(prom, &fuses->ring_osc);
1054 static const struct corner_adjustment *cpr_find_adjustment(u32 speed_bin,
1055 u32 pvs_version, u32 cpr_rev, const struct cpr_desc *desc,
1056 const struct cpr_drv *drv)
1060 struct corner_adjustment *a;
1062 for (i = 0; i < desc->num_adjustments; i++) {
1063 a = &desc->adjustments[i];
1065 if (a->speed_bin != speed_bin &&
1066 a->speed_bin != FUSE_PARAM_MATCH_ANY)
1068 if (a->pvs_version != pvs_version &&
1069 a->pvs_version != FUSE_PARAM_MATCH_ANY)
1071 if (a->cpr_rev != cpr_rev &&
1072 a->cpr_rev != FUSE_PARAM_MATCH_ANY)
1074 for (j = 0; j < drv->num_fuse_corners; j++) {
1075 val = a->ring_osc_idx[j];
1076 ro = drv->fuse_corners[j].ring_osc_idx;
1077 if (val != ro && val != FUSE_PARAM_MATCH_ANY)
1080 if (j == drv->num_fuse_corners)
1087 static void cpr_fuse_corner_init(struct cpr_drv *drv,
1088 const struct cpr_desc *desc,
1089 void __iomem *qfprom,
1090 const struct cpr_fuse *fuses, u32 speed,
1091 const struct corner_adjustment *adjustments,
1092 const struct acc_desc *acc_desc)
1095 unsigned int idx = 0;
1096 unsigned int step_volt;
1097 int steps, step_size_uv;
1098 const struct fuse_corner_data *fdata;
1099 struct fuse_corner *fuse, *end, *prev;
1100 const struct qfprom_offset *pvs_efuse;
1101 const struct qfprom_offset *init_v_efuse;
1102 const struct qfprom_offset *redun;
1103 const struct fuse_conditional_min_volt *min_v;
1104 const struct fuse_uplift_wa *up;
1105 bool do_min_v = false, do_uplift = false;
1106 const int *pvs_uV = NULL;
1107 const int *adj_uV, *adj_quot, *adj_min, *min_diff_quot;
1108 const int *step_quot;
1113 const struct reg_sequence *accs;
1115 redun = &acc_desc->override;
1116 expected = acc_desc->override_value;
1117 if (redun->width && cpr_read_efuse(qfprom, redun) == expected)
1118 accs = acc_desc->override_settings;
1120 accs = acc_desc->settings;
1122 /* Figure out if we should apply workarounds */
1123 min_v = desc->min_volt_fuse;
1125 cpr_read_efuse(qfprom, &min_v->redundant) == min_v->expected;
1127 min_uV = min_v->min_uV;
1129 up = desc->uplift_wa;
1130 if (!do_min_v && up)
1131 if (cpr_read_efuse(qfprom, &up->redundant) == up->expected)
1132 do_uplift = up->speed_bin == speed;
1134 adj_uV = adjustments ? adjustments->fuse_init_uV : NULL;
1135 adj_quot = adjustments ? adjustments->fuse_quot : NULL;
1136 adj_min = adjustments ? adjustments->fuse_quot_min : NULL;
1137 min_diff_quot = adjustments ? adjustments->fuse_quot_diff : NULL;
1138 fuse = drv->fuse_corners;
1139 end = &fuse[drv->num_fuse_corners - 1];
1140 fdata = desc->cpr_fuses.fuse_corner_data;
1141 step_quot = desc->step_quot;
1144 * The initial voltage for each fuse corner may be determined by one of
1145 * two ways. Either initial voltages are encoded for each fuse corner
1146 * in a dedicated fuse per fuse corner (fuses::init_voltage), or we
1147 * use the PVS bin fuse to use a table of initial voltages (pvs_uV).
1149 if (fuses->init_voltage.width) {
1150 //step_volt = regulator_get_linear_step(drv->vdd_apc);
1151 step_volt = 12500; /* TODO: Replace with ^ when apc_reg ready */
1152 step_size_uv = desc->cpr_fuses.init_voltage_step;
1154 redun = &desc->pvs_fuses->redundant;
1155 expected = desc->pvs_fuses->redundant_value;
1157 idx = !!(cpr_read_efuse(qfprom, redun) == expected);
1159 pvs_efuse = &desc->pvs_fuses->pvs_fuse[idx];
1160 bin = cpr_read_efuse(qfprom, pvs_efuse);
1161 pvs_uV = desc->pvs_fuses->pvs_bins[bin].uV;
1164 /* Populate fuse_corner voltage and ring_osc_idx members */
1166 for (i = 0; fuse <= end; fuse++, fuses++, i++) {
1170 init_v_efuse = &fuses->init_voltage;
1171 bits = cpr_read_efuse(qfprom, init_v_efuse);
1172 /* Not two's complement.. instead highest bit is sign */
1173 steps = bits & BIT(init_v_efuse->width - 1) ? -1 : 1;
1174 steps *= bits & ~BIT(init_v_efuse->width - 1);
1176 uV = fdata[i].ref_uV + steps * step_size_uv;
1177 uV = DIV_ROUND_UP(uV, step_volt) * step_volt;
1183 fuse->min_uV = fdata[i].min_uV;
1184 fuse->max_uV = fdata[i].max_uV;
1187 if (fuse->max_uV < min_uV) {
1188 fuse->max_uV = min_uV;
1189 fuse->min_uV = min_uV;
1190 } else if (fuse->min_uV < min_uV) {
1191 fuse->min_uV = min_uV;
1195 fuse->uV = clamp(uV, fuse->min_uV, fuse->max_uV);
1200 end->uV = clamp(end->uV, 0, up->max_uV);
1203 * Allow the highest fuse corner's PVS voltage to
1204 * define the ceiling voltage for that corner in order
1205 * to support SoC's in which variable ceiling values
1208 end->max_uV = max(end->max_uV, end->uV);
1211 /* Unpack the target quotient by scaling. */
1212 fuse->quot = cpr_read_efuse(qfprom, &fuses->quotient);
1213 fuse->quot *= fdata[i].quot_scale;
1214 fuse->quot += fdata[i].quot_offset;
1217 fuse->quot += adj_quot[i];
1219 if (prev && min_diff_quot) {
1220 diff = min_diff_quot[i];
1221 if (fuse->quot - prev->quot <= diff)
1222 fuse->quot = prev->quot + adj_min[i];
1228 fuse->quot += up->quot[i];
1230 fuse->step_quot = step_quot[fuse->ring_osc_idx];
1233 fuse->num_accs = acc_desc->num_regs_per_fuse;
1234 accs += acc_desc->num_regs_per_fuse;
1236 fuse->vdd_mx_req = fdata[i].vdd_mx_req;
1240 * Restrict all fuse corner PVS voltages based upon per corner
1241 * ceiling and floor voltages.
1243 for (fuse = drv->fuse_corners, i = 0; fuse <= end; fuse++, i++) {
1244 if (fuse->uV > fuse->max_uV)
1245 fuse->uV = fuse->max_uV;
1246 else if (fuse->uV < fuse->min_uV)
1247 fuse->uV = fuse->min_uV;
1249 pr_debug("fuse corner %d: [%d %d %d] RO%d quot %d squot %d\n", i,
1250 fuse->min_uV, fuse->uV, fuse->max_uV,
1251 fuse->ring_osc_idx, fuse->quot,
1255 drv->ceiling_max = end->max_uV;
1258 static int cpr_populate_opps(struct device_node *of_node, struct cpr_drv *drv,
1259 const struct corner_data **plan)
1262 struct device *cpu_dev;
1263 struct device_node *np;
1264 struct corner *corner;
1265 const struct corner_data *p;
1267 for (i = 0; (np = of_parse_phandle(of_node, "qcom,cpr-cpus", i)); i++) {
1268 for_each_possible_cpu(cpu)
1269 if (arch_find_n_match_cpu_physical_id(np, cpu, NULL))
1273 if (cpu >= nr_cpu_ids) {
1274 pr_err("Failed to find logical CPU for %s\n", np->name);
1278 cpu_dev = get_cpu_device(cpu);
1283 * Keep cpu_dev and its regulator and clock for monitoring
1284 * voltage changes and updating OPPs later.
1287 drv->cpu_dev = cpu_dev;
1288 drv->vdd_apc = devm_regulator_get(cpu_dev, "cpu");
1289 if (IS_ERR(drv->vdd_apc))
1290 return PTR_ERR(drv->vdd_apc);
1291 drv->cpu_clk = devm_clk_get(cpu_dev, NULL);
1292 if (IS_ERR(drv->cpu_clk))
1293 return PTR_ERR(drv->cpu_clk);
1296 for (j = 0, corner = drv->corners; plan[j]; j++, corner++) {
1298 ret = dev_pm_opp_add(cpu_dev, p->freq, corner->uV);
1301 corner->freq = p->freq;
1308 static const struct corner_data **
1309 find_freq_plan(const struct cpr_desc *desc, u32 speed_bin, u32 pvs_version)
1312 const struct freq_plan *p;
1314 for (i = 0; i < desc->num_freq_plans; i++) {
1315 p = &desc->freq_plans[i];
1317 if (p->speed_bin != speed_bin &&
1318 p->speed_bin != FUSE_PARAM_MATCH_ANY)
1320 if (p->pvs_version != pvs_version &&
1321 p->pvs_version != FUSE_PARAM_MATCH_ANY)
1331 static struct corner_override *find_corner_override(const struct cpr_desc *desc,
1332 u32 speed_bin, u32 pvs_version)
1335 struct corner_override *o;
1337 for (i = 0; i < desc->num_corner_overrides; i++) {
1338 o = &desc->corner_overrides[i];
1340 if (o->speed_bin != speed_bin &&
1341 o->speed_bin != FUSE_PARAM_MATCH_ANY)
1343 if (o->pvs_version != pvs_version &&
1344 o->pvs_version != FUSE_PARAM_MATCH_ANY)
1354 static void cpr_corner_init(struct cpr_drv *drv, const struct cpr_desc *desc,
1355 const struct cpr_fuse *fuses, u32 speed_bin,
1356 u32 pvs_version, void __iomem *qfprom,
1357 const struct corner_adjustment *adjustments,
1358 const struct corner_data **plan)
1360 int i, fnum, quot_diff, scaling;
1361 struct fuse_corner *fuse, *prev_fuse;
1362 struct corner *corner, *end;
1363 const struct corner_data *cdata, *p;
1364 const struct fuse_corner_data *fdata;
1365 bool apply_scaling = false;
1366 const int *adj_quot, *adj_volt, *adj_quot_offset;
1367 const struct qfprom_offset *quot_offset;
1368 unsigned long freq_corner, freq_diff, freq_diff_mhz;
1369 unsigned long freq_high, freq_low;
1371 u64 temp, temp_limit;
1372 int step_volt = 12500; /* TODO: Get from regulator APIs */
1373 const struct corner_override *override;
1375 corner = drv->corners;
1376 end = &corner[drv->num_corners - 1];
1377 cdata = desc->corner_data;
1378 fdata = desc->cpr_fuses.fuse_corner_data;
1379 adj_quot = adjustments ? adjustments->quot : NULL;
1380 adj_volt = adjustments ? adjustments->init_uV : NULL;
1381 adj_quot_offset = adjustments ? adjustments->fuse_quot_offset : NULL;
1383 override = find_corner_override(desc, speed_bin, pvs_version);
1386 * Store maximum frequency for each fuse corner based on the frequency
1389 for (i = 0; plan[i]; i++) {
1391 freq_corner = p->freq;
1392 fnum = p->fuse_corner;
1393 fuse = &drv->fuse_corners[fnum];
1394 if (freq_corner > fuse->max_freq)
1395 fuse->max_freq = freq_corner;
1400 * Get the quotient adjustment scaling factor, according to:
1402 * scaling = min(1000 * (QUOT(corner_N) - QUOT(corner_N-1))
1403 * / (freq(corner_N) - freq(corner_N-1)), max_factor)
1405 * QUOT(corner_N): quotient read from fuse for fuse corner N
1406 * QUOT(corner_N-1): quotient read from fuse for fuse corner (N - 1)
1407 * freq(corner_N): max frequency in MHz supported by fuse corner N
1408 * freq(corner_N-1): max frequency in MHz supported by fuse corner
1411 * Then walk through the corners mapped to each fuse corner
1412 * and calculate the quotient adjustment for each one using the
1413 * following formula:
1415 * quot_adjust = (freq_max - freq_corner) * scaling / 1000
1417 * freq_max: max frequency in MHz supported by the fuse corner
1418 * freq_corner: frequency in MHz corresponding to the corner
1419 * scaling: calculated from above equation
1430 * +--------------- +----------------
1431 * 0 1 2 3 4 5 6 0 1 2 3 4 5 6
1438 for (apply_scaling = false, i = 0; corner <= end; corner++, i++) {
1439 freq_corner = cdata[i].freq;
1440 fnum = cdata[i].fuse_corner;
1441 fuse = &drv->fuse_corners[fnum];
1443 prev_fuse = &drv->fuse_corners[fnum - 1];
1447 corner->fuse_corner = fuse;
1448 corner->uV = fuse->uV;
1449 if (prev_fuse && cdata[i - 1].freq == prev_fuse->max_freq) {
1450 quot_offset = &fuses[fnum].quotient_offset;
1451 if (quot_offset->width) {
1452 quot_diff = cpr_read_efuse(qfprom, quot_offset);
1453 quot_diff *= fdata->quot_scale;
1454 if (adj_quot_offset)
1455 quot_diff += adj_quot_offset[fnum];
1457 quot_diff = fuse->quot - prev_fuse->quot;
1460 freq_diff = fuse->max_freq - prev_fuse->max_freq;
1461 freq_diff /= 1000000; /* Convert to MHz */
1462 scaling = 1000 * quot_diff / freq_diff;
1463 scaling = min(scaling, fdata[fnum].max_quot_scale);
1465 apply_scaling = true;
1466 } else if (freq_corner == fuse->max_freq) {
1467 /* This is a fuse corner; don't scale anything */
1468 apply_scaling = false;
1471 if (apply_scaling) {
1472 freq_diff = fuse->max_freq - freq_corner;
1473 freq_diff_mhz = freq_diff / 1000000;
1474 corner->quot_adjust = scaling * freq_diff_mhz / 1000;
1476 freq_high = fuse->max_freq;
1477 freq_low = fuse->max_freq;
1478 volt_high = fuse->uV;
1481 if (freq_high > freq_low && volt_high > volt_low &&
1482 freq_high > freq_corner)
1485 temp = freq_diff * (fuse->uV - prev_fuse->uV);
1486 do_div(temp, freq_high - freq_low);
1489 * max_volt_scale has units of uV/MHz while freq values
1490 * have units of Hz. Divide by 1000000 to convert to.
1492 temp_limit = freq_diff * fdata[fnum].max_volt_scale;
1493 do_div(temp_limit, 1000000);
1495 corner->uV = volt_high - min(temp, temp_limit);
1496 corner->uV = roundup(corner->uV, step_volt);
1500 corner->quot_adjust -= adj_quot[i];
1503 corner->uV += adj_volt[i];
1505 /* Load per corner ceiling and floor voltages if they exist. */
1507 corner->max_uV = override->max_uV[i];
1508 corner->min_uV = override->min_uV[i];
1510 corner->max_uV = fuse->max_uV;
1511 corner->min_uV = fuse->min_uV;
1514 if (drv->ceiling_max < corner->max_uV)
1515 drv->ceiling_max = corner->max_uV;
1517 corner->uV = clamp(corner->uV, corner->min_uV, corner->max_uV);
1518 corner->last_uV = corner->uV;
1520 /* Reduce the ceiling voltage if needed */
1521 if (desc->reduce_to_corner_uV && corner->uV < corner->max_uV)
1522 corner->max_uV = corner->uV;
1523 else if (desc->reduce_to_fuse_uV && fuse->uV < corner->max_uV)
1524 corner->max_uV = max(corner->min_uV, fuse->uV);
1526 pr_debug("corner %d: [%d %d %d] quot %d\n", i,
1527 corner->min_uV, corner->uV, corner->max_uV,
1528 fuse->quot - corner->quot_adjust);
1532 static const struct cpr_fuse *
1533 cpr_get_fuses(const struct cpr_desc *desc, void __iomem *qfprom)
1535 u32 expected = desc->cpr_fuses.redundant_value;
1536 const struct qfprom_offset *fuse = &desc->cpr_fuses.redundant;
1539 idx = !!(fuse->width && cpr_read_efuse(qfprom, fuse) == expected);
1541 return &desc->cpr_fuses.cpr_fuse[idx * desc->num_fuse_corners];
1544 static bool cpr_is_close_loop_disabled(struct cpr_drv *drv,
1545 const struct cpr_desc *desc, void __iomem *qfprom,
1546 const struct cpr_fuse *fuses,
1547 const struct corner_adjustment *adj)
1549 const struct qfprom_offset *disable;
1551 struct fuse_corner *highest_fuse, *second_highest_fuse;
1552 int min_diff_quot, diff_quot;
1554 if (adj && adj->disable_closed_loop)
1557 if (!desc->cpr_fuses.disable)
1561 * Are the fuses the redundant ones? This avoids reading the fuse
1562 * redundant bit again
1564 idx = !!(fuses == desc->cpr_fuses.cpr_fuse);
1565 disable = &desc->cpr_fuses.disable[idx];
1567 if (cpr_read_efuse(qfprom, disable))
1570 if (!fuses->quotient_offset.width) {
1572 * Check if the target quotients for the highest two fuse
1573 * corners are too close together.
1575 highest_fuse = &drv->fuse_corners[drv->num_fuse_corners - 1];
1576 second_highest_fuse = highest_fuse - 1;
1578 min_diff_quot = desc->min_diff_quot;
1579 diff_quot = highest_fuse->quot - second_highest_fuse->quot;
1581 return diff_quot < min_diff_quot;
1587 static int cpr_init_parameters(struct platform_device *pdev,
1588 struct cpr_drv *drv)
1590 struct device_node *of_node = pdev->dev.of_node;
1593 ret = of_property_read_u32(of_node, "qcom,cpr-ref-clk",
1597 ret = of_property_read_u32(of_node, "qcom,cpr-timer-delay-us",
1598 &drv->timer_delay_us);
1601 ret = of_property_read_u32(of_node, "qcom,cpr-timer-cons-up",
1602 &drv->timer_cons_up);
1605 ret = of_property_read_u32(of_node, "qcom,cpr-timer-cons-down",
1606 &drv->timer_cons_down);
1609 drv->timer_cons_down &= RBIF_TIMER_ADJ_CONS_DOWN_MASK;
1611 ret = of_property_read_u32(of_node, "qcom,cpr-up-threshold",
1612 &drv->up_threshold);
1613 drv->up_threshold &= RBCPR_CTL_UP_THRESHOLD_MASK;
1617 ret = of_property_read_u32(of_node, "qcom,cpr-down-threshold",
1618 &drv->down_threshold);
1619 drv->down_threshold &= RBCPR_CTL_DN_THRESHOLD_MASK;
1623 ret = of_property_read_u32(of_node, "qcom,cpr-idle-clocks",
1625 drv->idle_clocks &= RBCPR_STEP_QUOT_IDLE_CLK_MASK;
1629 ret = of_property_read_u32(of_node, "qcom,cpr-gcnt-us", &drv->gcnt_us);
1632 ret = of_property_read_u32(of_node, "qcom,vdd-apc-step-up-limit",
1633 &drv->vdd_apc_step_up_limit);
1636 ret = of_property_read_u32(of_node, "qcom,vdd-apc-step-down-limit",
1637 &drv->vdd_apc_step_down_limit);
1641 ret = of_property_read_u32(of_node, "qcom,cpr-clamp-timer-interval",
1642 &drv->clamp_timer_interval);
1643 if (ret && ret != -EINVAL)
1646 drv->clamp_timer_interval = min_t(unsigned int,
1647 drv->clamp_timer_interval,
1648 RBIF_TIMER_ADJ_CLAMP_INT_MASK);
1650 pr_debug("up threshold = %u, down threshold = %u\n",
1651 drv->up_threshold, drv->down_threshold);
1656 static int cpr_init_and_enable_corner(struct cpr_drv *drv)
1661 end = &drv->corners[drv->num_corners - 1];
1662 rate = clk_get_rate(drv->cpu_clk);
1664 for (drv->corner = drv->corners; drv->corner <= end; drv->corner++)
1665 if (drv->corner->freq == rate)
1668 if (drv->corner > end)
1671 return cpr_enable(drv);
1674 static struct corner_data msm8916_corner_data[] = {
1675 /* [corner] -> { fuse corner, freq } */
1687 static const struct cpr_desc msm8916_desc = {
1688 .num_fuse_corners = 3,
1689 .vdd_mx_vmin_method = VDD_MX_VMIN_APC_CORNER_MAP,
1690 .min_diff_quot = CPR_FUSE_MIN_QUOT_DIFF,
1691 .step_quot = (int []){ 26, 26, 26, 26, 26, 26, 26, 26 },
1693 .init_voltage_step = 10000,
1694 .fuse_corner_data = (struct fuse_corner_data[]){
1695 /* ref_uV max_uV min_uV max_q q_off q_scl v_scl mx */
1696 { 1050000, 1050000, 1050000, 0, 0, 1, 0, 3 },
1697 { 1150000, 1150000, 1050000, 0, 0, 1, 0, 4 },
1698 { 1350000, 1350000, 1162500, 650, 0, 1, 0, 6 },
1700 .cpr_fuse = (struct cpr_fuse[]){
1702 .ring_osc = { 222, 3, 6},
1703 .init_voltage = { 220, 6, 2 },
1704 .quotient = { 221, 12, 2 },
1707 .ring_osc = { 222, 3, 6},
1708 .init_voltage = { 218, 6, 2 },
1709 .quotient = { 219, 12, 0 },
1712 .ring_osc = { 222, 3, 6},
1713 .init_voltage = { 216, 6, 0 },
1714 .quotient = { 216, 12, 6 },
1717 .disable = &(struct qfprom_offset){ 223, 1, 1 },
1719 .speed_bin = { 12, 3, 2 },
1720 .pvs_version = { 6, 2, 7 },
1721 .corner_data = msm8916_corner_data,
1722 .num_corners = ARRAY_SIZE(msm8916_corner_data),
1723 .num_freq_plans = 3,
1724 .freq_plans = (struct freq_plan[]){
1728 .plan = (const struct corner_data* []){
1729 msm8916_corner_data + 0,
1730 msm8916_corner_data + 1,
1731 msm8916_corner_data + 2,
1732 msm8916_corner_data + 3,
1733 msm8916_corner_data + 4,
1734 msm8916_corner_data + 5,
1735 msm8916_corner_data + 6,
1736 msm8916_corner_data + 7,
1743 .plan = (const struct corner_data* []){
1744 msm8916_corner_data + 0,
1745 msm8916_corner_data + 1,
1746 msm8916_corner_data + 2,
1747 msm8916_corner_data + 3,
1748 msm8916_corner_data + 4,
1749 msm8916_corner_data + 5,
1750 msm8916_corner_data + 6,
1751 msm8916_corner_data + 7,
1758 .plan = (const struct corner_data* []){
1759 msm8916_corner_data + 0,
1760 msm8916_corner_data + 1,
1761 msm8916_corner_data + 2,
1762 msm8916_corner_data + 3,
1763 msm8916_corner_data + 4,
1764 msm8916_corner_data + 5,
1765 msm8916_corner_data + 6,
1766 msm8916_corner_data + 7,
1767 msm8916_corner_data + 8,
1774 static const struct acc_desc msm8916_acc_desc = {
1775 .settings = (struct reg_sequence[]){
1780 .override_settings = (struct reg_sequence[]){
1785 .num_regs_per_fuse = 1,
1786 .override = { 6, 1, 4 },
1787 .override_value = 1,
1790 static const struct of_device_id cpr_descs[] = {
1791 { .compatible = "qcom,qfprom-msm8916", .data = &msm8916_desc },
1795 static const struct of_device_id acc_descs[] = {
1796 { .compatible = "qcom,tcsr-msm8916", .data = &msm8916_acc_desc },
1800 static int cpr_probe(struct platform_device *pdev)
1802 struct resource *res;
1803 struct device *dev = &pdev->dev;
1804 struct cpr_drv *drv;
1805 const struct cpr_fuse *cpr_fuses;
1806 const struct corner_adjustment *adj;
1807 const struct corner_data **plan;
1810 const struct cpr_desc *desc;
1811 const struct acc_desc *acc_desc;
1812 const struct of_device_id *match;
1813 struct device_node *np;
1814 void __iomem *qfprom;
1815 u32 cpr_rev = FUSE_REVISION_UNKNOWN;
1816 u32 speed_bin = SPEED_BIN_NONE;
1817 u32 pvs_version = 0;
1818 struct platform_device_info devinfo = { .name = "cpufreq-dt", };
1820 np = of_parse_phandle(dev->of_node, "eeprom", 0);
1824 match = of_match_node(cpr_descs, np);
1829 /* TODO: Get from eeprom API */
1830 qfprom = devm_ioremap(dev, 0x58000, 0x7000);
1834 len = sizeof(*drv) +
1835 sizeof(*drv->fuse_corners) * desc->num_fuse_corners +
1836 sizeof(*drv->corners) * desc->num_corners;
1838 drv = devm_kzalloc(dev, len, GFP_KERNEL);
1842 np = of_parse_phandle(dev->of_node, "acc-syscon", 0);
1846 match = of_match_node(acc_descs, np);
1850 acc_desc = match->data;
1851 drv->tcsr = syscon_node_to_regmap(np);
1852 if (IS_ERR(drv->tcsr))
1853 return PTR_ERR(drv->tcsr);
1855 drv->num_fuse_corners = desc->num_fuse_corners;
1856 drv->num_corners = desc->num_corners;
1857 drv->fuse_corners = (struct fuse_corner *)(drv + 1);
1858 drv->corners = (struct corner *)(drv->fuse_corners +
1859 drv->num_fuse_corners);
1860 mutex_init(&drv->lock);
1862 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1863 drv->base = devm_ioremap_resource(&pdev->dev, res);
1864 if (IS_ERR(drv->base))
1865 return PTR_ERR(drv->base);
1867 irq = platform_get_irq(pdev, 0);
1871 drv->vdd_mx = devm_regulator_get(dev, "vdd-mx");
1872 if (IS_ERR(drv->vdd_mx))
1873 return PTR_ERR(drv->vdd_mx);
1875 drv->vdd_mx_vmin_method = desc->vdd_mx_vmin_method;
1876 drv->vdd_mx_vmax = desc->vdd_mx_vmax;
1878 if (desc->fuse_revision.width)
1879 cpr_rev = cpr_read_efuse(qfprom, &desc->fuse_revision);
1880 if (desc->speed_bin.width)
1881 speed_bin = cpr_read_efuse(qfprom, &desc->speed_bin);
1882 if (desc->pvs_version.width)
1883 pvs_version = cpr_read_efuse(qfprom, &desc->pvs_version);
1885 plan = find_freq_plan(desc, speed_bin, pvs_version);
1889 cpr_fuses = cpr_get_fuses(desc, qfprom);
1890 cpr_populate_ring_osc_idx(cpr_fuses, drv, qfprom);
1892 adj = cpr_find_adjustment(speed_bin, pvs_version, cpr_rev, desc, drv);
1894 cpr_fuse_corner_init(drv, desc, qfprom, cpr_fuses, speed_bin, adj,
1896 cpr_corner_init(drv, desc, cpr_fuses, speed_bin, pvs_version, qfprom,
1899 ret = cpr_populate_opps(dev->of_node, drv, plan);
1903 drv->loop_disabled = cpr_is_close_loop_disabled(drv, desc, qfprom,
1905 pr_info("CPR closed loop is %sabled\n",
1906 drv->loop_disabled ? "dis" : "en");
1908 ret = cpr_init_parameters(pdev, drv);
1912 /* Configure CPR HW but keep it disabled */
1913 ret = cpr_config(drv);
1917 /* Enable ACC if required */
1918 if (acc_desc->enable_mask)
1919 regmap_update_bits(drv->tcsr, acc_desc->enable_reg,
1920 acc_desc->enable_mask,
1921 acc_desc->enable_mask);
1923 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
1924 cpr_irq_handler, IRQF_ONESHOT | IRQF_TRIGGER_RISING,
1929 ret = cpr_init_and_enable_corner(drv);
1933 drv->reg_nb.notifier_call = cpr_regulator_notifier;
1934 ret = regulator_register_notifier(drv->vdd_apc, &drv->reg_nb);
1938 drv->cpufreq_nb.notifier_call = cpr_cpufreq_notifier;
1939 ret = cpufreq_register_notifier(&drv->cpufreq_nb,
1940 CPUFREQ_TRANSITION_NOTIFIER);
1942 regulator_unregister_notifier(drv->vdd_apc, &drv->reg_nb);
1947 * Ensure that enable state accurately reflects the case in which CPR
1948 * is permanently disabled.
1950 //cpr_vreg->enable &= !cpr_vreg->loop_disabled;
1952 platform_set_drvdata(pdev, drv);
1954 return PTR_ERR_OR_ZERO(platform_device_register_full(&devinfo));
1957 static int cpr_remove(struct platform_device *pdev)
1959 struct cpr_drv *drv = platform_get_drvdata(pdev);
1961 if (cpr_is_allowed(drv)) {
1962 cpr_ctl_disable(drv);
1963 cpr_irq_set(drv, 0);
1969 static const struct of_device_id cpr_match_table[] = {
1970 { .compatible = "qcom,cpr" },
1973 MODULE_DEVICE_TABLE(of, cpr_match_table);
1975 static struct platform_driver cpr_driver = {
1977 .remove = cpr_remove,
1980 .of_match_table = cpr_match_table,
1984 module_platform_driver(cpr_driver);
1986 MODULE_DESCRIPTION("Core Power Reduction (CPR) driver");
1987 MODULE_LICENSE("GPL v2");
1988 MODULE_ALIAS("platform:qcom-cpr");