blob: 1be9d87d35cfb4fdd97f6bd54de946b6d695661e [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/driver.h>
#include <ddktl/protocol/i2cimpl.h>
#include <fbl/mutex.h>
#include <lib/sync/completion.h>
#include "proxy-protocol.h"
namespace platform_bus {
class PlatformI2cBus {
public:
explicit PlatformI2cBus(const i2c_impl_protocol_t* i2c, uint32_t bus_id);
zx_status_t Start();
zx_status_t Transact(uint32_t txid, rpc_i2c_req_t* req, uint16_t address,
zx_handle_t channel_handle);
private:
// struct representing an I2C transaction.
struct I2cTxn {
uint32_t txid;
zx_handle_t channel_handle;
list_node_t node;
uint16_t address;
i2c_transact_callback transact_cb;
void* cookie;
size_t length;
size_t cnt;
};
void Complete(I2cTxn* txn, zx_status_t status, const uint8_t* data,
size_t data_length);
int I2cThread();
ddk::I2cImplProtocolClient i2c_;
const uint32_t bus_id_;
size_t max_transfer_;
list_node_t queued_txns_ __TA_GUARDED(mutex_);
list_node_t free_txns_ __TA_GUARDED(mutex_);
sync_completion_t txn_signal_;
thrd_t thread_;
fbl::Mutex mutex_;
};
} // namespace platform_bus