From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [1/2] dmaengine: sprd: Optimize the sprd_dma_prep_dma_memcpy() From: Baolin Wang Message-Id: Date: Fri, 4 May 2018 16:01:36 +0800 To: dan.j.williams@intel.com, vinod.koul@intel.com Cc: eric.long@spreadtrum.com, broonie@kernel.org, baolin.wang@linaro.org, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: RnJvbTogRXJpYyBMb25nIDxlcmljLmxvbmdAc3ByZWFkdHJ1bS5jb20+CgpUaGlzIGlzIG9uZSBw cmVwYXJhdGlvbiBwYXRjaCwgd2UgY2FuIHVzZSBkZWZhdWx0IERNQSBjb25maWd1cmF0aW9uIHRv CmltcGxlbWVudCB0aGUgZGV2aWNlX3ByZXBfZG1hX21lbWNweSgpIGludGVyZmFjZSBpbnN0ZWFk IG9mIGlzc3VpbmcKc3ByZF9kbWFfY29uZmlnKCkuCgpXZSB3aWxsIGltcGxlbWVudCBvbmUgbmV3 IHNwcmRfZG1hX2NvbmZpZygpIGZ1bmN0aW9uIHdpdGggaW50cm9kdWNpbmcKZGV2aWNlX3ByZXBf c2xhdmVfc2coKSBpbnRlcmZhY2UgaW4gZm9sbG93aW5nIHBhdGNoLiBTbyB3ZSBjYW4gcmVtb3Zl CnRoZSBvYnNvbGV0ZSBzcHJkX2RtYV9jb25maWcoKSBmaXJzdGx5LgoKU2lnbmVkLW9mZi1ieTog RXJpYyBMb25nIDxlcmljLmxvbmdAc3ByZWFkdHJ1bS5jb20+ClNpZ25lZC1vZmYtYnk6IEJhb2xp biBXYW5nIDxiYW9saW4ud2FuZ0BsaW5hcm8ub3JnPgotLS0KIGRyaXZlcnMvZG1hL3NwcmQtZG1h LmMgfCAgMTU0ICsrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogMSBmaWxlIGNoYW5nZWQsIDMyIGluc2VydGlvbnMoKyksIDEyMiBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zcHJkLWRtYS5jIGIvZHJpdmVycy9kbWEvc3ByZC1kbWEu YwppbmRleCBjY2RlYjhmLi5hN2E4OWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zcHJkLWRt YS5jCisrKyBiL2RyaXZlcnMvZG1hL3NwcmQtZG1hLmMKQEAgLTU1MiwxNDcgKzU1Miw1NyBAQCBz dGF0aWMgdm9pZCBzcHJkX2RtYV9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikK IAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hhbi0+dmMubG9jaywgZmxhZ3MpOwogfQogCi1z dGF0aWMgaW50IHNwcmRfZG1hX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHN0cnVjdCBz cHJkX2RtYV9kZXNjICpzZGVzYywKLQkJCSAgIGRtYV9hZGRyX3QgZGVzdCwgZG1hX2FkZHJfdCBz cmMsIHNpemVfdCBsZW4pCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoK K3NwcmRfZG1hX3ByZXBfZG1hX21lbWNweShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRy X3QgZGVzdCwgZG1hX2FkZHJfdCBzcmMsCisJCQkgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBm bGFncykKIHsKLQlzdHJ1Y3Qgc3ByZF9kbWFfZGV2ICpzZGV2ID0gdG9fc3ByZF9kbWFfZGV2KGNo YW4pOwotCXN0cnVjdCBzcHJkX2RtYV9jaG5faHcgKmh3ID0gJnNkZXNjLT5jaG5faHc7Ci0JdTMy IGRhdGF3aWR0aCwgc3JjX3N0ZXAsIGRlc19zdGVwLCBmcmFnbWVudF9sZW47Ci0JdTMyIGJsb2Nr X2xlbiwgcmVxX21vZGUsIGlycV9tb2RlLCB0cmFuc2NhdGlvbl9sZW47Ci0JdTMyIGZpeF9tb2Rl ID0gMCwgZml4X2VuID0gMDsKKwlzdHJ1Y3Qgc3ByZF9kbWFfY2huICpzY2hhbiA9IHRvX3NwcmRf ZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IHNwcmRfZG1hX2Rlc2MgKnNkZXNjOworCXN0cnVjdCBz cHJkX2RtYV9jaG5faHcgKmh3OworCWVudW0gc3ByZF9kbWFfZGF0YXdpZHRoIGRhdGF3aWR0aDsK Kwl1MzIgc3RlcDsKIAotCWlmIChJU19BTElHTkVEKGxlbiwgNCkpIHsKLQkJZGF0YXdpZHRoID0g U1BSRF9ETUFfREFUQVdJRFRIXzRfQllURVM7Ci0JCXNyY19zdGVwID0gU1BSRF9ETUFfV09SRF9T VEVQOwotCQlkZXNfc3RlcCA9IFNQUkRfRE1BX1dPUkRfU1RFUDsKLQl9IGVsc2UgaWYgKElTX0FM SUdORUQobGVuLCAyKSkgewotCQlkYXRhd2lkdGggPSBTUFJEX0RNQV9EQVRBV0lEVEhfMl9CWVRF UzsKLQkJc3JjX3N0ZXAgPSBTUFJEX0RNQV9TSE9SVF9TVEVQOwotCQlkZXNfc3RlcCA9IFNQUkRf RE1BX1NIT1JUX1NURVA7Ci0JfSBlbHNlIHsKLQkJZGF0YXdpZHRoID0gU1BSRF9ETUFfREFUQVdJ RFRIXzFfQllURTsKLQkJc3JjX3N0ZXAgPSBTUFJEX0RNQV9CWVRFX1NURVA7Ci0JCWRlc19zdGVw ID0gU1BSRF9ETUFfQllURV9TVEVQOwotCX0KKwlzZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpzZGVz YyksIEdGUF9OT1dBSVQpOworCWlmICghc2Rlc2MpCisJCXJldHVybiBOVUxMOwogCi0JZnJhZ21l bnRfbGVuID0gU1BSRF9ETUFfTUVNQ1BZX01JTl9TSVpFOwotCWlmIChsZW4gPD0gU1BSRF9ETUFf QkxLX0xFTl9NQVNLKSB7Ci0JCWJsb2NrX2xlbiA9IGxlbjsKLQkJdHJhbnNjYXRpb25fbGVuID0g MDsKLQkJcmVxX21vZGUgPSBTUFJEX0RNQV9CTEtfUkVROwotCQlpcnFfbW9kZSA9IFNQUkRfRE1B X0JMS19JTlQ7Ci0JfSBlbHNlIHsKLQkJYmxvY2tfbGVuID0gU1BSRF9ETUFfTUVNQ1BZX01JTl9T SVpFOwotCQl0cmFuc2NhdGlvbl9sZW4gPSBsZW47Ci0JCXJlcV9tb2RlID0gU1BSRF9ETUFfVFJB TlNfUkVROwotCQlpcnFfbW9kZSA9IFNQUkRfRE1BX1RSQU5TX0lOVDsKLQl9CisJaHcgPSAmc2Rl c2MtPmNobl9odzsKIAogCWh3LT5jZmcgPSBTUFJEX0RNQV9ET05PVF9XQUlUX0JET05FIDw8IFNQ UkRfRE1BX1dBSVRfQkRPTkVfT0ZGU0VUOworCWh3LT5pbnRjID0gU1BSRF9ETUFfVFJBTlNfSU5U IHwgU1BSRF9ETUFfQ0ZHX0VSUl9JTlRfRU47CisJaHctPnNyY19hZGRyID0gKHUzMikoc3JjICYg U1BSRF9ETUFfTE9XX0FERFJfTUFTSyk7CisJaHctPmRlc19hZGRyID0gKHUzMikoZGVzdCAmIFNQ UkRfRE1BX0xPV19BRERSX01BU0spOwogCWh3LT53cmFwX3B0ciA9ICh1MzIpKChzcmMgPj4gU1BS RF9ETUFfSElHSF9BRERSX09GRlNFVCkgJgogCQkJICAgICBTUFJEX0RNQV9ISUdIX0FERFJfTUFT Syk7CiAJaHctPndyYXBfdG8gPSAodTMyKSgoZGVzdCA+PiBTUFJEX0RNQV9ISUdIX0FERFJfT0ZG U0VUKSAmCiAJCQkgICAgU1BSRF9ETUFfSElHSF9BRERSX01BU0spOwogCi0JaHctPnNyY19hZGRy ID0gKHUzMikoc3JjICYgU1BSRF9ETUFfTE9XX0FERFJfTUFTSyk7Ci0JaHctPmRlc19hZGRyID0g KHUzMikoZGVzdCAmIFNQUkRfRE1BX0xPV19BRERSX01BU0spOwotCi0JaWYgKChzcmNfc3RlcCAh PSAwICYmIGRlc19zdGVwICE9IDApIHx8IChzcmNfc3RlcCB8IGRlc19zdGVwKSA9PSAwKSB7Ci0J CWZpeF9lbiA9IDA7CisJaWYgKElTX0FMSUdORUQobGVuLCA4KSkgeworCQlkYXRhd2lkdGggPSBT UFJEX0RNQV9EQVRBV0lEVEhfOF9CWVRFUzsKKwkJc3RlcCA9IFNQUkRfRE1BX0RXT1JEX1NURVA7 CisJfSBlbHNlIGlmIChJU19BTElHTkVEKGxlbiwgNCkpIHsKKwkJZGF0YXdpZHRoID0gU1BSRF9E TUFfREFUQVdJRFRIXzRfQllURVM7CisJCXN0ZXAgPSBTUFJEX0RNQV9XT1JEX1NURVA7CisJfSBl bHNlIGlmIChJU19BTElHTkVEKGxlbiwgMikpIHsKKwkJZGF0YXdpZHRoID0gU1BSRF9ETUFfREFU QVdJRFRIXzJfQllURVM7CisJCXN0ZXAgPSBTUFJEX0RNQV9TSE9SVF9TVEVQOwogCX0gZWxzZSB7 Ci0JCWZpeF9lbiA9IDE7Ci0JCWlmIChzcmNfc3RlcCkKLQkJCWZpeF9tb2RlID0gMTsKLQkJZWxz ZQotCQkJZml4X21vZGUgPSAwOworCQlkYXRhd2lkdGggPSBTUFJEX0RNQV9EQVRBV0lEVEhfMV9C WVRFOworCQlzdGVwID0gU1BSRF9ETUFfQllURV9TVEVQOwogCX0KIAogCWh3LT5mcmdfbGVuID0g ZGF0YXdpZHRoIDw8IFNQUkRfRE1BX1NSQ19EQVRBV0lEVEhfT0ZGU0VUIHwKIAkJZGF0YXdpZHRo IDw8IFNQUkRfRE1BX0RFU19EQVRBV0lEVEhfT0ZGU0VUIHwKLQkJcmVxX21vZGUgPDwgU1BSRF9E TUFfUkVRX01PREVfT0ZGU0VUIHwKLQkJZml4X21vZGUgPDwgU1BSRF9ETUFfRklYX1NFTF9PRkZT RVQgfAotCQlmaXhfZW4gPDwgU1BSRF9ETUFfRklYX0VOX09GRlNFVCB8Ci0JCShmcmFnbWVudF9s ZW4gJiBTUFJEX0RNQV9GUkdfTEVOX01BU0spOwotCWh3LT5ibGtfbGVuID0gYmxvY2tfbGVuICYg U1BSRF9ETUFfQkxLX0xFTl9NQVNLOwotCi0JaHctPmludGMgPSBTUFJEX0RNQV9DRkdfRVJSX0lO VF9FTjsKLQotCXN3aXRjaCAoaXJxX21vZGUpIHsKLQljYXNlIFNQUkRfRE1BX05PX0lOVDoKLQkJ YnJlYWs7Ci0KLQljYXNlIFNQUkRfRE1BX0ZSQUdfSU5UOgotCQlody0+aW50YyB8PSBTUFJEX0RN QV9GUkFHX0lOVF9FTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNQUkRfRE1BX0JMS19JTlQ6Ci0JCWh3 LT5pbnRjIHw9IFNQUkRfRE1BX0JMS19JTlRfRU47Ci0JCWJyZWFrOworCQlTUFJEX0RNQV9UUkFO U19SRVEgPDwgU1BSRF9ETUFfUkVRX01PREVfT0ZGU0VUIHwKKwkJKGxlbiAmIFNQUkRfRE1BX0ZS R19MRU5fTUFTSyk7CisJaHctPmJsa19sZW4gPSBsZW4gJiBTUFJEX0RNQV9CTEtfTEVOX01BU0s7 CisJaHctPnRyc2NfbGVuID0gbGVuICYgU1BSRF9ETUFfVFJTQ19MRU5fTUFTSzsKIAotCWNhc2Ug U1BSRF9ETUFfQkxLX0ZSQUdfSU5UOgotCQlody0+aW50YyB8PSBTUFJEX0RNQV9CTEtfSU5UX0VO IHwgU1BSRF9ETUFfRlJBR19JTlRfRU47Ci0JCWJyZWFrOwotCi0JY2FzZSBTUFJEX0RNQV9UUkFO U19JTlQ6Ci0JCWh3LT5pbnRjIHw9IFNQUkRfRE1BX1RSQU5TX0lOVF9FTjsKLQkJYnJlYWs7Ci0K LQljYXNlIFNQUkRfRE1BX1RSQU5TX0ZSQUdfSU5UOgotCQlody0+aW50YyB8PSBTUFJEX0RNQV9U UkFOU19JTlRfRU4gfCBTUFJEX0RNQV9GUkFHX0lOVF9FTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNQ UkRfRE1BX1RSQU5TX0JMS19JTlQ6Ci0JCWh3LT5pbnRjIHw9IFNQUkRfRE1BX1RSQU5TX0lOVF9F TiB8IFNQUkRfRE1BX0JMS19JTlRfRU47Ci0JCWJyZWFrOwotCi0JY2FzZSBTUFJEX0RNQV9MSVNU X0lOVDoKLQkJaHctPmludGMgfD0gU1BSRF9ETUFfTElTVF9JTlRfRU47Ci0JCWJyZWFrOwotCi0J Y2FzZSBTUFJEX0RNQV9DRkdFUlJfSU5UOgotCQlody0+aW50YyB8PSBTUFJEX0RNQV9DRkdfRVJS X0lOVF9FTjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKHNkZXYtPmRtYV9kZXYu ZGV2LCAiaW52YWxpZCBpcnEgbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlm ICh0cmFuc2NhdGlvbl9sZW4gPT0gMCkKLQkJaHctPnRyc2NfbGVuID0gYmxvY2tfbGVuICYgU1BS RF9ETUFfVFJTQ19MRU5fTUFTSzsKLQllbHNlCi0JCWh3LT50cnNjX2xlbiA9IHRyYW5zY2F0aW9u X2xlbiAmIFNQUkRfRE1BX1RSU0NfTEVOX01BU0s7Ci0KLQlody0+dHJzZl9zdGVwID0gKGRlc19z dGVwICYgU1BSRF9ETUFfVFJTRl9TVEVQX01BU0spIDw8CisJaHctPnRyc2Zfc3RlcCA9IChzdGVw ICYgU1BSRF9ETUFfVFJTRl9TVEVQX01BU0spIDw8CiAJCQlTUFJEX0RNQV9ERVNUX1RSU0ZfU1RF UF9PRkZTRVQgfAotCQkJKHNyY19zdGVwICYgU1BSRF9ETUFfVFJTRl9TVEVQX01BU0spIDw8CisJ CQkoc3RlcCAmIFNQUkRfRE1BX1RSU0ZfU1RFUF9NQVNLKSA8PAogCQkJU1BSRF9ETUFfU1JDX1RS U0ZfU1RFUF9PRkZTRVQ7CiAKLQlody0+ZnJnX3N0ZXAgPSAwOwotCWh3LT5zcmNfYmxrX3N0ZXAg PSAwOwotCWh3LT5kZXNfYmxrX3N0ZXAgPSAwOwotCWh3LT5zcmNfYmxrX3N0ZXAgPSAwOwotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLXNw cmRfZG1hX3ByZXBfZG1hX21lbWNweShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3Qg ZGVzdCwgZG1hX2FkZHJfdCBzcmMsCi0JCQkgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFn cykKLXsKLQlzdHJ1Y3Qgc3ByZF9kbWFfY2huICpzY2hhbiA9IHRvX3NwcmRfZG1hX2NoYW4oY2hh bik7Ci0Jc3RydWN0IHNwcmRfZG1hX2Rlc2MgKnNkZXNjOwotCWludCByZXQ7Ci0KLQlzZGVzYyA9 IGt6YWxsb2Moc2l6ZW9mKCpzZGVzYyksIEdGUF9OT1dBSVQpOwotCWlmICghc2Rlc2MpCi0JCXJl dHVybiBOVUxMOwotCi0JcmV0ID0gc3ByZF9kbWFfY29uZmlnKGNoYW4sIHNkZXNjLCBkZXN0LCBz cmMsIGxlbik7Ci0JaWYgKHJldCkgewotCQlrZnJlZShzZGVzYyk7Ci0JCXJldHVybiBOVUxMOwot CX0KLQogCXJldHVybiB2Y2hhbl90eF9wcmVwKCZzY2hhbi0+dmMsICZzZGVzYy0+dmQsIGZsYWdz KTsKIH0KIAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751563AbeEDICr (ORCPT ); Fri, 4 May 2018 04:02:47 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:45500 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751507AbeEDICl (ORCPT ); Fri, 4 May 2018 04:02:41 -0400 X-Google-Smtp-Source: AB8JxZpXDb0RG+IgKk1DqTf5wv+DGLHc0DuS+1cE4KP+U4+p8xWHmXecPe0k9ARs/62jDjNnoSwXHg== From: Baolin Wang To: dan.j.williams@intel.com, vinod.koul@intel.com Cc: eric.long@spreadtrum.com, broonie@kernel.org, baolin.wang@linaro.org, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] dmaengine: sprd: Optimize the sprd_dma_prep_dma_memcpy() Date: Fri, 4 May 2018 16:01:36 +0800 Message-Id: X-Mailer: git-send-email 1.7.9.5 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Long This is one preparation patch, we can use default DMA configuration to implement the device_prep_dma_memcpy() interface instead of issuing sprd_dma_config(). We will implement one new sprd_dma_config() function with introducing device_prep_slave_sg() interface in following patch. So we can remove the obsolete sprd_dma_config() firstly. Signed-off-by: Eric Long Signed-off-by: Baolin Wang --- drivers/dma/sprd-dma.c | 154 ++++++++++-------------------------------------- 1 file changed, 32 insertions(+), 122 deletions(-) diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c index ccdeb8f..a7a89fd 100644 --- a/drivers/dma/sprd-dma.c +++ b/drivers/dma/sprd-dma.c @@ -552,147 +552,57 @@ static void sprd_dma_issue_pending(struct dma_chan *chan) spin_unlock_irqrestore(&schan->vc.lock, flags); } -static int sprd_dma_config(struct dma_chan *chan, struct sprd_dma_desc *sdesc, - dma_addr_t dest, dma_addr_t src, size_t len) +static struct dma_async_tx_descriptor * +sprd_dma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, + size_t len, unsigned long flags) { - struct sprd_dma_dev *sdev = to_sprd_dma_dev(chan); - struct sprd_dma_chn_hw *hw = &sdesc->chn_hw; - u32 datawidth, src_step, des_step, fragment_len; - u32 block_len, req_mode, irq_mode, transcation_len; - u32 fix_mode = 0, fix_en = 0; + struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); + struct sprd_dma_desc *sdesc; + struct sprd_dma_chn_hw *hw; + enum sprd_dma_datawidth datawidth; + u32 step; - if (IS_ALIGNED(len, 4)) { - datawidth = SPRD_DMA_DATAWIDTH_4_BYTES; - src_step = SPRD_DMA_WORD_STEP; - des_step = SPRD_DMA_WORD_STEP; - } else if (IS_ALIGNED(len, 2)) { - datawidth = SPRD_DMA_DATAWIDTH_2_BYTES; - src_step = SPRD_DMA_SHORT_STEP; - des_step = SPRD_DMA_SHORT_STEP; - } else { - datawidth = SPRD_DMA_DATAWIDTH_1_BYTE; - src_step = SPRD_DMA_BYTE_STEP; - des_step = SPRD_DMA_BYTE_STEP; - } + sdesc = kzalloc(sizeof(*sdesc), GFP_NOWAIT); + if (!sdesc) + return NULL; - fragment_len = SPRD_DMA_MEMCPY_MIN_SIZE; - if (len <= SPRD_DMA_BLK_LEN_MASK) { - block_len = len; - transcation_len = 0; - req_mode = SPRD_DMA_BLK_REQ; - irq_mode = SPRD_DMA_BLK_INT; - } else { - block_len = SPRD_DMA_MEMCPY_MIN_SIZE; - transcation_len = len; - req_mode = SPRD_DMA_TRANS_REQ; - irq_mode = SPRD_DMA_TRANS_INT; - } + hw = &sdesc->chn_hw; hw->cfg = SPRD_DMA_DONOT_WAIT_BDONE << SPRD_DMA_WAIT_BDONE_OFFSET; + hw->intc = SPRD_DMA_TRANS_INT | SPRD_DMA_CFG_ERR_INT_EN; + hw->src_addr = (u32)(src & SPRD_DMA_LOW_ADDR_MASK); + hw->des_addr = (u32)(dest & SPRD_DMA_LOW_ADDR_MASK); hw->wrap_ptr = (u32)((src >> SPRD_DMA_HIGH_ADDR_OFFSET) & SPRD_DMA_HIGH_ADDR_MASK); hw->wrap_to = (u32)((dest >> SPRD_DMA_HIGH_ADDR_OFFSET) & SPRD_DMA_HIGH_ADDR_MASK); - hw->src_addr = (u32)(src & SPRD_DMA_LOW_ADDR_MASK); - hw->des_addr = (u32)(dest & SPRD_DMA_LOW_ADDR_MASK); - - if ((src_step != 0 && des_step != 0) || (src_step | des_step) == 0) { - fix_en = 0; + if (IS_ALIGNED(len, 8)) { + datawidth = SPRD_DMA_DATAWIDTH_8_BYTES; + step = SPRD_DMA_DWORD_STEP; + } else if (IS_ALIGNED(len, 4)) { + datawidth = SPRD_DMA_DATAWIDTH_4_BYTES; + step = SPRD_DMA_WORD_STEP; + } else if (IS_ALIGNED(len, 2)) { + datawidth = SPRD_DMA_DATAWIDTH_2_BYTES; + step = SPRD_DMA_SHORT_STEP; } else { - fix_en = 1; - if (src_step) - fix_mode = 1; - else - fix_mode = 0; + datawidth = SPRD_DMA_DATAWIDTH_1_BYTE; + step = SPRD_DMA_BYTE_STEP; } hw->frg_len = datawidth << SPRD_DMA_SRC_DATAWIDTH_OFFSET | datawidth << SPRD_DMA_DES_DATAWIDTH_OFFSET | - req_mode << SPRD_DMA_REQ_MODE_OFFSET | - fix_mode << SPRD_DMA_FIX_SEL_OFFSET | - fix_en << SPRD_DMA_FIX_EN_OFFSET | - (fragment_len & SPRD_DMA_FRG_LEN_MASK); - hw->blk_len = block_len & SPRD_DMA_BLK_LEN_MASK; - - hw->intc = SPRD_DMA_CFG_ERR_INT_EN; - - switch (irq_mode) { - case SPRD_DMA_NO_INT: - break; - - case SPRD_DMA_FRAG_INT: - hw->intc |= SPRD_DMA_FRAG_INT_EN; - break; - - case SPRD_DMA_BLK_INT: - hw->intc |= SPRD_DMA_BLK_INT_EN; - break; + SPRD_DMA_TRANS_REQ << SPRD_DMA_REQ_MODE_OFFSET | + (len & SPRD_DMA_FRG_LEN_MASK); + hw->blk_len = len & SPRD_DMA_BLK_LEN_MASK; + hw->trsc_len = len & SPRD_DMA_TRSC_LEN_MASK; - case SPRD_DMA_BLK_FRAG_INT: - hw->intc |= SPRD_DMA_BLK_INT_EN | SPRD_DMA_FRAG_INT_EN; - break; - - case SPRD_DMA_TRANS_INT: - hw->intc |= SPRD_DMA_TRANS_INT_EN; - break; - - case SPRD_DMA_TRANS_FRAG_INT: - hw->intc |= SPRD_DMA_TRANS_INT_EN | SPRD_DMA_FRAG_INT_EN; - break; - - case SPRD_DMA_TRANS_BLK_INT: - hw->intc |= SPRD_DMA_TRANS_INT_EN | SPRD_DMA_BLK_INT_EN; - break; - - case SPRD_DMA_LIST_INT: - hw->intc |= SPRD_DMA_LIST_INT_EN; - break; - - case SPRD_DMA_CFGERR_INT: - hw->intc |= SPRD_DMA_CFG_ERR_INT_EN; - break; - - default: - dev_err(sdev->dma_dev.dev, "invalid irq mode\n"); - return -EINVAL; - } - - if (transcation_len == 0) - hw->trsc_len = block_len & SPRD_DMA_TRSC_LEN_MASK; - else - hw->trsc_len = transcation_len & SPRD_DMA_TRSC_LEN_MASK; - - hw->trsf_step = (des_step & SPRD_DMA_TRSF_STEP_MASK) << + hw->trsf_step = (step & SPRD_DMA_TRSF_STEP_MASK) << SPRD_DMA_DEST_TRSF_STEP_OFFSET | - (src_step & SPRD_DMA_TRSF_STEP_MASK) << + (step & SPRD_DMA_TRSF_STEP_MASK) << SPRD_DMA_SRC_TRSF_STEP_OFFSET; - hw->frg_step = 0; - hw->src_blk_step = 0; - hw->des_blk_step = 0; - hw->src_blk_step = 0; - return 0; -} - -static struct dma_async_tx_descriptor * -sprd_dma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, - size_t len, unsigned long flags) -{ - struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); - struct sprd_dma_desc *sdesc; - int ret; - - sdesc = kzalloc(sizeof(*sdesc), GFP_NOWAIT); - if (!sdesc) - return NULL; - - ret = sprd_dma_config(chan, sdesc, dest, src, len); - if (ret) { - kfree(sdesc); - return NULL; - } - return vchan_tx_prep(&schan->vc, &sdesc->vd, flags); } -- 1.7.9.5