From patchwork Thu Feb 9 14:22:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 9564669 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3FD5260236 for ; Thu, 9 Feb 2017 14:23:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 28573284EB for ; Thu, 9 Feb 2017 14:23:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1B586284B4; Thu, 9 Feb 2017 14:23:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00 autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 38F01284B4 for ; Thu, 9 Feb 2017 14:23:43 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cbpdK-0007YN-Gd; Thu, 09 Feb 2017 14:23:38 +0000 Received: from mailout4.w1.samsung.com ([210.118.77.14]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1cbpdG-0007Vi-W2 for linux-arm-kernel@lists.infradead.org; Thu, 09 Feb 2017 14:23:36 +0000 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OL4005A42ML9790@mailout4.w1.samsung.com> for linux-arm-kernel@lists.infradead.org; Thu, 09 Feb 2017 14:23:09 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170209142308eucas1p20d10fd81841160959b67a98419dc75b0~hpHhLZiDS0919409194eucas1p2X; Thu, 9 Feb 2017 14:23:08 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 25.A2.17477.C4B7C985; Thu, 9 Feb 2017 14:23:08 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20170209142307eucas1p180323d005f524760913b8d04ac966423~hpHgfPyUD1473314733eucas1p1k; Thu, 9 Feb 2017 14:23:07 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d000004445-cf-589c7b4c7376 Received: from eusync4.samsung.com ( [203.254.199.214]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 98.95.06687.79B7C985; Thu, 9 Feb 2017 14:24:23 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OL400ADQ2MEJ1A0@eusync4.samsung.com>; Thu, 09 Feb 2017 14:23:07 +0000 (GMT) From: Marek Szyprowski To: linux-samsung-soc@vger.kernel.org, dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 1/3] dmaengine: Add new device_{set, release}_slave callbacks Date: Thu, 09 Feb 2017 15:22:49 +0100 Message-id: <1486650171-20598-2-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1486650171-20598-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWSbUhTURzGO7svuxvNLlPyoKY4KsJKE4yuWlFgciM/VBKK+6AzL1PanOz6 MvNDyzDdRBNnZLjSdBoYazanhC+Z29gSw5mZJFhSUqSoo4aGhZbb1W+/5zz/8zz8D4dAxFto GFFQWMyoC2UKCS5E+10bnuNpFcbMEz8cYmqz0cWnXjRbMOrZ/U2MapxvQCmPp4dPmQytGGVd mMGo9wNGnPLVOQHV7HnFo8zOT3zq7fgURrnNGdRi/Qh6Loj++6cR0B1Dizza2q3D6bmZIZzu Nd2iTct2jLZ9qEbpels3oH3WyMuCLOHpPEZRUMqo487mCPNrRx7jRUtRmtnfLUALusL0QEBA MgHqrDWA4/1w8rMF1wMhISY7AZwzNiGc8AFYPbnC273RN9gGOKMLwL4pL+I3xKSWB+u+Sv2M k/FQv6IPRIWQ7QC6PE/5foGQqzxo/GUJRAWTV6DljTlQjpKH4MKkF/eziKRh3aYP4eoi4ZjL gPlZQF6E+tqGQDUkXXz4bebftiC2xQFofb0znwK1z+0ox8FwyW3jcxwBdTWjOyvcA7Cy6ijH zQBOrIg4ToYO97tAF0IGwcb+BwgXL4I1d8XcCA1t2o6d4/OwZziLewgjgM7ZdawBRLSBPd0g hClhlXKGPRnLypRsSaE89rpKaQXbv2J8y732EnS6kuyAJIBkr0iT2JIpxmSlbLnSDiCBSEJE MRpjpliUJyu/yahV2eoSBcPaQTiBSkJFQ23TGWJSLitmbjBMEaPedXmEIEwLnkQ38b+njhLs 7aojBp5aU++wL6W1Jqz/tOvW4EPTuPBj+PRqWWry/GhURo5AqxAYjqnCc+MI7Ko0Gj2s7Bys aPcOs0Fnyrxm9kJ2/ymwkZjrHEsZMKX3VDr67sBLceXX5lXGxCSnNLTaI3+02ItIvxyc2Lds NbBIZbpAgrL5svgYRM3K/gNbcDexEQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrAIsWRmVeSWpSXmKPExsVy+t/xa7rTq+dEGPybx27xd9IxdouNM9az Wqye+pfVYtL9CSwW589vYLdYMnk+q8Wmx9dYLS7vmsNm8bn3CKPFjPP7mCzWHrnLbnHm9CVW i+Nrwy1e9u1nceDz+P1rEqPH4j0vmTw2repk87hzbQ+bx+Yl9R5L3hxi9dhytZ3Fo2/LKkaP z5vkAjij3GwyUhNTUosUUvOS81My89JtlUJD3HQtlBTyEnNTbZUidH1DgpQUyhJzSoE8IwM0 4OAc4B6spG+X4JbRvX8eW8Er+Yqb32czNjAuk+pi5OSQEDCR2Lp7ASOELSZx4d56ti5GLg4h gSWMEm1vV7JAOE1MEouvz2ABqWITMJToetsFViUisIhR4sSK/8wgDrPAOyaJWw0v2UGqhAX8 JU4e2s4EYrMIqEo8vvCeDcTmFfCQ6P37mRlin5zEyWOTWUFsTgFPia7uCWB3CAHVTF2/mm0C I+8CRoZVjCKppcW56bnFhnrFibnFpXnpesn5uZsYgbGz7djPzTsYL20MPsQowMGoxMM7oWpO hBBrYllxZe4hRgkOZiURXq0KoBBvSmJlVWpRfnxRaU5q8SFGU6CjJjJLiSbnA+M6ryTe0MTQ 3NLQyNjCwtzISEmct+TDlXAhgfTEktTs1NSC1CKYPiYOTqkGxtgltzhji3i+vV98ofrM1s2F Mq+/yP/QSLRVYAiLib5XtfbOM93zh5V/Ls5aHnO/v7n605zHybXv4v8e6jz9dBl3wVYX+YAD pU/nV75ZKdhip/1NZX5h0/xLWoouV/7ty3ljvHDxinm9Erfas8Tez/G6tyOHoUuy91/Hqw9y q5fazJ3jJr8096ESS3FGoqEWc1FxIgCmSbfFswIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170209142307eucas1p180323d005f524760913b8d04ac966423 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170209142307eucas1p180323d005f524760913b8d04ac966423 X-RootMTR: 20170209142307eucas1p180323d005f524760913b8d04ac966423 References: <1486650171-20598-1-git-send-email-m.szyprowski@samsung.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170209_062335_192901_523B0D9C X-CRM114-Status: GOOD ( 19.05 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ulf Hansson , Lars-Peter Clausen , Arnd Bergmann , Bartlomiej Zolnierkiewicz , Vinod Koul , "Rafael J. Wysocki" , Krzysztof Kozlowski , Inki Dae , Marek Szyprowski MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Add two new callbacks to DMA engine device. They will used to provide access to slave device (the device which requested given DMA channel) for DMA engine driver. Access to slave device might be useful for example for implementing advanced runtime power management. DMA slave channels are exclusive, so only one slave device can be set for a given DMA slave channel. device_set_slave() will be called after the device_alloc_chan_resources() and device_release_slave() before the device_free_chan_resources(). Signed-off-by: Marek Szyprowski --- drivers/dma/dmaengine.c | 27 ++++++++++++++++++++++++--- include/linux/dmaengine.h | 10 ++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 24e0221fd66d..5b7089d8be4d 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c @@ -705,6 +705,7 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) { struct dma_device *d, *_d; struct dma_chan *chan = NULL; + int ret; /* If device-tree is present get slave info from here */ if (dev->of_node) @@ -715,8 +716,9 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) chan = acpi_dma_request_slave_chan_by_name(dev, name); if (chan) { - /* Valid channel found or requester need to be deferred */ - if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) + if (!IS_ERR(chan)) + goto found; + if (PTR_ERR(chan) == -EPROBE_DEFER) return chan; } @@ -738,7 +740,21 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) } mutex_unlock(&dma_list_mutex); - return chan ? chan : ERR_PTR(-EPROBE_DEFER); + if (!chan) + return ERR_PTR(-EPROBE_DEFER); + if (IS_ERR(chan)) + return chan; +found: + if (chan->device->device_set_slave) { + chan->slave = dev; + ret = chan->device->device_set_slave(chan, dev); + if (ret) { + chan->slave = NULL; + dma_release_channel(chan); + chan = ERR_PTR(ret); + } + } + return chan; } EXPORT_SYMBOL_GPL(dma_request_chan); @@ -786,6 +802,11 @@ void dma_release_channel(struct dma_chan *chan) mutex_lock(&dma_list_mutex); WARN_ONCE(chan->client_count != 1, "chan reference count %d != 1\n", chan->client_count); + if (chan->slave) { + if (chan->device->device_release_slave) + chan->device->device_release_slave(chan); + chan->slave = NULL; + } dma_chan_put(chan); /* drop PRIVATE cap enabled by __dma_request_channel() */ if (--chan->device->privatecnt == 0) diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 533680860865..d22299e37e69 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -277,6 +277,9 @@ struct dma_chan { struct dma_router *router; void *route_data; + /* Only for SLAVE channels */ + struct device *slave; + void *private; }; @@ -686,6 +689,10 @@ struct dma_filter { * @device_alloc_chan_resources: allocate resources and return the * number of allocated descriptors * @device_free_chan_resources: release DMA channel's resources + * @device_set_slave: provide access to the slave device, which requested + * given DMA channel, called after @device_alloc_chan_resources + * @device_release_slave: finishes access to the slave device, called + * before @device_free_chan_resources * @device_prep_dma_memcpy: prepares a memcpy operation * @device_prep_dma_xor: prepares a xor operation * @device_prep_dma_xor_val: prepares a xor validation operation @@ -746,6 +753,9 @@ struct dma_device { int (*device_alloc_chan_resources)(struct dma_chan *chan); void (*device_free_chan_resources)(struct dma_chan *chan); + int (*device_set_slave)(struct dma_chan *chan, struct device *slave); + void (*device_release_slave)(struct dma_chan *chan); + struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( struct dma_chan *chan, dma_addr_t dst, dma_addr_t src, size_t len, unsigned long flags);