1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #ifndef _QCOM_BAM_DMA_H
7*4882a593Smuzhiyun #define _QCOM_BAM_DMA_H
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <asm/byteorder.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun /*
12*4882a593Smuzhiyun * This data type corresponds to the native Command Element
13*4882a593Smuzhiyun * supported by BAM DMA Engine.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * @cmd_and_addr - upper 8 bits command and lower 24 bits register address.
16*4882a593Smuzhiyun * @data - for write command: content to be written into peripheral register.
17*4882a593Smuzhiyun * for read command: dest addr to write peripheral register value.
18*4882a593Smuzhiyun * @mask - register mask.
19*4882a593Smuzhiyun * @reserved - for future usage.
20*4882a593Smuzhiyun *
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun struct bam_cmd_element {
23*4882a593Smuzhiyun __le32 cmd_and_addr;
24*4882a593Smuzhiyun __le32 data;
25*4882a593Smuzhiyun __le32 mask;
26*4882a593Smuzhiyun __le32 reserved;
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun * This enum indicates the command type in a command element
31*4882a593Smuzhiyun */
32*4882a593Smuzhiyun enum bam_command_type {
33*4882a593Smuzhiyun BAM_WRITE_COMMAND = 0,
34*4882a593Smuzhiyun BAM_READ_COMMAND,
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * prep_bam_ce_le32 - Wrapper function to prepare a single BAM command
39*4882a593Smuzhiyun * element with the data already in le32 format.
40*4882a593Smuzhiyun *
41*4882a593Smuzhiyun * @bam_ce: bam command element
42*4882a593Smuzhiyun * @addr: target address
43*4882a593Smuzhiyun * @cmd: BAM command
44*4882a593Smuzhiyun * @data: actual data for write and dest addr for read in le32
45*4882a593Smuzhiyun */
46*4882a593Smuzhiyun static inline void
bam_prep_ce_le32(struct bam_cmd_element * bam_ce,u32 addr,enum bam_command_type cmd,__le32 data)47*4882a593Smuzhiyun bam_prep_ce_le32(struct bam_cmd_element *bam_ce, u32 addr,
48*4882a593Smuzhiyun enum bam_command_type cmd, __le32 data)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun bam_ce->cmd_and_addr =
51*4882a593Smuzhiyun cpu_to_le32((addr & 0xffffff) | ((cmd & 0xff) << 24));
52*4882a593Smuzhiyun bam_ce->data = data;
53*4882a593Smuzhiyun bam_ce->mask = cpu_to_le32(0xffffffff);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /*
57*4882a593Smuzhiyun * bam_prep_ce - Wrapper function to prepare a single BAM command element
58*4882a593Smuzhiyun * with the data.
59*4882a593Smuzhiyun *
60*4882a593Smuzhiyun * @bam_ce: BAM command element
61*4882a593Smuzhiyun * @addr: target address
62*4882a593Smuzhiyun * @cmd: BAM command
63*4882a593Smuzhiyun * @data: actual data for write and dest addr for read
64*4882a593Smuzhiyun */
65*4882a593Smuzhiyun static inline void
bam_prep_ce(struct bam_cmd_element * bam_ce,u32 addr,enum bam_command_type cmd,u32 data)66*4882a593Smuzhiyun bam_prep_ce(struct bam_cmd_element *bam_ce, u32 addr,
67*4882a593Smuzhiyun enum bam_command_type cmd, u32 data)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun bam_prep_ce_le32(bam_ce, addr, cmd, cpu_to_le32(data));
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun #endif
72