1b4a5ddb12
Add helper macro builtin_mips_cdmm_driver() for builtin CDMM drivers that don't do anything special in init and have no exit. The module_mips_cdmm_driver() helper isn't really appropriate for drivers that can't be built as a module. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Slaby <jslaby@suse.com> Cc: linux-mips@linux-mips.org Cc: <stable@vger.kernel.org> # 4.2.x- Patchwork: http://patchwork.linux-mips.org/patch/11264/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
110 lines
3.7 KiB
C
110 lines
3.7 KiB
C
/*
|
|
* 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 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 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)
|
|
|
|
/*
|
|
* builtin_mips_cdmm_driver() - Helper macro for drivers that don't do anything
|
|
* special in init and have no exit. This eliminates some boilerplate. Each
|
|
* driver may only use this macro once, and calling it replaces device_initcall
|
|
* (or in some cases, the legacy __initcall). This is meant to be a direct
|
|
* parallel of module_mips_cdmm_driver() above but without the __exit stuff that
|
|
* is not used for builtin cases.
|
|
*/
|
|
#define builtin_mips_cdmm_driver(__mips_cdmm_driver) \
|
|
builtin_driver(__mips_cdmm_driver, mips_cdmm_driver_register)
|
|
|
|
/* 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 */
|