diff options
Diffstat (limited to 'include/linux/soc/qcom')
| -rw-r--r-- | include/linux/soc/qcom/apr.h | 70 | ||||
| -rw-r--r-- | include/linux/soc/qcom/qcom_aoss.h | 38 | ||||
| -rw-r--r-- | include/linux/soc/qcom/smd-rpm.h | 2 | 
3 files changed, 109 insertions, 1 deletions
| diff --git a/include/linux/soc/qcom/apr.h b/include/linux/soc/qcom/apr.h index 137f9f2ac4c3..23c5b30f3511 100644 --- a/include/linux/soc/qcom/apr.h +++ b/include/linux/soc/qcom/apr.h @@ -7,6 +7,7 @@  #include <linux/device.h>  #include <linux/mod_devicetable.h>  #include <dt-bindings/soc/qcom,apr.h> +#include <dt-bindings/soc/qcom,gpr.h>  extern struct bus_type aprbus; @@ -75,10 +76,65 @@ struct apr_resp_pkt {  	int payload_size;  }; +struct gpr_hdr { +	uint32_t version:4; +	uint32_t hdr_size:4; +	uint32_t pkt_size:24; +	uint32_t dest_domain:8; +	uint32_t src_domain:8; +	uint32_t reserved:16; +	uint32_t src_port; +	uint32_t dest_port; +	uint32_t token; +	uint32_t opcode; +} __packed; + +struct gpr_pkt { +	struct gpr_hdr hdr; +	uint32_t payload[]; +}; + +struct gpr_resp_pkt { +	struct gpr_hdr hdr; +	void *payload; +	int payload_size; +}; + +#define GPR_HDR_SIZE			sizeof(struct gpr_hdr) +#define GPR_PKT_VER			0x0 +#define GPR_PKT_HEADER_WORD_SIZE	((sizeof(struct gpr_pkt) + 3) >> 2) +#define GPR_PKT_HEADER_BYTE_SIZE	(GPR_PKT_HEADER_WORD_SIZE << 2) + +#define GPR_BASIC_RSP_RESULT		0x02001005 + +struct gpr_ibasic_rsp_result_t { +	uint32_t opcode; +	uint32_t status; +}; + +#define GPR_BASIC_EVT_ACCEPTED		0x02001006 + +struct gpr_ibasic_rsp_accepted_t { +	uint32_t opcode; +}; +  /* Bits 0 to 15 -- Minor version,  Bits 16 to 31 -- Major version */  #define APR_SVC_MAJOR_VERSION(v)	((v >> 16) & 0xFF)  #define APR_SVC_MINOR_VERSION(v)	(v & 0xFF) +typedef int (*gpr_port_cb) (struct gpr_resp_pkt *d, void *priv, int op); +struct packet_router; +struct pkt_router_svc { +	struct device *dev; +	gpr_port_cb callback; +	struct packet_router *pr; +	spinlock_t lock; +	int id; +	void *priv; +}; + +typedef struct pkt_router_svc gpr_port_t; +  struct apr_device {  	struct device	dev;  	uint16_t	svc_id; @@ -86,21 +142,26 @@ struct apr_device {  	uint32_t	version;  	char name[APR_NAME_SIZE];  	const char *service_path; -	spinlock_t	lock; +	struct pkt_router_svc svc;  	struct list_head node;  }; +typedef struct apr_device gpr_device_t; +  #define to_apr_device(d) container_of(d, struct apr_device, dev) +#define svc_to_apr_device(d) container_of(d, struct apr_device, svc)  struct apr_driver {  	int	(*probe)(struct apr_device *sl);  	int	(*remove)(struct apr_device *sl);  	int	(*callback)(struct apr_device *a,  			    struct apr_resp_pkt *d); +	int	(*gpr_callback)(struct gpr_resp_pkt *d, void *data, int op);  	struct device_driver		driver;  	const struct apr_device_id	*id_table;  }; +typedef struct apr_driver gpr_driver_t;  #define to_apr_driver(d) container_of(d, struct apr_driver, driver)  /* @@ -123,7 +184,14 @@ void apr_driver_unregister(struct apr_driver *drv);  #define module_apr_driver(__apr_driver) \  	module_driver(__apr_driver, apr_driver_register, \  			apr_driver_unregister) +#define module_gpr_driver(__gpr_driver) module_apr_driver(__gpr_driver)  int apr_send_pkt(struct apr_device *adev, struct apr_pkt *pkt); +gpr_port_t *gpr_alloc_port(gpr_device_t *gdev, struct device *dev, +				gpr_port_cb cb, void *priv); +void gpr_free_port(gpr_port_t *port); +int gpr_send_port_pkt(gpr_port_t *port, struct gpr_pkt *pkt); +int gpr_send_pkt(gpr_device_t *gdev, struct gpr_pkt *pkt); +  #endif /* __QCOM_APR_H_ */ diff --git a/include/linux/soc/qcom/qcom_aoss.h b/include/linux/soc/qcom/qcom_aoss.h new file mode 100644 index 000000000000..3c2a82e606f8 --- /dev/null +++ b/include/linux/soc/qcom/qcom_aoss.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2021, The Linux Foundation. All rights reserved. + */ + +#ifndef __QCOM_AOSS_H__ +#define __QCOM_AOSS_H__ + +#include <linux/err.h> +#include <linux/device.h> + +struct qmp; + +#if IS_ENABLED(CONFIG_QCOM_AOSS_QMP) + +int qmp_send(struct qmp *qmp, const void *data, size_t len); +struct qmp *qmp_get(struct device *dev); +void qmp_put(struct qmp *qmp); + +#else + +static inline int qmp_send(struct qmp *qmp, const void *data, size_t len) +{ +	return -ENODEV; +} + +static inline struct qmp *qmp_get(struct device *dev) +{ +	return ERR_PTR(-ENODEV); +} + +static inline void qmp_put(struct qmp *qmp) +{ +} + +#endif + +#endif diff --git a/include/linux/soc/qcom/smd-rpm.h b/include/linux/soc/qcom/smd-rpm.h index 60e66fc9b6bf..860dd8cdf9f3 100644 --- a/include/linux/soc/qcom/smd-rpm.h +++ b/include/linux/soc/qcom/smd-rpm.h @@ -38,6 +38,8 @@ struct qcom_smd_rpm;  #define QCOM_SMD_RPM_IPA_CLK	0x617069  #define QCOM_SMD_RPM_CE_CLK	0x6563  #define QCOM_SMD_RPM_AGGR_CLK	0x72676761 +#define QCOM_SMD_RPM_HWKM_CLK	0x6d6b7768 +#define QCOM_SMD_RPM_PKA_CLK	0x616b70  int qcom_rpm_smd_write(struct qcom_smd_rpm *rpm,  		       int state, |