Skip to content

Commit 075b7dd

Browse files
committed
ASoC: SOF: sof-client: Introduce sof_client_dev_entry structure
Introduce a new internal structure for wrapping the sof_client_dev and move members away from the client visible struct that they must not access, let alone see (sdev and the list). The changes are mechanical in nature and contained within sof-client core code, no functional change or change in behavior is introduced. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
1 parent 76fc9cd commit 075b7dd

2 files changed

Lines changed: 69 additions & 36 deletions

File tree

sound/soc/sof/sof-client.c

Lines changed: 69 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4864
static 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

5774
static 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)
208225
int 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

257277
err_dev_add_data:
258-
kfree(cdev);
278+
kfree(centry);
259279

260280
return ret;
261281
}
262282
EXPORT_SYMBOL_NS_GPL(sof_client_dev_register, "SND_SOC_SOF_CLIENT");
263283

264284
void 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");
287309
int 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

306330
int 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");
325351
int 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
345372
struct 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");
371398
int 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");
394423
int 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

417448
struct 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
}
421454
EXPORT_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 */
424457
struct 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
}
428463
EXPORT_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

634669
struct 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
}
638675
EXPORT_SYMBOL_NS_GPL(sof_client_dev_to_sof_dev, "SND_SOC_SOF_CLIENT");

sound/soc/sof/sof-client.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,10 @@ struct sof_ipc4_fw_module;
1818
/**
1919
* struct sof_client_dev - SOF client device
2020
* @auxdev: auxiliary device
21-
* @sdev: pointer to SOF core device struct, resticted for core use only
22-
* @list: item in SOF core client dev list, resticted for core use only
2321
* @data: device specific data
2422
*/
2523
struct sof_client_dev {
2624
struct auxiliary_device auxdev;
27-
struct snd_sof_dev *sdev;
28-
struct list_head list;
2925
void *data;
3026
};
3127

0 commit comments

Comments
 (0)