[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