123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- #ifndef _LINUX_SOUNDWIRE_H
- #define _LINUX_SOUNDWIRE_H
- #include <linux/device.h>
- #include <linux/mutex.h>
- #include <linux/irqdomain.h>
- #include <linux/regmap.h>
- #include "audio_mod_devicetable.h"
- enum {
- SWR_UC0 = 0,
- SWR_UC1,
- SWR_UC2,
- SWR_UC3,
- SWR_UC_MAX,
- };
- #define SWR_CLK_RATE_24KHZ 24000
- #define SWR_CLK_RATE_48KHZ 48000
- #define SWR_CLK_RATE_0P3MHZ 300000
- #define SWR_CLK_RATE_0P6MHZ 600000
- #define SWR_CLK_RATE_1P2MHZ 1200000
- #define SWR_CLK_RATE_2P4MHZ 2400000
- #define SWR_CLK_RATE_4P8MHZ 4800000
- #define SWR_CLK_RATE_9P6MHZ 9600000
- #define SWR_CLK_RATE_11P2896MHZ 11289600
- #define SWR_CLK_RATE_12P288MHZ 12288000
- extern struct bus_type soundwire_type;
- struct swr_device;
- #define SWR_MAX_CHANNEL_NUM 8
- #define SWR_MAX_DEV_PORT_NUM 14
- #define SWR_MAX_DEV_NUM 11
- #define SWR_MAX_MSTR_PORT_NUM (SWR_MAX_DEV_NUM * SWR_MAX_DEV_PORT_NUM)
- #define SWR_PORT_PARAMS 2
- struct regmap *__devm_regmap_init_swr(struct swr_device *dev,
- const struct regmap_config *config,
- struct lock_class_key *lock_key,
- const char *lock_name);
- #define regmap_init_swr(swr, config) \
- __regmap_lockdep_wrapper(__regmap_init_swr, #config, \
- swr, config)
- #define devm_regmap_init_swr(swr, config) \
- __regmap_lockdep_wrapper(__devm_regmap_init_swr, #config, \
- swr, config)
- enum {
- SWR_GROUP_NONE = 0,
- SWR_GROUP_12 = 12,
- SWR_GROUP_13 = 13,
- SWR_BROADCAST = 15,
- };
- struct swr_port_info {
- u8 dev_num;
- u8 port_en;
- u8 slave_port_id;
- u8 offset1;
- u8 offset2;
- u16 sinterval;
- struct list_head list;
- u8 master_port_id;
- u8 hstart;
- u8 hstop;
- u8 blk_grp_count;
- u8 blk_pack_mode;
- u8 word_length;
- u8 lane_ctrl;
- u8 ch_en;
- u8 req_ch;
- u8 num_ch;
- u32 ch_rate;
- u32 req_ch_rate;
- };
- struct swr_port_params {
- u32 offset1;
- u32 lane_ctrl;
- };
- struct swr_dev_frame_config {
- struct swr_port_params *pp;
- };
- struct swr_params {
- u8 tid;
- u8 dev_num;
- u8 num_port;
- u8 port_id[SWR_MAX_DEV_PORT_NUM];
- u8 num_ch[SWR_MAX_DEV_PORT_NUM];
- u32 ch_rate[SWR_MAX_DEV_PORT_NUM];
- u8 ch_en[SWR_MAX_DEV_PORT_NUM];
- u8 port_type[SWR_MAX_DEV_PORT_NUM];
- };
- struct swr_reg {
- u8 tid;
- u8 dev_id;
- u32 regaddr;
- u32 *buf;
- u32 len;
- };
- struct swr_master {
- struct device dev;
- struct list_head list;
- unsigned int bus_num;
- struct mutex mlock;
- struct list_head devices;
- struct swr_port_info port[SWR_MAX_MSTR_PORT_NUM];
- struct swr_params **port_txn;
- struct swr_reg **reg_txn;
- u8 last_tid;
- u8 num_port;
- u8 num_dev;
- u8 gr_sid;
- int (*connect_port)(struct swr_master *mstr, struct swr_params *txn);
- int (*disconnect_port)(struct swr_master *mstr, struct swr_params *txn);
- int (*read)(struct swr_master *mstr, u8 dev_num, u16 reg_addr,
- void *buf, u32 len);
- int (*write)(struct swr_master *mstr, u8 dev_num, u16 reg_addr,
- const void *buf);
- int (*bulk_write)(struct swr_master *master, u8 dev_num, void *reg,
- const void *buf, size_t len);
- int (*get_logical_dev_num)(struct swr_master *mstr, u64 dev_id,
- u8 *dev_num);
- int (*init_port_params)(struct swr_master *mstr, u32 dev_num,
- u32 num_ports, struct swr_dev_frame_config *uc_arr);
- int (*slvdev_datapath_control)(struct swr_master *mstr, bool enable);
- bool (*remove_from_group)(struct swr_master *mstr);
- void (*device_wakeup_vote)(struct swr_master *mstr);
- void (*device_wakeup_unvote)(struct swr_master *mstr);
- u16 port_en_mask;
- };
- static inline struct swr_master *to_swr_master(struct device *dev)
- {
- return dev ? container_of(dev, struct swr_master, dev) : NULL;
- }
- struct swr_device {
- char name[SOUNDWIRE_NAME_SIZE];
- struct swr_master *master;
- struct swr_driver *driver;
- struct list_head dev_list;
- u8 dev_num;
- struct device dev;
- u64 addr;
- u8 group_id;
- bool paging_support;
- struct irq_domain *slave_irq;
- bool slave_irq_pending;
- u8 scp1_val;
- u8 scp2_val;
- };
- static inline struct swr_device *to_swr_device(struct device *dev)
- {
- return dev ? container_of(dev, struct swr_device, dev) : NULL;
- }
- struct swr_driver {
- int (*probe)(struct swr_device *swr);
- int (*remove)(struct swr_device *swr);
- void (*shutdown)(struct swr_device *swr);
- int (*suspend)(struct swr_device *swr, pm_message_t pmesg);
- int (*resume)(struct swr_device *swr);
- int (*device_up)(struct swr_device *swr);
- int (*device_down)(struct swr_device *swr);
- int (*reset_device)(struct swr_device *swr);
- struct device_driver driver;
- const struct swr_device_id *id_table;
- };
- static inline struct swr_driver *to_swr_driver(struct device_driver *drv)
- {
- return drv ? container_of(drv, struct swr_driver, driver) : NULL;
- }
- struct swr_boardinfo {
- char name[SOUNDWIRE_NAME_SIZE];
- int bus_num;
- u64 addr;
- struct device_node *of_node;
- struct swr_device *swr_slave;
- };
- static inline void *swr_get_ctrl_data(const struct swr_master *master)
- {
- return master ? dev_get_drvdata(&master->dev) : NULL;
- }
- static inline void swr_set_ctrl_data(struct swr_master *master, void *data)
- {
- dev_set_drvdata(&master->dev, data);
- }
- static inline void *swr_get_dev_data(const struct swr_device *dev)
- {
- return dev ? dev_get_drvdata(&dev->dev) : NULL;
- }
- static inline void swr_set_dev_data(struct swr_device *dev, void *data)
- {
- dev_set_drvdata(&dev->dev, data);
- }
- extern int swr_startup_devices(struct swr_device *swr_dev);
- extern struct swr_device *swr_new_device(struct swr_master *master,
- struct swr_boardinfo const *info);
- extern int of_register_swr_devices(struct swr_master *master);
- extern void swr_port_response(struct swr_master *mstr, u8 tid);
- extern int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id,
- u8 *dev_num);
- extern int swr_init_port_params(struct swr_device *dev,
- u32 num_ports, struct swr_dev_frame_config *pp);
- extern int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr,
- void *buf, u32 len);
- extern int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr,
- const void *buf);
- extern int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg_addr,
- const void *buf, size_t len);
- extern int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port,
- u8 *ch_mask, u32 *ch_rate, u8 *num_ch,
- u8 *port_type);
- extern int swr_disconnect_port(struct swr_device *dev,
- u8 *port_id, u8 num_port, u8 *ch_mask,
- u8 *port_type);
- extern int swr_set_device_group(struct swr_device *swr_dev, u8 id);
- extern int swr_driver_register(struct swr_driver *drv);
- extern void swr_driver_unregister(struct swr_driver *drv);
- extern int swr_add_device(struct swr_master *master,
- struct swr_device *swrdev);
- extern void swr_remove_device(struct swr_device *swr);
- extern void swr_master_add_boarddevices(struct swr_master *master);
- extern void swr_unregister_master(struct swr_master *master);
- extern int swr_register_master(struct swr_master *master);
- extern int swr_device_up(struct swr_device *swr_dev);
- extern int swr_device_down(struct swr_device *swr_dev);
- extern int swr_reset_device(struct swr_device *swr_dev);
- extern int swr_slvdev_datapath_control(struct swr_device *swr_dev, u8 dev_num,
- bool enable);
- extern int swr_remove_from_group(struct swr_device *dev, u8 dev_num);
- extern void swr_remove_device(struct swr_device *swr_dev);
- extern struct swr_device *get_matching_swr_slave_device(struct device_node *np);
- extern int swr_device_wakeup_vote(struct swr_device *dev);
- extern int swr_device_wakeup_unvote(struct swr_device *dev);
- #endif
|