1 /* $NetBSD: fdtvar.h,v 1.72 2021/09/06 14:03:18 jmcneill Exp $ */ 2 3 /*- 4 * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef _DEV_FDT_FDTVAR_H_ 30 #define _DEV_FDT_FDTVAR_H_ 31 32 #include <sys/types.h> 33 #include <sys/bus.h> 34 #include <sys/gpio.h> 35 #include <sys/termios.h> 36 37 #include <dev/i2c/i2cvar.h> 38 #include <dev/pwm/pwmvar.h> 39 #include <dev/clk/clk.h> 40 41 #ifdef _KERNEL_OPT 42 #include "audio.h" 43 #endif 44 #if NAUDIO > 0 45 #include <dev/audio/audio_dai.h> 46 #else 47 typedef void *audio_dai_tag_t; 48 #endif 49 50 #include <dev/clock_subr.h> 51 52 #include <dev/ofw/openfirm.h> 53 54 struct fdt_attach_args { 55 const char *faa_name; 56 bus_space_tag_t faa_bst; 57 bus_dma_tag_t faa_dmat; 58 int faa_phandle; 59 int faa_quiet; 60 }; 61 62 /* flags for fdtbus_intr_establish */ 63 #define FDT_INTR_MPSAFE __BIT(0) 64 65 /* Interrupt trigger types defined by the FDT "interrupts" bindings. */ 66 #define FDT_INTR_TYPE_POS_EDGE __BIT(0) 67 #define FDT_INTR_TYPE_NEG_EDGE __BIT(1) 68 #define FDT_INTR_TYPE_DOUBLE_EDGE (FDT_INTR_TYPE_POS_EDGE | \ 69 FDT_INTR_TYPE_NEG_EDGE) 70 #define FDT_INTR_TYPE_HIGH_LEVEL __BIT(2) 71 #define FDT_INTR_TYPE_LOW_LEVEL __BIT(3) 72 73 struct fdtbus_interrupt_controller_func { 74 void * (*establish)(device_t, u_int *, int, int, 75 int (*)(void *), void *, const char *); 76 void (*disestablish)(device_t, void *); 77 bool (*intrstr)(device_t, u_int *, char *, size_t); 78 void (*mask)(device_t, void *); 79 void (*unmask)(device_t, void *); 80 }; 81 82 struct fdtbus_spi_controller_func { 83 struct spi_controller * (*get_controller)(device_t); 84 }; 85 86 struct fdtbus_gpio_controller; 87 88 struct fdtbus_gpio_pin { 89 struct fdtbus_gpio_controller *gp_gc; 90 void *gp_priv; 91 }; 92 93 struct fdtbus_gpio_controller_func { 94 void * (*acquire)(device_t, const void *, size_t, int); 95 void (*release)(device_t, void *); 96 int (*read)(device_t, void *, bool); 97 void (*write)(device_t, void *, int, bool); 98 }; 99 100 struct fdtbus_pinctrl_controller; 101 102 struct fdtbus_pinctrl_pin { 103 struct fdtbus_pinctrl_controller *pp_pc; 104 void *pp_priv; 105 }; 106 107 struct fdtbus_pinctrl_controller_func { 108 int (*set_config)(device_t, const void *, size_t); 109 }; 110 111 struct fdtbus_iommu_func { 112 bus_dma_tag_t (*map)(device_t, const u_int *, bus_dma_tag_t); 113 }; 114 115 struct fdtbus_regulator_controller; 116 117 struct fdtbus_regulator { 118 struct fdtbus_regulator_controller *reg_rc; 119 }; 120 121 struct fdtbus_regulator_controller_func { 122 int (*acquire)(device_t); 123 void (*release)(device_t); 124 int (*enable)(device_t, bool); 125 int (*set_voltage)(device_t, u_int, u_int); 126 int (*get_voltage)(device_t, u_int *); 127 }; 128 129 struct fdtbus_clock_controller_func { 130 struct clk * (*decode)(device_t, int, const void *, size_t); 131 }; 132 133 struct fdtbus_reset_controller; 134 135 struct fdtbus_reset { 136 struct fdtbus_reset_controller *rst_rc; 137 void *rst_priv; 138 }; 139 140 struct fdtbus_reset_controller_func { 141 void * (*acquire)(device_t, const void *, size_t); 142 void (*release)(device_t, void *); 143 int (*reset_assert)(device_t, void *); 144 int (*reset_deassert)(device_t, void *); 145 }; 146 147 struct fdtbus_dai_controller_func { 148 audio_dai_tag_t (*get_tag)(device_t, const void *, size_t); 149 }; 150 151 struct fdtbus_dma_controller; 152 153 struct fdtbus_dma { 154 struct fdtbus_dma_controller *dma_dc; 155 void *dma_priv; 156 }; 157 158 enum fdtbus_dma_dir { 159 FDT_DMA_READ, /* device -> memory */ 160 FDT_DMA_WRITE /* memory -> device */ 161 }; 162 163 struct fdtbus_dma_opt { 164 int opt_bus_width; /* Bus width */ 165 int opt_burst_len; /* Burst length */ 166 int opt_swap; /* Enable data swapping */ 167 int opt_dblbuf; /* Enable double buffering */ 168 int opt_wrap_len; /* Address wrap-around window */ 169 }; 170 171 struct fdtbus_dma_req { 172 bus_dma_segment_t *dreq_segs; /* Memory */ 173 int dreq_nsegs; 174 175 bus_addr_t dreq_dev_phys; /* Device */ 176 int dreq_sel; /* Device selector */ 177 178 enum fdtbus_dma_dir dreq_dir; /* Transfer direction */ 179 180 int dreq_block_irq; /* Enable IRQ at end of block */ 181 int dreq_block_multi; /* Enable multiple block transfers */ 182 int dreq_flow; /* Enable flow control */ 183 184 struct fdtbus_dma_opt dreq_mem_opt; /* Memory options */ 185 struct fdtbus_dma_opt dreq_dev_opt; /* Device options */ 186 }; 187 188 struct fdtbus_dma_controller_func { 189 void * (*acquire)(device_t, const void *, size_t, 190 void (*)(void *), void *); 191 void (*release)(device_t, void *); 192 int (*transfer)(device_t, void *, struct fdtbus_dma_req *); 193 void (*halt)(device_t, void *); 194 }; 195 196 struct fdtbus_power_controller; 197 198 struct fdtbus_power_controller_func { 199 void (*reset)(device_t); 200 void (*poweroff)(device_t); 201 }; 202 203 struct fdtbus_phy_controller; 204 205 struct fdtbus_phy { 206 struct fdtbus_phy_controller *phy_pc; 207 void *phy_priv; 208 }; 209 210 struct fdtbus_phy_controller_func { 211 void * (*acquire)(device_t, const void *, size_t); 212 void (*release)(device_t, void *); 213 int (*enable)(device_t, void *, bool); 214 }; 215 216 struct fdtbus_pwm_controller_func { 217 pwm_tag_t (*get_tag)(device_t, const void *, size_t); 218 }; 219 220 struct fdtbus_mmc_pwrseq; 221 222 struct fdtbus_mmc_pwrseq_func { 223 void (*pre_power_on)(device_t); 224 void (*post_power_on)(device_t); 225 void (*power_off)(device_t); 226 void (*reset)(device_t); 227 }; 228 229 struct syscon; 230 231 struct fdt_console { 232 int (*match)(int); 233 void (*consinit)(struct fdt_attach_args *, u_int); 234 }; 235 236 struct fdt_console_info { 237 const struct fdt_console *ops; 238 }; 239 240 struct fdt_phandle_data { 241 int phandle; 242 int count; 243 const u_int *values; 244 }; 245 246 #define _FDT_CONSOLE_REGISTER(name) \ 247 __link_set_add_rodata(fdt_consoles, __CONCAT(name,_consinfo)); 248 249 #define FDT_CONSOLE(_name, _ops) \ 250 static const struct fdt_console_info __CONCAT(_name,_consinfo) = { \ 251 .ops = (_ops) \ 252 }; \ 253 _FDT_CONSOLE_REGISTER(_name) 254 255 struct fdt_opp_info { 256 const char * opp_compat; 257 bool (*opp_supported)(const int, const int); 258 }; 259 260 #define _FDT_OPP_REGISTER(name) \ 261 __link_set_add_rodata(fdt_opps, __CONCAT(name,_oppinfo)); 262 263 #define FDT_OPP(_name, _compat, _suppfn) \ 264 static const struct fdt_opp_info __CONCAT(_name,_oppinfo) = { \ 265 .opp_compat = (_compat), \ 266 .opp_supported = (_suppfn) \ 267 }; \ 268 _FDT_OPP_REGISTER(_name) 269 270 TAILQ_HEAD(fdt_conslist, fdt_console_info); 271 272 struct fdt_dma_range { 273 paddr_t dr_sysbase; 274 bus_addr_t dr_busbase; 275 bus_size_t dr_len; 276 }; 277 278 #define FDT_BUS_SPACE_FLAG_NONPOSTED_MMIO __BIT(0) 279 280 int fdtbus_register_interrupt_controller(device_t, int, 281 const struct fdtbus_interrupt_controller_func *); 282 int fdtbus_register_i2c_controller(i2c_tag_t, int); 283 int fdtbus_register_spi_controller(device_t, int, 284 const struct fdtbus_spi_controller_func *); 285 int fdtbus_register_gpio_controller(device_t, int, 286 const struct fdtbus_gpio_controller_func *); 287 int fdtbus_register_pinctrl_config(device_t, int, 288 const struct fdtbus_pinctrl_controller_func *); 289 int fdtbus_register_regulator_controller(device_t, int, 290 const struct fdtbus_regulator_controller_func *); 291 int fdtbus_register_clock_controller(device_t, int, 292 const struct fdtbus_clock_controller_func *); 293 int fdtbus_register_reset_controller(device_t, int, 294 const struct fdtbus_reset_controller_func *); 295 int fdtbus_register_dai_controller(device_t, int, 296 const struct fdtbus_dai_controller_func *); 297 int fdtbus_register_dma_controller(device_t, int, 298 const struct fdtbus_dma_controller_func *); 299 int fdtbus_register_power_controller(device_t, int, 300 const struct fdtbus_power_controller_func *); 301 int fdtbus_register_phy_controller(device_t, int, 302 const struct fdtbus_phy_controller_func *); 303 int fdtbus_register_pwm_controller(device_t, int, 304 const struct fdtbus_pwm_controller_func *); 305 int fdtbus_register_mmc_pwrseq(device_t, int, 306 const struct fdtbus_mmc_pwrseq_func *); 307 int fdtbus_register_syscon(device_t, int, struct syscon *); 308 int fdtbus_register_iommu(device_t, int, 309 const struct fdtbus_iommu_func *); 310 311 void fdtbus_set_decoderegprop(bool); 312 313 int fdtbus_get_reg(int, u_int, bus_addr_t *, bus_size_t *); 314 int fdtbus_get_reg_byname(int, const char *, bus_addr_t *, 315 bus_size_t *); 316 int fdtbus_get_reg64(int, u_int, uint64_t *, uint64_t *); 317 int fdtbus_get_addr_cells(int); 318 int fdtbus_get_size_cells(int); 319 uint64_t fdtbus_get_cells(const uint8_t *, int); 320 int fdtbus_get_phandle(int, const char *); 321 int fdtbus_get_phandle_with_data(int, const char *, const char *, 322 int, struct fdt_phandle_data *); 323 int fdtbus_get_phandle_from_native(int); 324 i2c_tag_t fdtbus_get_i2c_tag(int); 325 i2c_tag_t fdtbus_i2c_acquire(int, const char *); 326 void * fdtbus_intr_establish(int, u_int, int, int, 327 int (*func)(void *), void *arg); 328 void * fdtbus_intr_establish_xname(int, u_int, int, int, 329 int (*func)(void *), void *arg, const char *); 330 void * fdtbus_intr_establish_byname(int, const char *, int, int, 331 int (*func)(void *), void *arg, const char *); 332 void * fdtbus_intr_establish_raw(int, const u_int *, int, int, 333 int (*func)(void *), void *arg, const char *); 334 void fdtbus_intr_mask(int, void *); 335 void fdtbus_intr_unmask(int, void *); 336 void fdtbus_intr_disestablish(int, void *); 337 bool fdtbus_intr_str(int, u_int, char *, size_t); 338 bool fdtbus_intr_str_raw(int, const u_int *, char *, size_t); 339 int fdtbus_gpio_count(int, const char *); 340 struct fdtbus_gpio_pin *fdtbus_gpio_acquire(int, const char *, int); 341 struct fdtbus_gpio_pin *fdtbus_gpio_acquire_index(int, const char *, int, int); 342 void fdtbus_gpio_release(struct fdtbus_gpio_pin *); 343 int fdtbus_gpio_read(struct fdtbus_gpio_pin *); 344 void fdtbus_gpio_write(struct fdtbus_gpio_pin *, int); 345 int fdtbus_gpio_read_raw(struct fdtbus_gpio_pin *); 346 void fdtbus_gpio_write_raw(struct fdtbus_gpio_pin *, int); 347 audio_dai_tag_t fdtbus_dai_acquire(int, const char *); 348 audio_dai_tag_t fdtbus_dai_acquire_index(int, const char *, int); 349 pwm_tag_t fdtbus_pwm_acquire(int, const char *); 350 pwm_tag_t fdtbus_pwm_acquire_index(int, const char *, int); 351 int fdtbus_pinctrl_set_config_index(int, u_int); 352 int fdtbus_pinctrl_set_config(int, const char *); 353 bool fdtbus_pinctrl_has_config(int, const char *); 354 const char * fdtbus_pinctrl_parse_function(int); 355 const void * fdtbus_pinctrl_parse_pins(int, int *); 356 const char * fdtbus_pinctrl_parse_groups(int, int *); 357 const u_int * fdtbus_pinctrl_parse_pinmux(int, int *); 358 int fdtbus_pinctrl_parse_bias(int, int *); 359 int fdtbus_pinctrl_parse_drive(int); 360 int fdtbus_pinctrl_parse_drive_strength(int); 361 int fdtbus_pinctrl_parse_input_output(int, int *); 362 struct fdtbus_regulator *fdtbus_regulator_acquire(int, const char *); 363 void fdtbus_regulator_release(struct fdtbus_regulator *); 364 int fdtbus_regulator_enable(struct fdtbus_regulator *); 365 int fdtbus_regulator_disable(struct fdtbus_regulator *); 366 int fdtbus_regulator_set_voltage(struct fdtbus_regulator *, 367 u_int, u_int); 368 int fdtbus_regulator_get_voltage(struct fdtbus_regulator *, 369 u_int *); 370 int fdtbus_regulator_supports_voltage(struct fdtbus_regulator *, 371 u_int, u_int); 372 struct syscon * fdtbus_syscon_acquire(int, const char *); 373 struct syscon * fdtbus_syscon_lookup(int); 374 bus_dma_tag_t fdtbus_iommu_map(int, u_int, bus_dma_tag_t); 375 bus_dma_tag_t fdtbus_iommu_map_pci(int, uint32_t, bus_dma_tag_t); 376 377 struct fdtbus_dma *fdtbus_dma_get(int, const char *, void (*)(void *), void *); 378 struct fdtbus_dma *fdtbus_dma_get_index(int, u_int, void (*)(void *), 379 void *); 380 void fdtbus_dma_put(struct fdtbus_dma *); 381 int fdtbus_dma_transfer(struct fdtbus_dma *, 382 struct fdtbus_dma_req *); 383 void fdtbus_dma_halt(struct fdtbus_dma *); 384 385 struct clk * fdtbus_clock_get(int, const char *); 386 struct clk * fdtbus_clock_get_index(int, u_int); 387 struct clk * fdtbus_clock_byname(const char *); 388 void fdtbus_clock_assign(int); 389 u_int fdtbus_clock_count(int, const char *); 390 int fdtbus_clock_enable(int, const char *, bool); 391 int fdtbus_clock_enable_index(int, u_int, bool); 392 393 struct fdtbus_reset *fdtbus_reset_get(int, const char *); 394 struct fdtbus_reset *fdtbus_reset_get_index(int, u_int); 395 void fdtbus_reset_put(struct fdtbus_reset *); 396 int fdtbus_reset_assert(struct fdtbus_reset *); 397 int fdtbus_reset_deassert(struct fdtbus_reset *); 398 399 struct fdtbus_phy *fdtbus_phy_get(int, const char *); 400 struct fdtbus_phy *fdtbus_phy_get_index(int, u_int); 401 void fdtbus_phy_put(struct fdtbus_phy *); 402 device_t fdtbus_phy_device(struct fdtbus_phy *); 403 int fdtbus_phy_enable(struct fdtbus_phy *, bool); 404 405 struct fdtbus_mmc_pwrseq *fdtbus_mmc_pwrseq_get(int); 406 void fdtbus_mmc_pwrseq_pre_power_on(struct fdtbus_mmc_pwrseq *); 407 void fdtbus_mmc_pwrseq_post_power_on(struct fdtbus_mmc_pwrseq *); 408 void fdtbus_mmc_pwrseq_power_off(struct fdtbus_mmc_pwrseq *); 409 void fdtbus_mmc_pwrseq_reset(struct fdtbus_mmc_pwrseq *); 410 411 int fdtbus_todr_attach(device_t, int, todr_chip_handle_t); 412 413 void fdtbus_power_reset(void); 414 void fdtbus_power_poweroff(void); 415 416 device_t fdtbus_attach_i2cbus(device_t, int, i2c_tag_t, cfprint_t); 417 device_t fdtbus_attach_spibus(device_t, int, cfprint_t); 418 419 bool fdtbus_init(const void *); 420 const void * fdtbus_get_data(void); 421 int fdtbus_phandle2offset(int); 422 int fdtbus_offset2phandle(int); 423 bool fdtbus_get_path(int, char *, size_t); 424 425 const struct fdt_console *fdtbus_get_console(void); 426 427 const char * fdtbus_get_stdout_path(void); 428 int fdtbus_get_stdout_phandle(void); 429 int fdtbus_get_stdout_speed(void); 430 tcflag_t fdtbus_get_stdout_flags(void); 431 432 bool fdtbus_status_okay(int); 433 434 const void * fdtbus_get_prop(int, const char *, int *); 435 const char * fdtbus_get_string(int, const char *); 436 const char * fdtbus_get_string_index(int, const char *, u_int); 437 int fdtbus_get_index(int, const char *, const char *, u_int *); 438 439 void fdt_add_bus(device_t, int, struct fdt_attach_args *); 440 void fdt_add_bus_match(device_t, int, struct fdt_attach_args *, 441 bool (*)(void *, int), void *); 442 void fdt_add_child(device_t, int, struct fdt_attach_args *, u_int); 443 444 void fdt_remove_byhandle(int); 445 void fdt_remove_bycompat(const char *[]); 446 int fdt_find_with_property(const char *, int *); 447 448 int fdtbus_print(void *, const char *); 449 450 bus_dma_tag_t fdtbus_dma_tag_create(int, const struct fdt_dma_range *, 451 u_int); 452 bus_space_tag_t fdtbus_bus_tag_create(int, uint32_t); 453 454 #endif /* _DEV_FDT_FDTVAR_H_ */ 455