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

Dan Williams dcbw at redhat.com
Tue Feb 3 13:05:49 EST 2009


On Tue, 2009-02-03 at 09:38 -0800, Andrey Yurovsky wrote:
> 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>

Acked-by: Dan Williams <dcbw at redhat.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