// Copyright 2020 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.

#include <zircon/status.h>

#include <ddk/binding.h>
#include <ddk/debug.h>
#include <ddk/platform-defs.h>

#include "nelson-gpios.h"
#include "nelson.h"

namespace nelson {

static constexpr zx_bind_inst_t root_match[] = {
    BI_MATCH(),
};

static constexpr zx_bind_inst_t irq_gpio_match[] = {
    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_GPIO),
    BI_MATCH_IF(EQ, BIND_GPIO_PIN, GPIO_SELINA_IRQ),
};

static constexpr zx_bind_inst_t reset_gpio_match[] = {
    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_GPIO),
    BI_MATCH_IF(EQ, BIND_GPIO_PIN, GPIO_SELINA_RESET),
};

static constexpr zx_bind_inst_t spi_match[] = {
    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_SPI),
    BI_ABORT_IF(NE, BIND_PLATFORM_DEV_VID, PDEV_VID_INFINEON),
    BI_ABORT_IF(NE, BIND_PLATFORM_DEV_PID, PDEV_PID_INFINEON_BGT60TR13C),
    BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_DID, PDEV_DID_RADAR_SENSOR),
};

static constexpr device_fragment_part_t irq_gpio_fragment[] = {
    {countof(root_match), root_match},
    {countof(irq_gpio_match), irq_gpio_match},
};

static constexpr device_fragment_part_t reset_gpio_fragment[] = {
    {countof(root_match), root_match},
    {countof(reset_gpio_match), reset_gpio_match},
};

static constexpr device_fragment_part_t spi_fragment[] = {
    {countof(root_match), root_match},
    {countof(spi_match), spi_match},
};

static constexpr device_fragment_t fragments[] = {
    {"irq-gpio", countof(irq_gpio_fragment), irq_gpio_fragment},
    {"reset-gpio", countof(reset_gpio_fragment), reset_gpio_fragment},
    {"spi", countof(spi_fragment), spi_fragment},
};

static constexpr zx_device_prop_t props[] = {
    {BIND_PLATFORM_DEV_VID, 0, PDEV_VID_GENERIC},
    {BIND_PLATFORM_DEV_PID, 0, PDEV_PID_NELSON},
    {BIND_PLATFORM_DEV_DID, 0, PDEV_DID_RADAR_SENSOR},
};

static composite_device_desc_t composite_dev = []() {
  composite_device_desc_t desc = {};
  desc.props = props;
  desc.props_count = countof(props);
  desc.fragments = fragments;
  desc.fragments_count = countof(fragments);
  desc.coresident_device_index = 1;
  return desc;
}();

zx_status_t Nelson::SelinaInit() { return DdkAddComposite("selina", &composite_dev); }

}  // namespace nelson
