1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2021 YADRO
*
* Authors:
* Nikita Shubin <n.shubin@yadro.com>
*/
#ifndef __I2C_H__
#define __I2C_H__
#include <sbi/sbi_types.h>
#include <sbi/sbi_list.h>
/** Representation of a I2C adapter */
struct i2c_adapter {
/** Pointer to I2C driver owning this I2C adapter */
void *driver;
/** Unique ID of the I2C adapter assigned by the driver */
int id;
/**
* Send buffer to given address, register
*
* @return 0 on success and negative error code on failure
*/
int (*write)(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
uint8_t *buffer, int len);
/**
* Read buffer from given address, register
*
* @return 0 on success and negative error code on failure
*/
int (*read)(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
uint8_t *buffer, int len);
/** List */
struct sbi_dlist node;
};
static inline struct i2c_adapter *to_i2c_adapter(struct sbi_dlist *node)
{
return container_of(node, struct i2c_adapter, node);
}
/** Find a registered I2C adapter */
struct i2c_adapter *i2c_adapter_find(int id);
/** Register I2C adapter */
int i2c_adapter_add(struct i2c_adapter *ia);
/** Un-register I2C adapter */
void i2c_adapter_remove(struct i2c_adapter *ia);
/** Send to device on I2C adapter bus */
int i2c_adapter_write(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
uint8_t *buffer, int len);
/** Read from device on I2C adapter bus */
int i2c_adapter_read(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
uint8_t *buffer, int len);
static inline int i2c_adapter_reg_write(struct i2c_adapter *ia, uint8_t addr,
uint8_t reg, uint8_t val)
{
return i2c_adapter_write(ia, addr, reg, &val, 1);
}
static inline int i2c_adapter_reg_read(struct i2c_adapter *ia, uint8_t addr,
uint8_t reg, uint8_t *val)
{
uint8_t buf;
int ret = i2c_adapter_read(ia, addr, reg, &buf, 1);
if (ret)
return ret;
*val = buf;
return 0;
}
#endif
|