Software APIs
api.h
Go to the documentation of this file.
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Device table API auto-generated by `dtgen`
6
7#ifndef OPENTITAN_TOP_EARLGREY_DT_API_H_
8#define OPENTITAN_TOP_EARLGREY_DT_API_H_
9
10#ifdef __cplusplus
11extern "C" {
12#endif // __cplusplus
13
14/**
15 * @file
16 * @brief Device Tables (DT) API for top earlgrey
17 *
18 * This file contains the type definitions and global functions of the DT.
19 *
20 * The DT models the chip as a collection of instances. Each instance has
21 * a type (the IP block) and a number of attributes such as I/Os, IRQs
22 * and so on. The DT also provides top-specific lists of global resources
23 * such as I/O pads, clocks and interrupts.
24 */
25
26#include <stddef.h>
27#include <stdint.h>
29
30/**
31 * List of device types.
32 *
33 * Device types are guaranteed to be numbered consecutively from 0.
34 */
35typedef enum dt_device_type {
36 kDtDeviceTypeUnknown = 0, /**< Instance of unknown type */
37 kDtDeviceTypeAdcCtrl = 1, /**< instance of adc_ctrl */
38 kDtDeviceTypeAes = 2, /**< instance of aes */
39 kDtDeviceTypeAlertHandler = 3, /**< instance of alert_handler */
40 kDtDeviceTypeAonTimer = 4, /**< instance of aon_timer */
41 kDtDeviceTypeAst = 5, /**< instance of ast */
42 kDtDeviceTypeClkmgr = 6, /**< instance of clkmgr */
43 kDtDeviceTypeCsrng = 7, /**< instance of csrng */
44 kDtDeviceTypeEdn = 8, /**< instance of edn */
45 kDtDeviceTypeEntropySrc = 9, /**< instance of entropy_src */
46 kDtDeviceTypeFlashCtrl = 10, /**< instance of flash_ctrl */
47 kDtDeviceTypeGpio = 11, /**< instance of gpio */
48 kDtDeviceTypeHmac = 12, /**< instance of hmac */
49 kDtDeviceTypeI2c = 13, /**< instance of i2c */
50 kDtDeviceTypeKeymgr = 14, /**< instance of keymgr */
51 kDtDeviceTypeKmac = 15, /**< instance of kmac */
52 kDtDeviceTypeLcCtrl = 16, /**< instance of lc_ctrl */
53 kDtDeviceTypeOtbn = 17, /**< instance of otbn */
54 kDtDeviceTypeOtpCtrl = 18, /**< instance of otp_ctrl */
55 kDtDeviceTypeOtpMacro = 19, /**< instance of otp_macro */
56 kDtDeviceTypePinmux = 20, /**< instance of pinmux */
57 kDtDeviceTypePwm = 21, /**< instance of pwm */
58 kDtDeviceTypePwrmgr = 22, /**< instance of pwrmgr */
59 kDtDeviceTypeRomCtrl = 23, /**< instance of rom_ctrl */
60 kDtDeviceTypeRstmgr = 24, /**< instance of rstmgr */
61 kDtDeviceTypeRvCoreIbex = 25, /**< instance of rv_core_ibex */
62 kDtDeviceTypeRvDm = 26, /**< instance of rv_dm */
63 kDtDeviceTypeRvPlic = 27, /**< instance of rv_plic */
64 kDtDeviceTypeRvTimer = 28, /**< instance of rv_timer */
65 kDtDeviceTypeSensorCtrl = 29, /**< instance of sensor_ctrl */
66 kDtDeviceTypeSpiDevice = 30, /**< instance of spi_device */
67 kDtDeviceTypeSpiHost = 31, /**< instance of spi_host */
68 kDtDeviceTypeSramCtrl = 32, /**< instance of sram_ctrl */
69 kDtDeviceTypeSysrstCtrl = 33, /**< instance of sysrst_ctrl */
70 kDtDeviceTypeUart = 34, /**< instance of uart */
71 kDtDeviceTypeUsbdev = 35, /**< instance of usbdev */
73
74enum {
75 kDtDeviceTypeCount = 36, /**< Number of instance types */
76};
77
78
79/**
80 * List of instance IDs.
81 *
82 * Instance IDs are guaranteed to be numbered consecutively from 0.
83 */
84typedef enum dt_instance_id {
85 kDtInstanceIdUnknown = 0, /**< Unknown instance */
86 kDtInstanceIdAdcCtrlAon = 1, /**< instance adc_ctrl_aon of adc_ctrl */
87 kDtInstanceIdAes = 2, /**< instance aes of aes */
88 kDtInstanceIdAlertHandler = 3, /**< instance alert_handler of alert_handler */
89 kDtInstanceIdAonTimerAon = 4, /**< instance aon_timer_aon of aon_timer */
90 kDtInstanceIdAst = 5, /**< instance ast of ast */
91 kDtInstanceIdClkmgrAon = 6, /**< instance clkmgr_aon of clkmgr */
92 kDtInstanceIdCsrng = 7, /**< instance csrng of csrng */
93 kDtInstanceIdEdn0 = 8, /**< instance edn0 of edn */
94 kDtInstanceIdEdn1 = 9, /**< instance edn1 of edn */
95 kDtInstanceIdEntropySrc = 10, /**< instance entropy_src of entropy_src */
96 kDtInstanceIdFlashCtrl = 11, /**< instance flash_ctrl of flash_ctrl */
97 kDtInstanceIdGpio = 12, /**< instance gpio of gpio */
98 kDtInstanceIdHmac = 13, /**< instance hmac of hmac */
99 kDtInstanceIdI2c0 = 14, /**< instance i2c0 of i2c */
100 kDtInstanceIdI2c1 = 15, /**< instance i2c1 of i2c */
101 kDtInstanceIdI2c2 = 16, /**< instance i2c2 of i2c */
102 kDtInstanceIdKeymgr = 17, /**< instance keymgr of keymgr */
103 kDtInstanceIdKmac = 18, /**< instance kmac of kmac */
104 kDtInstanceIdLcCtrl = 19, /**< instance lc_ctrl of lc_ctrl */
105 kDtInstanceIdOtbn = 20, /**< instance otbn of otbn */
106 kDtInstanceIdOtpCtrl = 21, /**< instance otp_ctrl of otp_ctrl */
107 kDtInstanceIdOtpMacro = 22, /**< instance otp_macro of otp_macro */
108 kDtInstanceIdPinmuxAon = 23, /**< instance pinmux_aon of pinmux */
109 kDtInstanceIdPwmAon = 24, /**< instance pwm_aon of pwm */
110 kDtInstanceIdPwrmgrAon = 25, /**< instance pwrmgr_aon of pwrmgr */
111 kDtInstanceIdRomCtrl = 26, /**< instance rom_ctrl of rom_ctrl */
112 kDtInstanceIdRstmgrAon = 27, /**< instance rstmgr_aon of rstmgr */
113 kDtInstanceIdRvCoreIbex = 28, /**< instance rv_core_ibex of rv_core_ibex */
114 kDtInstanceIdRvDm = 29, /**< instance rv_dm of rv_dm */
115 kDtInstanceIdRvPlic = 30, /**< instance rv_plic of rv_plic */
116 kDtInstanceIdRvTimer = 31, /**< instance rv_timer of rv_timer */
117 kDtInstanceIdSensorCtrlAon = 32, /**< instance sensor_ctrl_aon of sensor_ctrl */
118 kDtInstanceIdSpiDevice = 33, /**< instance spi_device of spi_device */
119 kDtInstanceIdSpiHost0 = 34, /**< instance spi_host0 of spi_host */
120 kDtInstanceIdSpiHost1 = 35, /**< instance spi_host1 of spi_host */
121 kDtInstanceIdSramCtrlRetAon = 36, /**< instance sram_ctrl_ret_aon of sram_ctrl */
122 kDtInstanceIdSramCtrlMain = 37, /**< instance sram_ctrl_main of sram_ctrl */
123 kDtInstanceIdSysrstCtrlAon = 38, /**< instance sysrst_ctrl_aon of sysrst_ctrl */
124 kDtInstanceIdUart0 = 39, /**< instance uart0 of uart */
125 kDtInstanceIdUart1 = 40, /**< instance uart1 of uart */
126 kDtInstanceIdUart2 = 41, /**< instance uart2 of uart */
127 kDtInstanceIdUart3 = 42, /**< instance uart3 of uart */
128 kDtInstanceIdUsbdev = 43, /**< instance usbdev of usbdev */
130
131enum {
132 kDtInstanceIdCount = 44, /**< Number of instance IDs */
133};
134
135
136/**
137 * Get the instance type of a device instance.
138 *
139 * For example the instance type of `kDtUart0` is `kDtInstanceTypeUart`.
140 *
141 * @param id An instance ID.
142 * @return The instance type, or `kDtInstanceIdUnknown` if the ID is not valid.
143 */
145
146/** PLIC IRQ ID type.
147 *
148 * This type represents a raw IRQ ID from the PLIC.
149 *
150 * This is an alias to the top's `plic_irq_id_t` type for backward compatibility
151 * with existing code.
152 */
154
155/** PLIC IRQ ID for no interrupt. */
156static const dt_plic_irq_id_t kDtPlicIrqIdNone = kTopEarlgreyPlicIrqIdNone;
157
158/**
159 * Get the instance ID for a given PLIC IRQ ID.
160 *
161 * For example, on earlgrey, the instance ID of `kTopEarlgreyPlicIrqIdUart0TxWatermark`
162 * is `kDtInstanceIdUart0`. One can then use the type specific function to retrieve the
163 * IRQ name, for example `dt_uart_irq_from_plic_id` for the UART.
164 *
165 * @param irq A PLIC ID.
166 * @return The instance ID, or `kDtInstanceIdUnknown` if the PLIC ID is not valid.
167 */
169
170/**
171 * Alert ID type.
172 *
173 * This type represents a raw alert ID from the Alert Handler.
174 *
175 * This is an alias to the top's `alert_id_t` type for backward compatibility
176 * with existing code.
177 */
179
180/** Number of alerts. */
181enum {
182 /** Total number of alert IDs. */
183 kDtAlertCount = kTopEarlgreyAlertIdLast + 1,
184};
185
186/**
187 * Get the instance ID for a given alert ID.
188 *
189 * For example, on earlgrey, the instance ID of `kTopEarlgreyAlertIdUart0FatalFault` is
190 * `kDtInstanceIdUart0`. One can then use the type specific function to retrieve the
191 * alert name, for example `dt_uart_alert_from_alert_id` for the UART.
192 *
193 * @param alert An alert ID.
194 * @return The instance ID, or `kDtInstanceIdUnknown` if the alert ID is not valid.
195 */
197
198/**
199 * List of clocks.
200 *
201 * Clocks are guaranteed to be numbered consecutively from 0.
202 */
203typedef enum dt_clock {
204 kDtClockMain = 0, /**< clock main */
205 kDtClockIo = 1, /**< clock io */
206 kDtClockUsb = 2, /**< clock usb */
207 kDtClockAon = 3, /**< clock aon */
208 kDtClockIoDiv2 = 4, /**< clock io_div2 */
209 kDtClockIoDiv4 = 5, /**< clock io_div4 */
211
212enum {
213 kDtClockCount = 6, /**< Number of clocks */
214};
215
216
217/**
218 * Get the frequency of a clock.
219 *
220 * @param clk A clock ID.
221 * @return Clock frequency in Hz.
222 */
224
225/**
226 * List of resets.
227 *
228 * Resets are guaranteed to be numbered consecutively from 0.
229 */
230typedef enum dt_reset {
231 kDtResetUnknown = 0, /**< Unknown reset */
232 kDtResetPorAon = 1, /**< Reset node por_aon */
233 kDtResetLcSrc = 2, /**< Reset node lc_src */
234 kDtResetSysSrc = 3, /**< Reset node sys_src */
235 kDtResetPor = 4, /**< Reset node por */
236 kDtResetPorIo = 5, /**< Reset node por_io */
237 kDtResetPorIoDiv2 = 6, /**< Reset node por_io_div2 */
238 kDtResetPorIoDiv4 = 7, /**< Reset node por_io_div4 */
239 kDtResetPorUsb = 8, /**< Reset node por_usb */
240 kDtResetLc = 9, /**< Reset node lc */
241 kDtResetLcAon = 10, /**< Reset node lc_aon */
242 kDtResetLcIo = 11, /**< Reset node lc_io */
243 kDtResetLcIoDiv2 = 12, /**< Reset node lc_io_div2 */
244 kDtResetLcIoDiv4 = 13, /**< Reset node lc_io_div4 */
245 kDtResetLcUsb = 14, /**< Reset node lc_usb */
246 kDtResetSys = 15, /**< Reset node sys */
247 kDtResetSysIoDiv4 = 16, /**< Reset node sys_io_div4 */
248 kDtResetSpiDevice = 17, /**< Reset node spi_device */
249 kDtResetSpiHost0 = 18, /**< Reset node spi_host0 */
250 kDtResetSpiHost1 = 19, /**< Reset node spi_host1 */
251 kDtResetUsb = 20, /**< Reset node usb */
252 kDtResetUsbAon = 21, /**< Reset node usb_aon */
253 kDtResetI2c0 = 22, /**< Reset node i2c0 */
254 kDtResetI2c1 = 23, /**< Reset node i2c1 */
255 kDtResetI2c2 = 24, /**< Reset node i2c2 */
257
258enum {
259 kDtResetCount = 25, /**< Number of resets */
260};
261
262
263/**
264 * List of pads names.
265 */
266typedef enum dt_pad {
267 kDtPadConstantZero = 0, /**< Pad that is constantly tied to zero (input) */
268 kDtPadConstantOne = 1, /**< Pad that is constantly tied to one (input) */
269 kDtPadIoa0 = 2, /**< Muxed IO pad */
270 kDtPadIoa1 = 3, /**< Muxed IO pad */
271 kDtPadIoa2 = 4, /**< Muxed IO pad */
272 kDtPadIoa3 = 5, /**< Muxed IO pad */
273 kDtPadIoa4 = 6, /**< Muxed IO pad */
274 kDtPadIoa5 = 7, /**< Muxed IO pad */
275 kDtPadIoa6 = 8, /**< Muxed IO pad */
276 kDtPadIoa7 = 9, /**< Muxed IO pad */
277 kDtPadIoa8 = 10, /**< Muxed IO pad */
278 kDtPadIob0 = 11, /**< Muxed IO pad */
279 kDtPadIob1 = 12, /**< Muxed IO pad */
280 kDtPadIob2 = 13, /**< Muxed IO pad */
281 kDtPadIob3 = 14, /**< Muxed IO pad */
282 kDtPadIob4 = 15, /**< Muxed IO pad */
283 kDtPadIob5 = 16, /**< Muxed IO pad */
284 kDtPadIob6 = 17, /**< Muxed IO pad */
285 kDtPadIob7 = 18, /**< Muxed IO pad */
286 kDtPadIob8 = 19, /**< Muxed IO pad */
287 kDtPadIob9 = 20, /**< Muxed IO pad */
288 kDtPadIob10 = 21, /**< Muxed IO pad */
289 kDtPadIob11 = 22, /**< Muxed IO pad */
290 kDtPadIob12 = 23, /**< Muxed IO pad */
291 kDtPadIoc0 = 24, /**< Muxed IO pad */
292 kDtPadIoc1 = 25, /**< Muxed IO pad */
293 kDtPadIoc2 = 26, /**< Muxed IO pad */
294 kDtPadIoc3 = 27, /**< Muxed IO pad */
295 kDtPadIoc4 = 28, /**< Muxed IO pad */
296 kDtPadIoc5 = 29, /**< Muxed IO pad */
297 kDtPadIoc6 = 30, /**< Muxed IO pad */
298 kDtPadIoc7 = 31, /**< Muxed IO pad */
299 kDtPadIoc8 = 32, /**< Muxed IO pad */
300 kDtPadIoc9 = 33, /**< Muxed IO pad */
301 kDtPadIoc10 = 34, /**< Muxed IO pad */
302 kDtPadIoc11 = 35, /**< Muxed IO pad */
303 kDtPadIoc12 = 36, /**< Muxed IO pad */
304 kDtPadIor0 = 37, /**< Muxed IO pad */
305 kDtPadIor1 = 38, /**< Muxed IO pad */
306 kDtPadIor2 = 39, /**< Muxed IO pad */
307 kDtPadIor3 = 40, /**< Muxed IO pad */
308 kDtPadIor4 = 41, /**< Muxed IO pad */
309 kDtPadIor5 = 42, /**< Muxed IO pad */
310 kDtPadIor6 = 43, /**< Muxed IO pad */
311 kDtPadIor7 = 44, /**< Muxed IO pad */
312 kDtPadIor10 = 45, /**< Muxed IO pad */
313 kDtPadIor11 = 46, /**< Muxed IO pad */
314 kDtPadIor12 = 47, /**< Muxed IO pad */
315 kDtPadIor13 = 48, /**< Muxed IO pad */
316 kDtPadUsbdevUsbDp = 49, /**< */
317 kDtPadUsbdevUsbDn = 50, /**< */
318 kDtPadSpiHost0Sd0 = 51, /**< SPI host data */
319 kDtPadSpiHost0Sd1 = 52, /**< SPI host data */
320 kDtPadSpiHost0Sd2 = 53, /**< SPI host data */
321 kDtPadSpiHost0Sd3 = 54, /**< SPI host data */
322 kDtPadSpiDeviceSd0 = 55, /**< SPI device data */
323 kDtPadSpiDeviceSd1 = 56, /**< SPI device data */
324 kDtPadSpiDeviceSd2 = 57, /**< SPI device data */
325 kDtPadSpiDeviceSd3 = 58, /**< SPI device data */
326 kDtPadSysrstCtrlAonEcRstL = 59, /**< Dedicated sysrst_ctrl output (ec_rst_l) */
327 kDtPadSysrstCtrlAonFlashWpL = 60, /**< Dedicated sysrst_ctrl output (flash_wp_l)) */
328 kDtPadSpiDeviceSck = 61, /**< SPI device clock */
329 kDtPadSpiDeviceCsb = 62, /**< SPI device chip select */
330 kDtPadSpiHost0Sck = 63, /**< SPI host clock */
331 kDtPadSpiHost0Csb = 64, /**< SPI host chip select */
333
334enum {
335 kDtPadCount = 65, /**< Number of pads */
336};
337
338
339/** Type of peripheral I/O. */
340typedef enum dt_periph_io_type {
341 /** This peripheral I/O is connected to a muxed IO (MIO). */
343 /** This peripheral I/O is connected to a direct IO (DIO). */
345 /** This peripheral I/O is not connected to either a MIO or a DIO. */
348
349
350/** Direction of a peripheral I/O. */
351typedef enum dt_periph_io_dir {
352 /** This peripheral I/O is an input. */
354 /** This peripheral I/O is an output */
356 /** This peripheral I/O is an input-output */
359
360/** Peripheral I/O description.
361 *
362 * A `dt_periph_io_t` represents a HW IP block peripheral I/O, which can be an input, output or both.
363 * Importantly, this only represents how the block peripheral I/O is wired, i.e.
364 * whether it is connected a MIO or a direct IO on the pinmux, and the relevant information necessary to
365 * configure it.
366 *
367 * **Note:** The fields of this structure are internal, use the dt_periph_io_* functions to access them.
368 */
369typedef struct dt_periph_io {
370 struct {
371 dt_periph_io_type_t type; /**< Peripheral I/O type */
372 dt_periph_io_dir_t dir; /**< Peripheral I/O direction */
373 /**
374 * For `kDtPeriphIoTypeMio`: peripheral input number. This is the index of the MIO_PERIPH_INSEL register
375 * that controls this peripheral I/O.
376 *
377 * For `kDtPeriphIoTypeDio`: DIO pad number. This is the index of the various DIO_PAD_* registers
378 * that control this peripheral I/O.
379 */
380 uint16_t periph_input_or_direct_pad;
381 /**
382 * For `kDtPeriphIoTypeMio`: peripheral output number. This is the value to put in the MIO_OUTSEL registers
383 * to connect an output to this peripheral I/O. For `kDtPeriphIoTypeDio`: the pad index (`dt_pad_t`) to which this I/O is connected.
384 */
385 uint16_t outsel_or_dt_pad;
386 } __internal; /**< Private fields */
388
389
390/* Peripheral I/O that is constantly tied to high-Z (output only) */
391extern const dt_periph_io_t kDtPeriphIoConstantHighZ;
392
393/* Peripheral I/O that is constantly tied to one (output only) */
394extern const dt_periph_io_t kDtPeriphIoConstantZero;
395
396/* Peripheral I/O that is constantly tied to zero (output only) */
397extern const dt_periph_io_t kDtPeriphIoConstantOne;
398
399/**
400 * Return the type of a `dt_periph_io_t`.
401 *
402 * @param periph_io A peripheral I/O description.
403 * @return The peripheral I/O type (MIO, DIO, etc).
404 */
406 return periph_io.__internal.type;
407}
408
409/**
410 * Return the direction of a `dt_periph_io_t`.
411 *
412 * @param periph_io A peripheral I/O description.
413 * @return The peripheral I/O direction.
414 */
415static inline dt_periph_io_dir_t dt_periph_io_dir(dt_periph_io_t periph_io) {
416 return periph_io.__internal.dir;
417}
418
419/**
420 * Pinmux types.
421 *
422 * These types are aliases to top-level types for backward compatibility
423 * with existing code.
424 */
426typedef top_earlgrey_pinmux_insel_t dt_pinmux_insel_t;
427typedef top_earlgrey_pinmux_outsel_t dt_pinmux_outsel_t;
428typedef top_earlgrey_pinmux_mio_out_t dt_pinmux_mio_out_t;
429typedef top_earlgrey_direct_pads_t dt_pinmux_direct_pad_t;
430typedef top_earlgrey_muxed_pads_t dt_pinmux_muxed_pad_t;
431
432/** Tie constantly to zero. */
433static const dt_pinmux_outsel_t kDtPinmuxOutselConstantZero = kTopEarlgreyPinmuxOutselConstantZero;
434
435/** Tie constantly to one. */
436static const dt_pinmux_outsel_t kDtPinmuxOutselConstantOne = kTopEarlgreyPinmuxOutselConstantOne;
437
438/** Tie constantly to high-Z. */
439static const dt_pinmux_outsel_t kDtPinmuxOutselConstantHighZ = kTopEarlgreyPinmuxOutselConstantHighZ;
440
441/**
442 * Return the peripheral input for an MIO peripheral I/O.
443 *
444 * This is the index of the `MIO_PERIPH_INSEL` pinmux register that controls this peripheral I/O.
445 *
446 * @param periph_io A peripheral I/O of type `kDtPeriphIoTypeMio`.
447 * @return The peripheral input number of the MIO that this peripheral I/O is connected to.
448 *
449 * **Note:** This function only makes sense for peripheral I/Os of type `kDtPeriphIoTypeMio` which are
450 * inputs (`kDtPeriphIoDirIn`). For any other peripheral I/O, the return value is unspecified.
451 */
452static inline dt_pinmux_peripheral_in_t dt_periph_io_mio_periph_input(dt_periph_io_t periph_io) {
453 return (dt_pinmux_peripheral_in_t)periph_io.__internal.periph_input_or_direct_pad;
454}
455
456/**
457 * Return the outsel for an MIO peripheral I/O.
458 *
459 * This is the value to put in the `MIO_OUTSEL` pinmux registers to connect a pad to this peripheral I/O.
460 *
461 * @param periph_io A peripheral I/O of type `kDtPeriphIoTypeMio`.
462 * @return The outsel of the MIO that this peripheral I/O is connected to.
463 *
464 * **Note:** This function only makes sense for peripheral I/Os of type `kDtPeriphIoTypeMio` which are
465 * outputs (`kDtPeriphIoDirOut`). For any other peripheral I/O, the return value is unspecified.
466 */
467static inline dt_pinmux_outsel_t dt_periph_io_mio_outsel(dt_periph_io_t periph_io) {
468 return (dt_pinmux_outsel_t)periph_io.__internal.outsel_or_dt_pad;
469}
470
471/**
472 * Return the direct pad number of a DIO peripheral I/O.
473 *
474 * This is the index of the various `DIO_PAD_*` pinmux registers that control this peripheral I/O.
475 *
476 * @param periph_io A peripheral I/O of type `kDtPeriphIoTypeDio`.
477 * @return The direct pad number of the DIO that this peripheral I/O is connected to.
478 *
479 * **Note:** This function only makes sense for peripheral I/Os of type `kDtPeriphIoTypeDio` which are
480 * either outputs or inouts. For any other peripheral I/O type, the return value is unspecified.
481 */
482static inline dt_pinmux_direct_pad_t dt_periph_io_dio_pad_index(dt_periph_io_t periph_io) {
483 return (dt_pinmux_direct_pad_t)periph_io.__internal.periph_input_or_direct_pad;
484}
485
486/**
487 * Return the pad of a DIO peripheral I/O.
488 *
489 * @param periph_io A peripheral I/O of type `kDtPeriphIoTypeDio`.
490 * @return The pad to which this peripheral I/O is connected to.
491 *
492 * **Note:** This function only makes sense for peripheral I/Os of type `kDtPeriphIoTypeDio` which are
493 * either outputs or inouts. For any other peripheral I/O type, the return value is unspecified.
494 */
495static inline dt_pad_t dt_periph_io_dio_pad(dt_periph_io_t periph_io) {
496 return (dt_pad_t)periph_io.__internal.outsel_or_dt_pad;
497}
498
499/** Type of a pad. */
500typedef enum dt_pad_type {
501 /** This pad is a muxed IO (MIO). */
503 /** This pad is a direct IO (DIO). */
505 /** This pad is not an MIO or a DIO. */
508
509/**
510 * Return the type of a `dt_pad_t`.
511 *
512 * @param pad A pad description.
513 * @return The pad type (MIO, DIO, etc).
514 */
516
517/**
518 * Return the pad out number for an MIO pad.
519 *
520 * This is the index of the `MIO_OUT` registers that control this pad
521 * (or the output part of this pad).
522 *
523 * @param pad A pad of type `kDtPadTypeMio`.
524 * @return The pad out number of the MIO.
525 *
526 * **Note:** This function only makes sense for pads of type `kDtPadTypeMio` which are
527 * either inputs or inouts. For any other pad, the return value is unspecified.
528 */
529dt_pinmux_mio_out_t dt_pad_mio_out(dt_pad_t pad);
530
531/**
532 * Return the pad out number for an MIO pad.
533 *
534 * This is the index of the `MIO_PAD` registers that control this pad
535 * (or the output part of this pad).
536 *
537 * @param pad A pad of type `kDtPadTypeMio`.
538 * @return The pad out number of the MIO.
539 *
540 * **Note:** This function only makes sense for pads of type `kDtPadTypeMio`.
541 * For any other pad, the return value is unspecified.
542 */
543dt_pinmux_muxed_pad_t dt_pad_mio_pad_index(dt_pad_t pad);
544
545/**
546 * Return the insel for an MIO pad.
547 *
548 * This is the value to put in the `MIO_PERIPH_INSEL` registers to connect a peripheral I/O to this pad.
549 *
550 * @param pad A pad of type `kDtPadTypeMio`.
551 * @return The insel of the MIO that this pad is connected to.
552 *
553 * **Note:** This function only makes sense for pads of type `kDtPadTypeMio`.
554 * For any other pad, the return value is unspecified.
555 */
556dt_pinmux_insel_t dt_pad_mio_insel(dt_pad_t pad);
557
558/**
559 * Return the direct pad number of a DIO pad.
560 *
561 * This is the index of the various `DIO_PAD_*` registers that control this pad.
562 *
563 * @param pad A pad of type `kDtPadTypeDio`.
564 * @return The direct pad number of the DID that this pad is connected to.
565 *
566 * **Note:** This function only makes sense for pads of type `kDtPeriphIoTypeDio` which are
567 * either outputs or inouts. For any other pad type, the return value is unspecified.
568 */
569dt_pinmux_direct_pad_t dt_pad_dio_pad_index(dt_pad_t pad);
570
571#ifdef __cplusplus
572} // extern "C"
573#endif // __cplusplus
574
575#endif // OPENTITAN_TOP_EARLGREY_DT_API_H_