1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13 * more details.
14 */
15
16#ifndef __SP_PUBLIC_H_INCLUDED__
17#define __SP_PUBLIC_H_INCLUDED__
18
19#include <type_support.h>
20#include "system_local.h"
21
22/*! Enable or disable the program complete irq signal of SP[ID]
23
24 \param	ID[in]				SP identifier
25 \param	cnd[in]				predicate
26
27 \return none, if(cnd) enable(SP[ID].irq) else disable(SP[ID].irq)
28 */
29void cnd_sp_irq_enable(
30    const sp_ID_t		ID,
31    const bool			cnd);
32
33/*! Write to the status and control register of SP[ID]
34
35 \param	ID[in]				SP identifier
36 \param	reg[in]				register index
37 \param value[in]			The data to be written
38
39 \return none, SP[ID].sc[reg] = value
40 */
41STORAGE_CLASS_SP_H void sp_ctrl_store(
42    const sp_ID_t		ID,
43    const hrt_address	reg,
44    const hrt_data		value);
45
46/*! Read from the status and control register of SP[ID]
47
48 \param	ID[in]				SP identifier
49 \param	reg[in]				register index
50 \param value[in]			The data to be written
51
52 \return SP[ID].sc[reg]
53 */
54STORAGE_CLASS_SP_H hrt_data sp_ctrl_load(
55    const sp_ID_t		ID,
56    const hrt_address	reg);
57
58/*! Get the status of a bitfield in the control register of SP[ID]
59
60 \param	ID[in]				SP identifier
61 \param	reg[in]				register index
62 \param bit[in]				The bit index to be checked
63
64 \return  (SP[ID].sc[reg] & (1<<bit)) != 0
65 */
66STORAGE_CLASS_SP_H bool sp_ctrl_getbit(
67    const sp_ID_t		ID,
68    const hrt_address	reg,
69    const unsigned int	bit);
70
71/*! Set a bitfield in the control register of SP[ID]
72
73 \param	ID[in]				SP identifier
74 \param	reg[in]				register index
75 \param bit[in]				The bit index to be set
76
77 \return none, SP[ID].sc[reg] |= (1<<bit)
78 */
79STORAGE_CLASS_SP_H void sp_ctrl_setbit(
80    const sp_ID_t		ID,
81    const hrt_address	reg,
82    const unsigned int	bit);
83
84/*! Clear a bitfield in the control register of SP[ID]
85
86 \param	ID[in]				SP identifier
87 \param	reg[in]				register index
88 \param bit[in]				The bit index to be set
89
90 \return none, SP[ID].sc[reg] &= ~(1<<bit)
91 */
92STORAGE_CLASS_SP_H void sp_ctrl_clearbit(
93    const sp_ID_t		ID,
94    const hrt_address	reg,
95    const unsigned int	bit);
96
97/*! Write to the DMEM of SP[ID]
98
99 \param	ID[in]				SP identifier
100 \param	addr[in]			the address in DMEM
101 \param data[in]			The data to be written
102 \param size[in]			The size(in bytes) of the data to be written
103
104 \return none, SP[ID].dmem[addr...addr+size-1] = data
105 */
106STORAGE_CLASS_SP_H void sp_dmem_store(
107    const sp_ID_t		ID,
108    hrt_address		addr,
109    const void			*data,
110    const size_t		size);
111
112/*! Read from the DMEM of SP[ID]
113
114 \param	ID[in]				SP identifier
115 \param	addr[in]			the address in DMEM
116 \param data[in]			The data to be read
117 \param size[in]			The size(in bytes) of the data to be read
118
119 \return none, data = SP[ID].dmem[addr...addr+size-1]
120 */
121STORAGE_CLASS_SP_H void sp_dmem_load(
122    const sp_ID_t		ID,
123    const hrt_address	addr,
124    void			*data,
125    const size_t		size);
126
127/*! Write a 8-bit datum to the DMEM of SP[ID]
128
129 \param	ID[in]				SP identifier
130 \param	addr[in]			the address in DMEM
131 \param data[in]			The data to be written
132 \param size[in]			The size(in bytes) of the data to be written
133
134 \return none, SP[ID].dmem[addr...addr+size-1] = data
135 */
136STORAGE_CLASS_SP_H void sp_dmem_store_uint8(
137    const sp_ID_t		ID,
138    hrt_address		addr,
139    const uint8_t		data);
140
141/*! Write a 16-bit datum to the DMEM of SP[ID]
142
143 \param	ID[in]				SP identifier
144 \param	addr[in]			the address in DMEM
145 \param data[in]			The data to be written
146 \param size[in]			The size(in bytes) of the data to be written
147
148 \return none, SP[ID].dmem[addr...addr+size-1] = data
149 */
150STORAGE_CLASS_SP_H void sp_dmem_store_uint16(
151    const sp_ID_t		ID,
152    hrt_address		addr,
153    const uint16_t		data);
154
155/*! Write a 32-bit datum to the DMEM of SP[ID]
156
157 \param	ID[in]				SP identifier
158 \param	addr[in]			the address in DMEM
159 \param data[in]			The data to be written
160 \param size[in]			The size(in bytes) of the data to be written
161
162 \return none, SP[ID].dmem[addr...addr+size-1] = data
163 */
164STORAGE_CLASS_SP_H void sp_dmem_store_uint32(
165    const sp_ID_t		ID,
166    hrt_address		addr,
167    const uint32_t		data);
168
169/*! Load a 8-bit datum from the DMEM of SP[ID]
170
171 \param	ID[in]				SP identifier
172 \param	addr[in]			the address in DMEM
173 \param data[in]			The data to be read
174 \param size[in]			The size(in bytes) of the data to be read
175
176 \return none, data = SP[ID].dmem[addr...addr+size-1]
177 */
178STORAGE_CLASS_SP_H uint8_t sp_dmem_load_uint8(
179    const sp_ID_t		ID,
180    const hrt_address	addr);
181
182/*! Load a 16-bit datum from the DMEM of SP[ID]
183
184 \param	ID[in]				SP identifier
185 \param	addr[in]			the address in DMEM
186 \param data[in]			The data to be read
187 \param size[in]			The size(in bytes) of the data to be read
188
189 \return none, data = SP[ID].dmem[addr...addr+size-1]
190 */
191STORAGE_CLASS_SP_H uint16_t sp_dmem_load_uint16(
192    const sp_ID_t		ID,
193    const hrt_address	addr);
194
195/*! Load a 32-bit datum from the DMEM of SP[ID]
196
197 \param	ID[in]				SP identifier
198 \param	addr[in]			the address in DMEM
199 \param data[in]			The data to be read
200 \param size[in]			The size(in bytes) of the data to be read
201
202 \return none, data = SP[ID].dmem[addr...addr+size-1]
203 */
204STORAGE_CLASS_SP_H uint32_t sp_dmem_load_uint32(
205    const sp_ID_t		ID,
206    const hrt_address	addr);
207
208#endif /* __SP_PUBLIC_H_INCLUDED__ */
209