11a59d1b8SThomas 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