rp1_pio_if.h
1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2023-24 Raspberry Pi Ltd. 4 * All rights reserved. 5 */ 6 #ifndef _RP1_PIO_IF_H 7 #define _RP1_PIO_IF_H 8 9 #include <sys/ioctl.h> 10 11 #define RP1_PIO_INSTRUCTION_COUNT 32 12 #define RP1_PIO_SM_COUNT 4 13 #define RP1_PIO_GPIO_COUNT 28 14 #define RP1_GPIO_FUNC_PIO 7 15 16 #define RP1_PIO_ORIGIN_ANY ((uint16_t)(~0)) 17 18 #define RP1_PIO_DIR_TO_SM 0 19 #define RP1_PIO_DIR_FROM_SM 1 20 #define RP1_PIO_DIR_COUNT 2 21 22 typedef struct { 23 uint32_t clkdiv; 24 uint32_t execctrl; 25 uint32_t shiftctrl; 26 uint32_t pinctrl; 27 } rp1_pio_sm_config; 28 29 struct rp1_pio_add_program_args { 30 uint16_t num_instrs; 31 uint16_t origin; 32 uint16_t instrs[RP1_PIO_INSTRUCTION_COUNT]; 33 }; 34 35 struct rp1_pio_remove_program_args { 36 uint16_t num_instrs; 37 uint16_t origin; 38 }; 39 40 struct rp1_pio_sm_claim_args { 41 uint16_t mask; 42 }; 43 44 struct rp1_pio_sm_init_args { 45 uint16_t sm; 46 uint16_t initial_pc; 47 rp1_pio_sm_config config; 48 }; 49 50 struct rp1_pio_sm_set_config_args { 51 uint16_t sm; 52 uint16_t rsvd; 53 rp1_pio_sm_config config; 54 }; 55 56 struct rp1_pio_sm_exec_args { 57 uint16_t sm; 58 uint16_t instr; 59 uint8_t blocking; 60 uint8_t rsvd; 61 }; 62 63 struct rp1_pio_sm_clear_fifos_args { 64 uint16_t sm; 65 }; 66 67 struct rp1_pio_sm_set_clkdiv_args { 68 uint16_t sm; 69 uint16_t div_int; 70 uint8_t div_frac; 71 uint8_t rsvd; 72 }; 73 74 struct rp1_pio_sm_set_pins_args { 75 uint16_t sm; 76 uint16_t rsvd; 77 uint32_t values; 78 uint32_t mask; 79 }; 80 81 struct rp1_pio_sm_set_pindirs_args { 82 uint16_t sm; 83 uint16_t rsvd; 84 uint32_t dirs; 85 uint32_t mask; 86 }; 87 88 struct rp1_pio_sm_set_enabled_args { 89 uint16_t mask; 90 uint8_t enable; 91 uint8_t rsvd; 92 }; 93 94 struct rp1_pio_sm_restart_args { 95 uint16_t mask; 96 }; 97 98 struct rp1_pio_sm_clkdiv_restart_args { 99 uint16_t mask; 100 }; 101 102 struct rp1_pio_sm_enable_sync_args { 103 uint16_t mask; 104 }; 105 106 struct rp1_pio_sm_put_args { 107 uint16_t sm; 108 uint8_t blocking; 109 uint8_t rsvd; 110 uint32_t data; 111 }; 112 113 struct rp1_pio_sm_get_args { 114 uint16_t sm; 115 uint8_t blocking; 116 uint8_t rsvd; 117 uint32_t data; /* OUT */ 118 }; 119 120 struct rp1_pio_sm_set_dmactrl_args { 121 uint16_t sm; 122 uint8_t is_tx; 123 uint8_t rsvd; 124 uint32_t ctrl; 125 }; 126 127 struct rp1_pio_sm_fifo_state_args { 128 uint16_t sm; 129 uint8_t tx; 130 uint8_t rsvd; 131 uint16_t level; /* OUT */ 132 uint8_t empty; /* OUT */ 133 uint8_t full; /* OUT */ 134 }; 135 136 struct rp1_gpio_init_args { 137 uint16_t gpio; 138 }; 139 140 struct rp1_gpio_set_function_args { 141 uint16_t gpio; 142 uint16_t fn; 143 }; 144 145 struct rp1_gpio_set_pulls_args { 146 uint16_t gpio; 147 uint8_t up; 148 uint8_t down; 149 }; 150 151 struct rp1_gpio_set_args { 152 uint16_t gpio; 153 uint16_t value; 154 }; 155 156 struct rp1_pio_sm_config_xfer_args { 157 uint16_t sm; 158 uint16_t dir; 159 uint16_t buf_size; 160 uint16_t buf_count; 161 }; 162 163 struct rp1_pio_sm_xfer_data_args { 164 uint16_t sm; 165 uint16_t dir; 166 uint16_t data_bytes; 167 void *data; 168 }; 169 170 struct rp1_access_hw_args { 171 uint32_t addr; 172 uint32_t len; 173 void *data; 174 }; 175 176 #define PIO_IOC_MAGIC 102 177 178 #define PIO_IOC_SM_CONFIG_XFER \ 179 _IOW(PIO_IOC_MAGIC, 0, struct rp1_pio_sm_config_xfer_args) 180 #define PIO_IOC_SM_XFER_DATA \ 181 _IOW(PIO_IOC_MAGIC, 1, struct rp1_pio_sm_xfer_data_args) 182 183 #ifdef CONFIG_COMPAT 184 // XXX #define PIO_IOC_SM_XFER_DATA32 _IOW(PIO_IOC_MAGIC, 2, struct 185 // pio_sm_xfer_data_args) 186 #endif 187 188 #define PIO_IOC_READ_HW _IOW(PIO_IOC_MAGIC, 8, struct rp1_access_hw_args) 189 #define PIO_IOC_WRITE_HW _IOW(PIO_IOC_MAGIC, 9, struct rp1_access_hw_args) 190 191 #define PIO_IOC_CAN_ADD_PROGRAM \ 192 _IOW(PIO_IOC_MAGIC, 10, struct rp1_pio_add_program_args) 193 #define PIO_IOC_ADD_PROGRAM \ 194 _IOW(PIO_IOC_MAGIC, 11, struct rp1_pio_add_program_args) 195 #define PIO_IOC_REMOVE_PROGRAM \ 196 _IOW(PIO_IOC_MAGIC, 12, struct rp1_pio_remove_program_args) 197 #define PIO_IOC_CLEAR_INSTR_MEM _IO(PIO_IOC_MAGIC, 13) 198 199 #define PIO_IOC_SM_CLAIM _IOW(PIO_IOC_MAGIC, 20, struct rp1_pio_sm_claim_args) 200 #define PIO_IOC_SM_UNCLAIM _IOW(PIO_IOC_MAGIC, 21, struct rp1_pio_sm_claim_args) 201 #define PIO_IOC_SM_IS_CLAIMED \ 202 _IOW(PIO_IOC_MAGIC, 22, struct rp1_pio_sm_claim_args) 203 204 #define PIO_IOC_SM_INIT _IOW(PIO_IOC_MAGIC, 30, struct rp1_pio_sm_init_args) 205 #define PIO_IOC_SM_SET_CONFIG \ 206 _IOW(PIO_IOC_MAGIC, 31, struct rp1_pio_sm_set_config_args) 207 #define PIO_IOC_SM_EXEC _IOW(PIO_IOC_MAGIC, 32, struct rp1_pio_sm_exec_args) 208 #define PIO_IOC_SM_CLEAR_FIFOS \ 209 _IOW(PIO_IOC_MAGIC, 33, struct rp1_pio_sm_clear_fifos_args) 210 #define PIO_IOC_SM_SET_CLKDIV \ 211 _IOW(PIO_IOC_MAGIC, 34, struct rp1_pio_sm_set_clkdiv_args) 212 #define PIO_IOC_SM_SET_PINS \ 213 _IOW(PIO_IOC_MAGIC, 35, struct rp1_pio_sm_set_pins_args) 214 #define PIO_IOC_SM_SET_PINDIRS \ 215 _IOW(PIO_IOC_MAGIC, 36, struct rp1_pio_sm_set_pindirs_args) 216 #define PIO_IOC_SM_SET_ENABLED \ 217 _IOW(PIO_IOC_MAGIC, 37, struct rp1_pio_sm_set_enabled_args) 218 #define PIO_IOC_SM_RESTART \ 219 _IOW(PIO_IOC_MAGIC, 38, struct rp1_pio_sm_restart_args) 220 #define PIO_IOC_SM_CLKDIV_RESTART \ 221 _IOW(PIO_IOC_MAGIC, 39, struct rp1_pio_sm_restart_args) 222 #define PIO_IOC_SM_ENABLE_SYNC \ 223 _IOW(PIO_IOC_MAGIC, 40, struct rp1_pio_sm_enable_sync_args) 224 #define PIO_IOC_SM_PUT _IOW(PIO_IOC_MAGIC, 41, struct rp1_pio_sm_put_args) 225 #define PIO_IOC_SM_GET _IOWR(PIO_IOC_MAGIC, 42, struct rp1_pio_sm_get_args) 226 #define PIO_IOC_SM_SET_DMACTRL \ 227 _IOW(PIO_IOC_MAGIC, 43, struct rp1_pio_sm_set_dmactrl_args) 228 #define PIO_IOC_SM_FIFO_STATE \ 229 _IOW(PIO_IOC_MAGIC, 44, struct rp1_pio_sm_fifo_state_args) 230 #define PIO_IOC_SM_DRAIN_TX \ 231 _IOW(PIO_IOC_MAGIC, 45, struct rp1_pio_sm_clear_fifos_args) 232 233 #define PIO_IOC_GPIO_INIT _IOW(PIO_IOC_MAGIC, 50, struct rp1_gpio_init_args) 234 #define PIO_IOC_GPIO_SET_FUNCTION \ 235 _IOW(PIO_IOC_MAGIC, 51, struct rp1_gpio_set_function_args) 236 #define PIO_IOC_GPIO_SET_PULLS \ 237 _IOW(PIO_IOC_MAGIC, 52, struct rp1_gpio_set_pulls_args) 238 #define PIO_IOC_GPIO_SET_OUTOVER \ 239 _IOW(PIO_IOC_MAGIC, 53, struct rp1_gpio_set_args) 240 #define PIO_IOC_GPIO_SET_INOVER \ 241 _IOW(PIO_IOC_MAGIC, 54, struct rp1_gpio_set_args) 242 #define PIO_IOC_GPIO_SET_OEOVER \ 243 _IOW(PIO_IOC_MAGIC, 55, struct rp1_gpio_set_args) 244 #define PIO_IOC_GPIO_SET_INPUT_ENABLED \ 245 _IOW(PIO_IOC_MAGIC, 56, struct rp1_gpio_set_args) 246 #define PIO_IOC_GPIO_SET_DRIVE_STRENGTH \ 247 _IOW(PIO_IOC_MAGIC, 57, struct rp1_gpio_set_args) 248 249 #endif