summaryrefslogtreecommitdiff
path: root/arch/mips/include/asm/cdmm.h
blob: 16e22ce9719fdf7b801bd7c003fc916019d9dd71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2014 Imagination Technologies Ltd.
 */
#ifndef __ASM_CDMM_H
#define __ASM_CDMM_H

#include <linux/device.h>
#include <linux/mod_devicetable.h>

/**
 * struct mips_cdmm_device - Represents a single device on a CDMM bus.
 * @dev:	Driver model device object.
 * @cpu:	CPU which can access this device.
 * @res:	MMIO resource.
 * @type:	Device type identifier.
 * @rev:	Device revision number.
 */
struct mips_cdmm_device {
	struct device		dev;
	unsigned int		cpu;
	struct resource		res;
	unsigned int		type;
	unsigned int		rev;
};

/**
 * struct mips_cdmm_driver - Represents a driver for a CDMM device.
 * @drv:	Driver model driver object.
 * @probe	Callback for probing newly discovered devices.
 * @remove:	Callback to remove the device.
 * @shutdown:	Callback on system shutdown.
 * @cpu_down:	Callback when the parent CPU is going down.
 *		Any CPU pinned threads/timers should be disabled.
 * @cpu_up:	Callback when the parent CPU is coming back up again.
 *		CPU pinned threads/timers can be restarted.
 * @id_table:	Table for CDMM IDs to match against.
 */
struct mips_cdmm_driver {
	struct device_driver	drv;
	int			(*probe)(struct mips_cdmm_device *);
	int			(*remove)(struct mips_cdmm_device *);
	void			(*shutdown)(struct mips_cdmm_device *);
	int			(*cpu_down)(struct mips_cdmm_device *);
	int			(*cpu_up)(struct mips_cdmm_device *);
	const struct mips_cdmm_device_id *id_table;
};

/**
 * mips_cdmm_phys_base() - Choose a physical base address for CDMM region.
 *
 * Picking a suitable physical address at which to map the CDMM region is
 * platform specific, so this weak function can be defined by platform code to
 * pick a suitable value if none is configured by the bootloader.
 *
 * This address must be 32kB aligned, and the region occupies a maximum of 32kB
 * of physical address space which must not be used for anything else.
 *
 * Returns:	Physical base address for CDMM region, or 0 on failure.
 */
phys_addr_t __weak mips_cdmm_phys_base(void);

extern struct bus_type mips_cdmm_bustype;
void __iomem *mips_cdmm_early_probe(unsigned int dev_type);

#define to_mips_cdmm_device(d)	container_of(d, struct mips_cdmm_device, dev)

#define mips_cdmm_get_drvdata(d)	dev_get_drvdata(&d->dev)
#define mips_cdmm_set_drvdata(d, p)	dev_set_drvdata(&d->dev, p)

int mips_cdmm_driver_register(struct mips_cdmm_driver *);
void mips_cdmm_driver_unregister(struct mips_cdmm_driver *);

/*
 * module_mips_cdmm_driver() - Helper macro for drivers that don't do
 * anything special in module init/exit.  This eliminates a lot of
 * boilerplate.  Each module may only use this macro once, and
 * calling it replaces module_init() and module_exit()
 */
#define module_mips_cdmm_driver(__mips_cdmm_driver) \
	module_driver(__mips_cdmm_driver, mips_cdmm_driver_register, \
			mips_cdmm_driver_unregister)

/* drivers/tty/mips_ejtag_fdc.c */

#ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
int setup_early_fdc_console(void);
#else
static inline int setup_early_fdc_console(void)
{
	return -ENODEV;
}
#endif

#endif /* __ASM_CDMM_H */