3 #include <linux/spinlock.h>
4 #include <linux/interrupt.h>
5 #include <linux/types.h>
6 #include <linux/module.h>
7 #include <linux/proc_fs.h>
8 #include <linux/kernel.h>
9 #include <linux/init.h>
10 #include <linux/delay.h>
11 #include <linux/xlog.h>
13 #include <asm/uaccess.h>
15 #include <mach/mt_typedefs.h>
16 #include <mach/mt_pm_ldo.h>
18 /****************************************************************
20 ****************************************************************/
21 ROOTBUS_HW g_MT_PMIC_BusHW
;
23 /*******************************************************************
24 * Extern Variable DEFINATIONS
25 *******************************************************************/
27 /**********************************************************************
28 * Extern FUNCTION DEFINATIONS
29 *******************************************************************/
31 /**********************************************************************
32 * Debug Message Settings
33 *****************************************************************/
35 #define MSG(evt, fmt, args...) \
37 if ((DBG_PMAPI_##evt) & DBG_PMAPI_MASK) { \
38 xlog_printk(ANDROID_LOG_INFO, "Power/PMIC", fmt, ##args); \
42 #define MSG_FUNC_ENTRY(f) MSG(ENTER, "<PMAPI FUNC>: %s\n", __FUNCTION__)
44 #define MSG(evt, fmt, args...) do{}while(0)
45 #define MSG_FUNC_ENTRY(f) do{}while(0)
48 /****************************************************************
49 * FUNCTION DEFINATIONS
50 *******************************************************************/
51 int first_power_on_flag
= 1;
53 bool hwPowerOn(MT65XX_POWER powerId
, MT65XX_POWER_VOLTAGE powerVolt
, char *mode_name
)
58 if(first_power_on_flag
== 1)
60 for(j
=0 ; j
<MT65XX_POWER_COUNT_END
; j
++)
62 for(k
=0 ; k
<MAX_DEVICE
; k
++)
64 sprintf(g_MT_PMIC_BusHW
.Power
[j
].mod_name
[k
] , "%s", NON_OP
);
66 g_MT_PMIC_BusHW
.Power
[j
].dwPowerCount
=0;
68 first_power_on_flag
= 0;
69 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerOn] init done.\r\n");
73 if(powerId
>= MT65XX_POWER_COUNT_END
)
75 MSG(PMIC
,"[MT65XX PMU] Error!! powerId is wrong\r\n");
78 for (i
= 0; i
< MAX_DEVICE
; i
++)
80 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerOn] %d,%s,%d\r\n", i
, g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
], g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
);
82 if (!strcmp(g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
], NON_OP
))
84 MSG(PMIC
,"[%s] acquire powerId:%d index:%d mod_name: %s powerVolt:%d\r\n",
85 __FUNCTION__
,powerId
, i
, mode_name
,powerVolt
);
86 sprintf(g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
] , "%s", mode_name
);
91 else if (!strcmp(g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
], mode_name
))
93 MSG(CG
,"[%d] Power already register\r\n",powerId
);
97 g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
++ ;
98 /* We've already enable this LDO before */
99 if(g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
> 1)
101 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerOn] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 1\r\n", g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
);
106 MSG(CG
,"[%d] PMU LDO Enable\r\n",powerId
);
107 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerOn] enable %d by %s \r\n", powerId
, mode_name
);
108 if ((powerId
== MT65XX_POWER_LDO_VMC
)
109 ||(powerId
== MT65XX_POWER_LDO_VMCH
)
110 ||(powerId
== MT65XX_POWER_LDO_VEMC_3V3
)
111 ||(powerId
== MT65XX_POWER_LDO_VCAMD
)
112 ||(powerId
== MT65XX_POWER_LDO_VCAMIO
)
113 ||(powerId
== MT65XX_POWER_LDO_VCAMAF
)
114 ||(powerId
== MT65XX_POWER_LDO_VGP4
)
115 ||(powerId
== MT65XX_POWER_LDO_VGP5
)
116 ||(powerId
== MT65XX_POWER_LDO_VGP6
)
117 ||(powerId
== MT65XX_POWER_LDO_VIBR
)
118 ||(powerId
== MT65XX_POWER_LDO_VCAMA
)
119 ||(powerId
== MT6323_POWER_LDO_VMC
)
120 ||(powerId
== MT6323_POWER_LDO_VMCH
)
121 ||(powerId
== MT6323_POWER_LDO_VEMC_3V3
)
122 ||(powerId
== MT6323_POWER_LDO_VGP1
)
123 ||(powerId
== MT6323_POWER_LDO_VGP2
)
124 ||(powerId
== MT6323_POWER_LDO_VGP3
)
125 ||(powerId
== MT6323_POWER_LDO_VSIM1
)
126 ||(powerId
== MT6323_POWER_LDO_VSIM2
)
127 ||(powerId
== MT6323_POWER_LDO_VCAM_AF
)
128 ||(powerId
== MT6323_POWER_LDO_VIBR
)
129 ||(powerId
== MT6323_POWER_LDO_VM
)
130 ||(powerId
== MT6323_POWER_LDO_VCAMD
)
131 ||(powerId
== MT6323_POWER_LDO_VA
)
132 ||(powerId
== MT6323_POWER_LDO_VCAMA
)
133 ||(powerId
== MT6323_POWER_LDO_VCN28
)
134 ||(powerId
== MT6323_POWER_LDO_VCN33_BT
)
135 ||(powerId
== MT6323_POWER_LDO_VCN33_WIFI
)
138 pmic_ldo_vol_sel(powerId
, powerVolt
);
141 pmic_ldo_enable(powerId
, KAL_TRUE
);
145 EXPORT_SYMBOL(hwPowerOn
);
147 bool hwPowerDown(MT65XX_POWER powerId
, char *mode_name
)
152 if(powerId
>= MT65XX_POWER_COUNT_END
)
154 MSG(PMIC
,"%s:%s:%d powerId:%d is wrong\r\n",__FILE__
,__FUNCTION__
,
158 if(g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
== 0)
160 MSG(PMIC
,"%s:%s:%d powerId:%d (g_MT_PMIC_BusHW.dwPowerCount[powerId] = 0)\r\n",
161 __FILE__
,__FUNCTION__
,__LINE__
,powerId
);
164 for (i
= 0; i
< MAX_DEVICE
; i
++)
166 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerDown] %d,%s,%d\r\n", i
, g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
], g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
);
168 if (!strcmp(g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
], mode_name
))
170 MSG(PMIC
,"[%s] powerId:%d index:%d mod_name: %s\r\n",
171 __FUNCTION__
,powerId
, i
, mode_name
);
172 sprintf(g_MT_PMIC_BusHW
.Power
[powerId
].mod_name
[i
] , "%s", NON_OP
);
179 MSG(PMIC
,"[%s] Cannot find [%d] master is [%s]\r\n",__FUNCTION__
,powerId
, mode_name
);
182 g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
--;
183 if(g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
> 0)
185 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerDown] g_MT_PMIC_BusHW.Power[powerId].dwPowerCount (%d) > 0\r\n", g_MT_PMIC_BusHW
.Power
[powerId
].dwPowerCount
);
189 /* Turn off PMU LDO*/
190 MSG(CG
,"[%d] PMU LDO Disable\r\n",powerId
);
191 xlog_printk(ANDROID_LOG_DEBUG
, "Power/PMIC", "[hwPowerDown] disable %d by %s \r\n", powerId
, mode_name
);
193 pmic_ldo_enable(powerId
, KAL_FALSE
);
197 EXPORT_SYMBOL(hwPowerDown
);