diff options
author | Nicolin Chen <b42378@freescale.com> | 2013-11-13 09:55:24 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2013-12-15 22:48:47 -0500 |
commit | cd72b8462a2ebbf9524e726c65c2770f0bf70d22 (patch) | |
tree | fc3799201a918a732e1911276f3433c0095b1fba /drivers/dma/imx-sdma.c | |
parent | b714b84e2b74de68b12847bcaf2cf409a18fb741 (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.c | 15 |
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 | ||
1242 | static void sdma_add_scripts(struct sdma_engine *sdma, | 1244 | static 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; |