aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/imx-sdma.c
diff options
context:
space:
mode:
authorNicolin Chen <b42378@freescale.com>2013-11-13 09:55:24 -0500
committerVinod Koul <vinod.koul@intel.com>2013-12-15 22:48:47 -0500
commitcd72b8462a2ebbf9524e726c65c2770f0bf70d22 (patch)
treefc3799201a918a732e1911276f3433c0095b1fba /drivers/dma/imx-sdma.c
parentb714b84e2b74de68b12847bcaf2cf409a18fb741 (diff)
dma: imx-sdma: Add sdma firmware version 2 support
On i.MX5/6 series, SDMA is using new version firmware to support SSI dual FIFO feature and HDMI Audio (i.MX6Q/DL only). Thus add it. Signed-off-by: Nicolin Chen <b42378@freescale.com> Acked-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/imx-sdma.c')
-rw-r--r--drivers/dma/imx-sdma.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index c75679d42028..f769c7383536 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -323,6 +323,7 @@ struct sdma_engine {
323 struct clk *clk_ipg; 323 struct clk *clk_ipg;
324 struct clk *clk_ahb; 324 struct clk *clk_ahb;
325 spinlock_t channel_0_lock; 325 spinlock_t channel_0_lock;
326 u32 script_number;
326 struct sdma_script_start_addrs *script_addrs; 327 struct sdma_script_start_addrs *script_addrs;
327 const struct sdma_driver_data *drvdata; 328 const struct sdma_driver_data *drvdata;
328}; 329};
@@ -1238,6 +1239,7 @@ static void sdma_issue_pending(struct dma_chan *chan)
1238} 1239}
1239 1240
1240#define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1 34 1241#define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1 34
1242#define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V2 38
1241 1243
1242static void sdma_add_scripts(struct sdma_engine *sdma, 1244static void sdma_add_scripts(struct sdma_engine *sdma,
1243 const struct sdma_script_start_addrs *addr) 1245 const struct sdma_script_start_addrs *addr)
@@ -1246,7 +1248,7 @@ static void sdma_add_scripts(struct sdma_engine *sdma,
1246 s32 *saddr_arr = (u32 *)sdma->script_addrs; 1248 s32 *saddr_arr = (u32 *)sdma->script_addrs;
1247 int i; 1249 int i;
1248 1250
1249 for (i = 0; i < SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; i++) 1251 for (i = 0; i < sdma->script_number; i++)
1250 if (addr_arr[i] > 0) 1252 if (addr_arr[i] > 0)
1251 saddr_arr[i] = addr_arr[i]; 1253 saddr_arr[i] = addr_arr[i];
1252} 1254}
@@ -1272,6 +1274,17 @@ static void sdma_load_firmware(const struct firmware *fw, void *context)
1272 goto err_firmware; 1274 goto err_firmware;
1273 if (header->ram_code_start + header->ram_code_size > fw->size) 1275 if (header->ram_code_start + header->ram_code_size > fw->size)
1274 goto err_firmware; 1276 goto err_firmware;
1277 switch (header->version_major) {
1278 case 1:
1279 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1;
1280 break;
1281 case 2:
1282 sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V2;
1283 break;
1284 default:
1285 dev_err(sdma->dev, "unknown firmware version\n");
1286 goto err_firmware;
1287 }
1275 1288
1276 addr = (void *)header + header->script_addrs_start; 1289 addr = (void *)header + header->script_addrs_start;
1277 ram_code = (void *)header + header->ram_code_start; 1290 ram_code = (void *)header + header->ram_code_start;