@@ -45,13 +45,30 @@ struct sof_state_event_entry {
4545 struct list_head list ;
4646};
4747
48+ /**
49+ * struct sof_client_dev_entry - client device entry for internal management use
50+ * @sdev: pointer to SOF core device struct
51+ * @list: item in SOF core client dev list
52+ * @client_dev: SOF client device
53+ */
54+ struct sof_client_dev_entry {
55+ struct snd_sof_dev * sdev ;
56+ struct list_head list ;
57+
58+ struct sof_client_dev client_dev ;
59+ };
60+
61+ #define cdev_to_centry (cdev ) \
62+ container_of(cdev, struct sof_client_dev_entry, client_dev)
63+
4864static void sof_client_auxdev_release (struct device * dev )
4965{
5066 struct auxiliary_device * auxdev = to_auxiliary_dev (dev );
5167 struct sof_client_dev * cdev = auxiliary_dev_to_sof_client_dev (auxdev );
68+ struct sof_client_dev_entry * centry = cdev_to_centry (cdev );
5269
5370 kfree (cdev -> auxdev .dev .platform_data );
54- kfree (cdev );
71+ kfree (centry );
5572}
5673
5774static int sof_client_dev_add_data (struct sof_client_dev * cdev , const void * data ,
@@ -208,15 +225,18 @@ void sof_unregister_clients(struct snd_sof_dev *sdev)
208225int sof_client_dev_register (struct snd_sof_dev * sdev , const char * name , u32 id ,
209226 const void * data , size_t size )
210227{
228+ struct sof_client_dev_entry * centry ;
211229 struct auxiliary_device * auxdev ;
212230 struct sof_client_dev * cdev ;
213231 int ret ;
214232
215- cdev = kzalloc (sizeof (* cdev ), GFP_KERNEL );
216- if (!cdev )
233+ centry = kzalloc (sizeof (* centry ), GFP_KERNEL );
234+ if (!centry )
217235 return - ENOMEM ;
218236
219- cdev -> sdev = sdev ;
237+ cdev = & centry -> client_dev ;
238+
239+ centry -> sdev = sdev ;
220240 auxdev = & cdev -> auxdev ;
221241 auxdev -> name = name ;
222242 auxdev -> dev .parent = sdev -> dev ;
@@ -246,7 +266,7 @@ int sof_client_dev_register(struct snd_sof_dev *sdev, const char *name, u32 id,
246266
247267 /* add to list of SOF client devices */
248268 mutex_lock (& sdev -> ipc_client_mutex );
249- list_add (& cdev -> list , & sdev -> ipc_client_list );
269+ list_add (& centry -> list , & sdev -> ipc_client_list );
250270 mutex_unlock (& sdev -> ipc_client_mutex );
251271
252272 return 0 ;
@@ -255,25 +275,27 @@ int sof_client_dev_register(struct snd_sof_dev *sdev, const char *name, u32 id,
255275 kfree (cdev -> auxdev .dev .platform_data );
256276
257277err_dev_add_data :
258- kfree (cdev );
278+ kfree (centry );
259279
260280 return ret ;
261281}
262282EXPORT_SYMBOL_NS_GPL (sof_client_dev_register , "SND_SOC_SOF_CLIENT" );
263283
264284void sof_client_dev_unregister (struct snd_sof_dev * sdev , const char * name , u32 id )
265285{
266- struct sof_client_dev * cdev ;
286+ struct sof_client_dev_entry * centry ;
267287
268288 mutex_lock (& sdev -> ipc_client_mutex );
269289
270290 /*
271291 * sof_client_auxdev_release() will be invoked to free up memory
272292 * allocations through put_device()
273293 */
274- list_for_each_entry (cdev , & sdev -> ipc_client_list , list ) {
294+ list_for_each_entry (centry , & sdev -> ipc_client_list , list ) {
295+ struct sof_client_dev * cdev = & centry -> client_dev ;
296+
275297 if (!strcmp (cdev -> auxdev .name , name ) && cdev -> auxdev .id == id ) {
276- list_del (& cdev -> list );
298+ list_del (& centry -> list );
277299 auxiliary_device_delete (& cdev -> auxdev );
278300 auxiliary_device_uninit (& cdev -> auxdev );
279301 break ;
@@ -287,15 +309,17 @@ EXPORT_SYMBOL_NS_GPL(sof_client_dev_unregister, "SND_SOC_SOF_CLIENT");
287309int sof_client_ipc_tx_message (struct sof_client_dev * cdev , void * ipc_msg ,
288310 void * reply_data , size_t reply_bytes )
289311{
290- if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
312+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev (cdev );
313+
314+ if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
291315 struct sof_ipc_cmd_hdr * hdr = ipc_msg ;
292316
293- return sof_ipc_tx_message (cdev -> sdev -> ipc , ipc_msg , hdr -> size ,
317+ return sof_ipc_tx_message (sdev -> ipc , ipc_msg , hdr -> size ,
294318 reply_data , reply_bytes );
295- } else if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
319+ } else if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
296320 struct sof_ipc4_msg * msg = ipc_msg ;
297321
298- return sof_ipc_tx_message (cdev -> sdev -> ipc , ipc_msg , msg -> data_size ,
322+ return sof_ipc_tx_message (sdev -> ipc , ipc_msg , msg -> data_size ,
299323 reply_data , reply_bytes );
300324 }
301325
@@ -305,16 +329,18 @@ EXPORT_SYMBOL_NS_GPL(sof_client_ipc_tx_message, "SND_SOC_SOF_CLIENT");
305329
306330int sof_client_ipc_rx_message (struct sof_client_dev * cdev , void * ipc_msg , void * msg_buf )
307331{
332+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev (cdev );
333+
308334 if (IS_ENABLED (CONFIG_SND_SOC_SOF_IPC3 ) &&
309- cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
335+ sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
310336 struct sof_ipc_cmd_hdr * hdr = ipc_msg ;
311337
312338 if (hdr -> size < sizeof (hdr )) {
313- dev_err (cdev -> sdev -> dev , "The received message size is invalid\n" );
339+ dev_err (sdev -> dev , "The received message size is invalid\n" );
314340 return - EINVAL ;
315341 }
316342
317- sof_ipc3_do_rx_work (cdev -> sdev , ipc_msg , msg_buf );
343+ sof_ipc3_do_rx_work (sdev , ipc_msg , msg_buf );
318344 return 0 ;
319345 }
320346
@@ -325,16 +351,17 @@ EXPORT_SYMBOL_NS_GPL(sof_client_ipc_rx_message, "SND_SOC_SOF_CLIENT");
325351int sof_client_ipc_set_get_data (struct sof_client_dev * cdev , void * ipc_msg ,
326352 bool set )
327353{
328- if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
354+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev (cdev );
355+
356+ if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
329357 struct sof_ipc_cmd_hdr * hdr = ipc_msg ;
330358
331- return sof_ipc_set_get_data (cdev -> sdev -> ipc , ipc_msg , hdr -> size ,
332- set );
333- } else if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
359+ return sof_ipc_set_get_data (sdev -> ipc , ipc_msg , hdr -> size , set );
360+ } else if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
334361 struct sof_ipc4_msg * msg = ipc_msg ;
335362
336- return sof_ipc_set_get_data (cdev -> sdev -> ipc , ipc_msg ,
337- msg -> data_size , set );
363+ return sof_ipc_set_get_data (sdev -> ipc , ipc_msg , msg -> data_size ,
364+ set );
338365 }
339366
340367 return - EINVAL ;
@@ -344,7 +371,7 @@ EXPORT_SYMBOL_NS_GPL(sof_client_ipc_set_get_data, "SND_SOC_SOF_CLIENT");
344371#ifdef CONFIG_SND_SOC_SOF_IPC4
345372struct sof_ipc4_fw_module * sof_client_ipc4_find_module (struct sof_client_dev * c , const guid_t * uuid )
346373{
347- struct snd_sof_dev * sdev = c -> sdev ;
374+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev ( c ) ;
348375
349376 if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 )
350377 return sof_ipc4_find_module_by_uuid (sdev , uuid );
@@ -371,11 +398,13 @@ EXPORT_SYMBOL_NS_GPL(sof_client_ipc4_find_swidget_by_id, "SND_SOC_SOF_CLIENT");
371398int sof_suspend_clients (struct snd_sof_dev * sdev , pm_message_t state )
372399{
373400 const struct auxiliary_driver * adrv ;
374- struct sof_client_dev * cdev ;
401+ struct sof_client_dev_entry * centry ;
375402
376403 mutex_lock (& sdev -> ipc_client_mutex );
377404
378- list_for_each_entry (cdev , & sdev -> ipc_client_list , list ) {
405+ list_for_each_entry (centry , & sdev -> ipc_client_list , list ) {
406+ struct sof_client_dev * cdev = & centry -> client_dev ;
407+
379408 /* Skip devices without loaded driver */
380409 if (!cdev -> auxdev .dev .driver )
381410 continue ;
@@ -394,11 +423,13 @@ EXPORT_SYMBOL_NS_GPL(sof_suspend_clients, "SND_SOC_SOF_CLIENT");
394423int sof_resume_clients (struct snd_sof_dev * sdev )
395424{
396425 const struct auxiliary_driver * adrv ;
397- struct sof_client_dev * cdev ;
426+ struct sof_client_dev_entry * centry ;
398427
399428 mutex_lock (& sdev -> ipc_client_mutex );
400429
401- list_for_each_entry (cdev , & sdev -> ipc_client_list , list ) {
430+ list_for_each_entry (centry , & sdev -> ipc_client_list , list ) {
431+ struct sof_client_dev * cdev = & centry -> client_dev ;
432+
402433 /* Skip devices without loaded driver */
403434 if (!cdev -> auxdev .dev .driver )
404435 continue ;
@@ -416,14 +447,18 @@ EXPORT_SYMBOL_NS_GPL(sof_resume_clients, "SND_SOC_SOF_CLIENT");
416447
417448struct dentry * sof_client_get_debugfs_root (struct sof_client_dev * cdev )
418449{
419- return cdev -> sdev -> debugfs_root ;
450+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev (cdev );
451+
452+ return sdev -> debugfs_root ;
420453}
421454EXPORT_SYMBOL_NS_GPL (sof_client_get_debugfs_root , "SND_SOC_SOF_CLIENT" );
422455
423456/* DMA buffer allocation in client drivers must use the core SOF device */
424457struct device * sof_client_get_dma_dev (struct sof_client_dev * cdev )
425458{
426- return cdev -> sdev -> dev ;
459+ struct snd_sof_dev * sdev = sof_client_dev_to_sof_dev (cdev );
460+
461+ return sdev -> dev ;
427462}
428463EXPORT_SYMBOL_NS_GPL (sof_client_get_dma_dev , "SND_SOC_SOF_CLIENT" );
429464
@@ -517,10 +552,10 @@ int sof_client_register_ipc_rx_handler(struct sof_client_dev *cdev,
517552 if (!callback )
518553 return - EINVAL ;
519554
520- if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
555+ if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_3 ) {
521556 if (!(ipc_msg_type & SOF_GLB_TYPE_MASK ))
522557 return - EINVAL ;
523- } else if (cdev -> sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
558+ } else if (sdev -> pdata -> ipc_type == SOF_IPC_TYPE_4 ) {
524559 if (!(ipc_msg_type & SOF_IPC4_NOTIFICATION_TYPE_MASK ))
525560 return - EINVAL ;
526561 } else {
@@ -633,6 +668,8 @@ EXPORT_SYMBOL_NS_GPL(sof_client_get_fw_state, "SND_SOC_SOF_CLIENT");
633668
634669struct snd_sof_dev * sof_client_dev_to_sof_dev (struct sof_client_dev * cdev )
635670{
636- return cdev -> sdev ;
671+ struct sof_client_dev_entry * centry = cdev_to_centry (cdev );
672+
673+ return centry -> sdev ;
637674}
638675EXPORT_SYMBOL_NS_GPL (sof_client_dev_to_sof_dev , "SND_SOC_SOF_CLIENT" );
0 commit comments