[RFC] [PATCH 1/2] pcmcia: add pcmcia_loop_config() helper
Randy Dunlap
randy.dunlap at oracle.com
Mon Jul 28 17:10:21 EDT 2008
On Mon, 28 Jul 2008 23:00:48 +0200 Dominik Brodowski wrote:
> By calling pcmcia_loop_config(), a pcmcia driver can iterate over all
> available configuration options. During a driver's probe() phase, one
> doesn't need to use pcmcia_get_{first,next}_tuple, pcmcia_get_tuple_data
> and pcmcia_parse_tuple directly in most if not all cases.
>
> Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
> ---
> Documentation/pcmcia/driver-changes.txt | 6 +++
> drivers/pcmcia/pcmcia_resource.c | 57 +++++++++++++++++++++++++++++++
> include/pcmcia/cistpl.h | 6 +++
> 3 files changed, 69 insertions(+), 0 deletions(-)
>
> diff --git a/Documentation/pcmcia/driver-changes.txt b/Documentation/pcmcia/driver-changes.txt
> index 96f155e..44085c1 100644
> --- a/Documentation/pcmcia/driver-changes.txt
> +++ b/Documentation/pcmcia/driver-changes.txt
> @@ -1,5 +1,11 @@
> This file details changes in 2.6 which affect PCMCIA card driver authors:
>
> +* New configuration loop helper (as of 2.6.28)
> + By calling pcmcia_loop_config(), a driver can iterate over all available
> + configuration options. During a driver's probe() phase, one doesn't need
> + to use pcmcia_get_{first,next}_tuple, pcmcia_get_tuple_data and
> + pcmcia_parse_tuple directly in most if not all cases.
> +
> * New release helper (as of 2.6.17)
> Instead of calling pcmcia_release_{configuration,io,irq,win}, all that's
> necessary now is calling pcmcia_disable_device. As there is no valid
> diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
> index 4884a18..1544dfb 100644
> --- a/drivers/pcmcia/pcmcia_resource.c
> +++ b/drivers/pcmcia/pcmcia_resource.c
> @@ -909,3 +909,60 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev) {
> pcmcia_release_window(p_dev->win);
> }
> EXPORT_SYMBOL(pcmcia_disable_device);
> +
> +
> +/** pcmcia_loop_config
> + *
> + * pcmcia_loop_config() loops over all configuration options, and calls
> + * the driver-specific conf_check() for each one, checking whether
> + * it is a valid one.
> + */
Hi Dominik,
Since the comment block begins with /**, it looks like kernel-doc, but it's not
quite kernel-doc, so please make it be kernel-doc [preferred], or change it to just
a simple /* beginning symbol.
See Documentation/kernel-doc-nano-HOWTO.txt for info, or ask me...
Thanks.
> +
> +struct pcmcia_cfg_mem {
> + tuple_t tuple;
> + cisparse_t parse;
> + u8 buf[256];
> +};
> +
> +int pcmcia_loop_config(struct pcmcia_device *p_dev,
> + int (*conf_check) (struct pcmcia_device *p_dev,
> + cistpl_cftable_entry_t *cfg,
> + void *priv_data),
> + void *priv_data)
> +{
> + struct pcmcia_cfg_mem *cfg_mem;
> + tuple_t *tuple;
> + int ret = -ENODEV;
> +
> + cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL);
> + if (cfg_mem == NULL)
> + return -ENOMEM;
> +
> + tuple = &cfg_mem->tuple;
> + tuple->TupleData = cfg_mem->buf;
> + tuple->TupleDataMax = 255;
> + tuple->TupleOffset = 0;
> + tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
> + tuple->Attributes = 0;
> +
> + ret = pcmcia_get_first_tuple(p_dev, tuple);
> + while (!ret) {
> + if (pcmcia_get_tuple_data(p_dev, tuple))
> + goto next_entry;
> +
> + if (pcmcia_parse_tuple(p_dev, tuple, &cfg_mem->parse))
> + goto next_entry;
> +
> + ret = conf_check(p_dev, &cfg_mem->parse.cftable_entry,
> + priv_data);
> + if (!ret)
> + break;
> +
> + next_entry:
> + ret = pcmcia_get_next_tuple(p_dev, tuple);
> + }
> +
> + return ret;
> +}
> +
> +EXPORT_SYMBOL(pcmcia_loop_config);
---
~Randy
Linux Plumbers Conference, 17-19 September 2008, Portland, Oregon USA
http://linuxplumbersconf.org/
More information about the linux-pcmcia
mailing list