33 #include <linux/module.h>
36 #include <linux/errno.h>
37 #include <linux/pci.h>
39 #include <linux/signal.h>
43 #define DRIVER_VERSION "0.2"
45 #define DRIVER_DESC "ZT5550 CompactPCI Hot Plug Driver"
47 #define MY_NAME "cpcihp_zt5550"
49 #define dbg(format, arg...) \
52 printk (KERN_DEBUG "%s: " format "\n", \
55 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
56 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
57 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
66 static struct pci_dev *bus0_dev;
73 static void __iomem *hc_registers;
74 static void __iomem *csr_hc_index;
75 static void __iomem *csr_hc_data;
76 static void __iomem *csr_int_status;
77 static void __iomem *csr_int_mask;
80 static int zt5550_hc_config(
struct pci_dev *pdev)
86 err(
"too many host controller devices?");
92 err(
"cannot enable %s\n", pci_name(pdev));
97 dbg(
"hc_dev = %p", hc_dev);
103 err(
"cannot reserve MMIO region");
105 goto exit_disable_device;
111 err(
"cannot remap MMIO region %llx @ %llx",
115 goto exit_release_region;
126 dbg(
"disabling host control, fault and serial interrupts");
129 dbg(
"disabled host control, fault and serial interrupts");
134 dbg(
"disabling timer0, timer1 and ENUM interrupts");
136 dbg(
"disabled timer0, timer1 and ENUM interrupts");
147 static int zt5550_hc_cleanup(
void)
159 static int zt5550_hc_query_enum(
void)
164 return ((value &
ENUM_MASK) == ENUM_MASK);
167 static int zt5550_hc_check_irq(
void *
dev_id)
173 if(dev_id == zt5550_hpc.dev_id) {
174 reg =
readb(csr_int_status);
181 static int zt5550_hc_enable_irq(
void)
188 reg =
readb(csr_int_mask);
190 writeb(reg, csr_int_mask);
194 static int zt5550_hc_disable_irq(
void)
202 reg =
readb(csr_int_mask);
204 writeb(reg, csr_int_mask);
212 status = zt5550_hc_config(pdev);
216 dbg(
"returned from zt5550_hc_config");
219 zt5550_hpc_ops.query_enum = zt5550_hc_query_enum;
220 zt5550_hpc.ops = &zt5550_hpc_ops;
222 zt5550_hpc.irq = hc_dev->
irq;
224 zt5550_hpc.dev_id = hc_dev;
226 zt5550_hpc_ops.enable_irq = zt5550_hc_enable_irq;
227 zt5550_hpc_ops.disable_irq = zt5550_hc_disable_irq;
228 zt5550_hpc_ops.check_irq = zt5550_hc_check_irq;
230 info(
"using ENUM# polling mode");
235 err(
"could not register cPCI hotplug controller");
238 dbg(
"registered controller");
244 goto init_register_error;
251 err(
"could not register cPCI hotplug bus");
252 goto init_register_error;
254 dbg(
"registered bus");
258 err(
"could not started cPCI hotplug system");
260 goto init_register_error;
262 dbg(
"started cpci hp system");
268 err(
"status = %d", status);
291 .id_table = zt5550_hc_pci_tbl,
292 .probe = zt5550_hc_init_one,
296 static int __init zt5550_init(
void)
306 rc = pci_register_driver(&zt5550_hc_driver);