162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_X86_INTEL_SCU_IPC_H_
362306a36Sopenharmony_ci#define  _ASM_X86_INTEL_SCU_IPC_H_
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/ioport.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistruct device;
862306a36Sopenharmony_cistruct intel_scu_ipc_dev;
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/**
1162306a36Sopenharmony_ci * struct intel_scu_ipc_data - Data used to configure SCU IPC
1262306a36Sopenharmony_ci * @mem: Base address of SCU IPC MMIO registers
1362306a36Sopenharmony_ci * @irq: The IRQ number used for SCU (optional)
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_cistruct intel_scu_ipc_data {
1662306a36Sopenharmony_ci	struct resource mem;
1762306a36Sopenharmony_ci	int irq;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct intel_scu_ipc_dev *
2162306a36Sopenharmony_ci__intel_scu_ipc_register(struct device *parent,
2262306a36Sopenharmony_ci			 const struct intel_scu_ipc_data *scu_data,
2362306a36Sopenharmony_ci			 struct module *owner);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define intel_scu_ipc_register(parent, scu_data)  \
2662306a36Sopenharmony_ci	__intel_scu_ipc_register(parent, scu_data, THIS_MODULE)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_civoid intel_scu_ipc_unregister(struct intel_scu_ipc_dev *scu);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct intel_scu_ipc_dev *
3162306a36Sopenharmony_ci__devm_intel_scu_ipc_register(struct device *parent,
3262306a36Sopenharmony_ci			      const struct intel_scu_ipc_data *scu_data,
3362306a36Sopenharmony_ci			      struct module *owner);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define devm_intel_scu_ipc_register(parent, scu_data)  \
3662306a36Sopenharmony_ci	__devm_intel_scu_ipc_register(parent, scu_data, THIS_MODULE)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct intel_scu_ipc_dev *intel_scu_ipc_dev_get(void);
3962306a36Sopenharmony_civoid intel_scu_ipc_dev_put(struct intel_scu_ipc_dev *scu);
4062306a36Sopenharmony_cistruct intel_scu_ipc_dev *devm_intel_scu_ipc_dev_get(struct device *dev);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciint intel_scu_ipc_dev_ioread8(struct intel_scu_ipc_dev *scu, u16 addr,
4362306a36Sopenharmony_ci			      u8 *data);
4462306a36Sopenharmony_ciint intel_scu_ipc_dev_iowrite8(struct intel_scu_ipc_dev *scu, u16 addr,
4562306a36Sopenharmony_ci			       u8 data);
4662306a36Sopenharmony_ciint intel_scu_ipc_dev_readv(struct intel_scu_ipc_dev *scu, u16 *addr,
4762306a36Sopenharmony_ci			    u8 *data, size_t len);
4862306a36Sopenharmony_ciint intel_scu_ipc_dev_writev(struct intel_scu_ipc_dev *scu, u16 *addr,
4962306a36Sopenharmony_ci			     u8 *data, size_t len);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciint intel_scu_ipc_dev_update(struct intel_scu_ipc_dev *scu, u16 addr,
5262306a36Sopenharmony_ci			     u8 data, u8 mask);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciint intel_scu_ipc_dev_simple_command(struct intel_scu_ipc_dev *scu, int cmd,
5562306a36Sopenharmony_ci				     int sub);
5662306a36Sopenharmony_ciint intel_scu_ipc_dev_command_with_size(struct intel_scu_ipc_dev *scu, int cmd,
5762306a36Sopenharmony_ci					int sub, const void *in, size_t inlen,
5862306a36Sopenharmony_ci					size_t size, void *out, size_t outlen);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic inline int intel_scu_ipc_dev_command(struct intel_scu_ipc_dev *scu, int cmd,
6162306a36Sopenharmony_ci					    int sub, const void *in, size_t inlen,
6262306a36Sopenharmony_ci					    void *out, size_t outlen)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return intel_scu_ipc_dev_command_with_size(scu, cmd, sub, in, inlen,
6562306a36Sopenharmony_ci						   inlen, out, outlen);
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif
69