2006-02-01 18:05:16 +07:00
|
|
|
/*
|
|
|
|
* Copyright 2006 PathScale, Inc. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* This file is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of version 2 of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _LINUX_IO_H
|
|
|
|
#define _LINUX_IO_H
|
|
|
|
|
2006-10-08 21:08:45 +07:00
|
|
|
#include <linux/types.h>
|
2015-06-02 16:01:38 +07:00
|
|
|
#include <linux/init.h>
|
2015-08-17 21:00:35 +07:00
|
|
|
#include <linux/bug.h>
|
|
|
|
#include <linux/err.h>
|
2006-02-01 18:05:16 +07:00
|
|
|
#include <asm/io.h>
|
2006-10-01 13:29:12 +07:00
|
|
|
#include <asm/page.h>
|
2006-02-01 18:05:16 +07:00
|
|
|
|
2007-02-03 09:07:15 +07:00
|
|
|
struct device;
|
2015-08-17 21:00:35 +07:00
|
|
|
struct resource;
|
2007-02-03 09:07:15 +07:00
|
|
|
|
2014-02-08 14:51:58 +07:00
|
|
|
__visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
|
2006-06-21 10:03:02 +07:00
|
|
|
void __iowrite64_copy(void __iomem *to, const void *from, size_t count);
|
2006-02-01 18:05:16 +07:00
|
|
|
|
2007-05-15 15:41:02 +07:00
|
|
|
#ifdef CONFIG_MMU
|
2006-10-01 13:29:12 +07:00
|
|
|
int ioremap_page_range(unsigned long addr, unsigned long end,
|
2010-06-18 10:22:40 +07:00
|
|
|
phys_addr_t phys_addr, pgprot_t prot);
|
2007-05-15 15:41:02 +07:00
|
|
|
#else
|
|
|
|
static inline int ioremap_page_range(unsigned long addr, unsigned long end,
|
2010-06-18 10:22:40 +07:00
|
|
|
phys_addr_t phys_addr, pgprot_t prot)
|
2007-05-15 15:41:02 +07:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
2006-10-01 13:29:12 +07:00
|
|
|
|
2015-04-15 05:47:20 +07:00
|
|
|
#ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
|
|
|
|
void __init ioremap_huge_init(void);
|
|
|
|
int arch_ioremap_pud_supported(void);
|
|
|
|
int arch_ioremap_pmd_supported(void);
|
|
|
|
#else
|
|
|
|
static inline void ioremap_huge_init(void) { }
|
|
|
|
#endif
|
|
|
|
|
devres: device resource management
Implement device resource management, in short, devres. A device
driver can allocate arbirary size of devres data which is associated
with a release function. On driver detach, release function is
invoked on the devres data, then, devres data is freed.
devreses are typed by associated release functions. Some devreses are
better represented by single instance of the type while others need
multiple instances sharing the same release function. Both usages are
supported.
devreses can be grouped using devres group such that a device driver
can easily release acquired resources halfway through initialization
or selectively release resources (e.g. resources for port 1 out of 4
ports).
This patch adds devres core including documentation and the following
managed interfaces.
* alloc/free : devm_kzalloc(), devm_kzfree()
* IO region : devm_request_region(), devm_release_region()
* IRQ : devm_request_irq(), devm_free_irq()
* DMA : dmam_alloc_coherent(), dmam_free_coherent(),
dmam_declare_coherent_memory(), dmam_pool_create(),
dmam_pool_destroy()
* PCI : pcim_enable_device(), pcim_pin_device(), pci_is_managed()
* iomap : devm_ioport_map(), devm_ioport_unmap(), devm_ioremap(),
devm_ioremap_nocache(), devm_iounmap(), pcim_iomap_table(),
pcim_iomap(), pcim_iounmap()
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-01-20 14:00:26 +07:00
|
|
|
/*
|
|
|
|
* Managed iomap interface
|
|
|
|
*/
|
2014-04-08 05:39:19 +07:00
|
|
|
#ifdef CONFIG_HAS_IOPORT_MAP
|
devres: device resource management
Implement device resource management, in short, devres. A device
driver can allocate arbirary size of devres data which is associated
with a release function. On driver detach, release function is
invoked on the devres data, then, devres data is freed.
devreses are typed by associated release functions. Some devreses are
better represented by single instance of the type while others need
multiple instances sharing the same release function. Both usages are
supported.
devreses can be grouped using devres group such that a device driver
can easily release acquired resources halfway through initialization
or selectively release resources (e.g. resources for port 1 out of 4
ports).
This patch adds devres core including documentation and the following
managed interfaces.
* alloc/free : devm_kzalloc(), devm_kzfree()
* IO region : devm_request_region(), devm_release_region()
* IRQ : devm_request_irq(), devm_free_irq()
* DMA : dmam_alloc_coherent(), dmam_free_coherent(),
dmam_declare_coherent_memory(), dmam_pool_create(),
dmam_pool_destroy()
* PCI : pcim_enable_device(), pcim_pin_device(), pci_is_managed()
* iomap : devm_ioport_map(), devm_ioport_unmap(), devm_ioremap(),
devm_ioremap_nocache(), devm_iounmap(), pcim_iomap_table(),
pcim_iomap(), pcim_iounmap()
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-01-20 14:00:26 +07:00
|
|
|
void __iomem * devm_ioport_map(struct device *dev, unsigned long port,
|
|
|
|
unsigned int nr);
|
|
|
|
void devm_ioport_unmap(struct device *dev, void __iomem *addr);
|
2007-04-17 14:32:26 +07:00
|
|
|
#else
|
|
|
|
static inline void __iomem *devm_ioport_map(struct device *dev,
|
|
|
|
unsigned long port,
|
|
|
|
unsigned int nr)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
devres: device resource management
Implement device resource management, in short, devres. A device
driver can allocate arbirary size of devres data which is associated
with a release function. On driver detach, release function is
invoked on the devres data, then, devres data is freed.
devreses are typed by associated release functions. Some devreses are
better represented by single instance of the type while others need
multiple instances sharing the same release function. Both usages are
supported.
devreses can be grouped using devres group such that a device driver
can easily release acquired resources halfway through initialization
or selectively release resources (e.g. resources for port 1 out of 4
ports).
This patch adds devres core including documentation and the following
managed interfaces.
* alloc/free : devm_kzalloc(), devm_kzfree()
* IO region : devm_request_region(), devm_release_region()
* IRQ : devm_request_irq(), devm_free_irq()
* DMA : dmam_alloc_coherent(), dmam_free_coherent(),
dmam_declare_coherent_memory(), dmam_pool_create(),
dmam_pool_destroy()
* PCI : pcim_enable_device(), pcim_pin_device(), pci_is_managed()
* iomap : devm_ioport_map(), devm_ioport_unmap(), devm_ioremap(),
devm_ioremap_nocache(), devm_iounmap(), pcim_iomap_table(),
pcim_iomap(), pcim_iounmap()
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-01-20 14:00:26 +07:00
|
|
|
|
2014-07-18 16:36:39 +07:00
|
|
|
#define IOMEM_ERR_PTR(err) (__force void __iomem *)ERR_PTR(err)
|
|
|
|
|
2008-04-29 22:25:48 +07:00
|
|
|
void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,
|
2014-10-07 22:25:43 +07:00
|
|
|
resource_size_t size);
|
2008-04-29 22:25:48 +07:00
|
|
|
void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset,
|
2014-10-07 22:25:43 +07:00
|
|
|
resource_size_t size);
|
2015-02-06 20:45:27 +07:00
|
|
|
void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset,
|
|
|
|
resource_size_t size);
|
devres: device resource management
Implement device resource management, in short, devres. A device
driver can allocate arbirary size of devres data which is associated
with a release function. On driver detach, release function is
invoked on the devres data, then, devres data is freed.
devreses are typed by associated release functions. Some devreses are
better represented by single instance of the type while others need
multiple instances sharing the same release function. Both usages are
supported.
devreses can be grouped using devres group such that a device driver
can easily release acquired resources halfway through initialization
or selectively release resources (e.g. resources for port 1 out of 4
ports).
This patch adds devres core including documentation and the following
managed interfaces.
* alloc/free : devm_kzalloc(), devm_kzfree()
* IO region : devm_request_region(), devm_release_region()
* IRQ : devm_request_irq(), devm_free_irq()
* DMA : dmam_alloc_coherent(), dmam_free_coherent(),
dmam_declare_coherent_memory(), dmam_pool_create(),
dmam_pool_destroy()
* PCI : pcim_enable_device(), pcim_pin_device(), pci_is_managed()
* iomap : devm_ioport_map(), devm_ioport_unmap(), devm_ioremap(),
devm_ioremap_nocache(), devm_iounmap(), pcim_iomap_table(),
pcim_iomap(), pcim_iounmap()
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-01-20 14:00:26 +07:00
|
|
|
void devm_iounmap(struct device *dev, void __iomem *addr);
|
2007-07-16 13:41:38 +07:00
|
|
|
int check_signature(const volatile void __iomem *io_addr,
|
|
|
|
const unsigned char *signature, int length);
|
2008-05-03 03:34:04 +07:00
|
|
|
void devm_ioremap_release(struct device *dev, void *res);
|
2006-10-11 15:22:02 +07:00
|
|
|
|
2015-08-11 10:07:07 +07:00
|
|
|
void *devm_memremap(struct device *dev, resource_size_t offset,
|
|
|
|
size_t size, unsigned long flags);
|
|
|
|
void devm_memunmap(struct device *dev, void *addr);
|
|
|
|
|
2015-08-17 21:00:35 +07:00
|
|
|
void *__devm_memremap_pages(struct device *dev, struct resource *res);
|
|
|
|
|
|
|
|
#ifdef CONFIG_ZONE_DEVICE
|
|
|
|
void *devm_memremap_pages(struct device *dev, struct resource *res);
|
|
|
|
#else
|
|
|
|
static inline void *devm_memremap_pages(struct device *dev, struct resource *res)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Fail attempts to call devm_memremap_pages() without
|
|
|
|
* ZONE_DEVICE support enabled, this requires callers to fall
|
|
|
|
* back to plain devm_memremap() based on config
|
|
|
|
*/
|
|
|
|
WARN_ON_ONCE(1);
|
|
|
|
return ERR_PTR(-ENXIO);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-07-11 12:18:44 +07:00
|
|
|
/*
|
|
|
|
* Some systems do not have legacy ISA devices.
|
|
|
|
* /dev/port is not a valid interface on these systems.
|
|
|
|
* So for those archs, <asm/io.h> should define the following symbol.
|
|
|
|
*/
|
|
|
|
#ifndef arch_has_dev_port
|
|
|
|
#define arch_has_dev_port() (1)
|
|
|
|
#endif
|
|
|
|
|
2013-05-14 06:58:40 +07:00
|
|
|
/*
|
|
|
|
* Some systems (x86 without PAT) have a somewhat reliable way to mark a
|
|
|
|
* physical address range such that uncached mappings will actually
|
|
|
|
* end up write-combining. This facility should be used in conjunction
|
|
|
|
* with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has
|
|
|
|
* no effect if the per-page mechanisms are functional.
|
|
|
|
* (On x86 without PAT, these functions manipulate MTRRs.)
|
|
|
|
*
|
|
|
|
* arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed
|
|
|
|
* to have no effect.
|
|
|
|
*/
|
|
|
|
#ifndef arch_phys_wc_add
|
|
|
|
static inline int __must_check arch_phys_wc_add(unsigned long base,
|
|
|
|
unsigned long size)
|
|
|
|
{
|
|
|
|
return 0; /* It worked (i.e. did nothing). */
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void arch_phys_wc_del(int handle)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
#define arch_phys_wc_add arch_phys_wc_add
|
2015-05-26 15:28:13 +07:00
|
|
|
#ifndef arch_phys_wc_index
|
|
|
|
static inline int arch_phys_wc_index(int handle)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
#define arch_phys_wc_index arch_phys_wc_index
|
|
|
|
#endif
|
2013-05-14 06:58:40 +07:00
|
|
|
#endif
|
|
|
|
|
2015-08-11 10:07:06 +07:00
|
|
|
enum {
|
|
|
|
/* See memremap() kernel-doc for usage description... */
|
|
|
|
MEMREMAP_WB = 1 << 0,
|
|
|
|
MEMREMAP_WT = 1 << 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
void *memremap(resource_size_t offset, size_t size, unsigned long flags);
|
|
|
|
void memunmap(void *addr);
|
|
|
|
|
2006-02-01 18:05:16 +07:00
|
|
|
#endif /* _LINUX_IO_H */
|