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 <ddk/protocol/serial.h>
8#include <fbl/type_support.h>
9
10namespace ddk {
11namespace internal {
12
13DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_get_info, GetInfo,
14                                     zx_status_t (C::*)(serial_port_info_t*));
15
16DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_config, Config,
17                                     zx_status_t (C::*)(uint32_t, uint32_t));
18
19DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_enable, Enable,
20                                     zx_status_t (C::*)(bool));
21
22DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_read, Read,
23                                     zx_status_t (C::*)(void*, size_t, size_t*));
24
25DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_write, Write,
26                                     zx_status_t (C::*)(const void*, size_t, size_t*));
27
28DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_set_notify_callback, SetNotifyCallback,
29                                     zx_status_t (C::*)(serial_notify_cb, void*));
30
31template <typename D>
32constexpr void CheckSerialImplProtocolSubclass() {
33    static_assert(internal::serial_has_get_info<D>::value,
34                  "SerialImplProtocol subclasses must implement "
35                  "zx_status_t GetInfo(serial_port_info_t* info)");
36    static_assert(internal::serial_has_config<D>::value,
37                  "SerialImplProtocol subclasses must implement "
38                  "zx_status_t Config(uint32_t baud_rate, uint32_t flags)");
39    static_assert(internal::serial_has_enable<D>::value,
40                  "SerialImplProtocol subclasses must implement "
41                  "zx_status_t Enable(bool enable)");
42    static_assert(internal::serial_has_read<D>::value,
43                  "SerialImplProtocol subclasses must implement "
44                  "zx_status_t Read(void* buf, size_t length, size_t* out_actual)");
45    static_assert(internal::serial_has_write<D>::value,
46                  "SerialImplProtocol subclasses must implement "
47                  "zx_status_t Write(const void* buf, size_t length, size_t* out_actual)");
48    static_assert(internal::serial_has_set_notify_callback<D>::value,
49                  "SerialImplProtocol subclasses must implement "
50                  "zx_status_t SetNotifyCallback(serial_notify_cb cb, void* cookie)");
51}
52
53} // namespace internal
54} // namespace ddk
55