dmaengine: sprd: add dma mask interface in probe
[linux-2.6-microblaze.git] / drivers / dma / sprd-dma.c
index 168aa0b..fe3d69c 100644 (file)
@@ -212,7 +212,7 @@ struct sprd_dma_dev {
        struct clk              *ashb_clk;
        int                     irq;
        u32                     total_chns;
-       struct sprd_dma_chn     channels[];
+       struct sprd_dma_chn     channels[] __counted_by(total_chns);
 };
 
 static void sprd_dma_free_desc(struct virt_dma_desc *vd);
@@ -1117,6 +1117,15 @@ static int sprd_dma_probe(struct platform_device *pdev)
        u32 chn_count;
        int ret, i;
 
+       ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36));
+       if (ret) {
+               ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+               if (ret) {
+                       dev_err(&pdev->dev, "unable to set coherent mask to 32\n");
+                       return ret;
+               }
+       }
+
        /* Parse new and deprecated dma-channels properties */
        ret = device_property_read_u32(&pdev->dev, "dma-channels", &chn_count);
        if (ret)
@@ -1232,7 +1241,7 @@ err_rpm:
        return ret;
 }
 
-static int sprd_dma_remove(struct platform_device *pdev)
+static void sprd_dma_remove(struct platform_device *pdev)
 {
        struct sprd_dma_dev *sdev = platform_get_drvdata(pdev);
        struct sprd_dma_chn *c, *cn;
@@ -1255,7 +1264,6 @@ static int sprd_dma_remove(struct platform_device *pdev)
 
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
-       return 0;
 }
 
 static const struct of_device_id sprd_dma_match[] = {
@@ -1292,7 +1300,7 @@ static const struct dev_pm_ops sprd_dma_pm_ops = {
 
 static struct platform_driver sprd_dma_driver = {
        .probe = sprd_dma_probe,
-       .remove = sprd_dma_remove,
+       .remove_new = sprd_dma_remove,
        .driver = {
                .name = "sprd-dma",
                .of_match_table = sprd_dma_match,