import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / mach-mt8127 / mt_pm_ldo.c
1
2 #include <asm/io.h>
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>
12
13 #include <asm/uaccess.h>
14
15 #include <mach/mt_typedefs.h>
16 #include <mach/mt_pm_ldo.h>
17
18 /****************************************************************
19 * GLOBAL DEFINATION
20 ****************************************************************/
21 ROOTBUS_HW g_MT_PMIC_BusHW ;
22
23 /*******************************************************************
24 * Extern Variable DEFINATIONS
25 *******************************************************************/
26
27 /**********************************************************************
28 * Extern FUNCTION DEFINATIONS
29 *******************************************************************/
30
31 /**********************************************************************
32 * Debug Message Settings
33 *****************************************************************/
34 #if 1
35 #define MSG(evt, fmt, args...) \
36 do { \
37 if ((DBG_PMAPI_##evt) & DBG_PMAPI_MASK) { \
38 xlog_printk(ANDROID_LOG_INFO, "Power/PMIC", fmt, ##args); \
39 } \
40 } while(0)
41
42 #define MSG_FUNC_ENTRY(f) MSG(ENTER, "<PMAPI FUNC>: %s\n", __FUNCTION__)
43 #else
44 #define MSG(evt, fmt, args...) do{}while(0)
45 #define MSG_FUNC_ENTRY(f) do{}while(0)
46 #endif
47
48 /****************************************************************
49 * FUNCTION DEFINATIONS
50 *******************************************************************/
51 int first_power_on_flag = 1;
52
53 bool hwPowerOn(MT65XX_POWER powerId, MT65XX_POWER_VOLTAGE powerVolt, char *mode_name)
54 {
55 UINT32 i = 0;
56 int j=0, k=0;
57
58 if(first_power_on_flag == 1)
59 {
60 for(j=0 ; j<MT65XX_POWER_COUNT_END ; j++)
61 {
62 for(k=0 ; k<MAX_DEVICE ; k++)
63 {
64 sprintf(g_MT_PMIC_BusHW.Power[j].mod_name[k] , "%s", NON_OP);
65 }
66 g_MT_PMIC_BusHW.Power[j].dwPowerCount=0;
67 }
68 first_power_on_flag = 0;
69 xlog_printk(ANDROID_LOG_DEBUG, "Power/PMIC", "[hwPowerOn] init done.\r\n");
70 }
71
72 #if 1
73 if(powerId >= MT65XX_POWER_COUNT_END)
74 {
75 MSG(PMIC,"[MT65XX PMU] Error!! powerId is wrong\r\n");
76 return FALSE;
77 }
78 for (i = 0; i< MAX_DEVICE; i++)
79 {
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);
81
82 if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], NON_OP))
83 {
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);
87 break ;
88 }
89 /* already it */
90 #if 0
91 else if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], mode_name))
92 {
93 MSG(CG,"[%d] Power already register\r\n",powerId );
94 }
95 #endif
96 }
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)
100 {
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);
102 return TRUE;
103 }
104 #endif
105 /* Turn on PMU LDO*/
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)
136 )
137 {
138 pmic_ldo_vol_sel(powerId, powerVolt);
139 }
140
141 pmic_ldo_enable(powerId, KAL_TRUE);
142
143 return TRUE;
144 }
145 EXPORT_SYMBOL(hwPowerOn);
146
147 bool hwPowerDown(MT65XX_POWER powerId, char *mode_name)
148 {
149 UINT32 i;
150 #if 1
151 BOOL bFind = FALSE;
152 if(powerId >= MT65XX_POWER_COUNT_END)
153 {
154 MSG(PMIC,"%s:%s:%d powerId:%d is wrong\r\n",__FILE__,__FUNCTION__,
155 __LINE__ , powerId);
156 return FALSE;
157 }
158 if(g_MT_PMIC_BusHW.Power[powerId].dwPowerCount == 0)
159 {
160 MSG(PMIC,"%s:%s:%d powerId:%d (g_MT_PMIC_BusHW.dwPowerCount[powerId] = 0)\r\n",
161 __FILE__,__FUNCTION__,__LINE__ ,powerId);
162 return FALSE;
163 }
164 for (i = 0; i< MAX_DEVICE; i++)
165 {
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);
167
168 if (!strcmp(g_MT_PMIC_BusHW.Power[powerId].mod_name[i], mode_name))
169 {
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);
173 bFind = TRUE;
174 break ;
175 }
176 }
177 if(!bFind)
178 {
179 MSG(PMIC,"[%s] Cannot find [%d] master is [%s]\r\n",__FUNCTION__,powerId, mode_name);
180 return TRUE;
181 }
182 g_MT_PMIC_BusHW.Power[powerId].dwPowerCount--;
183 if(g_MT_PMIC_BusHW.Power[powerId].dwPowerCount > 0)
184 {
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);
186 return TRUE;
187 }
188 #endif
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);
192
193 pmic_ldo_enable(powerId, KAL_FALSE);
194
195 return TRUE;
196 }
197 EXPORT_SYMBOL(hwPowerDown);