Skip to content

Commit 8d3d5c7

Browse files
committed
dmaengine: sdxi: Use devres to clean up admin context memory
This removes a goto from the function activation path and makes the admin context cleanup automatic. Signed-off-by: Nathan Lynch <nathan.lynch@amd.com>
1 parent feb2a9a commit 8d3d5c7

3 files changed

Lines changed: 21 additions & 23 deletions

File tree

drivers/dma/sdxi/context.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/bug.h>
1111
#include <linux/cleanup.h>
1212
#include <linux/delay.h>
13+
#include <linux/device/devres.h>
1314
#include <linux/dma-direction.h>
1415
#include <linux/dma-mapping.h>
1516
#include <linux/dmapool.h>
@@ -392,13 +393,21 @@ static void unregister_cxt(struct sdxi_cxt *cxt)
392393
xa_erase(&cxt->sdxi->client_cxts, cxt->id);
393394
}
394395

395-
struct sdxi_cxt *sdxi_admin_cxt_init(struct sdxi_dev *sdxi)
396+
static void free_admin_cxt(void *ptr)
396397
{
398+
struct sdxi_dev *sdxi = ptr;
399+
400+
sdxi_free_cxt(sdxi->admin_cxt);
401+
}
402+
403+
int sdxi_admin_cxt_init(struct sdxi_dev *sdxi)
404+
{
405+
int err;
397406
struct sdxi_sq *sq;
398407

399408
struct sdxi_cxt *cxt __free(sdxi_cxt) = sdxi_alloc_cxt(sdxi);
400409
if (!cxt)
401-
return NULL;
410+
return -ENOMEM;
402411

403412
sq = cxt->sq;
404413
cxt->id = SDXI_ADMIN_CXT_ID;
@@ -407,17 +416,13 @@ struct sdxi_cxt *sdxi_admin_cxt_init(struct sdxi_dev *sdxi)
407416
sdxi_ring_state_init(cxt->ring_state, &sq->cxt_sts->read_index,
408417
sq->write_index, sq->ring_entries, sq->desc_ring);
409418

410-
if (sdxi_publish_cxt(cxt))
411-
return NULL;
419+
err = sdxi_publish_cxt(cxt);
420+
if (err)
421+
return err;
412422

413-
return_ptr(cxt);
414-
}
423+
sdxi->admin_cxt = no_free_ptr(cxt);
415424

416-
void sdxi_admin_cxt_exit(struct sdxi_cxt *cxt)
417-
{
418-
if (WARN_ON(!sdxi_cxt_is_admin(cxt)))
419-
return;
420-
sdxi_free_cxt(cxt);
425+
return devm_add_action_or_reset(sdxi_to_dev(sdxi), free_admin_cxt, sdxi);
421426
}
422427

423428
int sdxi_start_cxt(struct sdxi_cxt *cxt)

drivers/dma/sdxi/context.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ struct sdxi_cxt {
5151
struct sdxi_ring_state *ring_state;
5252
};
5353

54-
struct sdxi_cxt *sdxi_admin_cxt_init(struct sdxi_dev *sdxi);
55-
void sdxi_admin_cxt_exit(struct sdxi_cxt *cxt);
54+
int sdxi_admin_cxt_init(struct sdxi_dev *sdxi);
5655

5756
struct sdxi_cxt *sdxi_cxt_new(struct sdxi_dev *sdxi);
5857
void sdxi_cxt_exit(struct sdxi_cxt *cxt);

drivers/dma/sdxi/device.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,9 @@ static int sdxi_fn_activate(struct sdxi_dev *sdxi)
239239
* The admin context will not consume descriptors until we
240240
* write its doorbell later.
241241
*/
242-
sdxi->admin_cxt = sdxi_admin_cxt_init(sdxi);
243-
if (!sdxi->admin_cxt)
244-
return -ENOMEM;
242+
err = sdxi_admin_cxt_init(sdxi);
243+
if (err)
244+
return err;
245245

246246
/* SDXI 1.0 4.1.8.4.b: Set CXT_STS.state to CXTV_RUN. */
247247
sdxi->admin_cxt->sq->cxt_sts->state = FIELD_PREP(SDXI_CXT_STS_STATE,
@@ -252,7 +252,7 @@ static int sdxi_fn_activate(struct sdxi_dev *sdxi)
252252
*/
253253
err = sdxi_dev_start(sdxi);
254254
if (err)
255-
goto admin_cxt_exit;
255+
return err;
256256

257257
/*
258258
* SDXI 1.0 4.1.8.10.b: Start the admin context using method
@@ -264,10 +264,6 @@ static int sdxi_fn_activate(struct sdxi_dev *sdxi)
264264
iowrite64(0, sdxi->admin_cxt->db);
265265

266266
return 0;
267-
268-
admin_cxt_exit:
269-
sdxi_admin_cxt_exit(sdxi->admin_cxt);
270-
return err;
271267
}
272268

273269
static int sdxi_create_dma_pool(struct sdxi_dev *sdxi, struct dma_pool **pool,
@@ -310,8 +306,6 @@ static void sdxi_device_exit(struct sdxi_dev *sdxi)
310306
xa_for_each(&sdxi->client_cxts, index, cxt)
311307
sdxi_cxt_exit(cxt);
312308

313-
sdxi_admin_cxt_exit(sdxi->admin_cxt);
314-
315309
sdxi_dev_stop(sdxi);
316310
}
317311

0 commit comments

Comments
 (0)