static int mv_cesa_dev_dma_init(struct mv_cesa_dev *cesa) { struct device *dev = cesa->dev; struct mv_cesa_dev_dma *dma; if (!cesa->caps->has_tdma) return 0; dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); if (!dma) return -ENOMEM; dma->tdma_desc_pool = dmam_pool_create("tdma_desc", dev, sizeof(struct mv_cesa_tdma_desc), 16, 0); if (!dma->tdma_desc_pool) return -ENOMEM; dma->op_pool = dmam_pool_create("cesa_op", dev, sizeof(struct mv_cesa_op_ctx), 16, 0); if (!dma->op_pool) return -ENOMEM; dma->cache_pool = dmam_pool_create("cesa_cache", dev, CESA_MAX_HASH_BLOCK_SIZE, 1, 0); if (!dma->cache_pool) return -ENOMEM; dma->padding_pool = dmam_pool_create("cesa_padding", dev, 72, 1, 0); if (!dma->cache_pool) return -ENOMEM; cesa->dma = dma; return 0; }
static int scif_peer_add_device(struct scif_dev *scifdev) { struct scif_peer_dev *spdev = rcu_dereference(scifdev->spdev); char pool_name[16]; int ret; ret = device_add(&spdev->dev); put_device(&spdev->dev); if (ret) { dev_err(&scifdev->sdev->dev, "dnode %d: peer device_add failed\n", scifdev->node); goto put_spdev; } scnprintf(pool_name, sizeof(pool_name), "scif-%d", spdev->dnode); scifdev->signal_pool = dmam_pool_create(pool_name, &scifdev->sdev->dev, sizeof(struct scif_status), 1, 0); if (!scifdev->signal_pool) { dev_err(&scifdev->sdev->dev, "dnode %d: dmam_pool_create failed\n", scifdev->node); ret = -ENOMEM; goto del_spdev; } dev_dbg(&spdev->dev, "Added peer dnode %d\n", spdev->dnode); return 0; del_spdev: device_del(&spdev->dev); put_spdev: RCU_INIT_POINTER(scifdev->spdev, NULL); synchronize_rcu(); put_device(&spdev->dev); mutex_lock(&scif_info.conflock); scif_info.total--; mutex_unlock(&scif_info.conflock); return ret; }