162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  arch/arm/include/asm/mach/pci.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2000 Russell King
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __ASM_MACH_PCI_H
962306a36Sopenharmony_ci#define __ASM_MACH_PCI_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/ioport.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct pci_sys_data;
1462306a36Sopenharmony_cistruct pci_ops;
1562306a36Sopenharmony_cistruct pci_bus;
1662306a36Sopenharmony_cistruct pci_host_bridge;
1762306a36Sopenharmony_cistruct device;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct hw_pci {
2062306a36Sopenharmony_ci	struct pci_ops	*ops;
2162306a36Sopenharmony_ci	int		nr_controllers;
2262306a36Sopenharmony_ci	void		**private_data;
2362306a36Sopenharmony_ci	int		(*setup)(int nr, struct pci_sys_data *);
2462306a36Sopenharmony_ci	int		(*scan)(int nr, struct pci_host_bridge *);
2562306a36Sopenharmony_ci	void		(*preinit)(void);
2662306a36Sopenharmony_ci	void		(*postinit)(void);
2762306a36Sopenharmony_ci	u8		(*swizzle)(struct pci_dev *dev, u8 *pin);
2862306a36Sopenharmony_ci	int		(*map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * Per-controller structure
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_cistruct pci_sys_data {
3562306a36Sopenharmony_ci	struct list_head node;
3662306a36Sopenharmony_ci	int		busnr;		/* primary bus number			*/
3762306a36Sopenharmony_ci	u64		mem_offset;	/* bus->cpu memory mapping offset	*/
3862306a36Sopenharmony_ci	unsigned long	io_offset;	/* bus->cpu IO mapping offset		*/
3962306a36Sopenharmony_ci	struct pci_bus	*bus;		/* PCI bus				*/
4062306a36Sopenharmony_ci	struct list_head resources;	/* root bus resources (apertures)       */
4162306a36Sopenharmony_ci	struct resource io_res;
4262306a36Sopenharmony_ci	char		io_res_name[12];
4362306a36Sopenharmony_ci					/* Bridge swizzling			*/
4462306a36Sopenharmony_ci	u8		(*swizzle)(struct pci_dev *, u8 *);
4562306a36Sopenharmony_ci					/* IRQ mapping				*/
4662306a36Sopenharmony_ci	int		(*map_irq)(const struct pci_dev *, u8, u8);
4762306a36Sopenharmony_ci	void		*private_data;	/* platform controller private data	*/
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Call this with your hw_pci struct to initialise the PCI system.
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_civoid pci_common_init_dev(struct device *, struct hw_pci *);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/*
5662306a36Sopenharmony_ci * Compatibility wrapper for older platforms that do not care about
5762306a36Sopenharmony_ci * passing the parent device.
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_cistatic inline void pci_common_init(struct hw_pci *hw)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	pci_common_init_dev(NULL, hw);
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci/*
6562306a36Sopenharmony_ci * Setup early fixed I/O mapping.
6662306a36Sopenharmony_ci */
6762306a36Sopenharmony_ci#if defined(CONFIG_PCI)
6862306a36Sopenharmony_ciextern void pci_map_io_early(unsigned long pfn);
6962306a36Sopenharmony_ci#else
7062306a36Sopenharmony_cistatic inline void pci_map_io_early(unsigned long pfn) {}
7162306a36Sopenharmony_ci#endif
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/*
7462306a36Sopenharmony_ci * PCI controllers
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_ciextern struct pci_ops iop3xx_ops;
7762306a36Sopenharmony_ciextern int iop3xx_pci_setup(int nr, struct pci_sys_data *);
7862306a36Sopenharmony_ciextern void iop3xx_pci_preinit(void);
7962306a36Sopenharmony_ciextern void iop3xx_pci_preinit_cond(void);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciextern struct pci_ops dc21285_ops;
8262306a36Sopenharmony_ciextern int dc21285_setup(int nr, struct pci_sys_data *);
8362306a36Sopenharmony_ciextern void dc21285_preinit(void);
8462306a36Sopenharmony_ciextern void dc21285_postinit(void);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#endif /* __ASM_MACH_PCI_H */
87