162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __SOC_SOF_CLIENT_H 462306a36Sopenharmony_ci#define __SOC_SOF_CLIENT_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/auxiliary_bus.h> 762306a36Sopenharmony_ci#include <linux/device.h> 862306a36Sopenharmony_ci#include <linux/list.h> 962306a36Sopenharmony_ci#include <sound/sof.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct sof_ipc_fw_version; 1262306a36Sopenharmony_cistruct sof_ipc_cmd_hdr; 1362306a36Sopenharmony_cistruct snd_sof_dev; 1462306a36Sopenharmony_cistruct dentry; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistruct sof_ipc4_fw_module; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/** 1962306a36Sopenharmony_ci * struct sof_client_dev - SOF client device 2062306a36Sopenharmony_ci * @auxdev: auxiliary device 2162306a36Sopenharmony_ci * @sdev: pointer to SOF core device struct 2262306a36Sopenharmony_ci * @list: item in SOF core client dev list 2362306a36Sopenharmony_ci * @data: device specific data 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_cistruct sof_client_dev { 2662306a36Sopenharmony_ci struct auxiliary_device auxdev; 2762306a36Sopenharmony_ci struct snd_sof_dev *sdev; 2862306a36Sopenharmony_ci struct list_head list; 2962306a36Sopenharmony_ci void *data; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define sof_client_dev_to_sof_dev(cdev) ((cdev)->sdev) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define auxiliary_dev_to_sof_client_dev(auxiliary_dev) \ 3562306a36Sopenharmony_ci container_of(auxiliary_dev, struct sof_client_dev, auxdev) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define dev_to_sof_client_dev(dev) \ 3862306a36Sopenharmony_ci container_of(to_auxiliary_dev(dev), struct sof_client_dev, auxdev) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciint sof_client_ipc_tx_message(struct sof_client_dev *cdev, void *ipc_msg, 4162306a36Sopenharmony_ci void *reply_data, size_t reply_bytes); 4262306a36Sopenharmony_cistatic inline int sof_client_ipc_tx_message_no_reply(struct sof_client_dev *cdev, void *ipc_msg) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci return sof_client_ipc_tx_message(cdev, ipc_msg, NULL, 0); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ciint sof_client_ipc_set_get_data(struct sof_client_dev *cdev, void *ipc_msg, 4762306a36Sopenharmony_ci bool set); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct sof_ipc4_fw_module *sof_client_ipc4_find_module(struct sof_client_dev *c, const guid_t *u); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct dentry *sof_client_get_debugfs_root(struct sof_client_dev *cdev); 5262306a36Sopenharmony_cistruct device *sof_client_get_dma_dev(struct sof_client_dev *cdev); 5362306a36Sopenharmony_ciconst struct sof_ipc_fw_version *sof_client_get_fw_version(struct sof_client_dev *cdev); 5462306a36Sopenharmony_cisize_t sof_client_get_ipc_max_payload_size(struct sof_client_dev *cdev); 5562306a36Sopenharmony_cienum sof_ipc_type sof_client_get_ipc_type(struct sof_client_dev *cdev); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* module refcount management of SOF core */ 5862306a36Sopenharmony_ciint sof_client_core_module_get(struct sof_client_dev *cdev); 5962306a36Sopenharmony_civoid sof_client_core_module_put(struct sof_client_dev *cdev); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* IPC notification */ 6262306a36Sopenharmony_citypedef void (*sof_client_event_callback)(struct sof_client_dev *cdev, void *msg_buf); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciint sof_client_register_ipc_rx_handler(struct sof_client_dev *cdev, 6562306a36Sopenharmony_ci u32 ipc_msg_type, 6662306a36Sopenharmony_ci sof_client_event_callback callback); 6762306a36Sopenharmony_civoid sof_client_unregister_ipc_rx_handler(struct sof_client_dev *cdev, 6862306a36Sopenharmony_ci u32 ipc_msg_type); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* DSP state notification and query */ 7162306a36Sopenharmony_citypedef void (*sof_client_fw_state_callback)(struct sof_client_dev *cdev, 7262306a36Sopenharmony_ci enum sof_fw_state state); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ciint sof_client_register_fw_state_handler(struct sof_client_dev *cdev, 7562306a36Sopenharmony_ci sof_client_fw_state_callback callback); 7662306a36Sopenharmony_civoid sof_client_unregister_fw_state_handler(struct sof_client_dev *cdev); 7762306a36Sopenharmony_cienum sof_fw_state sof_client_get_fw_state(struct sof_client_dev *cdev); 7862306a36Sopenharmony_ciint sof_client_ipc_rx_message(struct sof_client_dev *cdev, void *ipc_msg, void *msg_buf); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#endif /* __SOC_SOF_CLIENT_H */ 81