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