1 // Copyright 2016 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/binding.h>
8 #include <ddk/device.h>
9 #include <zircon/types.h>
10 #include <zircon/listnode.h>
11 #include <stdint.h>
12 
13 #define I2C_7BIT_ADDRESS 7
14 #define I2C_10BIT_ADDRESS 10
15 
16 typedef struct i2c_slave_segment {
17     int type;
18     int len;
19     uint8_t* buf;
20 } i2c_slave_segment_t;
21 
22 typedef struct intel_serialio_i2c_slave_device {
23     zx_device_t* zxdev;
24     struct intel_serialio_i2c_device* controller;
25 
26     uint8_t chip_address_width;
27     uint16_t chip_address;
28 
29     struct list_node slave_list_node;
30 } intel_serialio_i2c_slave_device_t;
31 
32 // device protocol for a slave device
33 extern zx_protocol_device_t intel_serialio_i2c_slave_device_proto;
34 
35 zx_status_t intel_serialio_i2c_slave_transfer(
36     intel_serialio_i2c_slave_device_t* slave, i2c_slave_segment_t *segments, int segment_count);
37 zx_status_t intel_serialio_i2c_slave_get_irq(intel_serialio_i2c_slave_device_t* slave,
38                                              zx_handle_t* out);
39