xref: /openbmc/linux/include/sound/i2c.h (revision 1a59d1b8)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 #ifndef __SOUND_I2C_H
3 #define __SOUND_I2C_H
4 
5 /*
6  */
7 
8 #define SND_I2C_DEVICE_ADDRTEN	(1<<0)	/* 10-bit I2C address */
9 
10 struct snd_i2c_device {
11 	struct list_head list;
12 	struct snd_i2c_bus *bus;	/* I2C bus */
13 	char name[32];		/* some useful device name */
14 	unsigned short flags;	/* device flags */
15 	unsigned short addr;	/* device address (might be 10-bit) */
16 	unsigned long private_value;
17 	void *private_data;
18 	void (*private_free)(struct snd_i2c_device *device);
19 };
20 
21 #define snd_i2c_device(n) list_entry(n, struct snd_i2c_device, list)
22 
23 struct snd_i2c_bit_ops {
24 	void (*start)(struct snd_i2c_bus *bus);	/* transfer start */
25 	void (*stop)(struct snd_i2c_bus *bus);	/* transfer stop */
26 	void (*direction)(struct snd_i2c_bus *bus, int clock, int data);  /* set line direction (0 = write, 1 = read) */
27 	void (*setlines)(struct snd_i2c_bus *bus, int clock, int data);
28 	int (*getclock)(struct snd_i2c_bus *bus);
29 	int (*getdata)(struct snd_i2c_bus *bus, int ack);
30 };
31 
32 struct snd_i2c_ops {
33 	int (*sendbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
34 	int (*readbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
35 	int (*probeaddr)(struct snd_i2c_bus *bus, unsigned short addr);
36 };
37 
38 struct snd_i2c_bus {
39 	struct snd_card *card;	/* card which I2C belongs to */
40 	char name[32];		/* some useful label */
41 
42 	struct mutex lock_mutex;
43 
44 	struct snd_i2c_bus *master;	/* master bus when SCK/SCL is shared */
45 	struct list_head buses;	/* master: slave buses sharing SCK/SCL, slave: link list */
46 
47 	struct list_head devices; /* attached devices to this bus */
48 
49 	union {
50 		struct snd_i2c_bit_ops *bit;
51 		void *ops;
52 	} hw_ops;		/* lowlevel operations */
53 	const struct snd_i2c_ops *ops;	/* midlevel operations */
54 
55 	unsigned long private_value;
56 	void *private_data;
57 	void (*private_free)(struct snd_i2c_bus *bus);
58 };
59 
60 #define snd_i2c_slave_bus(n) list_entry(n, struct snd_i2c_bus, buses)
61 
62 int snd_i2c_bus_create(struct snd_card *card, const char *name,
63 		       struct snd_i2c_bus *master, struct snd_i2c_bus **ri2c);
64 int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name,
65 			  unsigned char addr, struct snd_i2c_device **rdevice);
66 int snd_i2c_device_free(struct snd_i2c_device *device);
67 
snd_i2c_lock(struct snd_i2c_bus * bus)68 static inline void snd_i2c_lock(struct snd_i2c_bus *bus)
69 {
70 	if (bus->master)
71 		mutex_lock(&bus->master->lock_mutex);
72 	else
73 		mutex_lock(&bus->lock_mutex);
74 }
75 
snd_i2c_unlock(struct snd_i2c_bus * bus)76 static inline void snd_i2c_unlock(struct snd_i2c_bus *bus)
77 {
78 	if (bus->master)
79 		mutex_unlock(&bus->master->lock_mutex);
80 	else
81 		mutex_unlock(&bus->lock_mutex);
82 }
83 
84 int snd_i2c_sendbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
85 int snd_i2c_readbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
86 int snd_i2c_probeaddr(struct snd_i2c_bus *bus, unsigned short addr);
87 
88 #endif /* __SOUND_I2C_H */
89