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 |
next prev 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: linkBe 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.