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 <ddktl/i2c-channel.h>
8 #include <ddktl/mmio.h>
9 #include <ddktl/protocol/gpio.h>
10 #include <ddktl/protocol/platform/device.h>
11 
12 #include <lib/zx/bti.h>
13 #include <lib/zx/interrupt.h>
14 #include <optional>
15 #include <zircon/types.h>
16 
17 namespace ddk {
18 
19 class PDev : public PDevProtocolClient {
20 
21 public:
PDev()22     PDev() {}
23 
24     // TODO(andresoportus): pass protocol by value/const& so there is no question on lifecycle.
PDev(pdev_protocol_t * proto)25     PDev(pdev_protocol_t* proto)
26         : PDevProtocolClient(proto) {}
27 
PDev(zx_device_t * parent)28     PDev(zx_device_t* parent)
29         : PDevProtocolClient(parent) {}
30 
31     ~PDev() = default;
32 
33     // Prints out information about the platform device.
34     void ShowInfo();
35 
36     zx_status_t MapMmio(uint32_t index, std::optional<MmioBuffer>* mmio);
37 
GetInterrupt(uint32_t index,zx::interrupt * out)38     zx_status_t GetInterrupt(uint32_t index, zx::interrupt* out) {
39         return PDevProtocolClient::GetInterrupt(index, 0, out);
40     }
41 
42     std::optional<I2cChannel> GetI2c(uint32_t index);
43     std::optional<GpioProtocolClient> GetGpio(uint32_t index);
44 };
45 
46 } // namespace ddk
47