xref: /OK3568_Linux_fs/kernel/arch/powerpc/include/asm/macio.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __MACIO_ASIC_H__
3*4882a593Smuzhiyun #define __MACIO_ASIC_H__
4*4882a593Smuzhiyun #ifdef __KERNEL__
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/of_device.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun extern struct bus_type macio_bus_type;
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /* MacIO device driver is defined later */
11*4882a593Smuzhiyun struct macio_driver;
12*4882a593Smuzhiyun struct macio_chip;
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define MACIO_DEV_COUNT_RESOURCES	8
15*4882a593Smuzhiyun #define MACIO_DEV_COUNT_IRQS		8
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /*
18*4882a593Smuzhiyun  * the macio_bus structure is used to describe a "virtual" bus
19*4882a593Smuzhiyun  * within a MacIO ASIC. It's typically provided by a macio_pci_asic
20*4882a593Smuzhiyun  * PCI device, but could be provided differently as well (nubus
21*4882a593Smuzhiyun  * machines using a fake OF tree).
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * The pdev field can be NULL on non-PCI machines
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun struct macio_bus
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun 	struct macio_chip	*chip;		/* macio_chip (private use) */
28*4882a593Smuzhiyun 	int			index;		/* macio chip index in system */
29*4882a593Smuzhiyun #ifdef CONFIG_PCI
30*4882a593Smuzhiyun 	struct pci_dev		*pdev;		/* PCI device hosting this bus */
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /*
35*4882a593Smuzhiyun  * the macio_dev structure is used to describe a device
36*4882a593Smuzhiyun  * within an Apple MacIO ASIC.
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun struct macio_dev
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	struct macio_bus	*bus;		/* macio bus this device is on */
41*4882a593Smuzhiyun 	struct macio_dev	*media_bay;	/* Device is part of a media bay */
42*4882a593Smuzhiyun 	struct platform_device	ofdev;
43*4882a593Smuzhiyun 	struct device_dma_parameters dma_parms; /* ide needs that */
44*4882a593Smuzhiyun 	int			n_resources;
45*4882a593Smuzhiyun 	struct resource		resource[MACIO_DEV_COUNT_RESOURCES];
46*4882a593Smuzhiyun 	int			n_interrupts;
47*4882a593Smuzhiyun 	struct resource		interrupt[MACIO_DEV_COUNT_IRQS];
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun #define	to_macio_device(d) container_of(d, struct macio_dev, ofdev.dev)
50*4882a593Smuzhiyun #define	of_to_macio_device(d) container_of(d, struct macio_dev, ofdev)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun extern struct macio_dev *macio_dev_get(struct macio_dev *dev);
53*4882a593Smuzhiyun extern void macio_dev_put(struct macio_dev *dev);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /*
56*4882a593Smuzhiyun  * Accessors to resources & interrupts and other device
57*4882a593Smuzhiyun  * fields
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun 
macio_resource_count(struct macio_dev * dev)60*4882a593Smuzhiyun static inline int macio_resource_count(struct macio_dev *dev)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	return dev->n_resources;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
macio_resource_start(struct macio_dev * dev,int resource_no)65*4882a593Smuzhiyun static inline unsigned long macio_resource_start(struct macio_dev *dev, int resource_no)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	return dev->resource[resource_no].start;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
macio_resource_end(struct macio_dev * dev,int resource_no)70*4882a593Smuzhiyun static inline unsigned long macio_resource_end(struct macio_dev *dev, int resource_no)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	return dev->resource[resource_no].end;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun 
macio_resource_len(struct macio_dev * dev,int resource_no)75*4882a593Smuzhiyun static inline unsigned long macio_resource_len(struct macio_dev *dev, int resource_no)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	struct resource *res = &dev->resource[resource_no];
78*4882a593Smuzhiyun 	if (res->start == 0 || res->end == 0 || res->end < res->start)
79*4882a593Smuzhiyun 		return 0;
80*4882a593Smuzhiyun 	return resource_size(res);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun extern int macio_enable_devres(struct macio_dev *dev);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun extern int macio_request_resource(struct macio_dev *dev, int resource_no, const char *name);
86*4882a593Smuzhiyun extern void macio_release_resource(struct macio_dev *dev, int resource_no);
87*4882a593Smuzhiyun extern int macio_request_resources(struct macio_dev *dev, const char *name);
88*4882a593Smuzhiyun extern void macio_release_resources(struct macio_dev *dev);
89*4882a593Smuzhiyun 
macio_irq_count(struct macio_dev * dev)90*4882a593Smuzhiyun static inline int macio_irq_count(struct macio_dev *dev)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun 	return dev->n_interrupts;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
macio_irq(struct macio_dev * dev,int irq_no)95*4882a593Smuzhiyun static inline int macio_irq(struct macio_dev *dev, int irq_no)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun 	return dev->interrupt[irq_no].start;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
macio_set_drvdata(struct macio_dev * dev,void * data)100*4882a593Smuzhiyun static inline void macio_set_drvdata(struct macio_dev *dev, void *data)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	dev_set_drvdata(&dev->ofdev.dev, data);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
macio_get_drvdata(struct macio_dev * dev)105*4882a593Smuzhiyun static inline void* macio_get_drvdata(struct macio_dev *dev)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	return dev_get_drvdata(&dev->ofdev.dev);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
macio_get_of_node(struct macio_dev * mdev)110*4882a593Smuzhiyun static inline struct device_node *macio_get_of_node(struct macio_dev *mdev)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun 	return mdev->ofdev.dev.of_node;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #ifdef CONFIG_PCI
macio_get_pci_dev(struct macio_dev * mdev)116*4882a593Smuzhiyun static inline struct pci_dev *macio_get_pci_dev(struct macio_dev *mdev)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun 	return mdev->bus->pdev;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun #endif
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /*
123*4882a593Smuzhiyun  * A driver for a mac-io chip based device
124*4882a593Smuzhiyun  */
125*4882a593Smuzhiyun struct macio_driver
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	int	(*probe)(struct macio_dev* dev, const struct of_device_id *match);
128*4882a593Smuzhiyun 	int	(*remove)(struct macio_dev* dev);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	int	(*suspend)(struct macio_dev* dev, pm_message_t state);
131*4882a593Smuzhiyun 	int	(*resume)(struct macio_dev* dev);
132*4882a593Smuzhiyun 	int	(*shutdown)(struct macio_dev* dev);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #ifdef CONFIG_PMAC_MEDIABAY
135*4882a593Smuzhiyun 	void	(*mediabay_event)(struct macio_dev* dev, int mb_state);
136*4882a593Smuzhiyun #endif
137*4882a593Smuzhiyun 	struct device_driver	driver;
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun #define	to_macio_driver(drv) container_of(drv,struct macio_driver, driver)
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun extern int macio_register_driver(struct macio_driver *);
142*4882a593Smuzhiyun extern void macio_unregister_driver(struct macio_driver *);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #endif /* __KERNEL__ */
145*4882a593Smuzhiyun #endif /* __MACIO_ASIC_H__ */
146