blob: d761c5eb7838f8cbe4b3ebc60f7dc805f65544f6 [file] [log] [blame]
// Copyright 2024 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 <lib/ddk/binding_driver.h>
#include <lib/ddk/device.h>
#include <lib/ddk/platform-defs.h>
#include <cstring>
#include <memory>
#include <bind/fuchsia/cpp/bind.h>
#include <bind/fuchsia/hardware/i2c/cpp/bind.h>
#include <bind/fuchsia/i2c/cpp/bind.h>
#include <bind/fuchsia/khadas/platform/cpp/bind.h>
#include "src/devices/board/drivers/vim3/vim3.h"
namespace vim3 {
const ddk::BindRule kI2cRules[] = {
ddk::MakeAcceptBindRule(bind_fuchsia_hardware_i2c::SERVICE,
bind_fuchsia_hardware_i2c::SERVICE_ZIRCONTRANSPORT),
ddk::MakeAcceptBindRule(bind_fuchsia::I2C_BUS_ID, bind_fuchsia_i2c::BIND_I2C_BUS_ID_I2C_A0_0),
ddk::MakeAcceptBindRule(bind_fuchsia::I2C_ADDRESS, bind_fuchsia_i2c::BIND_I2C_ADDRESS_MCU),
};
const device_bind_prop_t kI2cProperties[] = {
ddk::MakeProperty(bind_fuchsia_hardware_i2c::SERVICE,
bind_fuchsia_hardware_i2c::SERVICE_ZIRCONTRANSPORT),
};
const ddk::BindRule kMcuRules[] = {
ddk::MakeAcceptBindRule(BIND_PLATFORM_DEV_VID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_VID_KHADAS),
ddk::MakeAcceptBindRule(BIND_PLATFORM_DEV_PID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_PID_VIM3),
ddk::MakeAcceptBindRule(BIND_PLATFORM_DEV_DID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_DID_VIM3_MCU),
};
const device_bind_prop_t kMcuProperties[] = {
ddk::MakeProperty(BIND_PLATFORM_DEV_VID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_VID_KHADAS),
ddk::MakeProperty(BIND_PLATFORM_DEV_PID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_PID_VIM3),
ddk::MakeProperty(BIND_PLATFORM_DEV_DID,
bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_DID_VIM3_MCU),
};
const zx_device_prop_t kMcuProps[] = {
{BIND_PLATFORM_DEV_VID, 0, bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_VID_KHADAS},
{BIND_PLATFORM_DEV_PID, 0, bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_PID_VIM3},
{BIND_PLATFORM_DEV_DID, 0, bind_fuchsia_khadas_platform::BIND_PLATFORM_DEV_DID_VIM3_MCU},
};
zx_status_t Vim3::McuInit() {
auto dev = std::make_unique<Vim3Child>(zxdev());
zx_status_t status = dev->DdkAdd(ddk::DeviceAddArgs("mcu").set_props(kMcuProps));
if (status != ZX_OK) {
zxlogf(ERROR, "DdkAdd mcu request failed: %s", zx_status_get_string(status));
return status;
}
// Device intentionally leaked as it is now held by DevMgr.
[[maybe_unused]] auto ptr = dev.release();
status = DdkAddCompositeNodeSpec(
"mcu-composite",
ddk::CompositeNodeSpec(kI2cRules, kI2cProperties).AddParentSpec(kMcuRules, kMcuProperties));
if (status != ZX_OK) {
zxlogf(ERROR, "DdkAddCompositeNodeSpec failed: %s", zx_status_get_string(status));
return status;
}
return ZX_OK;
}
} // namespace vim3