[PATCH v5 3/7] wireless: wl12xx: add platform data passing support

Ohad Ben-Cohen ohad at wizery.com
Mon Sep 6 07:55:55 EDT 2010


2010/9/4 Michał Mirosław <mirqus at gmail.com>:
> 2010/9/1 Ohad Ben-Cohen <ohad at wizery.com>:
>> Add a simple mechanism to pass platform data to the
>> SDIO instances of wl12xx.
>>
>> This way there is no confusion over who owns the 'embedded data',
>> typechecking is preserved, and no possibility for the wrong driver to
>> pick up the data.
>>
>> Originally proposed by Russell King.
>>
>> Signed-off-by: Ohad Ben-Cohen <ohad at wizery.com>
>> ---
>>  drivers/net/wireless/Makefile                      |    2 +
>>  drivers/net/wireless/wl12xx/Kconfig                |    5 ++-
>>  drivers/net/wireless/wl12xx/wl12xx_platform_data.c |   31 ++++++++++++++++++++
>>  include/linux/wl12xx.h                             |    3 ++
>>  4 files changed, 40 insertions(+), 1 deletions(-)
>>  create mode 100644 drivers/net/wireless/wl12xx/wl12xx_platform_data.c
>>
>> diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile
>> index 5d4ce4d..85af697 100644
>> --- a/drivers/net/wireless/Makefile
>> +++ b/drivers/net/wireless/Makefile
>> @@ -50,5 +50,7 @@ obj-$(CONFIG_ATH_COMMON)      += ath/
>>  obj-$(CONFIG_MAC80211_HWSIM)   += mac80211_hwsim.o
>>
>>  obj-$(CONFIG_WL12XX)   += wl12xx/
>> +# small builtin driver bit
>> +obj-$(CONFIG_WL12XX_PLATFORM_DATA)     += wl12xx/wl12xx_platform_data.o
>>
>>  obj-$(CONFIG_IWM)      += iwmc3200wifi/
>> diff --git a/drivers/net/wireless/wl12xx/Kconfig b/drivers/net/wireless/wl12xx/Kconfig
>> index 2f98058..4a8bb25 100644
>> --- a/drivers/net/wireless/wl12xx/Kconfig
>> +++ b/drivers/net/wireless/wl12xx/Kconfig
>> @@ -74,4 +74,7 @@ config WL1271_SDIO
>>          If you choose to build a module, it'll be called
>>          wl1271_sdio. Say N if unsure.
>>
>> -
>> +config WL12XX_PLATFORM_DATA
>> +       bool
>> +       depends on WL1271_SDIO != n
>> +       default y
>> diff --git a/drivers/net/wireless/wl12xx/wl12xx_platform_data.c b/drivers/net/wireless/wl12xx/wl12xx_platform_data.c
>> new file mode 100644
>> index 0000000..e00973b
>> --- /dev/null
>> +++ b/drivers/net/wireless/wl12xx/wl12xx_platform_data.c
>> @@ -0,0 +1,31 @@
>> +#include <linux/module.h>
>> +#include <linux/wl12xx.h>
>> +
>> +static struct wl12xx_platform_data *platform_data;
>> +
>> +int __init wl12xx_set_platform_data(const struct wl12xx_platform_data *data)
>> +{
>> +       if (platform_data)
>> +               return -EBUSY;
>> +       if (!data)
>> +               return -EINVAL;
>> +
>> +       platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
>> +       if (!platform_data)
>> +               return -ENOMEM;
>> +
>> +       return 0;
>> +}
>> +
>> +int wl12xx_get_platform_data(struct wl12xx_platform_data *data)
>> +{
>> +       if (!platform_data)
>> +               return -ENODEV;
>> +       if (!data)
>> +               return -EINVAL;
>> +
>> +       memcpy(data, platform_data, sizeof(*data));
>> +
>> +       return 0;
>> +}
>> +EXPORT_SYMBOL(wl12xx_get_platform_data);
>> diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
>> index 137ac89..3e33ae1 100644
>> --- a/include/linux/wl12xx.h
>> +++ b/include/linux/wl12xx.h
>> @@ -31,4 +31,7 @@ struct wl12xx_platform_data {
>>        bool use_eeprom;
>>  };
>>
>> +int wl12xx_set_platform_data(const struct wl12xx_platform_data *data);
>> +int wl12xx_get_platform_data(struct wl12xx_platform_data *data);
>> +
>>  #endif
>
> Why do you need all that copying? Isn't the data constant?

That was the original proposal from Russell;

AFAICT it's very similar to how platform device resources are handled
- it allows marking the original definition of the data as __initdata
(need to add that) thus freeing up its space after the initialization
phase completes. Later, in some scenarios, it might also allow to free
up the copied data (not done now, but the copying happen only once in
the lifetime of the driver so I'm fine with it).

>
> Best Regards,
> Michał Mirosław
>



More information about the linux-arm-kernel mailing list