[PATCH] libertas: if_spi: add ability to call board specific setup/teardown methods

Andrey Yurovsky andrey at cozybit.com
Tue Feb 3 12:38:22 EST 2009


On Tue, Feb 3, 2009 at 7:51 AM, Dan Williams <dcbw at redhat.com> wrote:
> On Tue, 2009-02-03 at 09:04 +0200, Mike Rapoport wrote:
>> 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 at compulab.co.il>
>
> Andrey, does this look OK to you?  Seems fine to me, though what's the
> lifetime of the platform data 'pdata' in the probe function?  Is that
> guaranteed to be valid for the entire lifetime of the libertas SPI
> device?
>
> Dan

Yes, this looks good to me.  'pdata' will span the lifetime of the
device as it's set up in if_spi_probe and stays around until
libertas_spi_remove

Acked-by: Andrey Yurovsky <andrey at cozybit.com>

>> ---
>>  drivers/net/wireless/libertas/if_spi.c |   15 +++++++++++++++
>>  include/linux/spi/libertas_spi.h       |    7 +++++++
>>  2 files changed, 22 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c
>> index 7c02ea3..07311e7 100644
>> --- a/drivers/net/wireless/libertas/if_spi.c
>> +++ b/drivers/net/wireless/libertas/if_spi.c
>> @@ -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;
>> diff --git a/include/linux/spi/libertas_spi.h b/include/linux/spi/libertas_spi.h
>> index ada71b4..79506f5 100644
>> --- a/include/linux/spi/libertas_spi.h
>> +++ b/include/linux/spi/libertas_spi.h
>> @@ -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
>> --
>> 1.5.6.4
>>
>>
>
>
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
>



More information about the libertas-dev mailing list