Loading drivers/block/xsysace.c +89 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,10 @@ #include <linux/blkdev.h> #include <linux/hdreg.h> #include <linux/platform_device.h> #if defined(CONFIG_OF) #include <linux/of_device.h> #include <linux/of_platform.h> #endif MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); MODULE_DESCRIPTION("Xilinx SystemACE device driver"); Loading Loading @@ -1157,6 +1161,85 @@ static struct platform_driver ace_platform_driver = { }, }; /* --------------------------------------------------------------------- * OF_Platform Bus Support */ #if defined(CONFIG_OF) static int __devinit ace_of_probe(struct of_device *op, const struct of_device_id *match) { struct resource res; unsigned long physaddr; const u32 *id; int irq, bus_width, rc; dev_dbg(&op->dev, "ace_of_probe(%p, %p)\n", op, match); /* device id */ id = of_get_property(op->node, "port-number", NULL); /* physaddr */ rc = of_address_to_resource(op->node, 0, &res); if (rc) { dev_err(&op->dev, "invalid address\n"); return rc; } physaddr = res.start; /* irq */ irq = irq_of_parse_and_map(op->node, 0); /* bus width */ bus_width = ACE_BUS_WIDTH_16; if (of_find_property(op->node, "8-bit", NULL)) bus_width = ACE_BUS_WIDTH_8; /* Call the bus-independant setup code */ return ace_alloc(&op->dev, id ? *id : 0, physaddr, irq, bus_width); } static int __devexit ace_of_remove(struct of_device *op) { ace_free(&op->dev); return 0; } /* Match table for of_platform binding */ static struct of_device_id __devinit ace_of_match[] = { { .compatible = "xilinx,xsysace", }, {}, }; MODULE_DEVICE_TABLE(of, ace_of_match); static struct of_platform_driver ace_of_driver = { .owner = THIS_MODULE, .name = "xsysace", .match_table = ace_of_match, .probe = ace_of_probe, .remove = __devexit_p(ace_of_remove), .driver = { .name = "xsysace", }, }; /* Registration helpers to keep the number of #ifdefs to a minimum */ static inline int __init ace_of_register(void) { pr_debug("xsysace: registering OF binding\n"); return of_register_platform_driver(&ace_of_driver); } static inline void __exit ace_of_unregister(void) { of_unregister_platform_driver(&ace_of_driver); } #else /* CONFIG_OF */ /* CONFIG_OF not enabled; do nothing helpers */ static inline int __init ace_of_register(void) { return 0; } static inline void __exit ace_of_unregister(void) { } #endif /* CONFIG_OF */ /* --------------------------------------------------------------------- * Module init/exit routines */ Loading @@ -1170,6 +1253,9 @@ static int __init ace_init(void) goto err_blk; } if ((rc = ace_of_register()) != 0) goto err_of; pr_debug("xsysace: registering platform binding\n"); if ((rc = platform_driver_register(&ace_platform_driver)) != 0) goto err_plat; Loading @@ -1178,6 +1264,8 @@ static int __init ace_init(void) return 0; err_plat: ace_of_unregister(); err_of: unregister_blkdev(ace_major, "xsysace"); err_blk: printk(KERN_ERR "xsysace: registration failed; err=%i\n", rc); Loading @@ -1188,6 +1276,7 @@ static void __exit ace_exit(void) { pr_debug("Unregistering Xilinx SystemACE driver\n"); platform_driver_unregister(&ace_platform_driver); ace_of_unregister(); unregister_blkdev(ace_major, "xsysace"); } Loading Loading
drivers/block/xsysace.c +89 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,10 @@ #include <linux/blkdev.h> #include <linux/hdreg.h> #include <linux/platform_device.h> #if defined(CONFIG_OF) #include <linux/of_device.h> #include <linux/of_platform.h> #endif MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); MODULE_DESCRIPTION("Xilinx SystemACE device driver"); Loading Loading @@ -1157,6 +1161,85 @@ static struct platform_driver ace_platform_driver = { }, }; /* --------------------------------------------------------------------- * OF_Platform Bus Support */ #if defined(CONFIG_OF) static int __devinit ace_of_probe(struct of_device *op, const struct of_device_id *match) { struct resource res; unsigned long physaddr; const u32 *id; int irq, bus_width, rc; dev_dbg(&op->dev, "ace_of_probe(%p, %p)\n", op, match); /* device id */ id = of_get_property(op->node, "port-number", NULL); /* physaddr */ rc = of_address_to_resource(op->node, 0, &res); if (rc) { dev_err(&op->dev, "invalid address\n"); return rc; } physaddr = res.start; /* irq */ irq = irq_of_parse_and_map(op->node, 0); /* bus width */ bus_width = ACE_BUS_WIDTH_16; if (of_find_property(op->node, "8-bit", NULL)) bus_width = ACE_BUS_WIDTH_8; /* Call the bus-independant setup code */ return ace_alloc(&op->dev, id ? *id : 0, physaddr, irq, bus_width); } static int __devexit ace_of_remove(struct of_device *op) { ace_free(&op->dev); return 0; } /* Match table for of_platform binding */ static struct of_device_id __devinit ace_of_match[] = { { .compatible = "xilinx,xsysace", }, {}, }; MODULE_DEVICE_TABLE(of, ace_of_match); static struct of_platform_driver ace_of_driver = { .owner = THIS_MODULE, .name = "xsysace", .match_table = ace_of_match, .probe = ace_of_probe, .remove = __devexit_p(ace_of_remove), .driver = { .name = "xsysace", }, }; /* Registration helpers to keep the number of #ifdefs to a minimum */ static inline int __init ace_of_register(void) { pr_debug("xsysace: registering OF binding\n"); return of_register_platform_driver(&ace_of_driver); } static inline void __exit ace_of_unregister(void) { of_unregister_platform_driver(&ace_of_driver); } #else /* CONFIG_OF */ /* CONFIG_OF not enabled; do nothing helpers */ static inline int __init ace_of_register(void) { return 0; } static inline void __exit ace_of_unregister(void) { } #endif /* CONFIG_OF */ /* --------------------------------------------------------------------- * Module init/exit routines */ Loading @@ -1170,6 +1253,9 @@ static int __init ace_init(void) goto err_blk; } if ((rc = ace_of_register()) != 0) goto err_of; pr_debug("xsysace: registering platform binding\n"); if ((rc = platform_driver_register(&ace_platform_driver)) != 0) goto err_plat; Loading @@ -1178,6 +1264,8 @@ static int __init ace_init(void) return 0; err_plat: ace_of_unregister(); err_of: unregister_blkdev(ace_major, "xsysace"); err_blk: printk(KERN_ERR "xsysace: registration failed; err=%i\n", rc); Loading @@ -1188,6 +1276,7 @@ static void __exit ace_exit(void) { pr_debug("Unregistering Xilinx SystemACE driver\n"); platform_driver_unregister(&ace_platform_driver); ace_of_unregister(); unregister_blkdev(ace_major, "xsysace"); } Loading