[ARM] 4971/1: pxaficp_ir: provide startup and shutdown hooks
authorDmitry Baryshkov <dbaryshkov@gmail.com>
Sat, 12 Apr 2008 19:08:16 +0000 (20:08 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 19 Apr 2008 10:29:08 +0000 (11:29 +0100)
Let platform do some specific initialisation and cleanup
things during pxaficp_ir probing and removing. E.g. this
can be usefull to request/free gpios used by the platform
to control the transceiver.

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/net/irda/pxaficp_ir.c
include/asm-arm/arch-pxa/irda.h

index 8239c520f1ef2af494ddf42a2d78e31fc82a5358..8db71ab20456b38d14ce1f8e5cd4e1e8e4c87ecf 100644 (file)
@@ -832,6 +832,11 @@ static int pxa_irda_probe(struct platform_device *pdev)
        if (err)
                goto err_mem_5;
 
+       if (si->pdata->startup)
+               err = si->pdata->startup(si->dev);
+       if (err)
+               goto err_startup;
+
        dev->hard_start_xmit    = pxa_irda_hard_xmit;
        dev->open               = pxa_irda_start;
        dev->stop               = pxa_irda_stop;
@@ -857,6 +862,9 @@ static int pxa_irda_probe(struct platform_device *pdev)
                dev_set_drvdata(&pdev->dev, dev);
 
        if (err) {
+               if (si->pdata->shutdown)
+                       si->pdata->shutdown(si->dev);
+err_startup:
                kfree(si->tx_buff.head);
 err_mem_5:
                kfree(si->rx_buff.head);
@@ -882,6 +890,8 @@ static int pxa_irda_remove(struct platform_device *_dev)
        if (dev) {
                struct pxa_irda *si = netdev_priv(dev);
                unregister_netdev(dev);
+               if (si->pdata->shutdown)
+                       si->pdata->shutdown(si->dev);
                kfree(si->tx_buff.head);
                kfree(si->rx_buff.head);
                clk_put(si->fir_clk);
index 748406f384c2fd4c94ab6bfc06029ee52ea01e78..99f4f423a8e1bc3e6d3537dd64a47337dd76cfd8 100644 (file)
@@ -10,6 +10,8 @@
 struct pxaficp_platform_data {
        int transceiver_cap;
        void (*transceiver_mode)(struct device *dev, int mode);
+       int (*startup)(struct device *dev);
+       void (*shutdown)(struct device *dev);
 };
 
 extern void pxa_set_ficp_info(struct pxaficp_platform_data *info);