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