Merge tag 'dmaengine-4.9-rc1' of git://git.infradead.org/users/vkoul/slave-dma
[cascardo/linux.git] / drivers / dma / imx-sdma.c
index 3cb4738..b9629b2 100644 (file)
 struct sdma_mode_count {
        u32 count   : 16; /* size of the buffer pointed by this BD */
        u32 status  :  8; /* E,R,I,C,W,D status bits stored here */
-       u32 command :  8; /* command mostlky used for channel 0 */
+       u32 command :  8; /* command mostly used for channel 0 */
 };
 
 /*
@@ -479,6 +479,24 @@ static struct sdma_driver_data sdma_imx6q = {
        .script_addrs = &sdma_script_imx6q,
 };
 
+static struct sdma_script_start_addrs sdma_script_imx7d = {
+       .ap_2_ap_addr = 644,
+       .uart_2_mcu_addr = 819,
+       .mcu_2_app_addr = 749,
+       .uartsh_2_mcu_addr = 1034,
+       .mcu_2_shp_addr = 962,
+       .app_2_mcu_addr = 685,
+       .shp_2_mcu_addr = 893,
+       .spdif_2_mcu_addr = 1102,
+       .mcu_2_spdif_addr = 1136,
+};
+
+static struct sdma_driver_data sdma_imx7d = {
+       .chnenbl0 = SDMA_CHNENBL0_IMX35,
+       .num_events = 48,
+       .script_addrs = &sdma_script_imx7d,
+};
+
 static const struct platform_device_id sdma_devtypes[] = {
        {
                .name = "imx25-sdma",
@@ -498,6 +516,9 @@ static const struct platform_device_id sdma_devtypes[] = {
        }, {
                .name = "imx6q-sdma",
                .driver_data = (unsigned long)&sdma_imx6q,
+       }, {
+               .name = "imx7d-sdma",
+               .driver_data = (unsigned long)&sdma_imx7d,
        }, {
                /* sentinel */
        }
@@ -511,6 +532,7 @@ static const struct of_device_id sdma_dt_ids[] = {
        { .compatible = "fsl,imx35-sdma", .data = &sdma_imx35, },
        { .compatible = "fsl,imx31-sdma", .data = &sdma_imx31, },
        { .compatible = "fsl,imx25-sdma", .data = &sdma_imx25, },
+       { .compatible = "fsl,imx7d-sdma", .data = &sdma_imx7d, },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, sdma_dt_ids);
@@ -686,8 +708,7 @@ static void sdma_update_channel_loop(struct sdma_channel *sdmac)
                 * executed.
                 */
 
-               if (sdmac->desc.callback)
-                       sdmac->desc.callback(sdmac->desc.callback_param);
+               dmaengine_desc_get_callback_invoke(&sdmac->desc, NULL);
 
                sdmac->buf_tail++;
                sdmac->buf_tail %= sdmac->num_bd;
@@ -722,8 +743,8 @@ static void mxc_sdma_handle_channel_normal(unsigned long data)
                sdmac->status = DMA_COMPLETE;
 
        dma_cookie_complete(&sdmac->desc);
-       if (sdmac->desc.callback)
-               sdmac->desc.callback(sdmac->desc.callback_param);
+
+       dmaengine_desc_get_callback_invoke(&sdmac->desc, NULL);
 }
 
 static irqreturn_t sdma_int_handler(int irq, void *dev_id)
@@ -1387,6 +1408,7 @@ static void sdma_issue_pending(struct dma_chan *chan)
 #define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1        34
 #define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V2        38
 #define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V3        41
+#define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V4        42
 
 static void sdma_add_scripts(struct sdma_engine *sdma,
                const struct sdma_script_start_addrs *addr)
@@ -1436,6 +1458,9 @@ static void sdma_load_firmware(const struct firmware *fw, void *context)
        case 3:
                sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V3;
                break;
+       case 4:
+               sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V4;
+               break;
        default:
                dev_err(sdma->dev, "unknown firmware version\n");
                goto err_firmware;