All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Ludovic Desroches <ludovic.desroches@atmel.com>
Cc: linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	swarren@wwwdotorg.org, linus.walleij@linaro.org,
	nicolas.ferre@atmel.com
Subject: Re: [RESEND PATCH 2/2] pinctrl: introduce complex pin description
Date: Tue, 14 Jul 2015 08:13:59 +0200	[thread overview]
Message-ID: <20150714061359.GC5161@pengutronix.de> (raw)
In-Reply-To: <1433948699-19800-3-git-send-email-ludovic.desroches@atmel.com>

On Wed, Jun 10, 2015 at 05:04:57PM +0200, Ludovic Desroches wrote:
> Using a string to describe a pin in the device tree can be not enough.
> Some controllers may need extra information to fully describe a pin. It
> concerns mainly controllers which have a per pin muxing approach which
> don't fit well the notions of groups and functions.
> Instead of using a pin name, a 32 bit value is used. The 16 least
> significant bits are used for the pin number. Other 16 bits can be used to
> store extra parameters.

In the Mediatek driver we use 'pinmux' as name for the property
containing the combined pin number / mux value defines. 'pinmux' better
describes what it is...

> +
> +	if (pctldesc->complex_pin_desc)
> +		ret = of_property_count_u32_elems(np, "pins");
> +	else
> +		ret = of_property_count_strings(np, "pins");

... and has the advantage that you don't have to pass in a
complex_pin_desc variable from the driver as the different property
name inherently carries this information. 'pins' can then stay a
property containing only strings.

>  	if (ret < 0) {
>  		ret = of_property_count_strings(np, "groups");
>  		if (ret < 0)
> @@ -297,11 +305,12 @@ int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev,
>  		if (type == PIN_MAP_TYPE_INVALID)
>  			type = PIN_MAP_TYPE_CONFIGS_GROUP;
>  		subnode_target_type = "groups";
> +		pins_prop = false;
>  	} else {
>  		if (type == PIN_MAP_TYPE_INVALID)
>  			type = PIN_MAP_TYPE_CONFIGS_PIN;
>  	}
> -	strings_count = ret;
> +	items_count = ret;
>  
>  	ret = of_property_read_string(np, "function", &function);
>  	if (ret < 0) {
> @@ -326,17 +335,31 @@ int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev,
>  	if (num_configs)
>  		reserve++;
>  
> -	reserve *= strings_count;
> +	reserve *= items_count;
>  
>  	ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
>  			num_maps, reserve);
>  	if (ret < 0)
>  		goto exit;
>  
> -	of_property_for_each_string(np, subnode_target_type, prop, group) {
> +	items_name = kmalloc_array(items_count, sizeof(char *), GFP_KERNEL);
> +	if (!items_name)
> +		goto exit;
> +	if (pctldesc->complex_pin_desc && pins_prop) {
> +		of_property_for_each_u32(np, subnode_target_type, prop, cur, val) {
> +			pin_id = val & PINCTRL_PIN_MASK;
> +			items_name[i++] = pctldesc->pins[pin_id].name;
> +		}

I don't like that even though pins have numbers here they are converted
to strings which the driver later has to search in a list just to
convert it back into the number. This is quite inefficient.

I guess this could be optimized later, but it would be nice to have the
pin number directly in the driver.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

WARNING: multiple messages have this Message-ID (diff)
From: s.hauer@pengutronix.de (Sascha Hauer)
To: linux-arm-kernel@lists.infradead.org
Subject: [RESEND PATCH 2/2] pinctrl: introduce complex pin description
Date: Tue, 14 Jul 2015 08:13:59 +0200	[thread overview]
Message-ID: <20150714061359.GC5161@pengutronix.de> (raw)
In-Reply-To: <1433948699-19800-3-git-send-email-ludovic.desroches@atmel.com>

On Wed, Jun 10, 2015 at 05:04:57PM +0200, Ludovic Desroches wrote:
> Using a string to describe a pin in the device tree can be not enough.
> Some controllers may need extra information to fully describe a pin. It
> concerns mainly controllers which have a per pin muxing approach which
> don't fit well the notions of groups and functions.
> Instead of using a pin name, a 32 bit value is used. The 16 least
> significant bits are used for the pin number. Other 16 bits can be used to
> store extra parameters.

In the Mediatek driver we use 'pinmux' as name for the property
containing the combined pin number / mux value defines. 'pinmux' better
describes what it is...

> +
> +	if (pctldesc->complex_pin_desc)
> +		ret = of_property_count_u32_elems(np, "pins");
> +	else
> +		ret = of_property_count_strings(np, "pins");

... and has the advantage that you don't have to pass in a
complex_pin_desc variable from the driver as the different property
name inherently carries this information. 'pins' can then stay a
property containing only strings.

>  	if (ret < 0) {
>  		ret = of_property_count_strings(np, "groups");
>  		if (ret < 0)
> @@ -297,11 +305,12 @@ int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev,
>  		if (type == PIN_MAP_TYPE_INVALID)
>  			type = PIN_MAP_TYPE_CONFIGS_GROUP;
>  		subnode_target_type = "groups";
> +		pins_prop = false;
>  	} else {
>  		if (type == PIN_MAP_TYPE_INVALID)
>  			type = PIN_MAP_TYPE_CONFIGS_PIN;
>  	}
> -	strings_count = ret;
> +	items_count = ret;
>  
>  	ret = of_property_read_string(np, "function", &function);
>  	if (ret < 0) {
> @@ -326,17 +335,31 @@ int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev,
>  	if (num_configs)
>  		reserve++;
>  
> -	reserve *= strings_count;
> +	reserve *= items_count;
>  
>  	ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
>  			num_maps, reserve);
>  	if (ret < 0)
>  		goto exit;
>  
> -	of_property_for_each_string(np, subnode_target_type, prop, group) {
> +	items_name = kmalloc_array(items_count, sizeof(char *), GFP_KERNEL);
> +	if (!items_name)
> +		goto exit;
> +	if (pctldesc->complex_pin_desc && pins_prop) {
> +		of_property_for_each_u32(np, subnode_target_type, prop, cur, val) {
> +			pin_id = val & PINCTRL_PIN_MASK;
> +			items_name[i++] = pctldesc->pins[pin_id].name;
> +		}

I don't like that even though pins have numbers here they are converted
to strings which the driver later has to search in a list just to
convert it back into the number. This is quite inefficient.

I guess this could be optimized later, but it would be nice to have the
pin number directly in the driver.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

  parent reply	other threads:[~2015-07-14  6:14 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-10 15:04 [RESEND PATCH 0/2] get pinctrl more flexible for per pin muxing controllers Ludovic Desroches
2015-06-10 15:04 ` Ludovic Desroches
2015-06-10 15:04 ` Ludovic Desroches
2015-06-10 15:04 ` [RESEND PATCH 1/2] pinctrl: change function behavior " Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-15 15:58   ` Stephen Warren
2015-06-15 15:58     ` Stephen Warren
2015-06-15 15:58     ` Stephen Warren
2015-06-17 12:38     ` Ludovic Desroches
2015-06-17 12:38       ` Ludovic Desroches
2015-06-17 12:38       ` Ludovic Desroches
2015-06-17 15:55       ` Stephen Warren
2015-06-17 15:55         ` Stephen Warren
2015-06-18 12:33         ` Ludovic Desroches
2015-06-18 12:33           ` Ludovic Desroches
2015-06-18 12:33           ` Ludovic Desroches
2015-07-14  5:57           ` Sascha Hauer
2015-07-14  5:57             ` Sascha Hauer
2015-07-15  7:46             ` Ludovic Desroches
2015-07-15  7:46               ` Ludovic Desroches
2015-07-15  7:46               ` Ludovic Desroches
2015-07-15  8:29               ` Ludovic Desroches
2015-07-15  8:29                 ` Ludovic Desroches
2015-07-15  8:29                 ` Ludovic Desroches
2015-07-27  9:43               ` Linus Walleij
2015-07-27  9:43                 ` Linus Walleij
2015-07-27 12:12                 ` Ludovic Desroches
2015-07-27 12:12                   ` Ludovic Desroches
2015-06-30  9:17         ` Nicolas Ferre
2015-06-30  9:17           ` Nicolas Ferre
2015-06-30  9:17           ` Nicolas Ferre
2015-07-13 12:07           ` Linus Walleij
2015-07-13 12:07             ` Linus Walleij
2015-07-13 12:07             ` Linus Walleij
2015-07-14  6:54             ` Sascha Hauer
2015-07-14  6:54               ` Sascha Hauer
2015-07-13 12:13       ` Linus Walleij
2015-07-13 12:13         ` Linus Walleij
2015-06-10 15:04 ` [RESEND PATCH 2/2] pinctrl: introduce complex pin description Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-15 16:01   ` Stephen Warren
2015-06-15 16:01     ` Stephen Warren
2015-06-15 16:01     ` Stephen Warren
2015-06-17 12:42     ` Ludovic Desroches
2015-06-17 12:42       ` Ludovic Desroches
2015-06-17 12:42       ` Ludovic Desroches
2015-07-14  6:13   ` Sascha Hauer [this message]
2015-07-14  6:13     ` Sascha Hauer
2015-07-15  8:45     ` Ludovic Desroches
2015-07-15  8:45       ` Ludovic Desroches
2015-07-15  8:45       ` Ludovic Desroches
2015-07-15 10:05       ` Sascha Hauer
2015-07-15 10:05         ` Sascha Hauer
2015-07-15 13:52         ` Ludovic Desroches
2015-07-15 13:52           ` Ludovic Desroches
2015-07-15 13:52           ` Ludovic Desroches
2015-06-10 15:04 ` [RESEND PROTO] pinctrl: rough draft for a future controller Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-10 15:04 ` [RESEND PROTO] ARM: at91/dt: proto dt Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches
2015-06-10 15:04   ` Ludovic Desroches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150714061359.GC5161@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=devicetree@vger.kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ludovic.desroches@atmel.com \
    --cc=nicolas.ferre@atmel.com \
    --cc=swarren@wwwdotorg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.