Commit 55f19d56 authored by Grant Likely's avatar Grant Likely

dt: xilinx_hwicap: merge platform and of_platform driver bindings

of_platform_driver is getting removed, and a single platform_driver
can now support both devicetree and non-devicetree use cases.  This
patch merges the two driver registrations.
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
Acked-by: default avatarStephen Neuendorffer <stephen.neuendorffer@xilinx.com>
parent a1e9c9dd
...@@ -714,20 +714,29 @@ static int __devexit hwicap_remove(struct device *dev) ...@@ -714,20 +714,29 @@ static int __devexit hwicap_remove(struct device *dev)
return 0; /* success */ return 0; /* success */
} }
static int __devinit hwicap_drv_probe(struct platform_device *pdev) #ifdef CONFIG_OF
static int __devinit hwicap_of_probe(struct platform_device *op)
{ {
struct resource *res; struct resource res;
const struct config_registers *regs; const unsigned int *id;
const char *family; const char *family;
int rc;
const struct hwicap_driver_config *config = op->dev.of_match->data;
const struct config_registers *regs;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) rc = of_address_to_resource(op->dev.of_node, 0, &res);
return -ENODEV; if (rc) {
dev_err(&op->dev, "invalid address\n");
return rc;
}
id = of_get_property(op->dev.of_node, "port-number", NULL);
/* It's most likely that we're using V4, if the family is not /* It's most likely that we're using V4, if the family is not
specified */ specified */
regs = &v4_config_registers; regs = &v4_config_registers;
family = pdev->dev.platform_data; family = of_get_property(op->dev.of_node, "xlnx,family", NULL);
if (family) { if (family) {
if (!strcmp(family, "virtex2p")) { if (!strcmp(family, "virtex2p")) {
...@@ -738,54 +747,33 @@ static int __devinit hwicap_drv_probe(struct platform_device *pdev) ...@@ -738,54 +747,33 @@ static int __devinit hwicap_drv_probe(struct platform_device *pdev)
regs = &v5_config_registers; regs = &v5_config_registers;
} }
} }
return hwicap_setup(&op->dev, id ? *id : -1, &res, config,
return hwicap_setup(&pdev->dev, pdev->id, res, regs);
&buffer_icap_config, regs);
} }
#else
static int __devexit hwicap_drv_remove(struct platform_device *pdev) static inline int hwicap_of_probe(struct platform_device *op)
{ {
return hwicap_remove(&pdev->dev); return -EINVAL;
} }
#endif /* CONFIG_OF */
static struct platform_driver hwicap_platform_driver = { static int __devinit hwicap_drv_probe(struct platform_device *pdev)
.probe = hwicap_drv_probe,
.remove = hwicap_drv_remove,
.driver = {
.owner = THIS_MODULE,
.name = DRIVER_NAME,
},
};
/* ---------------------------------------------------------------------
* OF bus binding
*/
#if defined(CONFIG_OF)
static int __devinit
hwicap_of_probe(struct platform_device *op, const struct of_device_id *match)
{ {
struct resource res; struct resource *res;
const unsigned int *id;
const char *family;
int rc;
const struct hwicap_driver_config *config = match->data;
const struct config_registers *regs; const struct config_registers *regs;
const char *family;
dev_dbg(&op->dev, "hwicap_of_probe(%p, %p)\n", op, match); if (pdev->dev.of_match)
return hwicap_of_probe(pdev);
rc = of_address_to_resource(op->dev.of_node, 0, &res);
if (rc) {
dev_err(&op->dev, "invalid address\n");
return rc;
}
id = of_get_property(op->dev.of_node, "port-number", NULL); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
/* It's most likely that we're using V4, if the family is not /* It's most likely that we're using V4, if the family is not
specified */ specified */
regs = &v4_config_registers; regs = &v4_config_registers;
family = of_get_property(op->dev.of_node, "xlnx,family", NULL); family = pdev->dev.platform_data;
if (family) { if (family) {
if (!strcmp(family, "virtex2p")) { if (!strcmp(family, "virtex2p")) {
...@@ -796,50 +784,38 @@ hwicap_of_probe(struct platform_device *op, const struct of_device_id *match) ...@@ -796,50 +784,38 @@ hwicap_of_probe(struct platform_device *op, const struct of_device_id *match)
regs = &v5_config_registers; regs = &v5_config_registers;
} }
} }
return hwicap_setup(&op->dev, id ? *id : -1, &res, config,
regs); return hwicap_setup(&pdev->dev, pdev->id, res,
&buffer_icap_config, regs);
} }
static int __devexit hwicap_of_remove(struct platform_device *op) static int __devexit hwicap_drv_remove(struct platform_device *pdev)
{ {
return hwicap_remove(&op->dev); return hwicap_remove(&pdev->dev);
} }
/* Match table for of_platform binding */ #ifdef CONFIG_OF
/* Match table for device tree binding */
static const struct of_device_id __devinitconst hwicap_of_match[] = { static const struct of_device_id __devinitconst hwicap_of_match[] = {
{ .compatible = "xlnx,opb-hwicap-1.00.b", .data = &buffer_icap_config}, { .compatible = "xlnx,opb-hwicap-1.00.b", .data = &buffer_icap_config},
{ .compatible = "xlnx,xps-hwicap-1.00.a", .data = &fifo_icap_config}, { .compatible = "xlnx,xps-hwicap-1.00.a", .data = &fifo_icap_config},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, hwicap_of_match); MODULE_DEVICE_TABLE(of, hwicap_of_match);
#else
#define hwicap_of_match NULL
#endif
static struct of_platform_driver hwicap_of_driver = { static struct platform_driver hwicap_platform_driver = {
.probe = hwicap_of_probe, .probe = hwicap_drv_probe,
.remove = __devexit_p(hwicap_of_remove), .remove = hwicap_drv_remove,
.driver = { .driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = DRIVER_NAME,
.of_match_table = hwicap_of_match, .of_match_table = hwicap_of_match,
}, },
}; };
/* Registration helpers to keep the number of #ifdefs to a minimum */
static inline int __init hwicap_of_register(void)
{
pr_debug("hwicap: calling of_register_platform_driver()\n");
return of_register_platform_driver(&hwicap_of_driver);
}
static inline void __exit hwicap_of_unregister(void)
{
of_unregister_platform_driver(&hwicap_of_driver);
}
#else /* CONFIG_OF */
/* CONFIG_OF not enabled; do nothing helpers */
static inline int __init hwicap_of_register(void) { return 0; }
static inline void __exit hwicap_of_unregister(void) { }
#endif /* CONFIG_OF */
static int __init hwicap_module_init(void) static int __init hwicap_module_init(void)
{ {
dev_t devt; dev_t devt;
...@@ -856,21 +832,12 @@ static int __init hwicap_module_init(void) ...@@ -856,21 +832,12 @@ static int __init hwicap_module_init(void)
return retval; return retval;
retval = platform_driver_register(&hwicap_platform_driver); retval = platform_driver_register(&hwicap_platform_driver);
if (retval)
goto failed1;
retval = hwicap_of_register();
if (retval) if (retval)
goto failed2; goto failed;
return retval; return retval;
failed2: failed:
platform_driver_unregister(&hwicap_platform_driver);
failed1:
unregister_chrdev_region(devt, HWICAP_DEVICES); unregister_chrdev_region(devt, HWICAP_DEVICES);
return retval; return retval;
...@@ -884,8 +851,6 @@ static void __exit hwicap_module_cleanup(void) ...@@ -884,8 +851,6 @@ static void __exit hwicap_module_cleanup(void)
platform_driver_unregister(&hwicap_platform_driver); platform_driver_unregister(&hwicap_platform_driver);
hwicap_of_unregister();
unregister_chrdev_region(devt, HWICAP_DEVICES); unregister_chrdev_region(devt, HWICAP_DEVICES);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment