Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
syscon.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Carlo Caione <ccaione@baylibre.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_SYSCON_H_
14#define ZEPHYR_INCLUDE_DRIVERS_SYSCON_H_
15
24
25#include <errno.h>
26
27#include <zephyr/types.h>
28#include <zephyr/device.h>
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
38
43typedef int (*syscon_api_get_base)(const struct device *dev, uintptr_t *addr);
44
49typedef int (*syscon_api_read_reg)(const struct device *dev, uint32_t reg, uint32_t *val);
50
55typedef int (*syscon_api_write_reg)(const struct device *dev, uint32_t reg, uint32_t val);
56
61typedef int (*syscon_api_update_bits)(const struct device *dev, uint32_t reg,
62 uint32_t mask, uint32_t val);
63
68typedef int (*syscon_api_get_size)(const struct device *dev, size_t *size);
69
85
87
97__syscall int syscon_get_base(const struct device *dev, uintptr_t *addr);
98
99static inline int z_impl_syscon_get_base(const struct device *dev, uintptr_t *addr)
100{
101 const struct syscon_driver_api *api = DEVICE_API_GET(syscon, dev);
102
103 if ((api == NULL) || (api->get_base == NULL)) {
104 return -ENOSYS;
105 }
106
107 return api->get_base(dev, addr);
108}
109
110
123__syscall int syscon_read_reg(const struct device *dev, uint32_t reg, uint32_t *val);
124
125static inline int z_impl_syscon_read_reg(const struct device *dev, uint32_t reg, uint32_t *val)
126{
127 const struct syscon_driver_api *api = DEVICE_API_GET(syscon, dev);
128
129 if ((api == NULL) || (api->read == NULL)) {
130 return -ENOSYS;
131 }
132
133 return api->read(dev, reg, val);
134}
135
136
149__syscall int syscon_write_reg(const struct device *dev, uint32_t reg, uint32_t val);
150
151static inline int z_impl_syscon_write_reg(const struct device *dev, uint32_t reg, uint32_t val)
152{
153 const struct syscon_driver_api *api = DEVICE_API_GET(syscon, dev);
154
155 if ((api == NULL) || (api->write == NULL)) {
156 return -ENOSYS;
157 }
158
159 return api->write(dev, reg, val);
160}
161
184__syscall int syscon_update_bits(const struct device *dev, uint32_t reg,
185 uint32_t mask, uint32_t val);
186
187static inline int z_impl_syscon_update_bits(const struct device *dev, uint32_t reg,
188 uint32_t mask, uint32_t val)
189{
190 const struct syscon_driver_api *api = (const struct syscon_driver_api *)dev->api;
191
192 if ((api == NULL) || (api->update_bits == NULL)) {
193 return -ENOSYS;
194 }
195
196 return api->update_bits(dev, reg, mask, val);
197}
198
208__syscall int syscon_get_size(const struct device *dev, size_t *size);
209
210static inline int z_impl_syscon_get_size(const struct device *dev, size_t *size)
211{
212 const struct syscon_driver_api *api = DEVICE_API_GET(syscon, dev);
213
214 if ((api == NULL) || (api->get_size == NULL)) {
215 return -ENOSYS;
216 }
217
218 return api->get_size(dev, size);
219}
220
224
225#ifdef __cplusplus
226}
227#endif
228
229#include <zephyr/syscalls/syscon.h>
230
231#endif /* ZEPHYR_INCLUDE_DRIVERS_SYSCON_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1425
System error numbers.
int(* syscon_api_get_base)(const struct device *dev, uintptr_t *addr)
Get the base address of the syscon region.
Definition syscon.h:43
int(* syscon_api_read_reg)(const struct device *dev, uint32_t reg, uint32_t *val)
Read a single register.
Definition syscon.h:49
int(* syscon_api_write_reg)(const struct device *dev, uint32_t reg, uint32_t val)
Write a single register.
Definition syscon.h:55
int(* syscon_api_update_bits)(const struct device *dev, uint32_t reg, uint32_t mask, uint32_t val)
Atomically update bits in a register.
Definition syscon.h:61
int(* syscon_api_get_size)(const struct device *dev, size_t *size)
Get the size of the syscon register region.
Definition syscon.h:68
int syscon_get_base(const struct device *dev, uintptr_t *addr)
Get the syscon base address.
int syscon_get_size(const struct device *dev, size_t *size)
Get the size of the syscon register in bytes.
int syscon_update_bits(const struct device *dev, uint32_t reg, uint32_t mask, uint32_t val)
Atomically update bits in a syscon register.
int syscon_write_reg(const struct device *dev, uint32_t reg, uint32_t val)
Write to syscon register.
int syscon_read_reg(const struct device *dev, uint32_t reg, uint32_t *val)
Read from syscon register.
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:519
<span class="mlabel">Driver Operations</span> SYSCON driver operations
Definition syscon.h:73
syscon_api_get_base get_base
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition syscon.h:81
syscon_api_read_reg read
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition syscon.h:75
syscon_api_get_size get_size
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition syscon.h:83
syscon_api_update_bits update_bits
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition syscon.h:79
syscon_api_write_reg write
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition syscon.h:77