s390/cio: use dma helpers for setting masks
[linux-2.6-microblaze.git] / drivers / s390 / cio / device.c
index df46373..3f02602 100644 (file)
@@ -679,33 +679,47 @@ static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch)
 {
        struct ccw_device *cdev;
        struct gen_pool *dma_pool;
+       int ret;
 
        cdev  = kzalloc(sizeof(*cdev), GFP_KERNEL);
-       if (!cdev)
+       if (!cdev) {
+               ret = -ENOMEM;
                goto err_cdev;
+       }
        cdev->private = kzalloc(sizeof(struct ccw_device_private),
                                GFP_KERNEL | GFP_DMA);
-       if (!cdev->private)
+       if (!cdev->private) {
+               ret = -ENOMEM;
                goto err_priv;
-       cdev->dev.coherent_dma_mask = sch->dev.coherent_dma_mask;
+       }
+
        cdev->dev.dma_mask = sch->dev.dma_mask;
+       ret = dma_set_coherent_mask(&cdev->dev, sch->dev.coherent_dma_mask);
+       if (ret)
+               goto err_coherent_mask;
+
        dma_pool = cio_gp_dma_create(&cdev->dev, 1);
-       if (!dma_pool)
+       if (!dma_pool) {
+               ret = -ENOMEM;
                goto err_dma_pool;
+       }
        cdev->private->dma_pool = dma_pool;
        cdev->private->dma_area = cio_gp_dma_zalloc(dma_pool, &cdev->dev,
                                        sizeof(*cdev->private->dma_area));
-       if (!cdev->private->dma_area)
+       if (!cdev->private->dma_area) {
+               ret = -ENOMEM;
                goto err_dma_area;
+       }
        return cdev;
 err_dma_area:
        cio_gp_dma_destroy(dma_pool, &cdev->dev);
 err_dma_pool:
+err_coherent_mask:
        kfree(cdev->private);
 err_priv:
        kfree(cdev);
 err_cdev:
-       return ERR_PTR(-ENOMEM);
+       return ERR_PTR(ret);
 }
 
 static void ccw_device_todo(struct work_struct *work);