1 /* $NetBSD: fdtvar.h,v 1.61 2020/09/28 11:54:24 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 *); 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_i2c_controller_func { 83 i2c_tag_t (*get_tag)(device_t); 84 }; 85 86 struct fdtbus_spi_controller_func { 87 struct spi_controller * (*get_controller)(device_t); 88 }; 89 90 struct fdtbus_gpio_controller; 91 92 struct fdtbus_gpio_pin { 93 struct fdtbus_gpio_controller *gp_gc; 94 void *gp_priv; 95 }; 96 97 struct fdtbus_gpio_controller_func { 98 void * (*acquire)(device_t, const void *, size_t, int); 99 void (*release)(device_t, void *); 100 int (*read)(device_t, void *, bool); 101 void (*write)(device_t, void *, int, bool); 102 }; 103 104 struct fdtbus_pinctrl_controller; 105 106 struct fdtbus_pinctrl_pin { 107 struct fdtbus_pinctrl_controller *pp_pc; 108 void *pp_priv; 109 }; 110 111 struct fdtbus_pinctrl_controller_func { 112 int (*set_config)(device_t, const void *, size_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 int fdtbus_register_interrupt_controller(device_t, int, 279 const struct fdtbus_interrupt_controller_func *); 280 int fdtbus_register_i2c_controller(device_t, int, 281 const struct fdtbus_i2c_controller_func *); 282 int fdtbus_register_spi_controller(device_t, int, 283 const struct fdtbus_spi_controller_func *); 284 int fdtbus_register_gpio_controller(device_t, int, 285 const struct fdtbus_gpio_controller_func *); 286 int fdtbus_register_pinctrl_config(device_t, int, 287 const struct fdtbus_pinctrl_controller_func *); 288 int fdtbus_register_regulator_controller(device_t, int, 289 const struct fdtbus_regulator_controller_func *); 290 int fdtbus_register_clock_controller(device_t, int, 291 const struct fdtbus_clock_controller_func *); 292 int fdtbus_register_reset_controller(device_t, int, 293 const struct fdtbus_reset_controller_func *); 294 int fdtbus_register_dai_controller(device_t, int, 295 const struct fdtbus_dai_controller_func *); 296 int fdtbus_register_dma_controller(device_t, int, 297 const struct fdtbus_dma_controller_func *); 298 int fdtbus_register_power_controller(device_t, int, 299 const struct fdtbus_power_controller_func *); 300 int fdtbus_register_phy_controller(device_t, int, 301 const struct fdtbus_phy_controller_func *); 302 int fdtbus_register_pwm_controller(device_t, int, 303 const struct fdtbus_pwm_controller_func *); 304 int fdtbus_register_mmc_pwrseq(device_t, int, 305 const struct fdtbus_mmc_pwrseq_func *); 306 int fdtbus_register_syscon(device_t, int, struct syscon *); 307 308 void fdtbus_set_decoderegprop(bool); 309 310 int fdtbus_get_reg(int, u_int, bus_addr_t *, bus_size_t *); 311 int fdtbus_get_reg_byname(int, const char *, bus_addr_t *, 312 bus_size_t *); 313 int fdtbus_get_reg64(int, u_int, uint64_t *, uint64_t *); 314 int fdtbus_get_addr_cells(int); 315 int fdtbus_get_size_cells(int); 316 uint64_t fdtbus_get_cells(const uint8_t *, int); 317 int fdtbus_get_phandle(int, const char *); 318 int fdtbus_get_phandle_with_data(int, const char *, const char *, 319 int, struct fdt_phandle_data *); 320 int fdtbus_get_phandle_from_native(int); 321 i2c_tag_t fdtbus_get_i2c_tag(int); 322 i2c_tag_t fdtbus_i2c_acquire(int, const char *); 323 void * fdtbus_intr_establish(int, u_int, int, int, 324 int (*func)(void *), void *arg); 325 void * fdtbus_intr_establish_byname(int, const char *, int, int, 326 int (*func)(void *), void *arg); 327 void * fdtbus_intr_establish_raw(int, const u_int *, int, int, 328 int (*func)(void *), void *arg); 329 void fdtbus_intr_mask(int, void *); 330 void fdtbus_intr_unmask(int, void *); 331 void fdtbus_intr_disestablish(int, void *); 332 bool fdtbus_intr_str(int, u_int, char *, size_t); 333 bool fdtbus_intr_str_raw(int, const u_int *, char *, size_t); 334 struct fdtbus_gpio_pin *fdtbus_gpio_acquire(int, const char *, int); 335 struct fdtbus_gpio_pin *fdtbus_gpio_acquire_index(int, const char *, int, int); 336 void fdtbus_gpio_release(struct fdtbus_gpio_pin *); 337 int fdtbus_gpio_read(struct fdtbus_gpio_pin *); 338 void fdtbus_gpio_write(struct fdtbus_gpio_pin *, int); 339 int fdtbus_gpio_read_raw(struct fdtbus_gpio_pin *); 340 void fdtbus_gpio_write_raw(struct fdtbus_gpio_pin *, int); 341 audio_dai_tag_t fdtbus_dai_acquire(int, const char *); 342 audio_dai_tag_t fdtbus_dai_acquire_index(int, const char *, int); 343 pwm_tag_t fdtbus_pwm_acquire(int, const char *); 344 pwm_tag_t fdtbus_pwm_acquire_index(int, const char *, int); 345 int fdtbus_pinctrl_set_config_index(int, u_int); 346 int fdtbus_pinctrl_set_config(int, const char *); 347 bool fdtbus_pinctrl_has_config(int, const char *); 348 const char * fdtbus_pinctrl_parse_function(int); 349 const void * fdtbus_pinctrl_parse_pins(int, int *); 350 const char * fdtbus_pinctrl_parse_groups(int, int *); 351 const u_int * fdtbus_pinctrl_parse_pinmux(int, int *); 352 int fdtbus_pinctrl_parse_bias(int, int *); 353 int fdtbus_pinctrl_parse_drive(int); 354 int fdtbus_pinctrl_parse_drive_strength(int); 355 int fdtbus_pinctrl_parse_input_output(int, int *); 356 struct fdtbus_regulator *fdtbus_regulator_acquire(int, const char *); 357 void fdtbus_regulator_release(struct fdtbus_regulator *); 358 int fdtbus_regulator_enable(struct fdtbus_regulator *); 359 int fdtbus_regulator_disable(struct fdtbus_regulator *); 360 int fdtbus_regulator_set_voltage(struct fdtbus_regulator *, 361 u_int, u_int); 362 int fdtbus_regulator_get_voltage(struct fdtbus_regulator *, 363 u_int *); 364 int fdtbus_regulator_supports_voltage(struct fdtbus_regulator *, 365 u_int, u_int); 366 struct syscon * fdtbus_syscon_acquire(int, const char *); 367 struct syscon * fdtbus_syscon_lookup(int); 368 369 struct fdtbus_dma *fdtbus_dma_get(int, const char *, void (*)(void *), void *); 370 struct fdtbus_dma *fdtbus_dma_get_index(int, u_int, void (*)(void *), 371 void *); 372 void fdtbus_dma_put(struct fdtbus_dma *); 373 int fdtbus_dma_transfer(struct fdtbus_dma *, 374 struct fdtbus_dma_req *); 375 void fdtbus_dma_halt(struct fdtbus_dma *); 376 377 struct clk * fdtbus_clock_get(int, const char *); 378 struct clk * fdtbus_clock_get_index(int, u_int); 379 struct clk * fdtbus_clock_byname(const char *); 380 void fdtbus_clock_assign(int); 381 u_int fdtbus_clock_count(int, const char *); 382 int fdtbus_clock_enable(int, const char *, bool); 383 int fdtbus_clock_enable_index(int, u_int, bool); 384 385 struct fdtbus_reset *fdtbus_reset_get(int, const char *); 386 struct fdtbus_reset *fdtbus_reset_get_index(int, u_int); 387 void fdtbus_reset_put(struct fdtbus_reset *); 388 int fdtbus_reset_assert(struct fdtbus_reset *); 389 int fdtbus_reset_deassert(struct fdtbus_reset *); 390 391 struct fdtbus_phy *fdtbus_phy_get(int, const char *); 392 struct fdtbus_phy *fdtbus_phy_get_index(int, u_int); 393 void fdtbus_phy_put(struct fdtbus_phy *); 394 device_t fdtbus_phy_device(struct fdtbus_phy *); 395 int fdtbus_phy_enable(struct fdtbus_phy *, bool); 396 397 struct fdtbus_mmc_pwrseq *fdtbus_mmc_pwrseq_get(int); 398 void fdtbus_mmc_pwrseq_pre_power_on(struct fdtbus_mmc_pwrseq *); 399 void fdtbus_mmc_pwrseq_post_power_on(struct fdtbus_mmc_pwrseq *); 400 void fdtbus_mmc_pwrseq_power_off(struct fdtbus_mmc_pwrseq *); 401 void fdtbus_mmc_pwrseq_reset(struct fdtbus_mmc_pwrseq *); 402 403 int fdtbus_todr_attach(device_t, int, todr_chip_handle_t); 404 405 void fdtbus_power_reset(void); 406 void fdtbus_power_poweroff(void); 407 408 device_t fdtbus_attach_i2cbus(device_t, int, i2c_tag_t, cfprint_t); 409 device_t fdtbus_attach_spibus(device_t, int, cfprint_t); 410 411 bool fdtbus_init(const void *); 412 const void * fdtbus_get_data(void); 413 int fdtbus_phandle2offset(int); 414 int fdtbus_offset2phandle(int); 415 bool fdtbus_get_path(int, char *, size_t); 416 417 const struct fdt_console *fdtbus_get_console(void); 418 419 const char * fdtbus_get_stdout_path(void); 420 int fdtbus_get_stdout_phandle(void); 421 int fdtbus_get_stdout_speed(void); 422 tcflag_t fdtbus_get_stdout_flags(void); 423 424 bool fdtbus_status_okay(int); 425 426 const void * fdtbus_get_prop(int, const char *, int *); 427 const char * fdtbus_get_string(int, const char *); 428 const char * fdtbus_get_string_index(int, const char *, u_int); 429 int fdtbus_get_index(int, const char *, const char *, u_int *); 430 431 void fdt_add_bus(device_t, int, struct fdt_attach_args *); 432 void fdt_add_bus_match(device_t, int, struct fdt_attach_args *, 433 bool (*)(void *, int), void *); 434 void fdt_add_child(device_t, int, struct fdt_attach_args *, u_int); 435 436 void fdt_remove_byhandle(int); 437 void fdt_remove_bycompat(const char *[]); 438 int fdt_find_with_property(const char *, int *); 439 int fdtbus_print(void *, const char *); 440 441 bus_dma_tag_t fdtbus_dma_tag_create(int, const struct fdt_dma_range *, 442 u_int); 443 444 #endif /* _DEV_FDT_FDTVAR_H */ 445