1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * CompactPCI Hot Plug Core Functions 4 * 5 * Copyright (C) 2002 SOMA Networks, Inc. 6 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) 7 * Copyright (C) 2001 IBM Corp. 8 * 9 * All rights reserved. 10 * 11 * Send feedback to <scottm@somanetworks.com> 12 */ 13 14 #ifndef _CPCI_HOTPLUG_H 15 #define _CPCI_HOTPLUG_H 16 17 #include <linux/types.h> 18 #include <linux/pci.h> 19 #include <linux/pci_hotplug.h> 20 21 /* PICMG 2.1 R2.0 HS CSR bits: */ 22 #define HS_CSR_INS 0x0080 23 #define HS_CSR_EXT 0x0040 24 #define HS_CSR_PI 0x0030 25 #define HS_CSR_LOO 0x0008 26 #define HS_CSR_PIE 0x0004 27 #define HS_CSR_EIM 0x0002 28 #define HS_CSR_DHA 0x0001 29 30 struct slot { 31 u8 number; 32 unsigned int devfn; 33 struct pci_bus *bus; 34 struct pci_dev *dev; 35 unsigned int latch_status:1; 36 unsigned int adapter_status:1; 37 unsigned int extracting; 38 struct hotplug_slot hotplug_slot; 39 struct list_head slot_list; 40 }; 41 42 struct cpci_hp_controller_ops { 43 int (*query_enum)(void); 44 int (*enable_irq)(void); 45 int (*disable_irq)(void); 46 int (*check_irq)(void *dev_id); 47 u8 (*get_power)(struct slot *slot); 48 int (*set_power)(struct slot *slot, int value); 49 }; 50 51 struct cpci_hp_controller { 52 unsigned int irq; 53 unsigned long irq_flags; 54 char *devname; 55 void *dev_id; 56 char *name; 57 struct cpci_hp_controller_ops *ops; 58 }; 59 60 static inline const char *slot_name(struct slot *slot) 61 { 62 return hotplug_slot_name(&slot->hotplug_slot); 63 } 64 65 static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot) 66 { 67 return container_of(hotplug_slot, struct slot, hotplug_slot); 68 } 69 70 int cpci_hp_register_controller(struct cpci_hp_controller *controller); 71 int cpci_hp_unregister_controller(struct cpci_hp_controller *controller); 72 int cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last); 73 int cpci_hp_unregister_bus(struct pci_bus *bus); 74 int cpci_hp_start(void); 75 int cpci_hp_stop(void); 76 77 /* Global variables */ 78 extern int cpci_debug; 79 80 /* 81 * Internal function prototypes, these functions should not be used by 82 * board/chassis drivers. 83 */ 84 u8 cpci_get_attention_status(struct slot *slot); 85 u16 cpci_get_hs_csr(struct slot *slot); 86 int cpci_set_attention_status(struct slot *slot, int status); 87 int cpci_check_and_clear_ins(struct slot *slot); 88 int cpci_check_ext(struct slot *slot); 89 int cpci_clear_ext(struct slot *slot); 90 int cpci_led_on(struct slot *slot); 91 int cpci_led_off(struct slot *slot); 92 int cpci_configure_slot(struct slot *slot); 93 int cpci_unconfigure_slot(struct slot *slot); 94 95 #ifdef CONFIG_HOTPLUG_PCI_CPCI 96 int cpci_hotplug_init(int debug); 97 #else 98 static inline int cpci_hotplug_init(int debug) { return 0; } 99 #endif 100 101 #endif /* _CPCI_HOTPLUG_H */ 102