xref: /linux/include/sound/i2c.h (revision 1a59d1b8)
1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds #ifndef __SOUND_I2C_H
31da177e4SLinus Torvalds #define __SOUND_I2C_H
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #define SND_I2C_DEVICE_ADDRTEN	(1<<0)	/* 10-bit I2C address */
91da177e4SLinus Torvalds 
1097f02e05STakashi Iwai struct snd_i2c_device {
111da177e4SLinus Torvalds 	struct list_head list;
1297f02e05STakashi Iwai 	struct snd_i2c_bus *bus;	/* I2C bus */
131da177e4SLinus Torvalds 	char name[32];		/* some useful device name */
141da177e4SLinus Torvalds 	unsigned short flags;	/* device flags */
151da177e4SLinus Torvalds 	unsigned short addr;	/* device address (might be 10-bit) */
161da177e4SLinus Torvalds 	unsigned long private_value;
171da177e4SLinus Torvalds 	void *private_data;
1897f02e05STakashi Iwai 	void (*private_free)(struct snd_i2c_device *device);
191da177e4SLinus Torvalds };
201da177e4SLinus Torvalds 
2197f02e05STakashi Iwai #define snd_i2c_device(n) list_entry(n, struct snd_i2c_device, list)
221da177e4SLinus Torvalds 
2397f02e05STakashi Iwai struct snd_i2c_bit_ops {
2497f02e05STakashi Iwai 	void (*start)(struct snd_i2c_bus *bus);	/* transfer start */
2597f02e05STakashi Iwai 	void (*stop)(struct snd_i2c_bus *bus);	/* transfer stop */
2697f02e05STakashi Iwai 	void (*direction)(struct snd_i2c_bus *bus, int clock, int data);  /* set line direction (0 = write, 1 = read) */
2797f02e05STakashi Iwai 	void (*setlines)(struct snd_i2c_bus *bus, int clock, int data);
2897f02e05STakashi Iwai 	int (*getclock)(struct snd_i2c_bus *bus);
2997f02e05STakashi Iwai 	int (*getdata)(struct snd_i2c_bus *bus, int ack);
3097f02e05STakashi Iwai };
311da177e4SLinus Torvalds 
3297f02e05STakashi Iwai struct snd_i2c_ops {
3397f02e05STakashi Iwai 	int (*sendbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
3497f02e05STakashi Iwai 	int (*readbytes)(struct snd_i2c_device *device, unsigned char *bytes, int count);
3597f02e05STakashi Iwai 	int (*probeaddr)(struct snd_i2c_bus *bus, unsigned short addr);
3697f02e05STakashi Iwai };
371da177e4SLinus Torvalds 
3897f02e05STakashi Iwai struct snd_i2c_bus {
3997f02e05STakashi Iwai 	struct snd_card *card;	/* card which I2C belongs to */
401da177e4SLinus Torvalds 	char name[32];		/* some useful label */
411da177e4SLinus Torvalds 
42ef9f0a42SIngo Molnar 	struct mutex lock_mutex;
431da177e4SLinus Torvalds 
4497f02e05STakashi Iwai 	struct snd_i2c_bus *master;	/* master bus when SCK/SCL is shared */
451da177e4SLinus Torvalds 	struct list_head buses;	/* master: slave buses sharing SCK/SCL, slave: link list */
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds 	struct list_head devices; /* attached devices to this bus */
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds 	union {
5097f02e05STakashi Iwai 		struct snd_i2c_bit_ops *bit;
511da177e4SLinus Torvalds 		void *ops;
521da177e4SLinus Torvalds 	} hw_ops;		/* lowlevel operations */
535df29bcaSJulia Lawall 	const struct snd_i2c_ops *ops;	/* midlevel operations */
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds 	unsigned long private_value;
561da177e4SLinus Torvalds 	void *private_data;
5797f02e05STakashi Iwai 	void (*private_free)(struct snd_i2c_bus *bus);
581da177e4SLinus Torvalds };
591da177e4SLinus Torvalds 
6097f02e05STakashi Iwai #define snd_i2c_slave_bus(n) list_entry(n, struct snd_i2c_bus, buses)
611da177e4SLinus Torvalds 
6297f02e05STakashi Iwai int snd_i2c_bus_create(struct snd_card *card, const char *name,
6397f02e05STakashi Iwai 		       struct snd_i2c_bus *master, struct snd_i2c_bus **ri2c);
6497f02e05STakashi Iwai int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name,
6597f02e05STakashi Iwai 			  unsigned char addr, struct snd_i2c_device **rdevice);
6697f02e05STakashi Iwai int snd_i2c_device_free(struct snd_i2c_device *device);
671da177e4SLinus Torvalds 
snd_i2c_lock(struct snd_i2c_bus * bus)6897f02e05STakashi Iwai static inline void snd_i2c_lock(struct snd_i2c_bus *bus)
6997f02e05STakashi Iwai {
701da177e4SLinus Torvalds 	if (bus->master)
71ef9f0a42SIngo Molnar 		mutex_lock(&bus->master->lock_mutex);
721da177e4SLinus Torvalds 	else
73ef9f0a42SIngo Molnar 		mutex_lock(&bus->lock_mutex);
741da177e4SLinus Torvalds }
7597f02e05STakashi Iwai 
snd_i2c_unlock(struct snd_i2c_bus * bus)7697f02e05STakashi Iwai static inline void snd_i2c_unlock(struct snd_i2c_bus *bus)
7797f02e05STakashi Iwai {
781da177e4SLinus Torvalds 	if (bus->master)
79ef9f0a42SIngo Molnar 		mutex_unlock(&bus->master->lock_mutex);
801da177e4SLinus Torvalds 	else
81ef9f0a42SIngo Molnar 		mutex_unlock(&bus->lock_mutex);
821da177e4SLinus Torvalds }
831da177e4SLinus Torvalds 
8497f02e05STakashi Iwai int snd_i2c_sendbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
8597f02e05STakashi Iwai int snd_i2c_readbytes(struct snd_i2c_device *device, unsigned char *bytes, int count);
8697f02e05STakashi Iwai int snd_i2c_probeaddr(struct snd_i2c_bus *bus, unsigned short addr);
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds #endif /* __SOUND_I2C_H */
89