libertas: if_spi: add ability to call board specific setup/teardown methods
authorMike Rapoport <mike@compulab.co.il>
Tue, 3 Feb 2009 07:04:20 +0000 (09:04 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Feb 2009 20:03:48 +0000 (15:03 -0500)
In certain cases it is required to perform board specific actions
before activating libertas G-SPI interface. These actions may include
power up of the chip, GPIOs setup, proper pin-strapping and SPI
controller config.
This patch adds ability to call board specific setup/teardown methods

Signed-off-by: Mike Rapoport <mike@compulab.co.il>
Acked-by: Andrey Yurovsky <andrey@cozybit.com>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/if_spi.c
include/linux/spi/libertas_spi.h

index 7c02ea314fd1525a6558cafb67b50d94b1b04bb7..07311e71af926cad9d80156c700d4810b2cc713a 100644 (file)
@@ -42,6 +42,7 @@ struct if_spi_packet {
 struct if_spi_card {
        struct spi_device               *spi;
        struct lbs_private              *priv;
+       struct libertas_spi_platform_data *pdata;
 
        char                            helper_fw_name[FIRMWARE_NAME_MAX];
        char                            main_fw_name[FIRMWARE_NAME_MAX];
@@ -1022,6 +1023,17 @@ static int __devinit if_spi_probe(struct spi_device *spi)
 
        lbs_deb_enter(LBS_DEB_SPI);
 
+       if (!pdata) {
+               err = -EINVAL;
+               goto out;
+       }
+
+       if (pdata->setup) {
+               err = pdata->setup(spi);
+               if (err)
+                       goto out;
+       }
+
        /* Allocate card structure to represent this specific device */
        card = kzalloc(sizeof(struct if_spi_card), GFP_KERNEL);
        if (!card) {
@@ -1029,6 +1041,7 @@ static int __devinit if_spi_probe(struct spi_device *spi)
                goto out;
        }
        spi_set_drvdata(spi, card);
+       card->pdata = pdata;
        card->spi = spi;
        card->gpio_cs = pdata->gpio_cs;
        card->prev_xfer_time = jiffies;
@@ -1158,6 +1171,8 @@ static int __devexit libertas_spi_remove(struct spi_device *spi)
        if_spi_terminate_spi_thread(card);
        lbs_remove_card(priv); /* will call free_netdev */
        gpio_free(card->gpio_cs);
+       if (card->pdata->teardown)
+               card->pdata->teardown(spi);
        free_if_spi_card(card);
        lbs_deb_leave(LBS_DEB_SPI);
        return 0;
index ada71b4f378810980b5eb6b9d8b36d40134c0fac..79506f5f9e67f4d975f592e2c373d52b2b137472 100644 (file)
@@ -10,6 +10,9 @@
  */
 #ifndef _LIBERTAS_SPI_H_
 #define _LIBERTAS_SPI_H_
+
+struct spi_device;
+
 struct libertas_spi_platform_data {
        /* There are two ways to read data from the WLAN module's SPI
         * interface. Setting 0 or 1 here controls which one is used.
@@ -21,5 +24,9 @@ struct libertas_spi_platform_data {
 
        /* GPIO number to use as chip select */
        u16 gpio_cs;
+
+       /* Board specific setup/teardown */
+       int (*setup)(struct spi_device *spi);
+       int (*teardown)(struct spi_device *spi);
 };
 #endif