#ifndef _LIBI2C_H
#define _LIBI2C_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <libdevinfo.h>
#include <stdint.h>
#include <sys/i2c/i2c.h>
typedef enum {
I2C_ERR_OK = 0,
I2C_ERR_CONTROLLER,
I2C_ERR_BAD_PTR,
I2C_ERR_NO_MEM,
I2C_ERR_LIBDEVINFO,
I2C_ERR_BAD_DEVI,
I2C_ERR_INTERNAL,
I2C_ERR_PRIVS,
I2C_ERR_OPEN_DEV,
I2C_ERR_BAD_CONTROLLER,
I2C_ERR_BAD_PORT,
I2C_ERR_BAD_DEVICE,
I2C_ERR_BAD_ADDR_TYPE,
I2C_ERR_BAD_ADDR,
I2C_ERR_UNSUP_ADDR_TYPE,
I2C_ERR_ADDR_RSVD,
I2C_ERR_ADDR_IN_USE,
I2C_ERR_ADDR_UNKNOWN,
I2C_ERR_IO_READ_LEN_RANGE,
I2C_ERR_IO_WRITE_LEN_RANGE,
I2C_ERR_IO_REQ_MISSING_FIELDS,
I2C_ERR_IO_REQ_IO_INVALID,
I2C_ERR_CANT_XLATE_IO_REQ,
I2C_ERR_SMBUS_OP_UNSUP,
I2C_ERR_LOCK_WAIT_SIGNAL,
I2C_ERR_LOCK_WOULD_BLOCK,
I2C_ERR_NO_KERN_MEM,
I2C_ERR_BAD_DEV_NAME,
I2C_ERR_COMPAT_LEN_RANGE,
I2C_ERR_ADD_DEV_REQ_MISSING_FIELDS,
I2C_ERR_NEXUS,
I2C_ERR_OP_IN_PROGRESS,
I2C_ERR_PROP_UNSUP,
I2C_ERR_BAD_PROP,
I2C_ERR_SET_PROP_UNSUP,
I2C_ERR_PROP_READ_ONLY,
I2C_ERR_PROP_BUF_TOO_SMALL,
I2C_ERR_PROP_BUF_TOO_BIG,
I2C_ERR_BAD_PROP_VAL,
I2C_ERR_NO_PROP_DEF_VAL,
I2C_ERR_PROP_TYPE_MISMATCH,
I2C_ERR_BUF_TOO_SMALL,
} i2c_err_t;
typedef struct i2c_hdl i2c_hdl_t;
typedef struct i2c_ctrl i2c_ctrl_t;
typedef struct i2c_ctrl_iter i2c_ctrl_iter_t;
typedef struct i2c_ctrl_disc i2c_ctrl_disc_t;
typedef struct i2c_prop_info i2c_prop_info_t;
typedef struct i2c_port i2c_port_t;
typedef struct i2c_port_iter i2c_port_iter_t;
typedef struct i2c_port_disc i2c_port_disc_t;
typedef struct i2c_port_map i2c_port_map_t;
typedef struct i2c_dev_iter i2c_dev_iter_t;
typedef struct i2c_dev_disc i2c_dev_disc_t;
typedef struct i2c_dev_info i2c_dev_info_t;
typedef struct i2c_dev_add_req i2c_dev_add_req_t;
typedef struct i2c_mux_iter i2c_mux_iter_t;
typedef struct i2c_mux_disc i2c_mux_disc_t;
typedef struct i2c_io_req i2c_io_req_t;
typedef struct smbus_io_req smbus_io_req_t;
typedef enum i2c_iter {
I2C_ITER_VALID,
I2C_ITER_DONE,
I2C_ITER_ERROR
} i2c_iter_t;
extern i2c_hdl_t *i2c_init(void);
extern void i2c_fini(i2c_hdl_t *);
extern i2c_err_t i2c_err(i2c_hdl_t *);
extern i2c_ctrl_error_t i2c_ctrl_err(i2c_hdl_t *);
extern int32_t i2c_syserr(i2c_hdl_t *);
extern const char *i2c_errmsg(i2c_hdl_t *);
extern const char *i2c_errtostr(i2c_hdl_t *, i2c_err_t);
extern const char *i2c_ctrl_errtostr(i2c_hdl_t *, i2c_ctrl_error_t);
extern bool i2c_ctrl_discover_init(i2c_hdl_t *, i2c_ctrl_iter_t **);
extern i2c_iter_t i2c_ctrl_discover_step(i2c_ctrl_iter_t *,
const i2c_ctrl_disc_t **);
extern void i2c_ctrl_discover_fini(i2c_ctrl_iter_t *);
typedef bool (*i2c_ctrl_disc_f)(i2c_hdl_t *, const i2c_ctrl_disc_t *, void *);
extern bool i2c_ctrl_discover(i2c_hdl_t *, i2c_ctrl_disc_f, void *);
extern di_node_t i2c_ctrl_disc_devi(const i2c_ctrl_disc_t *);
extern di_minor_t i2c_ctrl_disc_minor(const i2c_ctrl_disc_t *);
extern bool i2c_ctrl_init(i2c_hdl_t *, di_node_t, i2c_ctrl_t **);
extern bool i2c_ctrl_init_by_path(i2c_hdl_t *, const char *, i2c_ctrl_t **);
extern void i2c_ctrl_fini(i2c_ctrl_t *);
extern i2c_hdl_t *i2c_ctrl_hdl(i2c_ctrl_t *);
extern const char *i2c_ctrl_name(i2c_ctrl_t *);
extern const char *i2c_ctrl_path(i2c_ctrl_t *);
extern int32_t i2c_ctrl_instance(i2c_ctrl_t *);
extern uint32_t i2c_ctrl_nprops(i2c_ctrl_t *);
extern const char *i2c_prop_info_name(i2c_prop_info_t *);
extern i2c_prop_t i2c_prop_info_id(i2c_prop_info_t *);
extern i2c_prop_type_t i2c_prop_info_type(i2c_prop_info_t *);
extern bool i2c_prop_info_sup(i2c_prop_info_t *);
extern i2c_prop_perm_t i2c_prop_info_perm(i2c_prop_info_t *);
extern bool i2c_prop_info_def_u32(i2c_prop_info_t *, uint32_t *);
extern const i2c_prop_range_t *i2c_prop_info_pos(i2c_prop_info_t *);
extern bool i2c_prop_info(i2c_ctrl_t *, i2c_prop_t, i2c_prop_info_t **);
extern bool i2c_prop_info_by_name(i2c_ctrl_t *, const char *,
i2c_prop_info_t **);
extern void i2c_prop_info_free(i2c_prop_info_t *);
extern bool i2c_prop_get(i2c_ctrl_t *, i2c_prop_t, void *, size_t *);
extern bool i2c_prop_set(i2c_ctrl_t *, i2c_prop_t, const void *, size_t);
extern bool i2c_port_discover_init(i2c_hdl_t *, i2c_port_iter_t **);
extern i2c_iter_t i2c_port_discover_step(i2c_port_iter_t *,
const i2c_port_disc_t **);
extern void i2c_port_discover_fini(i2c_port_iter_t *);
typedef bool (*i2c_port_disc_f)(i2c_hdl_t *, const i2c_port_disc_t *, void *);
extern bool i2c_port_discover(i2c_hdl_t *, i2c_port_disc_f, void *);
extern di_node_t i2c_port_disc_devi(const i2c_port_disc_t *);
extern const char *i2c_port_disc_path(const i2c_port_disc_t *);
extern bool i2c_port_init(i2c_hdl_t *, di_node_t, i2c_port_t **);
extern bool i2c_port_init_by_path(i2c_hdl_t *, const char *, i2c_port_t **);
extern void i2c_port_fini(i2c_port_t *);
extern const char *i2c_port_name(i2c_port_t *);
extern const char *i2c_port_path(i2c_port_t *);
extern uint32_t i2c_port_portno(i2c_port_t *);
typedef enum {
I2C_PORT_TYPE_CTRL,
I2C_PORT_TYPE_MUX
} i2c_port_type_t;
extern i2c_port_type_t i2c_port_type(i2c_port_t *);
extern bool i2c_port_map_snap(i2c_port_t *, i2c_port_map_t **);
extern void i2c_port_map_free(i2c_port_map_t *);
extern void i2c_port_map_ndevs(const i2c_port_map_t *, uint32_t *, uint32_t *);
extern bool i2c_port_map_addr_info(const i2c_port_map_t *, const i2c_addr_t *,
uint32_t *, bool *, major_t *);
extern bool i2c_device_add_req_init(i2c_port_t *, i2c_dev_add_req_t **);
extern void i2c_device_add_req_fini(i2c_dev_add_req_t *);
extern bool i2c_device_add_req_set_addr(i2c_dev_add_req_t *,
const i2c_addr_t *);
extern bool i2c_device_add_req_set_name(i2c_dev_add_req_t *, const char *);
extern bool i2c_device_add_req_set_compatible(i2c_dev_add_req_t *,
char *const *, size_t);
extern bool i2c_device_add_req_exec(i2c_dev_add_req_t *);
extern bool i2c_device_rem(i2c_port_t *, const i2c_addr_t *);
extern bool i2c_device_discover_init(i2c_hdl_t *, i2c_dev_iter_t **);
extern i2c_iter_t i2c_device_discover_step(i2c_dev_iter_t *,
const i2c_dev_disc_t **);
extern void i2c_device_discover_fini(i2c_dev_iter_t *);
typedef bool (*i2c_dev_disc_f)(i2c_hdl_t *, const i2c_dev_disc_t *, void *);
extern bool i2c_device_discover(i2c_hdl_t *, i2c_dev_disc_f, void *);
extern const char *i2c_device_disc_name(const i2c_dev_disc_t *);
extern const char *i2c_device_disc_path(const i2c_dev_disc_t *);
extern di_node_t i2c_device_disc_devi(const i2c_dev_disc_t *);
extern di_minor_t i2c_device_disc_devctl(const i2c_dev_disc_t *);
extern bool i2c_device_info_snap(i2c_hdl_t *, di_node_t, i2c_dev_info_t **);
extern void i2c_device_info_free(i2c_dev_info_t *);
extern const char *i2c_device_info_path(const i2c_dev_info_t *);
extern const char *i2c_device_info_name(const i2c_dev_info_t *);
extern const char *i2c_device_info_driver(const i2c_dev_info_t *);
extern int i2c_device_info_instance(const i2c_dev_info_t *);
extern uint32_t i2c_device_info_naddrs(const i2c_dev_info_t *);
extern const i2c_addr_t *i2c_device_info_addr(const i2c_dev_info_t *, uint32_t);
extern i2c_addr_source_t i2c_device_info_addr_source(const i2c_dev_info_t *,
uint32_t);
extern const i2c_addr_t *i2c_device_info_addr_primary(const i2c_dev_info_t *);
extern bool i2c_mux_discover_init(i2c_hdl_t *, i2c_mux_iter_t **);
extern i2c_iter_t i2c_mux_discover_step(i2c_mux_iter_t *,
const i2c_mux_disc_t **);
extern void i2c_mux_discover_fini(i2c_mux_iter_t *);
typedef bool (*i2c_mux_disc_f)(i2c_hdl_t *, const i2c_mux_disc_t *, void *);
extern bool i2c_mux_discover(i2c_hdl_t *, i2c_mux_disc_f, void *);
extern const char *i2c_mux_disc_name(const i2c_mux_disc_t *);
extern const char *i2c_mux_disc_path(const i2c_mux_disc_t *);
extern uint32_t i2c_mux_disc_nports(const i2c_mux_disc_t *);
extern di_node_t i2c_mux_disc_devi(const i2c_mux_disc_t *);
extern di_minor_t i2c_mux_disc_devctl(const i2c_mux_disc_t *);
extern bool i2c_io_req_init(i2c_port_t *, i2c_io_req_t **);
extern void i2c_io_req_fini(i2c_io_req_t *);
extern bool i2c_io_req_set_addr(i2c_io_req_t *, const i2c_addr_t *);
extern bool i2c_io_req_set_transmit_data(i2c_io_req_t *, const void *, size_t);
extern bool i2c_io_req_set_receive_buf(i2c_io_req_t *, void *, size_t);
extern bool i2c_io_req_exec(i2c_io_req_t *);
extern bool smbus_io_req_init(i2c_port_t *, smbus_io_req_t **);
extern void smbus_io_req_fini(smbus_io_req_t *);
extern bool smbus_io_req_set_addr(smbus_io_req_t *, const i2c_addr_t *);
extern bool smbus_io_req_set_quick_cmd(smbus_io_req_t *, bool);
extern bool smbus_io_req_set_send_byte(smbus_io_req_t *, uint8_t);
extern bool smbus_io_req_set_write_u8(smbus_io_req_t *, uint8_t, uint8_t);
extern bool smbus_io_req_set_write_u16(smbus_io_req_t *, uint8_t, uint16_t);
extern bool smbus_io_req_set_write_u32(smbus_io_req_t *, uint8_t, uint32_t);
extern bool smbus_io_req_set_write_u64(smbus_io_req_t *, uint8_t, uint64_t);
extern bool smbus_io_req_set_write_block(smbus_io_req_t *, uint8_t,
const void *, size_t, bool);
extern bool smbus_io_req_set_recv_byte(smbus_io_req_t *, uint8_t *);
extern bool smbus_io_req_set_read_u8(smbus_io_req_t *, uint8_t, uint8_t *);
extern bool smbus_io_req_set_read_u16(smbus_io_req_t *, uint8_t, uint16_t *);
extern bool smbus_io_req_set_read_u32(smbus_io_req_t *, uint8_t, uint32_t *);
extern bool smbus_io_req_set_read_u64(smbus_io_req_t *, uint8_t, uint64_t *);
extern bool smbus_io_req_set_read_block_i2c(smbus_io_req_t *, uint8_t, void *,
size_t);
extern bool smbus_io_req_set_process_call(smbus_io_req_t *, uint8_t, uint16_t,
uint16_t *);
extern bool smbus_io_req_exec(smbus_io_req_t *);
extern bool i2c_addr_reserved(const i2c_addr_t *);
extern bool i2c_port_dev_init_by_path(i2c_hdl_t *, const char *, bool,
i2c_port_t **, i2c_dev_info_t **);
extern bool i2c_addr_parse(i2c_hdl_t *, const char *, i2c_addr_t *);
extern bool i2c_addr_to_string(i2c_hdl_t *, const i2c_addr_t *, char *, size_t);
#ifdef __cplusplus
}
#endif
#endif