From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AH8x225pYN7iaIQN1IdLLf4T1sJPFIYW6AunqPvDhq83iZixsvZrvF884E4YXVR1z4LLonHmosc9 ARC-Seal: i=1; a=rsa-sha256; t=1516788476; cv=none; d=google.com; s=arc-20160816; b=nECBqPi28kkSdjoS9Aj63vNU+BFjpa7BhCEqMudunaA2GrzzuPpz8CNHP/mb9KwPJ5 KUbSFcJRHR8ZasVyPddZxuKKPYpqmkGgUEudmecvFr9vUBpBOL6oClFuVCHP061cdmg5 2ApcwEmoHiovnmmMuyk6/0c5twrHoG6l/ToxDll/maDzpJyjtxc3R/nlm56+rWmMvnI4 bSb79g1v9DRj4N7bbQbzooBaXlT3KhjgHF4upIF6qjm/vS84HoVmwtNX4R8FVp4dW0k5 4N9qYhvKxu97mik0baYXOgZ2EkpkF/awaMZGn8RIljrPLHQlipz4jJgINUmpR7FKvjc+ Un4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:sender:date :arc-authentication-results; bh=RuY7TJ/9eFe5yitzZK9PXP12mbw3VxzV34tL/4n+HHE=; b=b2qNfZmUKrbtHOdUNVYe++ch/k7nlnoKntLz9xZRkSGhXljYDLhJqm2zxLZM0nbfwT LvJ86chvypgGJftZDwLlXFU/M+3UoMDSI+MySuMRcn1CCByA75PtNE/WGhbYoVbWqGEp sXZh29pG6RVi+UDMd2Daxzn+A2+fWGMjU2sep0HNRjVoPSRdAUBx7IRpLlwgVEOEq/i4 WCC5D8t0JhJTR19oweuicCHduWK9Ers6i574eVN+zT1u2xCe4LQ4XARv6rRNF/UWbbPO xKlC4nz5gOxdYvuwFFUyhvyQrZ/UqOH+BesqIeu5EEgRlO5cZMz5Lm94x/tTzpdbglVp jQMA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of ladis@linux-mips.org designates 148.251.95.138 as permitted sender) smtp.mailfrom=ladis@linux-mips.org Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of ladis@linux-mips.org designates 148.251.95.138 as permitted sender) smtp.mailfrom=ladis@linux-mips.org Date: Wed, 24 Jan 2018 11:07:54 +0100 Sender: Ladislav Michl From: Ladislav Michl To: linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Cc: Thomas Gleixner , Tom Lendacky , Borislav Petkov , Ingo Molnar , Lorenzo Pieralisi , Philippe Ombredanne , Kate Stewart , Greg Kroah-Hartman , Boris Brezillon , Dmitry Torokhov , Bjorn Helgaas , Wei Yongjun Subject: [PATCH v2 2/3] devres: Add devm_ioremap_shared_resource() Message-ID: <20180124100754.GC19593@lenoch> References: <20180124100604.GA19593@lenoch> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180124100604.GA19593@lenoch> User-Agent: Mutt/1.9.2 (2017-12-15) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1590467993608542121?= X-GMAIL-MSGID: =?utf-8?q?1590467993608542121?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Implement managed ioremap function for shared resources. Signed-off-by: Ladislav Michl --- Changes: - v2: Rebased on top of PATCH v2 1/3 include/linux/io.h | 8 +++++++- lib/devres.c | 22 ++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/include/linux/io.h b/include/linux/io.h index 2aea3363bfb2..2b9eb48e0f49 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -79,10 +79,16 @@ void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, resource_size_t size); void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, resource_size_t size); -void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); +#define devm_ioremap_resource(dev, res) \ + __devm_ioremap_resource(dev, res, false) +#define devm_ioremap_shared_resource(dev, res) \ + __devm_ioremap_resource(dev, res, true) +void __iomem *__devm_ioremap_resource(struct device *dev, struct resource *res, + bool shared); void devm_iounmap(struct device *dev, void __iomem *addr); int check_signature(const volatile void __iomem *io_addr, const unsigned char *signature, int length); + void devm_ioremap_release(struct device *dev, void *res); void *devm_memremap(struct device *dev, resource_size_t offset, diff --git a/lib/devres.c b/lib/devres.c index 5f2aedd58bc5..7711ff40a572 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -22,6 +22,9 @@ static int devm_ioremap_match(struct device *dev, void *res, void *match_data) * @size: Size of map * * Managed ioremap(). Map is automatically unmapped on driver detach. + * + * When possible, use devm_ioremap_resource() or + * devm_ioremap_shared_resource() instead. */ void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, resource_size_t size) @@ -116,13 +119,14 @@ void devm_iounmap(struct device *dev, void __iomem *addr) EXPORT_SYMBOL(devm_iounmap); /** - * devm_ioremap_resource() - check, request region, and ioremap resource + * __devm_ioremap_resource() - check, request region, and ioremap resource * @dev: generic device to handle the resource for * @res: resource to be handled + * @shared: region is not requested when true * - * Checks that a resource is a valid memory region, requests the memory - * region and ioremaps it. All operations are managed and will be undone - * on driver detach. + * Checks that a resource is a valid memory region, eventually requests the + * memory region and ioremaps it. All operations are managed and will be + * undone on driver detach. * * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code * on failure. Usage example: @@ -132,7 +136,8 @@ EXPORT_SYMBOL(devm_iounmap); * if (IS_ERR(base)) * return PTR_ERR(base); */ -void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) +void __iomem *__devm_ioremap_resource(struct device *dev, struct resource *res, + bool shared) { resource_size_t size; const char *name; @@ -148,7 +153,7 @@ void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) size = resource_size(res); name = res->name ?: dev_name(dev); - if (!devm_request_mem_region(dev, res->start, size, name)) { + if (!shared && !devm_request_mem_region(dev, res->start, size, name)) { dev_err(dev, "can't request region for resource %pR\n", res); return IOMEM_ERR_PTR(-EBUSY); } @@ -156,13 +161,14 @@ void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) dest_ptr = devm_ioremap(dev, res->start, size); if (!dest_ptr) { dev_err(dev, "ioremap failed for resource %pR\n", res); - devm_release_mem_region(dev, res->start, size); + if (!shared) + devm_release_mem_region(dev, res->start, size); dest_ptr = IOMEM_ERR_PTR(-ENOMEM); } return dest_ptr; } -EXPORT_SYMBOL(devm_ioremap_resource); +EXPORT_SYMBOL(__devm_ioremap_resource); #ifdef CONFIG_HAS_IOPORT_MAP /* -- 2.15.1