1 /* Copyright 2018 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
4 #include <metal/machine/platform.h>
6 #ifdef METAL_SIFIVE_GPIO0
8 #include <metal/drivers/sifive_gpio0.h>
10 #include <metal/machine.h>
12 int __metal_driver_sifive_gpio0_disable_input(struct metal_gpio *ggpio, long source)
14 long base = __metal_driver_sifive_gpio0_base(ggpio);
16 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_INPUT_EN)) &= ~source;
21 long __metal_driver_sifive_gpio0_output(struct metal_gpio *ggpio)
23 long base = __metal_driver_sifive_gpio0_base(ggpio);
25 return __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT));
28 int __metal_driver_sifive_gpio0_enable_output(struct metal_gpio *ggpio, long source)
30 long base = __metal_driver_sifive_gpio0_base(ggpio);
32 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_OUTPUT_EN)) |= source;
37 int __metal_driver_sifive_gpio0_output_set(struct metal_gpio *ggpio, long value)
39 long base = __metal_driver_sifive_gpio0_base(ggpio);
41 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) |= value;
46 int __metal_driver_sifive_gpio0_output_clear(struct metal_gpio *ggpio, long value)
48 long base = __metal_driver_sifive_gpio0_base(ggpio);
50 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) &= ~value;
55 int __metal_driver_sifive_gpio0_output_toggle(struct metal_gpio *ggpio, long value)
57 long base = __metal_driver_sifive_gpio0_base(ggpio);
59 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) =
60 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) ^ value;
65 int __metal_driver_sifive_gpio0_enable_io(struct metal_gpio *ggpio, long source, long dest)
67 long base = __metal_driver_sifive_gpio0_base(ggpio);
69 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_IOF_SEL)) &= ~source;
70 __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_IOF_EN)) |= dest;
75 __METAL_DEFINE_VTABLE(__metal_driver_vtable_sifive_gpio0) = {
76 .gpio.disable_input = __metal_driver_sifive_gpio0_disable_input,
77 .gpio.output = __metal_driver_sifive_gpio0_output,
78 .gpio.enable_output = __metal_driver_sifive_gpio0_enable_output,
79 .gpio.output_set = __metal_driver_sifive_gpio0_output_set,
80 .gpio.output_clear = __metal_driver_sifive_gpio0_output_clear,
81 .gpio.output_toggle = __metal_driver_sifive_gpio0_output_toggle,
82 .gpio.enable_io = __metal_driver_sifive_gpio0_enable_io,
85 #endif /* METAL_SIFIVE_GPIO0 */