18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _QCOM_BAM_DMA_H
78c2ecf20Sopenharmony_ci#define _QCOM_BAM_DMA_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <asm/byteorder.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/*
128c2ecf20Sopenharmony_ci * This data type corresponds to the native Command Element
138c2ecf20Sopenharmony_ci * supported by BAM DMA Engine.
148c2ecf20Sopenharmony_ci *
158c2ecf20Sopenharmony_ci * @cmd_and_addr - upper 8 bits command and lower 24 bits register address.
168c2ecf20Sopenharmony_ci * @data - for write command: content to be written into peripheral register.
178c2ecf20Sopenharmony_ci *	   for read command: dest addr to write peripheral register value.
188c2ecf20Sopenharmony_ci * @mask - register mask.
198c2ecf20Sopenharmony_ci * @reserved - for future usage.
208c2ecf20Sopenharmony_ci *
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_cistruct bam_cmd_element {
238c2ecf20Sopenharmony_ci	__le32 cmd_and_addr;
248c2ecf20Sopenharmony_ci	__le32 data;
258c2ecf20Sopenharmony_ci	__le32 mask;
268c2ecf20Sopenharmony_ci	__le32 reserved;
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/*
308c2ecf20Sopenharmony_ci * This enum indicates the command type in a command element
318c2ecf20Sopenharmony_ci */
328c2ecf20Sopenharmony_cienum bam_command_type {
338c2ecf20Sopenharmony_ci	BAM_WRITE_COMMAND = 0,
348c2ecf20Sopenharmony_ci	BAM_READ_COMMAND,
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci/*
388c2ecf20Sopenharmony_ci * prep_bam_ce_le32 - Wrapper function to prepare a single BAM command
398c2ecf20Sopenharmony_ci * element with the data already in le32 format.
408c2ecf20Sopenharmony_ci *
418c2ecf20Sopenharmony_ci * @bam_ce: bam command element
428c2ecf20Sopenharmony_ci * @addr: target address
438c2ecf20Sopenharmony_ci * @cmd: BAM command
448c2ecf20Sopenharmony_ci * @data: actual data for write and dest addr for read in le32
458c2ecf20Sopenharmony_ci */
468c2ecf20Sopenharmony_cistatic inline void
478c2ecf20Sopenharmony_cibam_prep_ce_le32(struct bam_cmd_element *bam_ce, u32 addr,
488c2ecf20Sopenharmony_ci		 enum bam_command_type cmd, __le32 data)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	bam_ce->cmd_and_addr =
518c2ecf20Sopenharmony_ci		cpu_to_le32((addr & 0xffffff) | ((cmd & 0xff) << 24));
528c2ecf20Sopenharmony_ci	bam_ce->data = data;
538c2ecf20Sopenharmony_ci	bam_ce->mask = cpu_to_le32(0xffffffff);
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci/*
578c2ecf20Sopenharmony_ci * bam_prep_ce - Wrapper function to prepare a single BAM command element
588c2ecf20Sopenharmony_ci * with the data.
598c2ecf20Sopenharmony_ci *
608c2ecf20Sopenharmony_ci * @bam_ce: BAM command element
618c2ecf20Sopenharmony_ci * @addr: target address
628c2ecf20Sopenharmony_ci * @cmd: BAM command
638c2ecf20Sopenharmony_ci * @data: actual data for write and dest addr for read
648c2ecf20Sopenharmony_ci */
658c2ecf20Sopenharmony_cistatic inline void
668c2ecf20Sopenharmony_cibam_prep_ce(struct bam_cmd_element *bam_ce, u32 addr,
678c2ecf20Sopenharmony_ci	    enum bam_command_type cmd, u32 data)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	bam_prep_ce_le32(bam_ce, addr, cmd, cpu_to_le32(data));
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci#endif
72