forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/arch/arm/mach-omap2/vc.c
....@@ -26,6 +26,31 @@
2626 #include "scrm44xx.h"
2727 #include "control.h"
2828
29
+#define OMAP4430_VDD_IVA_I2C_DISABLE BIT(14)
30
+#define OMAP4430_VDD_MPU_I2C_DISABLE BIT(13)
31
+#define OMAP4430_VDD_CORE_I2C_DISABLE BIT(12)
32
+#define OMAP4430_VDD_IVA_PRESENCE BIT(9)
33
+#define OMAP4430_VDD_MPU_PRESENCE BIT(8)
34
+#define OMAP4430_AUTO_CTRL_VDD_IVA(x) ((x) << 4)
35
+#define OMAP4430_AUTO_CTRL_VDD_MPU(x) ((x) << 2)
36
+#define OMAP4430_AUTO_CTRL_VDD_CORE(x) ((x) << 0)
37
+#define OMAP4430_AUTO_CTRL_VDD_RET 2
38
+
39
+#define OMAP4430_VDD_I2C_DISABLE_MASK \
40
+ (OMAP4430_VDD_IVA_I2C_DISABLE | \
41
+ OMAP4430_VDD_MPU_I2C_DISABLE | \
42
+ OMAP4430_VDD_CORE_I2C_DISABLE)
43
+
44
+#define OMAP4_VDD_DEFAULT_VAL \
45
+ (OMAP4430_VDD_I2C_DISABLE_MASK | \
46
+ OMAP4430_VDD_IVA_PRESENCE | OMAP4430_VDD_MPU_PRESENCE | \
47
+ OMAP4430_AUTO_CTRL_VDD_IVA(OMAP4430_AUTO_CTRL_VDD_RET) | \
48
+ OMAP4430_AUTO_CTRL_VDD_MPU(OMAP4430_AUTO_CTRL_VDD_RET) | \
49
+ OMAP4430_AUTO_CTRL_VDD_CORE(OMAP4430_AUTO_CTRL_VDD_RET))
50
+
51
+#define OMAP4_VDD_RET_VAL \
52
+ (OMAP4_VDD_DEFAULT_VAL & ~OMAP4430_VDD_I2C_DISABLE_MASK)
53
+
2954 /**
3055 * struct omap_vc_channel_cfg - describe the cfg_channel bitfield
3156 * @sa: bit for slave address
....@@ -278,6 +303,26 @@
278303 OMAP3_PRM_VOLTSETUP2_OFFSET);
279304 vc.voltsetup2 = voltsetup2;
280305 }
306
+}
307
+
308
+void omap4_vc_set_pmic_signaling(int core_next_state)
309
+{
310
+ struct voltagedomain *vd = vc.vd;
311
+ u32 val;
312
+
313
+ if (!vd)
314
+ return;
315
+
316
+ switch (core_next_state) {
317
+ case PWRDM_POWER_RET:
318
+ val = OMAP4_VDD_RET_VAL;
319
+ break;
320
+ default:
321
+ val = OMAP4_VDD_DEFAULT_VAL;
322
+ break;
323
+ }
324
+
325
+ vd->write(val, OMAP4_PRM_VOLTCTRL_OFFSET);
281326 }
282327
283328 /*
....@@ -542,9 +587,19 @@
542587 writel_relaxed(val, OMAP4_SCRM_CLKSETUPTIME);
543588 }
544589
590
+static void __init omap4_vc_init_pmic_signaling(struct voltagedomain *voltdm)
591
+{
592
+ if (vc.vd)
593
+ return;
594
+
595
+ vc.vd = voltdm;
596
+ voltdm->write(OMAP4_VDD_DEFAULT_VAL, OMAP4_PRM_VOLTCTRL_OFFSET);
597
+}
598
+
545599 /* OMAP4 specific voltage init functions */
546600 static void __init omap4_vc_init_channel(struct voltagedomain *voltdm)
547601 {
602
+ omap4_vc_init_pmic_signaling(voltdm);
548603 omap4_set_timings(voltdm, true);
549604 omap4_set_timings(voltdm, false);
550605 }
....@@ -615,7 +670,7 @@
615670 const struct i2c_init_data *i2c_data;
616671
617672 if (!voltdm->pmic->i2c_high_speed) {
618
- pr_warn("%s: only high speed supported!\n", __func__);
673
+ pr_info("%s: using bootloader low-speed timings\n", __func__);
619674 return;
620675 }
621676