linux/linux-5.4.31/drivers/remoteproc/rproc_srm_core.h

99 lines
3.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) STMicroelectronics 2018 - All Rights Reserved
* Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
*/
#ifndef _RPROC_SRM_CORE_H_
#define _RPROC_SRM_CORE_H_
/**
* Message type used in resource manager rpmsg:
* RPROC_SRM_MSG_GETCONFIG: Request to get the configuration of a resource
* RPROC_SRM_MSG_SETCONFIG: Request to set the configuration of a resource
* RPROC_SRM_MSG_ERROR: Error when processing a request
*/
#define RPROC_SRM_MSG_GETCONFIG 0x00
#define RPROC_SRM_MSG_SETCONFIG 0x01
#define RPROC_SRM_MSG_ERROR 0xFF
/**
* Resource type used in resource manager rpmsg:
* RPROC_SRM_RSC_CLOCK: clock resource
* RPROC_SRM_RSC_REGU: regulator resource
*/
#define RPROC_SRM_RSC_CLOCK 0x00
#define RPROC_SRM_RSC_REGU 0x01
/**
* struct clock_cfg - clock configuration used in resource manager rpmsg
* @index: clock index
* @name: clock name
* @rate: clock rate request (in SetConfig message) or current status (in
* GetConfig message)
*/
struct clock_cfg {
u32 index;
u8 name[16];
u32 rate;
};
/**
* struct regu_cfg - regu configuration used in resource manager rpmsg
* @index: regulator index
* @name: regulator name
* @enable: regulator enable/disable request (in SetConfig message) or
* current status (in GetConfig message)
* @curr_voltage_mv: current regulator voltage in mV (meaningful in
* SetConfig message)
* @min_voltage_mv: regulator min voltage request in mV (meaningful in
* SetConfig message)
* @max_voltage_mv: regulator max voltage request in mV (meaningful in
* SetConfig message)
*/
struct regu_cfg {
u32 index;
u8 name[16];
u32 enable;
u32 curr_voltage_mv;
u32 min_voltage_mv;
u32 max_voltage_mv;
};
/**
* struct rpmsg_srm_msg - message structure used between processors to
* dynamically update resources configuration
* @message_type: type of the message: see RPROC_SRM_MSG*
* @device_id: an identifier specifying the device owning the resources.
* This is implementation dependent. As example it may be the
* device name or the device address.
* @rsc_type: the type of the resource for which the configuration applies:
* see RPROC_SRM_RSC*
* @clock_cfg: clock config - relevant if &rsc_type is RPROC_SRM_RSC_CLOCK
* @regu_cfg: regulator config - relevant if &rsc_type is RPROC_SRM_RSC_REGU
*/
struct rpmsg_srm_msg {
u32 message_type;
u8 device_id[32];
u32 rsc_type;
union {
struct clock_cfg clock_cfg;
struct regu_cfg regu_cfg;
};
};
struct rpmsg_srm_msg_desc {
struct rpmsg_endpoint *ept;
struct rpmsg_srm_msg *msg;
};
struct rproc_srm_core;
int rproc_srm_core_register_notifier(struct rproc_srm_core *core,
struct notifier_block *nb);
int rproc_srm_core_unregister_notifier(struct rproc_srm_core *core,
struct notifier_block *nb);
int rpmsg_srm_send(struct rpmsg_endpoint *ept, struct rpmsg_srm_msg *msg);
#endif