soundwire.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef _LINUX_SOUNDWIRE_H
  7. #define _LINUX_SOUNDWIRE_H
  8. #include <linux/device.h>
  9. #include <linux/mutex.h>
  10. #include <linux/irqdomain.h>
  11. #include <linux/regmap.h>
  12. #include "audio_mod_devicetable.h"
  13. enum {
  14. SWR_UC0 = 0,
  15. SWR_UC1,
  16. SWR_UC2,
  17. SWR_UC3,
  18. SWR_UC_MAX,
  19. };
  20. #define SWR_CLK_RATE_24KHZ 24000
  21. #define SWR_CLK_RATE_48KHZ 48000
  22. #define SWR_CLK_RATE_0P3MHZ 300000
  23. #define SWR_CLK_RATE_0P6MHZ 600000
  24. #define SWR_CLK_RATE_1P2MHZ 1200000
  25. #define SWR_CLK_RATE_2P4MHZ 2400000
  26. #define SWR_CLK_RATE_4P8MHZ 4800000
  27. #define SWR_CLK_RATE_9P6MHZ 9600000
  28. #define SWR_CLK_RATE_11P2896MHZ 11289600
  29. #define SWR_CLK_RATE_12P288MHZ 12288000
  30. extern struct bus_type soundwire_type;
  31. struct swr_device;
  32. /* Soundwire supports max. of 8 channels per port */
  33. #define SWR_MAX_CHANNEL_NUM 8
  34. /* Soundwire supports max. of 14 ports on each device */
  35. #define SWR_MAX_DEV_PORT_NUM 14
  36. /* Maximum number of slave devices that a master can control */
  37. #define SWR_MAX_DEV_NUM 11
  38. /* Maximum number of ports on master so that it can accommodate all the port
  39. * configurations of all devices
  40. */
  41. #define SWR_MAX_MSTR_PORT_NUM (SWR_MAX_DEV_NUM * SWR_MAX_DEV_PORT_NUM)
  42. /* SWR slave port params count */
  43. #define SWR_PORT_PARAMS 2
  44. /* Regmap support for soundwire interface */
  45. struct regmap *__devm_regmap_init_swr(struct swr_device *dev,
  46. const struct regmap_config *config,
  47. struct lock_class_key *lock_key,
  48. const char *lock_name);
  49. /**
  50. * regmap_init_swr(): Initialise register map
  51. *
  52. * @swr: Device that will be interacted with
  53. * @config: Configuration for register map
  54. *
  55. * The return value will be an ERR_PTR() on error or a valid pointer to
  56. * a struct regmap.
  57. */
  58. #define regmap_init_swr(swr, config) \
  59. __regmap_lockdep_wrapper(__regmap_init_swr, #config, \
  60. swr, config)
  61. /**
  62. * devm_regmap_init_swr(): Initialise managed register map
  63. *
  64. * @swr: Device that will be interacted with
  65. * @config: Configuration for register map
  66. *
  67. * The return value will be an ERR_PTR() on error or a valid pointer
  68. * to a struct regmap. The regmap will be automatically freed by the
  69. * device management code.
  70. */
  71. #define devm_regmap_init_swr(swr, config) \
  72. __regmap_lockdep_wrapper(__devm_regmap_init_swr, #config, \
  73. swr, config)
  74. /* Indicates soundwire devices group information */
  75. enum {
  76. SWR_GROUP_NONE = 0,
  77. SWR_GROUP_12 = 12,
  78. SWR_GROUP_13 = 13,
  79. SWR_BROADCAST = 15,
  80. };
  81. /*
  82. * struct swr_port_info - represents new soundwire frame shape
  83. * with full data ports
  84. * @list: link with other soundwire port info nodes
  85. * @dev_num: logical device number of the soundwire slave device
  86. * @port_en: flag indicates whether the port is enabled
  87. * @slave_port_id: logical port number of the soundwire slave device
  88. * @offset1: sample offset indicating the offset of the channel
  89. * from the start of the frame
  90. * @offset2: channel offset indicating offset between to channels
  91. * @hstart: start offset for subframe window.
  92. * @hstop: start offset for subframe window.
  93. * @master_port_id: logical port number of corresponding soundwire master device
  94. * @blk_grp_count: grouping count for n.o of channels.
  95. * @blk_pack_mode: packing mode for channels in each port.
  96. * @sinterval: sample interval indicates spacing from one sample
  97. * event to the next
  98. * @ch_en: channels enabled in a port.
  99. * @req_ch: channels requested to be enabled in a port.
  100. * @num_ch: number of channels enabled in a port
  101. * @ch_rate: sampling rate of the channel with which data will be
  102. * transferred
  103. *
  104. * Soundwire frame shape is created based on swr_port_info struct
  105. * parameters.
  106. */
  107. struct swr_port_info {
  108. u8 dev_num;
  109. u8 port_en;
  110. u8 slave_port_id;
  111. u8 offset1;
  112. u8 offset2;
  113. u16 sinterval;
  114. struct list_head list;
  115. u8 master_port_id;
  116. u8 hstart;
  117. u8 hstop;
  118. u8 blk_grp_count;
  119. u8 blk_pack_mode;
  120. u8 word_length;
  121. u8 lane_ctrl;
  122. u8 ch_en;
  123. u8 req_ch;
  124. u8 num_ch;
  125. u32 ch_rate;
  126. u32 req_ch_rate;
  127. };
  128. struct swr_port_params {
  129. u32 offset1;
  130. u32 lane_ctrl;
  131. };
  132. struct swr_dev_frame_config {
  133. struct swr_port_params *pp;
  134. };
  135. /*
  136. * struct swr_params - represent transfer of data from soundwire slave
  137. * to soundwire master
  138. * @tid: transaction ID to track each transaction
  139. * @dev_num: logical device number of the soundwire slave device
  140. * @num_port: number of ports that needs to be configured
  141. * @port_id: array of logical port numbers of the soundwire slave device
  142. * @num_ch: array of number of channels enabled
  143. * @ch_rate: array of sampling rate of different channels that need to
  144. * be configured
  145. * @ch_en: array of channels mask for all the ports
  146. * @port_type: the required master port type
  147. */
  148. struct swr_params {
  149. u8 tid;
  150. u8 dev_num;
  151. u8 num_port;
  152. u8 port_id[SWR_MAX_DEV_PORT_NUM];
  153. u8 num_ch[SWR_MAX_DEV_PORT_NUM];
  154. u32 ch_rate[SWR_MAX_DEV_PORT_NUM];
  155. u8 ch_en[SWR_MAX_DEV_PORT_NUM];
  156. u8 port_type[SWR_MAX_DEV_PORT_NUM];
  157. };
  158. /*
  159. * struct swr_reg - struct to handle soundwire slave register read/writes
  160. * @tid: transaction id for reg read/writes
  161. * @dev_id: logical device number of the soundwire slave device
  162. * @regaddr: 16 bit regaddr of soundwire slave
  163. * @buf: value to be written/read to/from regaddr
  164. * @len: length of the buffer buf
  165. */
  166. struct swr_reg {
  167. u8 tid;
  168. u8 dev_id;
  169. u32 regaddr;
  170. u32 *buf;
  171. u32 len;
  172. };
  173. /*
  174. * struct swr_master - Interface to the soundwire master controller
  175. * @dev: device interface to this driver
  176. * @list: link with other soundwire master controllers
  177. * @bus_num: board/SoC specific identifier for a soundwire master
  178. * @mlock: mutex protecting master data structures
  179. * @devices: list of devices on this master
  180. * @port: logical port numbers of the soundwire master. This array
  181. * can hold maximum master ports which is equal to number of slave
  182. * devices multiplied by number of ports in each slave device
  183. * @port_txn: table of port config transactions with transaction id
  184. * @reg_txn: table of register transactions with transaction id
  185. * @last_tid: size of table port_txn (can't grow beyond 256 since
  186. * tid is 8 bits)
  187. * @num_port: number of active ports on soundwire master
  188. * @gr_sid: slave id used by the group for write operations
  189. * @connect_port: callback for configuration of soundwire port(s)
  190. * @disconnect_port: callback for disable of soundwire port(s)
  191. * @read: callback for soundwire slave register read
  192. * @write: callback for soundwire slave register write
  193. * @get_logical_dev_num: callback to get soundwire slave logical
  194. * device number
  195. * @port_en_mask: bit mask of active ports on soundwire master
  196. */
  197. struct swr_master {
  198. struct device dev;
  199. struct list_head list;
  200. unsigned int bus_num;
  201. struct mutex mlock;
  202. struct list_head devices;
  203. struct swr_port_info port[SWR_MAX_MSTR_PORT_NUM];
  204. struct swr_params **port_txn;
  205. struct swr_reg **reg_txn;
  206. u8 last_tid;
  207. u8 num_port;
  208. u8 num_dev;
  209. u8 gr_sid;
  210. int (*connect_port)(struct swr_master *mstr, struct swr_params *txn);
  211. int (*disconnect_port)(struct swr_master *mstr, struct swr_params *txn);
  212. int (*read)(struct swr_master *mstr, u8 dev_num, u16 reg_addr,
  213. void *buf, u32 len);
  214. int (*write)(struct swr_master *mstr, u8 dev_num, u16 reg_addr,
  215. const void *buf);
  216. int (*bulk_write)(struct swr_master *master, u8 dev_num, void *reg,
  217. const void *buf, size_t len);
  218. int (*get_logical_dev_num)(struct swr_master *mstr, u64 dev_id,
  219. u8 *dev_num);
  220. int (*init_port_params)(struct swr_master *mstr, u32 dev_num,
  221. u32 num_ports, struct swr_dev_frame_config *uc_arr);
  222. int (*slvdev_datapath_control)(struct swr_master *mstr, bool enable);
  223. bool (*remove_from_group)(struct swr_master *mstr);
  224. void (*device_wakeup_vote)(struct swr_master *mstr);
  225. void (*device_wakeup_unvote)(struct swr_master *mstr);
  226. u16 port_en_mask;
  227. };
  228. static inline struct swr_master *to_swr_master(struct device *dev)
  229. {
  230. return dev ? container_of(dev, struct swr_master, dev) : NULL;
  231. }
  232. /*
  233. * struct swr_device - represent a soundwire slave device
  234. * @name: indicates the name of the device, defined in devicetree
  235. * binding under soundwire slave device node as a compatible field.
  236. * @master: soundwire master managing the bus hosting this device
  237. * @driver: Device's driver. Pointer to access routines
  238. * @dev_list: list of devices on a controller
  239. * @dev_num: logical device number of the soundwire slave device
  240. * @dev: driver model representation of the device
  241. * @addr: represents "ea-addr" which is unique-id of soundwire slave
  242. * device
  243. * @group_id: group id supported by the slave device
  244. * @slave_irq: irq handle of slave to be invoked by master
  245. * during slave interrupt
  246. */
  247. struct swr_device {
  248. char name[SOUNDWIRE_NAME_SIZE];
  249. struct swr_master *master;
  250. struct swr_driver *driver;
  251. struct list_head dev_list;
  252. u8 dev_num;
  253. struct device dev;
  254. u64 addr;
  255. u8 group_id;
  256. bool paging_support;
  257. struct irq_domain *slave_irq;
  258. bool slave_irq_pending;
  259. u8 scp1_val; /*used for v1.2 or class devices*/
  260. u8 scp2_val; /*used for v1.2 or class devices*/
  261. };
  262. static inline struct swr_device *to_swr_device(struct device *dev)
  263. {
  264. return dev ? container_of(dev, struct swr_device, dev) : NULL;
  265. }
  266. /*
  267. * struct swr_driver - Manage soundwire slave device driver
  268. * @probe: binds this driver to soundwire device
  269. * @remove: unbinds this driver from soundwire device
  270. * @shutdown: standard shutdown callback used during power down/halt
  271. * @suspend: standard suspend callback used during system suspend
  272. * @resume: standard resume callback used during system resume
  273. * @driver: soundwire device drivers should initialize name and
  274. * owner field of this structure
  275. * @id_table: list of soundwire devices supported by this driver
  276. */
  277. struct swr_driver {
  278. int (*probe)(struct swr_device *swr);
  279. int (*remove)(struct swr_device *swr);
  280. void (*shutdown)(struct swr_device *swr);
  281. int (*suspend)(struct swr_device *swr, pm_message_t pmesg);
  282. int (*resume)(struct swr_device *swr);
  283. int (*device_up)(struct swr_device *swr);
  284. int (*device_down)(struct swr_device *swr);
  285. int (*reset_device)(struct swr_device *swr);
  286. struct device_driver driver;
  287. const struct swr_device_id *id_table;
  288. };
  289. static inline struct swr_driver *to_swr_driver(struct device_driver *drv)
  290. {
  291. return drv ? container_of(drv, struct swr_driver, driver) : NULL;
  292. }
  293. /*
  294. * struct swr_boardinfo - Declare board info for soundwire device bringup
  295. * @name: name to initialize swr_device.name
  296. * @bus_num: identifies which soundwire master parents the soundwire
  297. * slave_device
  298. * @addr: represents "ea-addr" of soundwire slave device
  299. * @of_node: pointer to OpenFirmware device node
  300. * @swr_slave: device to be registered with soundwire
  301. */
  302. struct swr_boardinfo {
  303. char name[SOUNDWIRE_NAME_SIZE];
  304. int bus_num;
  305. u64 addr;
  306. struct device_node *of_node;
  307. struct swr_device *swr_slave;
  308. };
  309. static inline void *swr_get_ctrl_data(const struct swr_master *master)
  310. {
  311. return master ? dev_get_drvdata(&master->dev) : NULL;
  312. }
  313. static inline void swr_set_ctrl_data(struct swr_master *master, void *data)
  314. {
  315. dev_set_drvdata(&master->dev, data);
  316. }
  317. static inline void *swr_get_dev_data(const struct swr_device *dev)
  318. {
  319. return dev ? dev_get_drvdata(&dev->dev) : NULL;
  320. }
  321. static inline void swr_set_dev_data(struct swr_device *dev, void *data)
  322. {
  323. dev_set_drvdata(&dev->dev, data);
  324. }
  325. extern int swr_startup_devices(struct swr_device *swr_dev);
  326. extern struct swr_device *swr_new_device(struct swr_master *master,
  327. struct swr_boardinfo const *info);
  328. extern int of_register_swr_devices(struct swr_master *master);
  329. extern void swr_port_response(struct swr_master *mstr, u8 tid);
  330. extern int swr_get_logical_dev_num(struct swr_device *dev, u64 dev_id,
  331. u8 *dev_num);
  332. extern int swr_init_port_params(struct swr_device *dev,
  333. u32 num_ports, struct swr_dev_frame_config *pp);
  334. extern int swr_read(struct swr_device *dev, u8 dev_num, u16 reg_addr,
  335. void *buf, u32 len);
  336. extern int swr_write(struct swr_device *dev, u8 dev_num, u16 reg_addr,
  337. const void *buf);
  338. extern int swr_bulk_write(struct swr_device *dev, u8 dev_num, void *reg_addr,
  339. const void *buf, size_t len);
  340. extern int swr_connect_port(struct swr_device *dev, u8 *port_id, u8 num_port,
  341. u8 *ch_mask, u32 *ch_rate, u8 *num_ch,
  342. u8 *port_type);
  343. extern int swr_disconnect_port(struct swr_device *dev,
  344. u8 *port_id, u8 num_port, u8 *ch_mask,
  345. u8 *port_type);
  346. extern int swr_set_device_group(struct swr_device *swr_dev, u8 id);
  347. extern int swr_driver_register(struct swr_driver *drv);
  348. extern void swr_driver_unregister(struct swr_driver *drv);
  349. extern int swr_add_device(struct swr_master *master,
  350. struct swr_device *swrdev);
  351. extern void swr_remove_device(struct swr_device *swr);
  352. extern void swr_master_add_boarddevices(struct swr_master *master);
  353. extern void swr_unregister_master(struct swr_master *master);
  354. extern int swr_register_master(struct swr_master *master);
  355. extern int swr_device_up(struct swr_device *swr_dev);
  356. extern int swr_device_down(struct swr_device *swr_dev);
  357. extern int swr_reset_device(struct swr_device *swr_dev);
  358. extern int swr_slvdev_datapath_control(struct swr_device *swr_dev, u8 dev_num,
  359. bool enable);
  360. extern int swr_remove_from_group(struct swr_device *dev, u8 dev_num);
  361. extern void swr_remove_device(struct swr_device *swr_dev);
  362. extern struct swr_device *get_matching_swr_slave_device(struct device_node *np);
  363. extern int swr_device_wakeup_vote(struct swr_device *dev);
  364. extern int swr_device_wakeup_unvote(struct swr_device *dev);
  365. #endif /* _LINUX_SOUNDWIRE_H */