1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <stdint.h>
8 #include <threads.h>
9 
10 #include <ddk/device.h>
11 #include <ddk/mmio-buffer.h>
12 #include <ddk/protocol/gpioimpl.h>
13 #include <ddk/protocol/platform/bus.h>
14 #include <ddk/protocol/platform/device.h>
15 #include <hw/reg.h>
16 #include <soc/imx8m/imx8m-gpio.h>
17 #include <zircon/syscalls/port.h>
18 
19 typedef struct {
20     pdev_protocol_t pdev;
21     pbus_protocol_t pbus;
22     gpio_impl_protocol_t gpio;
23     zx_device_t* zxdev;
24     mmio_buffer_t mmios[IMX_GPIO_BLOCKS];
25     mmio_buffer_t mmio_iomux;
26     mtx_t lock[IMX_GPIO_BLOCKS];
27     zx_handle_t inth[IMX_GPIO_INTERRUPTS];
28     zx_handle_t vinth[IMX_GPIO_MAX];
29     zx_handle_t porth;
30     thrd_t irq_handler;
31     mtx_t gpio_lock;
32 } imx8_gpio_t;
33 
34 #define READ32_GPIO_REG(block_index, offset) \
35         readl((uint8_t*)gpio->mmios[block_index].vaddr + offset)
36 #define WRITE32_GPIO_REG(block_index, offset, value) \
37         writel(value, (uint8_t*)gpio->mmios[block_index].vaddr + offset)
38 
39 zx_status_t imx8_gpio_config_in(void* ctx, uint32_t pin, uint32_t flags);
40 zx_status_t imx8_gpio_config_out(void* ctx, uint32_t pin, uint8_t initial_value);
41 zx_status_t imx8_gpio_read(void* ctx, uint32_t pin, uint8_t* out_value);
42 zx_status_t imx8_gpio_write(void* ctx, uint32_t pin, uint8_t value);
43 zx_status_t imx8_gpio_get_interrupt(void* ctx, uint32_t pin, uint32_t flags,
44                                     zx_handle_t* out_handle);
45 zx_status_t imx8_gpio_release_interrupt(void* ctx, uint32_t pin);
46 zx_status_t imx8_gpio_set_polarity(void* ctx, uint32_t pin, uint32_t polarity);
47 /* imx8_set_alt_function is SoC dependent. */
48 int imx8_gpio_irq_handler(void* arg);
49