On Tue, 2009-02-03 at 09:38 -0800, Andrey Yurovsky wrote: > On Tue, Feb 3, 2009 at 7:51 AM, Dan Williams <dcbw@xxxxxxxxxx> 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@xxxxxxxxxxxxxx> > > > > 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@xxxxxxxxxxx> Acked-by: Dan Williams <dcbw@xxxxxxxxxx> > >> --- > >> 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@xxxxxxxxxxxxxxxxxxx > > http://lists.infradead.org/mailman/listinfo/libertas-dev > > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html