xref: /openbsd/sys/dev/pci/drm/include/linux/i2c.h (revision 53e1df33)
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