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