From patchwork Thu Mar 31 12:29:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris BREZILLON X-Patchwork-Id: 33752 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.84_2) (envelope-from ) id 1albkb-0000OT-QX; Thu, 31 Mar 2016 12:31:01 +0000 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.76/mailfrontend-8) with esmtp id 1albkZ-0001nr-lM; Thu, 31 Mar 2016 14:31:01 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756707AbcCaM35 (ORCPT + 1 other); Thu, 31 Mar 2016 08:29:57 -0400 Received: from down.free-electrons.com ([37.187.137.238]:41988 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753691AbcCaM3v (ORCPT ); Thu, 31 Mar 2016 08:29:51 -0400 Received: by mail.free-electrons.com (Postfix, from userid 110) id F067B1820; Thu, 31 Mar 2016 14:29:48 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail.free-electrons.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT, URIBL_BLOCKED shortcircuit=ham autolearn=disabled version=3.4.0 Received: from localhost.localdomain (LMontsouris-657-1-184-87.w90-63.abo.wanadoo.fr [90.63.216.87]) by mail.free-electrons.com (Postfix) with ESMTPSA id 5DFE217EA; Thu, 31 Mar 2016 14:29:48 +0200 (CEST) From: Boris Brezillon To: David Woodhouse , Brian Norris , linux-mtd@lists.infradead.org, Andrew Morton , Dave Gordon Cc: Mark Brown , linux-spi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Vinod Koul , Dan Williams , dmaengine@vger.kernel.org, Mauro Carvalho Chehab , Hans Verkuil , Laurent Pinchart , linux-media@vger.kernel.org, Boris Brezillon , Richard Weinberger , Herbert Xu , "David S. Miller" , linux-crypto@vger.kernel.org, Vignesh R , linux-mm@kvack.org, Joerg Roedel , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] spi: use sg_alloc_table_from_buf() Date: Thu, 31 Mar 2016 14:29:43 +0200 Message-Id: <1459427384-21374-4-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> References: <1459427384-21374-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2016.3.31.122717 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_2000_2999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, NO_URI_HTTPS 0, REFERENCES 0, SINGLE_URI_IN_BODY 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __IN_REP_TO 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __MULTIPLE_RCPTS_TO_X5 0, __REFERENCES 0, __SANE_MSGID 0, __SINGLE_URI_TEXT 0, __TO_MALFORMED_2 0, __URI_IN_BODY 0, __URI_NO_WWW 0, __URI_NS , __URI_WITH_PATH 0' Replace custom implementation of sg_alloc_table_from_buf() by a call to sg_alloc_table_from_buf(). Signed-off-by: Boris Brezillon Acked-by: Mark Brown --- drivers/spi/spi.c | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index de2f2f9..eed461d 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -705,49 +705,14 @@ static int spi_map_buf(struct spi_master *master, struct device *dev, struct sg_table *sgt, void *buf, size_t len, enum dma_data_direction dir) { - const bool vmalloced_buf = is_vmalloc_addr(buf); - unsigned int max_seg_size = dma_get_max_seg_size(dev); - int desc_len; - int sgs; - struct page *vm_page; - void *sg_buf; - size_t min; - int i, ret; - - if (vmalloced_buf) { - desc_len = min_t(int, max_seg_size, PAGE_SIZE); - sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len); - } else { - desc_len = min_t(int, max_seg_size, master->max_dma_len); - sgs = DIV_ROUND_UP(len, desc_len); - } + struct sg_constraints constraints = { }; + int ret; - ret = sg_alloc_table(sgt, sgs, GFP_KERNEL); - if (ret != 0) + constraints.max_segment_size = dma_get_max_seg_size(dev); + ret = sg_alloc_table_from_buf(sgt, buf, len, &constraints, GFP_KERNEL); + if (ret) return ret; - for (i = 0; i < sgs; i++) { - - if (vmalloced_buf) { - min = min_t(size_t, - len, desc_len - offset_in_page(buf)); - vm_page = vmalloc_to_page(buf); - if (!vm_page) { - sg_free_table(sgt); - return -ENOMEM; - } - sg_set_page(&sgt->sgl[i], vm_page, - min, offset_in_page(buf)); - } else { - min = min_t(size_t, len, desc_len); - sg_buf = buf; - sg_set_buf(&sgt->sgl[i], sg_buf, min); - } - - buf += min; - len -= min; - } - ret = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); if (!ret) ret = -ENOMEM;