blob: d45296ea0c98a52c6d4afc509ffbb36b362f9e22 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <threads.h>
#include <ddk/platform-defs.h>
#include <ddk/protocol/platform-device-lib.h>
#include <ddk/protocol/platform/bus.h>
#include <ddk/protocol/platform/device.h>
#include <ddktl/device.h>
#include <ddktl/protocol/gpioimpl.h>
#include <fbl/array.h>
#include <lib/zx/interrupt.h>
#include <lib/zx/port.h>
#include "mt8167-gpio-regs.h"
namespace gpio {
class Mt8167GpioDevice;
using DeviceType = ddk::Device<Mt8167GpioDevice, ddk::Unbindable>;
class Mt8167GpioDevice : public DeviceType,
public ddk::GpioImplProtocol<Mt8167GpioDevice, ddk::base_protocol> {
public:
static zx_status_t Create(zx_device_t* parent);
explicit Mt8167GpioDevice(zx_device_t* parent, mmio_buffer_t gpio_mmio,
mmio_buffer_t iocfg_mmio, mmio_buffer_t eint_mmio)
: DeviceType(parent),
gpio_mmio_(gpio_mmio),
dir_(gpio_mmio),
out_(gpio_mmio),
in_(gpio_mmio),
pull_en_(gpio_mmio),
pull_sel_(gpio_mmio),
iocfg_(iocfg_mmio),
eint_(eint_mmio) {}
zx_status_t Bind();
zx_status_t Init();
// Methods required by the ddk mixins
void DdkUnbind();
void DdkRelease();
zx_status_t GpioImplConfigIn(uint32_t index, uint32_t flags);
zx_status_t GpioImplConfigOut(uint32_t index, uint8_t initial_value);
zx_status_t GpioImplSetAltFunction(uint32_t index, uint64_t function);
zx_status_t GpioImplRead(uint32_t index, uint8_t* out_value);
zx_status_t GpioImplWrite(uint32_t index, uint8_t value);
zx_status_t GpioImplGetInterrupt(uint32_t index, uint32_t flags, zx::interrupt* out_irq);
zx_status_t GpioImplReleaseInterrupt(uint32_t index);
zx_status_t GpioImplSetPolarity(uint32_t index, uint32_t polarity);
protected:
fbl::Array<zx::interrupt> interrupts_; // Protected to be changed in unit tests.
private:
void ShutDown();
int Thread();
ddk::MmioBuffer gpio_mmio_;
const GpioDirReg dir_;
const GpioOutReg out_;
const GpioInReg in_;
const GpioPullEnReg pull_en_;
const GpioPullSelReg pull_sel_;
const IoConfigReg iocfg_;
const ExtendedInterruptReg eint_;
zx::interrupt int_;
zx::port port_;
thrd_t thread_;
};
} // namespace gpio