1*53e1df33Sjsg /* $OpenBSD: i2c.h,v 1.8 2023/03/21 09:44:35 jsg Exp $ */
27f4dd379Sjsg /*
37f4dd379Sjsg * Copyright (c) 2017 Mark Kettenis
47f4dd379Sjsg *
57f4dd379Sjsg * Permission to use, copy, modify, and distribute this software for any
67f4dd379Sjsg * purpose with or without fee is hereby granted, provided that the above
77f4dd379Sjsg * copyright notice and this permission notice appear in all copies.
87f4dd379Sjsg *
97f4dd379Sjsg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107f4dd379Sjsg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117f4dd379Sjsg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127f4dd379Sjsg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137f4dd379Sjsg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147f4dd379Sjsg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157f4dd379Sjsg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167f4dd379Sjsg */
177f4dd379Sjsg
187f4dd379Sjsg #ifndef _LINUX_I2C_H
197f4dd379Sjsg #define _LINUX_I2C_H
207f4dd379Sjsg
217f4dd379Sjsg #include <sys/stdint.h>
227f4dd379Sjsg #include <sys/rwlock.h>
23*53e1df33Sjsg /*
24*53e1df33Sjsg * normally seq_file.h is indirectly included via
25*53e1df33Sjsg *
26*53e1df33Sjsg * linux/regulator/consumer.h
27*53e1df33Sjsg * linux/suspend.h
28*53e1df33Sjsg * linux/swap.h
29*53e1df33Sjsg * linux/memcontrol.h
30*53e1df33Sjsg * linux/cgroup.h
31*53e1df33Sjsg * linux/seq_file.h
32*53e1df33Sjsg */
337f4dd379Sjsg #include <linux/seq_file.h>
34ad8b1aafSjsg #include <linux/acpi.h>
351bb76ff1Sjsg #include <linux/device.h>
367f4dd379Sjsg
377f4dd379Sjsg #include <dev/i2c/i2cvar.h>
387f4dd379Sjsg
397f4dd379Sjsg struct i2c_algorithm;
407f4dd379Sjsg
417f4dd379Sjsg #define I2C_FUNC_I2C 0
427f4dd379Sjsg #define I2C_FUNC_SMBUS_EMUL 0
437f4dd379Sjsg #define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0
447f4dd379Sjsg #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0
457f4dd379Sjsg #define I2C_FUNC_10BIT_ADDR 0
467f4dd379Sjsg
475ca02815Sjsg #define I2C_AQ_COMB 0
485ca02815Sjsg #define I2C_AQ_COMB_SAME_ADDR 0
495ca02815Sjsg #define I2C_AQ_NO_ZERO_LEN 0
505ca02815Sjsg
51c349dbc7Sjsg struct i2c_lock_operations;
52c349dbc7Sjsg
535ca02815Sjsg struct i2c_adapter_quirks {
545ca02815Sjsg unsigned int flags;
555ca02815Sjsg uint16_t max_read_len;
565ca02815Sjsg uint16_t max_write_len;
575ca02815Sjsg uint16_t max_comb_1st_msg_len;
585ca02815Sjsg uint16_t max_comb_2nd_msg_len;
595ca02815Sjsg };
605ca02815Sjsg
617f4dd379Sjsg struct i2c_adapter {
627f4dd379Sjsg struct i2c_controller ic;
637f4dd379Sjsg
647f4dd379Sjsg char name[48];
657f4dd379Sjsg const struct i2c_algorithm *algo;
667f4dd379Sjsg void *algo_data;
677f4dd379Sjsg int retries;
68c349dbc7Sjsg const struct i2c_lock_operations *lock_ops;
695ca02815Sjsg const struct i2c_adapter_quirks *quirks;
707f4dd379Sjsg
717f4dd379Sjsg void *data;
727f4dd379Sjsg };
737f4dd379Sjsg
74c349dbc7Sjsg struct i2c_lock_operations {
75c349dbc7Sjsg void (*lock_bus)(struct i2c_adapter *, unsigned int);
76c349dbc7Sjsg int (*trylock_bus)(struct i2c_adapter *, unsigned int);
77c349dbc7Sjsg void (*unlock_bus)(struct i2c_adapter *, unsigned int);
78c349dbc7Sjsg };
79c349dbc7Sjsg
807f4dd379Sjsg #define I2C_NAME_SIZE 20
817f4dd379Sjsg
827f4dd379Sjsg struct i2c_msg {
837f4dd379Sjsg uint16_t addr;
847f4dd379Sjsg uint16_t flags;
857f4dd379Sjsg uint16_t len;
867f4dd379Sjsg uint8_t *buf;
877f4dd379Sjsg };
887f4dd379Sjsg
897f4dd379Sjsg #define I2C_M_RD 0x0001
907f4dd379Sjsg #define I2C_M_NOSTART 0x0002
917f4dd379Sjsg #define I2C_M_STOP 0x0004
927f4dd379Sjsg
937f4dd379Sjsg struct i2c_algorithm {
947f4dd379Sjsg int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int);
957f4dd379Sjsg uint32_t (*functionality)(struct i2c_adapter *);
967f4dd379Sjsg };
977f4dd379Sjsg
987f4dd379Sjsg extern struct i2c_algorithm i2c_bit_algo;
997f4dd379Sjsg
1007f4dd379Sjsg struct i2c_algo_bit_data {
1017f4dd379Sjsg struct i2c_controller ic;
1027f4dd379Sjsg };
1037f4dd379Sjsg
10465bb161bSjsg int __i2c_transfer(struct i2c_adapter *, struct i2c_msg *, int);
1057f4dd379Sjsg int i2c_transfer(struct i2c_adapter *, struct i2c_msg *, int);
10649261a46Sjsg
10749261a46Sjsg static inline int
i2c_add_adapter(struct i2c_adapter * adap)10849261a46Sjsg i2c_add_adapter(struct i2c_adapter *adap)
10949261a46Sjsg {
11049261a46Sjsg return 0;
11149261a46Sjsg }
11249261a46Sjsg
11349261a46Sjsg static inline void
i2c_del_adapter(struct i2c_adapter * adap)11449261a46Sjsg i2c_del_adapter(struct i2c_adapter *adap)
11549261a46Sjsg {
11649261a46Sjsg }
1177f4dd379Sjsg
1187f4dd379Sjsg static inline void *
i2c_get_adapdata(struct i2c_adapter * adap)1197f4dd379Sjsg i2c_get_adapdata(struct i2c_adapter *adap)
1207f4dd379Sjsg {
1217f4dd379Sjsg return adap->data;
1227f4dd379Sjsg }
1237f4dd379Sjsg
1247f4dd379Sjsg static inline void
i2c_set_adapdata(struct i2c_adapter * adap,void * data)1257f4dd379Sjsg i2c_set_adapdata(struct i2c_adapter *adap, void *data)
1267f4dd379Sjsg {
1277f4dd379Sjsg adap->data = data;
1287f4dd379Sjsg }
1297f4dd379Sjsg
1307f4dd379Sjsg int i2c_bit_add_bus(struct i2c_adapter *);
1317f4dd379Sjsg
1327f4dd379Sjsg #endif
133