On 04/11/2013 01:28 PM, Arend van Spriel wrote: > From: Hante Meuleman <meuleman@xxxxxxxxxxxx> > > This patch adds support for platform specific data for SDIO > fullmac devices. Currently OOB interrupts are configured by Kconfig > BRCMFMAC_SDIO_OOB but that is now determined dynamically by checking > availibility of platform data. > > Reviewed-by: Arend Van Spriel <arend@xxxxxxxxxxxx> > Reviewed-by: Franky (Zhenhui) Lin <frankyl@xxxxxxxxxxxx> > Reviewed-by: Pieter-Paul Giesberts <pieterpg@xxxxxxxxxxxx> > Reviewed-by: Piotr Haber <phaber@xxxxxxxxxxxx> > Signed-off-by: Hante Meuleman <meuleman@xxxxxxxxxxxx> > Signed-off-by: Arend van Spriel <arend@xxxxxxxxxxxx> > --- > drivers/net/wireless/brcm80211/Kconfig | 9 -- > drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 155 ++++++++++---------- > .../net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c | 114 ++++---------- > drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 29 ++-- > .../net/wireless/brcm80211/brcmfmac/sdio_host.h | 6 +- > include/linux/brcmfmac_platform.h | 125 ++++++++++++++++ > 6 files changed, 251 insertions(+), 187 deletions(-) > create mode 100644 include/linux/brcmfmac_platform.h > .... > --- /dev/null > +++ b/include/linux/brcmfmac_platform.h This should be placed into include/linux/platform_data/ > @@ -0,0 +1,125 @@ > +/* > + * Copyright (c) 2013 Broadcom Corporation > + * > + * Permission to use, copy, modify, and/or distribute this software for any > + * purpose with or without fee is hereby granted, provided that the above > + * copyright notice and this permission notice appear in all copies. > + * > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY > + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION > + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN > + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > + */ > + > +#ifndef _LINUX_BRCMFMAC_PLATFORM_H > +#define _LINUX_BRCMFMAC_PLATFORM_H > + > +/* > + * Platform specific driver functions and data. Through the platform specific > + * device data functions can be provided to help the brcmfmac driver to > + * operate with the device in combination with the used platform. > + * > + * Use the platform data in the following (similar) way: > + * > + * > +#include <brcmfmac_platform.h> > + > + > +static void brcmfmac_power_on(void) > +{ > +} > + > +static void brcmfmac_power_off(void) > +{ > +} > + > +static void brcmfmac_reset(void) > +{ > +} > + > +static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = { > + .power_on = brcmfmac_power_on, > + .power_off = brcmfmac_power_off, > + .reset = brcmfmac_reset > +}; > + > +static struct platform_device brcmfmac_device = { > + .name = BRCMFMAC_SDIO_PDATA_NAME, > + .id = PLATFORM_DEVID_NONE, > + .dev.platform_data = &brcmfmac_sdio_pdata > +}; > + > +void __init brcmfmac_init_pdata(void) > +{ > + brcmfmac_sdio_pdata.oob_irq_supported = true; > + brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB); > + brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ | > + IORESOURCE_IRQ_HIGHLEVEL; > + platform_device_register(&brcmfmac_device); > +} > + * > + * > + * Note: the brcmfmac can be loaded as module or be statically built-in into > + * the kernel. If built-in then do note that it uses module_init (and > + * module_exit) routines which equal device_initcall. So if you intend to > + * create a module with the platform specific data for the brcmfmac and have > + * it built-in to the kernel then use a higher initcall then device_initcall > + * (see init.h). If this is not done then brcmfmac will load without problems > + * but will not pickup the platform data. > + * > + * When the driver does not "detect" platform driver data then it will continue > + * without reporting anything and just assume there is no data needed. Which is > + * probably true for most platforms. > + * > + * Explanation of the platform_data fields: > + * > + * drive_strength: is the preferred drive_strength to be used for the SDIO > + * pins. If 0 then a default value will be used. This is the target drive > + * strength, the exact drive strength which will be used depends on the > + * capabilities of the device. > + * > + * oob_irq_supported: does the board have support for OOB interrupts. SDIO > + * in-band interrupts are relatively slow and for having less overhead on > + * interrupt processing an out of band interrupt can be used. If the HW > + * supports this then enable this by setting this field to true and configure > + * the oob related fields. > + * > + * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are > + * used for registering the irq using request_irq function. > + * > + * power_on: This function is called by the brcmfmac when the module gets > + * loaded. This can be particularly useful for low power devices. The platform > + * spcific routine may for example decide to power up the complete device. > + * If there is no use-case for this function then provide NULL. > + * > + * power_off: This function is called by the brcmfmac when the module gets > + * unloaded. At this point the device can be powered down or otherwise be reset. > + * So if an actual power_off is not supported but reset is then reset the device > + * when this function gets called. This can be particularly useful for low power > + * devices. If there is no use-case for this function (either power-down or > + * reset) then provide NULL. > + * > + * reset: This function can get called if the device communication broke down. > + * This functionality is particularly useful in case of SDIO type devices. It is > + * possible to reset a dongle via sdio data interface, but it requires that > + * this is fully functional. This function is chip/module specific and this > + * function should return only after the complete reset has completed. > + */ > + > +#define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio" > + > +struct brcmfmac_sdio_platform_data { > + unsigned int drive_strength; > + bool oob_irq_supported; > + unsigned int oob_irq_nr; > + unsigned long oob_irq_flags; > + void (*power_on)(void); > + void (*power_off)(void); > + void (*reset)(void); > +}; > + > +#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ > + > -- 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