[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