blob: e0a2cfe2201f9b1bad6fd383a10d10bd0a067321 [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 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 * removed!
60 * removed!
61 *
62 * removed!
63 * removed!
64 * removed!
65 * removed!
66 * removed!
67 *
68 * removed!
69 * removed!
70 * removed!
71 * removed!
72 *
73 * removed!
74 * removed!
75 * removed!
76 * removed!
77 * removed!
78 *
79 * removed!
80 * removed!
81 * removed!
82 * removed!
83 *
84 * removed!
85 * removed!
86 *
87 * removed!
88 * removed!
89 *
90 * removed!
91 * removed!
92 *
93 * removed!
94 * removed!
95 *
96 * removed!
97 * removed!
98 *
99 * removed!
100 * removed!
101 *
102 * removed!
103 * removed!
104 * removed!
105 * removed!
106 *
107 * removed!
108 * removed!
109 * removed!
110 *------------------------------------------------------------------------------
111 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
112 *============================================================================
113 ****************************************************************************/
114
115#include "kal_debug.h"
116#include "kal_public_api.h"
117#include "kal_hrt_api.h"
118#include "intrCtrl.h"
119#include "dcl.h"
120#include "pmif.h"
121#include "spmi.h"
122#include "pmif_sw.h"
123#include "spmi_sw.h"
124#include "us_timer.h"
125#include "drv_features.h"
126
127#if defined (DRV_SPMI_OFF) || DRV_SPMI_NOT_SUPPORT
128
129DCL_STATUS DclSPMI_Initialize(void)
130{
131 return STATUS_UNSUPPORTED;
132}
133
134DCL_HANDLE DclSPMI_Open(DCL_DEV dev, DCL_FLAGS flags)
135{
136 return STATUS_UNSUPPORTED;
137}
138
139DCL_STATUS DclSPMI_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
140{
141 return STATUS_UNSUPPORTED;
142}
143
144DCL_STATUS DclSPMI_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
145{
146 return STATUS_UNSUPPORTED;
147}
148
149DCL_STATUS DclSPMI_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
150{
151 return STATUS_UNSUPPORTED;
152}
153
154DCL_STATUS DclSPMI_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
155{
156 return STATUS_UNSUPPORTED;
157}
158
159DCL_STATUS DclSPMI_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
160{
161 return STATUS_UNSUPPORTED;
162}
163
164DCL_STATUS DclSPMI_Close(DCL_HANDLE handle)
165{
166 return STATUS_UNSUPPORTED;
167}
168
169#else /* DRV_SPMI_OFF */
170SPMI_CONTROL_HANDLER spmi_control_handler = 0;
171static DCL_UINT32 dcl_spmi_handle_count = 0;
172
173/*************************************************************************
174* FUNCTION
175* DclSPMI_Initialize
176*
177* DESCRIPTION
178* This function is to initialize SPMI module
179*
180* PARAMETERS
181* None
182*
183* RETURNS
184* STATUS_OK
185*
186*************************************************************************/
187DCL_STATUS DclSPMI_Initialize(void)
188{
189#if defined(MT6885) || defined(MT6873) || defined(MERCURY)
190 pmif_spmi_init(SPMI_MASTER_0);
191#elif defined(MT6853)
192#if defined(MT6315)
193 pmif_spmi_init(SPMI_MASTER_1);
194#else
195 pmif_spmi_init(SPMI_MASTER_1);
196 pmif_spmi_init(SPMI_MASTER_P_1);
197#endif
198#else
199 pmif_spmi_init(SPMI_MASTER_1);
200 pmif_spmi_init(SPMI_MASTER_P_1);
201#endif
202
203 return STATUS_OK;
204}
205
206/*************************************************************************
207* FUNCTION
208* DclSPMI_Open
209*
210* DESCRIPTION
211* This function is to open the SPMI module and return a handle
212*
213* PARAMETERS
214* dev: only valid for DCL_SPMI
215* flags: no sepcial flags is needed. Please use FLAGS_NONE
216*
217* RETURNS
218* DCL_HANDLE_INVALID: Open failed.
219* other value: a valid handle
220*
221*************************************************************************/
222DCL_HANDLE DclSPMI_Open(DCL_DEV dev, DCL_FLAGS flags)
223{
224 kal_uint32 handle;
225
226 if (dev != DCL_SPMI) {
227 /* Incorrecr device ID */
228 return DCL_HANDLE_INVALID;
229 }
230 kal_hrt_take_itc_lock(KAL_ITC_SPMI_LOCK, KAL_INFINITE_WAIT);
231 dcl_spmi_handle_count++;
232 handle = dcl_spmi_handle_count;
233 kal_hrt_give_itc_lock(KAL_ITC_SPMI_LOCK);
234
235 /* Register DCL default lisr */
236 return handle;
237}
238
239/*************************************************************************
240* FUNCTION
241* DclSPMI_ReadData
242*
243* DESCRIPTION
244* This function is not supported for the SPMI module now.
245*
246* PARAMETERS
247* N/A
248*
249* RETURNS
250* STATUS_UNSUPPORTED
251*
252*************************************************************************/
253DCL_STATUS DclSPMI_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
254{
255
256 return STATUS_UNSUPPORTED;
257}
258
259/*************************************************************************
260* FUNCTION
261* DclSPMI_WriteData
262*
263* DESCRIPTION
264* This function is not supported for the SPMI module now.
265*
266* PARAMETERS
267* N/A
268*
269* RETURNS
270* STATUS_UNSUPPORTED
271*
272*************************************************************************/
273DCL_STATUS DclSPMI_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
274{
275
276 return STATUS_UNSUPPORTED;
277}
278
279/*************************************************************************
280* FUNCTION
281* DclSPMI_Configure
282*
283* DESCRIPTION
284* This function is not supported for the SPMI module now.
285*
286* PARAMETERS
287* N/A
288*
289* RETURNS
290* STATUS_UNSUPPORTED
291*
292*************************************************************************/
293DCL_STATUS DclSPMI_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
294{
295
296 return STATUS_UNSUPPORTED;
297}
298
299/*************************************************************************
300* FUNCTION
301* DclSPMI_RegisterCallback
302*
303* DESCRIPTION
304* This function is not supported for the SPMI module now.
305*
306* PARAMETERS
307* N/A
308*
309* RETURNS
310* STATUS_UNSUPPORTED
311*
312*************************************************************************/
313DCL_STATUS DclSPMI_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
314{
315 return STATUS_UNSUPPORTED;
316}
317
318/*************************************************************************
319* FUNCTION
320* DclSPMI_Control
321*
322* DESCRIPTION
323* This function is to send command to control the SPMI module.
324*
325* PARAMETERS
326* handle: The handle value returned from DclSPMI_Open
327* cmd: a control command for SPMI module
328* RETURNS
329* STATUS_OK: command is executed successfully.
330* STATUS_FAIL: command is failed.
331* STATUS_INVALID_CMD: It's a invalid command.
332* STATUS_UNSUPPORTED: It's a unsupported command.
333*
334*************************************************************************/
335DCL_STATUS DclSPMI_Control_Priv(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
336{
337 struct spmi_device *md_dev;
338 DCL_INT32 ret = STATUS_OK, cmd_ret = 0;
339
340 switch(cmd) {
341 case EXT_REGISTER_READL:
342 {
343 SPMI_CTRL_EXT_REGISTER_READL *cmd = &(data->rSPMIExtRegisterReadL);
344 unsigned char rdata = 0;
345
346 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
347 //TBD md_dev = get_spmi_device(SPMI_MASTER_0, slaveid);
348 cmd_ret = spmi_ext_register_readl(md_dev, cmd->addr,
349 &rdata, cmd->len);
350 if (cmd_ret)
351 ret = STATUS_FAIL;
352 cmd->value = rdata;
353 }
354 break;
355
356 case EXT_REGISTER_WRITEL:
357 {
358 SPMI_CTRL_EXT_REGISTER_WRITEL *cmd = &(data->rSPMIExtRegisterWriteL);
359 unsigned char wdata = 0;
360
361 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
362 wdata = (unsigned char)cmd->value;
363 cmd_ret = spmi_ext_register_writel(md_dev, cmd->addr,
364 &wdata, cmd->len);
365 if (cmd_ret)
366 ret = STATUS_FAIL;
367 }
368 break;
369
370 case EXT_REGISTER_READL_FIELD:
371 {
372 SPMI_CTRL_EXT_REGISTER_READL_FIELD *cmd = &(data->rSPMIExtRegisterReadLField);
373 unsigned char rdata = 0;
374
375 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
376 cmd_ret = spmi_ext_register_readl_field(md_dev, cmd->addr,
377 &rdata, cmd->len, cmd->mask, cmd->shift);
378 if (cmd_ret)
379 ret = STATUS_FAIL;
380 cmd->value = rdata;
381 }
382 break;
383
384 case EXT_REGISTER_WRITEL_FIELD:
385 {
386 SPMI_CTRL_EXT_REGISTER_WRITEL_FIELD *cmd = &(data->rSPMIExtRegisterWriteLField);
387 unsigned char wdata = 0;
388
389 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
390 wdata = (unsigned char)cmd->value;
391 cmd_ret = spmi_ext_register_writel_field(md_dev, cmd->addr,
392 &wdata, cmd->len, cmd->mask, cmd->shift);
393 if (cmd_ret)
394 ret = STATUS_FAIL;
395 }
396 break;
397
398 case REGISTER_READ:
399 {
400 SPMI_CTRL_EXT_REGISTER_READL *cmd = &(data->rSPMIExtRegisterReadL);
401 unsigned char rdata = 0;
402
403 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
404 cmd_ret = spmi_register_read(md_dev, cmd->addr, &rdata);
405 if (cmd_ret)
406 ret = STATUS_FAIL;
407 cmd->value = rdata;
408 }
409 break;
410
411 case REGISTER_WRITE:
412 {
413 SPMI_CTRL_EXT_REGISTER_WRITEL *cmd = &(data->rSPMIExtRegisterWriteL);
414 unsigned char wdata = 0;
415
416 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
417 wdata = (unsigned char)cmd->value;
418 cmd_ret = spmi_register_write(md_dev, cmd->addr, wdata);
419 if (cmd_ret)
420 ret = STATUS_FAIL;
421 }
422 break;
423
424 case EXT_REGISTER_READ:
425 {
426 SPMI_CTRL_EXT_REGISTER_READL *cmd = &(data->rSPMIExtRegisterReadL);
427 unsigned char rdata = 0;
428
429 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
430 cmd_ret = spmi_ext_register_read(md_dev, cmd->addr,
431 &rdata, cmd->len);
432 if (cmd_ret)
433 ret = STATUS_FAIL;
434 cmd->value = rdata;
435 }
436 break;
437
438 case EXT_REGISTER_WRITE:
439 {
440 SPMI_CTRL_EXT_REGISTER_WRITEL *cmd = &(data->rSPMIExtRegisterWriteL);
441 unsigned char wdata = 0;
442
443 md_dev = get_spmi_device(SPMI_MASTER_0, (unsigned int)cmd->type);
444 wdata = (unsigned char)cmd->value;
445 cmd_ret = spmi_ext_register_write(md_dev, cmd->addr,
446 &wdata, cmd->len);
447 if (cmd_ret)
448 ret = STATUS_FAIL;
449 }
450 break;
451 }
452
453 return ret;
454}
455
456DCL_STATUS DclSPMI_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
457{
458 return DclSPMI_Control_Priv(handle, cmd, data);
459}
460/*************************************************************************
461* FUNCTION
462* DclSPMI_Close
463*
464* DESCRIPTION
465* This function is to close the SPMI module.
466*
467* PARAMETERS
468* handle: the returned handle value of DclSPMI_Close
469*
470* RETURNS
471* STATUS_OK
472*
473*************************************************************************/
474DCL_STATUS DclSPMI_Close(DCL_HANDLE handle)
475{
476 return STATUS_OK;
477}
478
479#endif /* endif DRV_SPMI_OFF */
480