satip-axe/kernel/include/linux/stm/pci-glue.h

129 lines
4.0 KiB
C

/*
* (c) 2010 STMicroelectronics Limited
*
* Author: David Mckay <david.mckay@st.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Arch specific glue to join up the main stm pci driver in drivers/stm/
* to the specific PCI arch code.
*
*/
#ifndef __LINUX_STM_PCI_GLUE_H
#define __LINUX_STM_PCI_GLUE_H
#include <linux/pci.h>
/*
* This function takes the information filled in by the arch independant code
* and hooks it up to the arch specific stuff. The arch independant code lives
* in drivers/stm/pcie.c or drivers/stm/pci.c
*
* If this function needs to allocate memory it should use devm_kzalloc()
*/
enum stm_pci_type {STM_PCI_EMISS, STM_PCI_EXPRESS};
int __devinit stm_pci_register_controller(struct platform_device *pdev,
struct pci_ops *config_ops,
enum stm_pci_type type);
/*
* Given a pci bus, return the corresponding platform device that created it
* in the first place. Must be called with a bus that has as it's root
* controller an interface registered via above mechanism
*/
struct platform_device *stm_pci_bus_to_platform(struct pci_bus *bus);
/* Returns what type of bus this bus is ultimately connected to */
enum stm_pci_type stm_pci_controller_type(struct pci_bus *bus);
/* For a given pci express device, return the legacy interrupt number ie INTA.
* Must be called on a device that has it's root bus registered via the above
* function. Will return -EINVAL if called on a non-express bus which doesn't
* have the concept of a legacy interrupt
*/
int stm_pci_legacy_irq(struct pci_dev *dev);
#ifdef CONFIG_STM_PCI_EMISS
/* IO functions for the EMISS PCI controller. Unfortunately
* you have to actually run code to do an IO transaction,
* rather than just dereference it, this complicates it
* considerably
*/
u8 pci_emiss_inb(unsigned long port);
u16 pci_emiss_inw(unsigned long port);
u32 pci_emiss_inl(unsigned long port);
u8 pci_emiss_inb_p(unsigned long port);
u16 pci_emiss_inw_p(unsigned long port);
u32 pci_emiss_inl_p(unsigned long port);
void pci_emiss_insb(unsigned long port, void *dst, unsigned long count);
void pci_emiss_insw(unsigned long port, void *dst, unsigned long count);
void pci_emiss_insl(unsigned long port, void *dst, unsigned long count);
void pci_emiss_outb(u8 val, unsigned long port);
void pci_emiss_outw(u16 val, unsigned long port);
void pci_emiss_outl(u32 val, unsigned long port);
void pci_emiss_outb_p(u8 val, unsigned long port);
void pci_emiss_outw_p(u16 val, unsigned long port);
void pci_emiss_outl_p(u32 val, unsigned long port);
void pci_emiss_outsb(unsigned long port, const void *src,
unsigned long count);
void pci_emiss_outsw(unsigned long port, const void *src,
unsigned long count);
void pci_emiss_outsl(unsigned long port, const void *src,
unsigned long count);
#endif
#ifdef CONFIG_SUPERH
/*
* Defines macros to plug in the EMISS IO functions into the
* SH4 machine vector
*
* We have to hook all the in/out functions as they cannot be memory
* mapped with the emiss PCI IP
*
* Also, for PCI we use the generic iomap implementation, and so do
* not need the ioport_map function, instead using the generic cookie
* based implementation.
*
*/
#ifdef CONFIG_STM_PCI_EMISS
#define STM_PCI_IO_MACHINE_VEC \
.mv_inb = pci_emiss_inb, \
.mv_inw = pci_emiss_inw, \
.mv_inl = pci_emiss_inl, \
.mv_outb = pci_emiss_outb, \
.mv_outw = pci_emiss_outw, \
.mv_outl = pci_emiss_outl, \
.mv_inb_p = pci_emiss_inb_p, \
.mv_inw_p = pci_emiss_inw, \
.mv_inl_p = pci_emiss_inl, \
.mv_outb_p = pci_emiss_outb_p, \
.mv_outw_p = pci_emiss_outw, \
.mv_outl_p = pci_emiss_outl, \
.mv_insb = pci_emiss_insb, \
.mv_insw = pci_emiss_insw, \
.mv_insl = pci_emiss_insl, \
.mv_outsb = pci_emiss_outsb, \
.mv_outsw = pci_emiss_outsw, \
.mv_outsl = pci_emiss_outsl,
#else
#define STM_PCI_IO_MACHINE_VEC
#endif /* CONFIG_STM_PCI_EMISS */
#endif /* CONFIG_SUPERH */
#endif /* __LINUX_STM_PCI_GLUE_H */