blob: 771117c5766d15a59eec0ffdbf8ddb2212c5f06a [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * dcl_pmu.c
41 *
42 * Project:
43 * --------
44 * MOLY
45 *
46 * Description:
47 * ------------
48 * This Module defines DCL (Driver Common Layer) of the PMIC driver.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 ****************************************************************************/
56#include "kal_debug.h"
57#include "kal_public_api.h"
58#include "kal_hrt_api.h"
59#include "intrCtrl.h"
60#include "dcl.h"
61#include "dcl_pmu_sw.h"
62#include "dcl_pmu_common_sw.h"
63#include "us_timer.h"
64
65#ifndef DRV_PMIC_OFF
66
67#if defined(DCL_PMIC_ACCESS_TIME_LOG)
68PMIC_ACCESS_DURATION_DBG pmic_access_duration_log[PMIC_LOG_TYPE_MAX][PMIC_DURATION_LOG_MAX][MAX_PMIC_DURATION_INFO_SIZE];
69DCL_UINT32 pmic_access_duration_index [PMIC_LOG_TYPE_MAX] = {0};
70DCL_UINT32 pmic_access_timing_issue_log [PMIC_LOG_TYPE_MAX][MAX_PMIC_DURATION_INFO_SIZE];
71DCL_UINT32 pmic_access_timing_issue_index [PMIC_LOG_TYPE_MAX]= {0};
72#endif // End of #if defined(DCL_PMIC_ACCESS_TIME_LOG)
73
74kal_spinlockid dcl_pmic_control_spinlock;
75kal_atomic_uint32 dcl_pmic_hrt_flag = 0;
76
77PMU_CONTROL_HANDLER pmu_control_handler = 0;
78static DCL_UINT32 dcl_pmu_handle_count = 0;
79
80#if defined(DCL_PMIC_MODULE_CONTROL)
81DCL_FLAGS dcl_pmu_handle_flags = FLAGS_NONE;
82
83DCL_FLAGS DclPMU_GetCurrentHandlerFlag(DCL_HANDLE handle)
84{
85 if( handle == dcl_pmu_handle_count )
86 return dcl_pmu_handle_flags ;
87
88 return FLAGS_NONE;
89}
90#endif
91
92kal_atomic_uint32 DclPMU_GetHrtFlag(void)
93{
94 return kal_atomic_read(&dcl_pmic_hrt_flag);
95}
96
97/*************************************************************************
98* FUNCTION
99* DclPMU_Initialize
100*
101* DESCRIPTION
102* This function is to initialize PMU module
103*
104* PARAMETERS
105* None
106*
107* RETURNS
108* STATUS_OK
109*
110*************************************************************************/
111DCL_STATUS DclPMU_Initialize(void)
112{
113#if defined(MT6353)
114extern void dcl_pmic6353_init(void);
115 dcl_pmic6353_init();
116#else
117extern void dcl_pmic_init(void);
118 dcl_pmic_init();
119#endif
120
121 return STATUS_OK;
122}
123
124/*************************************************************************
125* FUNCTION
126* DclPMU_Open
127*
128* DESCRIPTION
129* This function is to open the PMU module and return a handle
130*
131* PARAMETERS
132* dev: only valid for DCL_PMU
133* flags: no sepcial flags is needed. Please use FLAGS_NONE
134*
135* RETURNS
136* DCL_HANDLE_INVALID: Open failed.
137* other value: a valid handle
138*
139*************************************************************************/
140DCL_HANDLE DclPMU_Open(DCL_DEV dev, DCL_FLAGS flags)
141{
142 kal_uint32 handle;
143 kal_uint32 savedMask=0;
144
145 if (dev != DCL_PMU){
146 return DCL_HANDLE_INVALID; // Incorrecr device ID
147 }
148 savedMask = kal_hrt_SaveAndSetIRQMask();
149 dcl_pmu_handle_count++;
150 handle = dcl_pmu_handle_count;
151#if defined(DCL_PMIC_MODULE_CONTROL)
152 dcl_pmu_handle_flags = flags;
153#endif
154 kal_hrt_RestoreIRQMask(savedMask);
155
156 // Register DCL default lisr
157 return handle;
158}
159/*************************************************************************
160* FUNCTION
161* DclPMU_ReadData
162*
163* DESCRIPTION
164* This function is not supported for the PMU module now.
165*
166* PARAMETERS
167* N/A
168*
169* RETURNS
170* STATUS_UNSUPPORTED
171*
172*************************************************************************/
173DCL_STATUS DclPMU_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
174{
175
176 return STATUS_UNSUPPORTED;
177}
178
179/*************************************************************************
180* FUNCTION
181* DclPMU_WriteData
182*
183* DESCRIPTION
184* This function is not supported for the PMU module now.
185*
186* PARAMETERS
187* N/A
188*
189* RETURNS
190* STATUS_UNSUPPORTED
191*
192*************************************************************************/
193DCL_STATUS DclPMU_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
194{
195
196 return STATUS_UNSUPPORTED;
197}
198
199/*************************************************************************
200* FUNCTION
201* DclPMU_Configure
202*
203* DESCRIPTION
204* This function is not supported for the PMU module now.
205*
206* PARAMETERS
207* N/A
208*
209* RETURNS
210* STATUS_UNSUPPORTED
211*
212*************************************************************************/
213DCL_STATUS DclPMU_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
214{
215
216 return STATUS_UNSUPPORTED;
217}
218
219/*************************************************************************
220* FUNCTION
221* DclPMU_RegisterCallback
222*
223* DESCRIPTION
224* This function is to set callback function for the PMU module.
225*
226* PARAMETERS
227* handle: the returned handle value of DclPMU_Open
228* event: Supported events:
229* EVENT_PMU_TIMEOUT: Watch dog time out interrupt
230* callback: the callback function for registered events
231*
232* RETURNS
233* STATUS_OK: Successfully register the callback function.
234* STATUS_INVALID_HANDLE: It's a invalid handle.
235* STATUS_NOT_OPENED: The module has not been opened.
236* STATUS_INVALID_EVENT: The event parameter is invalid.
237* STATUS_UNSUPPORTED: The function is NOT supported
238*
239*************************************************************************/
240DCL_STATUS DclPMU_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
241{
242 return STATUS_UNSUPPORTED;
243}
244
245
246/*************************************************************************
247* FUNCTION
248* DclPMU_Control
249*
250* DESCRIPTION
251* This function is to send command to control the PMU module.
252*
253* PARAMETERS
254* handle: The handle value returned from DclPMU_Open
255* cmd: a control command for PMU module
256* PMU38: Refer dcl_pmu38.c
257*
258*
259* data: The data of the control command
260* PMU38: Refer dcl_pmu38.c
261*
262*
263* RETURNS
264* STATUS_OK: command is executed successfully.
265* STATUS_FAIL: command is failed.
266* STATUS_INVALID_CMD: It's a invalid command.
267*
268*************************************************************************/
269DCL_STATUS DclPMU_Control_Wrap(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data, PMIC_LOG_TYPE_ENUM type)
270{
271
272#if defined(DCL_PMIC_ACCESS_TIME_LOG)
273 DCL_STATUS pmu_control_status;
274 DCL_UINT32 duration_idx = pmic_access_duration_index[type];
275 DCL_UINT32 issue_idx = pmic_access_timing_issue_index[type];
276
277
278 if(type == PMIC_LOG_TYPE_NORMAL_DOMAIN)
279 kal_take_spinlock(dcl_pmic_control_spinlock, KAL_INFINITE_WAIT);
280
281 pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].start_time = ust_get_current_time();
282
283 pmu_control_status = pmu_control_handler(handle,cmd,data);
284
285 pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].end_time = ust_get_current_time();
286 pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].cmd = cmd;
287 pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].duration_time = ust_us_duration(pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].start_time, pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].end_time);
288
289 if(pmic_access_duration_log[type][PMIC_DCL_DBG][duration_idx].duration_time > PMIC_ACCESS_DURATION_THRESHOLD)
290 {
291 pmic_access_timing_issue_log[type][issue_idx] = duration_idx;
292 issue_idx++;
293 issue_idx = issue_idx &(MAX_PMIC_DURATION_INFO_SIZE - 1);
294 pmic_access_timing_issue_index[type] = issue_idx;
295 }
296
297 duration_idx++;
298 duration_idx = duration_idx &(MAX_PMIC_DURATION_INFO_SIZE - 1);
299 pmic_access_duration_index[type] = duration_idx;
300
301 if(type == PMIC_LOG_TYPE_NORMAL_DOMAIN)
302 kal_give_spinlock(dcl_pmic_control_spinlock);
303
304 return pmu_control_status;
305
306#else
307 return pmu_control_handler(handle, cmd, data);
308#endif
309}
310
311DCL_STATUS DclPMU_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
312{
313 DCL_STATUS pmu_control_status;
314
315 if (kal_get_current_domain() == KAL_DOMAIN_NORMAL)
316 {
317 pmu_control_status = DclPMU_Control_Wrap(handle, cmd, data, PMIC_LOG_TYPE_NORMAL_DOMAIN);
318 } else { //HRT/CHRT domain
319 kal_atomic_inc(&dcl_pmic_hrt_flag);
320 pmu_control_status = DclPMU_Control_Wrap(handle, cmd, data, PMIC_LOG_TYPE_HRT_DOMAIN);
321 kal_atomic_dec(&dcl_pmic_hrt_flag);
322 }
323
324 return pmu_control_status;
325}
326/*************************************************************************
327* FUNCTION
328* DclPMU_Close
329*
330* DESCRIPTION
331* This function is to close the PMU module.
332*
333* PARAMETERS
334* handle: the returned handle value of DclPMU_Open
335*
336* RETURNS
337* STATUS_OK
338*
339*************************************************************************/
340DCL_STATUS DclPMU_Close(DCL_HANDLE handle)
341{
342 return STATUS_OK;
343}
344
345
346#else // DRV_PMIC_OFF
347DCL_STATUS DclPMU_Initialize(void)
348{
349 return STATUS_UNSUPPORTED;
350}
351
352DCL_HANDLE DclPMU_Open(DCL_DEV dev, DCL_FLAGS flags)
353{
354 return STATUS_UNSUPPORTED;
355}
356
357DCL_STATUS DclPMU_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
358{
359 return STATUS_UNSUPPORTED;
360}
361
362DCL_STATUS DclPMU_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
363{
364 return STATUS_UNSUPPORTED;
365}
366
367DCL_STATUS DclPMU_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
368{
369 return STATUS_UNSUPPORTED;
370}
371
372DCL_STATUS DclPMU_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
373{
374 return STATUS_UNSUPPORTED;
375}
376
377DCL_STATUS DclPMU_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
378{
379 return STATUS_UNSUPPORTED;
380}
381
382DCL_STATUS DclPMU_Close(DCL_HANDLE handle)
383{
384 return STATUS_UNSUPPORTED;
385}
386
387#endif // DRV_PMIC_OFF
388
389