[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