185 lines
4.9 KiB
C
Executable File
185 lines
4.9 KiB
C
Executable File
/*
|
|
* Copyright (C) 2019 Spreadtrum Communications Inc.
|
|
*
|
|
* This software is licensed under the terms of the GNU General Public
|
|
* License version 2, as published by the Free Software Foundation, and
|
|
* may be copied, distributed, and modified under those terms.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
/* MPM: modem power manger
|
|
* PMS: power manage source which be used to request
|
|
* a modem power manage resource.
|
|
*/
|
|
#ifndef _SPRD_MPM_H
|
|
#define _SPRD_MPM_H
|
|
/*
|
|
* MPM modem powermanger source state define,
|
|
* if in idle state, we can release
|
|
* the related resources(such as pcie) of modem.
|
|
*/
|
|
enum {
|
|
SPRD_MPM_IDLE = 0,
|
|
SPRD_MPM_BUSY
|
|
};
|
|
|
|
/*
|
|
* @sprd_pms: the power manager source data struct,
|
|
* can usd it to request wake lock or request modem resource.
|
|
*
|
|
* @name: the name of a pms.
|
|
* @data: the point of MPM.
|
|
* @multitask: whether to support multitasking, default is false.
|
|
* false, the source can only be used in single task context.
|
|
* true, the source can be used multitask context.
|
|
* @awake: whether stay awake.
|
|
* @awake_cnt: total awake times.
|
|
* @pre_awake_cnt pre_awake_cnt.
|
|
* @active_cnt: the active counter of the pms.
|
|
* @expires: the timer expires value.
|
|
* @active_lock: use for protect the active_cnt member.
|
|
* @expires_lock: use for protect expires member.
|
|
* @entry: an entry of all pms list.
|
|
* @wake_timer: used for delay release wakelock.
|
|
*/
|
|
struct sprd_pms {
|
|
const char *name;
|
|
void *data;
|
|
bool multitask;
|
|
bool awake;
|
|
unsigned int awake_cnt;
|
|
unsigned int pre_awake_cnt;
|
|
unsigned int active_cnt;
|
|
unsigned long expires;
|
|
spinlock_t active_lock;
|
|
spinlock_t expires_lock;
|
|
struct list_head entry;
|
|
struct timer_list wake_timer;
|
|
};
|
|
|
|
/**
|
|
* sprd_mpm_create - create a modem powermanger source instacnce.
|
|
*
|
|
* @dst, which mpm (PSCP, SP, WCN, etc.) will be created.
|
|
* @later_idle, will release resource later (in ms).
|
|
*/
|
|
int sprd_mpm_create(unsigned int dst,
|
|
const char *name,
|
|
unsigned int later_idle);
|
|
|
|
/**
|
|
* sprd_mpm_init_resource_ops - int resource ops for mpm.
|
|
*
|
|
* @wait_resource, used to wait request resource ready.
|
|
* @request_resource, used to request a resource
|
|
* @release_resource, used to release a resource
|
|
*/
|
|
int sprd_mpm_init_resource_ops(unsigned int dst,
|
|
int (*wait_resource)(unsigned int dst,
|
|
int timeout),
|
|
int (*request_resource)(unsigned int dst),
|
|
int (*release_resource)(unsigned int dst));
|
|
|
|
/**
|
|
* sprd_mpm_destroy - destroy a modem powermanger source instacnce.
|
|
*
|
|
* @dst, which mpm (PSCP, SP, WCN, etc.) will be destroyed.
|
|
*/
|
|
int sprd_mpm_destroy(unsigned int dst);
|
|
|
|
/**
|
|
* sprd_pms_create - init a pms,
|
|
* a module which used it to request a modem power manage resource.
|
|
* All the pms interface are not safe in multi-thread or multi-cpu.
|
|
* if you want use in multi-thread, please use the pms_ext interface.
|
|
*
|
|
* @dst, the pms belong to which mpm.
|
|
* @name, the name of this pms.
|
|
* @pms, the point of this pms.
|
|
* @multitask: support multitask.
|
|
*
|
|
* Returns: NULL failed, > 0 succ.
|
|
*/
|
|
struct sprd_pms *sprd_pms_create(unsigned int dst,
|
|
const char *name, bool multitask);
|
|
|
|
/**
|
|
* sprd_pms_destroy - destroy a pms.
|
|
*
|
|
* @pms, the point of this pms.
|
|
*/
|
|
void sprd_pms_destroy(struct sprd_pms *pms);
|
|
|
|
/**
|
|
* sprd_pms_request_resource - request mpm resource
|
|
*
|
|
* @pms, the point of this pms.
|
|
* @timeout, in ms.
|
|
*
|
|
* Returns:
|
|
* 0 resource ready,
|
|
* < 0 resoure not ready,
|
|
* -%ERESTARTSYS if it was interrupted by a signal.
|
|
*/
|
|
int sprd_pms_request_resource(struct sprd_pms *pms, int timeout);
|
|
|
|
/**
|
|
* sprd_pms_release_resource - release mpm resource.
|
|
*
|
|
* @pms, the point of this pms.
|
|
*/
|
|
void sprd_pms_release_resource(struct sprd_pms *pms);
|
|
|
|
/**
|
|
* sprd_pms_request_wakelock - request wakelock
|
|
*
|
|
* @pms, the point of this pms.
|
|
*/
|
|
void sprd_pms_request_wakelock(struct sprd_pms *pms);
|
|
|
|
/**
|
|
* sprd_pms_release_wakelock - release wakelock
|
|
*
|
|
* @pms, the point of this pms.
|
|
*/
|
|
void sprd_pms_release_wakelock(struct sprd_pms *pms);
|
|
|
|
/**
|
|
* sprd_pms_request_wakelock_period -
|
|
* request wake lock, and will auto reaslse in msec ms.
|
|
*
|
|
* @pms, the point of this pms.
|
|
* @msec, will auto reaslse in msec ms
|
|
*/
|
|
void sprd_pms_request_wakelock_period(struct sprd_pms *pms, unsigned int msec);
|
|
|
|
/**
|
|
* sprd_pms_release_wakelock_later - release wakelock later.
|
|
*
|
|
* @pms, the point of this pms.
|
|
* @msec, later time (in ms).
|
|
*/
|
|
void sprd_pms_release_wakelock_later(struct sprd_pms *pms,
|
|
unsigned int msec);
|
|
|
|
/**
|
|
* sprd_pms_power_up - just powe up, not wait result.
|
|
*
|
|
* @pms, the point of this pms.
|
|
*/
|
|
void sprd_pms_power_up(struct sprd_pms *pms);
|
|
|
|
/**
|
|
* sprd_pms_power_up - just power down,.
|
|
*
|
|
* @pms, the point of this pms.
|
|
* @immediately, whether immediately power down.
|
|
*/
|
|
void sprd_pms_power_down(struct sprd_pms *pms, bool immediately);
|
|
|
|
#endif
|