1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * This file is subject to the terms and conditions of the GNU General Public
3*4882a593Smuzhiyun * License. See the file "COPYING" in the main directory of this archive
4*4882a593Smuzhiyun * for more details.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (C) 2014 Imagination Technologies Ltd.
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #ifndef __ASM_CDMM_H
9*4882a593Smuzhiyun #define __ASM_CDMM_H
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/device.h>
12*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /**
15*4882a593Smuzhiyun * struct mips_cdmm_device - Represents a single device on a CDMM bus.
16*4882a593Smuzhiyun * @dev: Driver model device object.
17*4882a593Smuzhiyun * @cpu: CPU which can access this device.
18*4882a593Smuzhiyun * @res: MMIO resource.
19*4882a593Smuzhiyun * @type: Device type identifier.
20*4882a593Smuzhiyun * @rev: Device revision number.
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun struct mips_cdmm_device {
23*4882a593Smuzhiyun struct device dev;
24*4882a593Smuzhiyun unsigned int cpu;
25*4882a593Smuzhiyun struct resource res;
26*4882a593Smuzhiyun unsigned int type;
27*4882a593Smuzhiyun unsigned int rev;
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun /**
31*4882a593Smuzhiyun * struct mips_cdmm_driver - Represents a driver for a CDMM device.
32*4882a593Smuzhiyun * @drv: Driver model driver object.
33*4882a593Smuzhiyun * @probe Callback for probing newly discovered devices.
34*4882a593Smuzhiyun * @remove: Callback to remove the device.
35*4882a593Smuzhiyun * @shutdown: Callback on system shutdown.
36*4882a593Smuzhiyun * @cpu_down: Callback when the parent CPU is going down.
37*4882a593Smuzhiyun * Any CPU pinned threads/timers should be disabled.
38*4882a593Smuzhiyun * @cpu_up: Callback when the parent CPU is coming back up again.
39*4882a593Smuzhiyun * CPU pinned threads/timers can be restarted.
40*4882a593Smuzhiyun * @id_table: Table for CDMM IDs to match against.
41*4882a593Smuzhiyun */
42*4882a593Smuzhiyun struct mips_cdmm_driver {
43*4882a593Smuzhiyun struct device_driver drv;
44*4882a593Smuzhiyun int (*probe)(struct mips_cdmm_device *);
45*4882a593Smuzhiyun int (*remove)(struct mips_cdmm_device *);
46*4882a593Smuzhiyun void (*shutdown)(struct mips_cdmm_device *);
47*4882a593Smuzhiyun int (*cpu_down)(struct mips_cdmm_device *);
48*4882a593Smuzhiyun int (*cpu_up)(struct mips_cdmm_device *);
49*4882a593Smuzhiyun const struct mips_cdmm_device_id *id_table;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /**
53*4882a593Smuzhiyun * mips_cdmm_phys_base() - Choose a physical base address for CDMM region.
54*4882a593Smuzhiyun *
55*4882a593Smuzhiyun * Picking a suitable physical address at which to map the CDMM region is
56*4882a593Smuzhiyun * platform specific, so this function can be defined by platform code to
57*4882a593Smuzhiyun * pick a suitable value if none is configured by the bootloader.
58*4882a593Smuzhiyun *
59*4882a593Smuzhiyun * This address must be 32kB aligned, and the region occupies a maximum of 32kB
60*4882a593Smuzhiyun * of physical address space which must not be used for anything else.
61*4882a593Smuzhiyun *
62*4882a593Smuzhiyun * Returns: Physical base address for CDMM region, or 0 on failure.
63*4882a593Smuzhiyun */
64*4882a593Smuzhiyun phys_addr_t mips_cdmm_phys_base(void);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun extern struct bus_type mips_cdmm_bustype;
67*4882a593Smuzhiyun void __iomem *mips_cdmm_early_probe(unsigned int dev_type);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun #define to_mips_cdmm_device(d) container_of(d, struct mips_cdmm_device, dev)
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #define mips_cdmm_get_drvdata(d) dev_get_drvdata(&d->dev)
72*4882a593Smuzhiyun #define mips_cdmm_set_drvdata(d, p) dev_set_drvdata(&d->dev, p)
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun int mips_cdmm_driver_register(struct mips_cdmm_driver *);
75*4882a593Smuzhiyun void mips_cdmm_driver_unregister(struct mips_cdmm_driver *);
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun * module_mips_cdmm_driver() - Helper macro for drivers that don't do
79*4882a593Smuzhiyun * anything special in module init/exit. This eliminates a lot of
80*4882a593Smuzhiyun * boilerplate. Each module may only use this macro once, and
81*4882a593Smuzhiyun * calling it replaces module_init() and module_exit()
82*4882a593Smuzhiyun */
83*4882a593Smuzhiyun #define module_mips_cdmm_driver(__mips_cdmm_driver) \
84*4882a593Smuzhiyun module_driver(__mips_cdmm_driver, mips_cdmm_driver_register, \
85*4882a593Smuzhiyun mips_cdmm_driver_unregister)
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun /*
88*4882a593Smuzhiyun * builtin_mips_cdmm_driver() - Helper macro for drivers that don't do anything
89*4882a593Smuzhiyun * special in init and have no exit. This eliminates some boilerplate. Each
90*4882a593Smuzhiyun * driver may only use this macro once, and calling it replaces device_initcall
91*4882a593Smuzhiyun * (or in some cases, the legacy __initcall). This is meant to be a direct
92*4882a593Smuzhiyun * parallel of module_mips_cdmm_driver() above but without the __exit stuff that
93*4882a593Smuzhiyun * is not used for builtin cases.
94*4882a593Smuzhiyun */
95*4882a593Smuzhiyun #define builtin_mips_cdmm_driver(__mips_cdmm_driver) \
96*4882a593Smuzhiyun builtin_driver(__mips_cdmm_driver, mips_cdmm_driver_register)
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /* drivers/tty/mips_ejtag_fdc.c */
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun #ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
101*4882a593Smuzhiyun int setup_early_fdc_console(void);
102*4882a593Smuzhiyun #else
setup_early_fdc_console(void)103*4882a593Smuzhiyun static inline int setup_early_fdc_console(void)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun return -ENODEV;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun #endif
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun #endif /* __ASM_CDMM_H */
110