From: Thomas Abraham <thomas.abraham@linaro.org>
To: Stephen Warren <swarren@nvidia.com>
Cc: Dong Aisheng <dongas86@gmail.com>,
Shawn Guo <shawn.guo@linaro.org>,
Dong Aisheng-B29396 <B29396@freescale.com>,
"Linus Walleij (linus.walleij@linaro.org)"
<linus.walleij@linaro.org>,
"Sascha Hauer (s.hauer@pengutronix.de)" <s.hauer@pengutronix.de>,
"rob.herring@calxeda.com" <rob.herring@calxeda.com>,
"kernel@pengutronix.de" <kernel@pengutronix.de>,
"cjb@laptop.org" <cjb@laptop.org>,
"Simon Glass (sjg@chromium.org)" <sjg@chromium.org>,
"Grant Likely (grant.likely@secretlab.ca)"
<grant.likely@secretlab.ca>,
"ext Tony Lindgren (tony@atomide.com)" <tony@atomide.com>,
"devicetree-discuss@lists.ozlabs.org"
<devicetree-discuss@lists.ozlabs.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: An extremely simplified pinctrl bindings proposal
Date: Sun, 5 Feb 2012 19:07:51 -0800 [thread overview]
Message-ID: <CAJuYYwQ2yczBh+CBFWohZPM+9jHXYxyxYzL8CS4puE96v4fDXw@mail.gmail.com> (raw)
In-Reply-To: <74CDBE0F657A3D45AFBB94109FB122FF178E5D3160@HQMAIL01.nvidia.com>
Hi Stephen,
On 4 February 2012 21:31, Stephen Warren <swarren@nvidia.com> wrote:
> Sorry, I haven't had a chance to read any of the pincrl emails from
> Friday onwards. However, I thought a bit more about this, and decided
> to propose someting much simpler:
>
> Thoughts:
>
> * Defining all the pins, groups, functions, ... takes a lot of space,
> whether it's in static data in pinctrl drivers or in the device tree.
> The lists must also be stored in RAM at runtime.
>
> * It's been very difficult to come up with a generic description of all
> pin controller's capabilities. This is true even irrespective of device
> tree; think pin config where we've agonized over whether we can create
> a standardized list of pin config properties, or need to allow each
> pinctrl driver to define its own set of properties, etc.
>
> * The only real use of the lists is for debugfs. Drivers shouldn't expect
> to directly request specific pinctrl settings, since that would encode
> knowledge of an individual SoC's pin controller. This should be
> abstracted from drivers.
>
> * The data in debugfs could easily be replaced by a raw register dump
> coupled with a SoC-specific script to print out what each register
> means.
>
> My proposal below is to radically simplify the pinctrl subsystem, and
> make it little more than a system to execute a list of arbitrary register
> writes.
Thanks for your work on pinctrl bindings proposal.
With this new approach, how much of the pinctrl susbystem is used in
device tree mode. Last time I had proposed something similar to this
(http://marc.info/?l=linux-kernel&m=132697880016289&w=2), you were not
happy about that approach since the pinctrl subsystem is largely
under-utilized (http://marc.info/?l=linux-kernel&m=132735884622374&w=2),
expect for providing a interface which individual
pinctrl/pinmux/pinconfig drivers will use to implement a function that
programs the hardware.
There need not be pinmux/pinctrl/pinconfig bindings that are designed
for the linux pinctrl subsystem. DT allows specifying the
pinconfig/pinmux properties in a simple way, which was not possible in
non-dt case and hence the pinctrl subsystem. Other OS'es which might
not have a pinctrl subsystem, similar to what linux has, should also
find the pinctrl bindings useful.
Regards,
Thomas.
>
> Advantages:
>
> * No need to define any kind of data model for pinctrl.
>
> * No need to store any list of pins/groups/function/parameters/... either
> in static data, in device tree, or at run-time.
>
> * No need to store the the selected board-specific settings anywhere either.
>
> * Completely generic; can handle anything that exists now or in the future.
>
> * Handles pin mux and pin config identically.
>
> * Extremely simple to implement and understand; probably just a few K
> of code and no data. I assume this will be very appealing to those
> interested in using the binding within U-Boot too.
>
> * The lists of register writes can just as easily be provided by board
> files as device tree, so operation should be identical.
>
> Disadvantages:
>
> * Creating the list of register values/masks may be a little painful. If
> we move forward with this, we'd want to strongly push dtc towards
> providing named constants, expressesion, macros, etc. Those dtc features
> would be very useful anyway.
>
> * Lack of high-level semantic meaning to the data; but I assert there's
> little benefit to having that anyway.
>
> To solve this, write a script to parse each pinctrl driver's regcache
> file and print out all the register meanings.
>
> * This scheme wouldn't represent which device "owns" which pins/groups,
> nor be able to validate that different devices' pinmux settings don't
> conflict.
>
> I don't think this is a huge issue though, since that's mainly error-
> checking. Any problems should be just as obvious during testing whether
> they cause the HW to fail to operate correctly, or whether they cause
> pinctrl to throw an error. Equally, there are many error conditions
> that pinctrl core wasn't checking for anyway.
>
> Precedent:
>
> * There was previous discussion on using this exact technique for pinmux
> at a previous Linaro Connect:
>
> http://www.spinics.net/lists/linux-tegra/msg01943.html
>
> * There is an existing binding that works very similarly, for the Mavell
> PHY:
>
> http://www.gossamer-threads.com/lists/linux/kernel/1305624
> drivers/net/phy/marvell.c
>
> Explicit mention was made here that a simple list of register writes
> avoiding the complexity of representing a huge number of combinations
> in the device tree.
>
> tegra20.dtsi:
>
> pinmux: pinmux@70000000 {
> compatible = "nvidia,tegra20-pinmux";
> reg = <0x70000014 0x10> /* Tri-state registers */
> <0x70000080 0x20> /* Mux registers */
> <0x700000a0 0x14> /* Pull-up/down registers */
> <0x70000868 0xa8>; /* Pad control registers */
>
> pinmux_i2c1_spdio_active: pinmux-i2c1-spdio-active {
> reg-init =
> /* Set pingroup SPDO to function I2C1 */
> <
> 1 /* Register "bank" in controller */
> 0x8c /* Register offset */
> 0x000000c0 /* Write bitmask, 0 for whole register */
> 0x00000080 /* Write value */
> >
> /* Set pingroup SPDI to function I2C1 */
> <
> 1 /* Register "bank" in controller */
> 0x8c /* Register offset */
> 0x00000300 /* Write bitmask, 0 for whole register */
> 0x00000200 /* Write value */
> >;
> };
> pinmux_i2c1_spdio_suspend: pinmux-i2c1-spdio-suspend {
> ...
> };
> };
>
> tegra-seaboard.dts:
>
> i2c@7000c000 {
> /*
> * These are phandles to nodes that containthe reg-init list. Can
> * we have phandles to properties instead? Then we wouldn't need
> * all those nodes which each just contains 1 property.
> */
> pinctrl = <&pinmux_i2c1_spdio_active &pinmux_i2c1_spdio_suspend>;
> pinctrl-names = "active", "suspend";
> };
>
> In order to support programming more than one pin controller at once, we
> could include the phandle of the pin controller in the "reg-init" property:
>
> somewhere-other-than-under-a-pin-controller {
> pinmux-foo {
> reg-init =
> <
> &tegra_pmx /* Pin controller */
> 2 /* Number of entries for this controller */
> >
> <
> 1 /* Register "bank" in controller */
> 0x8c /* Register offset */
> 0x000000c0 /* Write bitmask, 0 for whole register */
> 0x00000080 /* Write value */
> >
> <
> 1 /* Register "bank" in controller */
> 0x8c /* Register offset */
> 0x00000300 /* Write bitmask, 0 for whole register */
> 0x00000200 /* Write value */
> >
> <
> &other_pmx /* Pin controller */
> 1 /* Number of entries for this controller */
> >
> <
> 0 /* Register "bank" in controller */
> 0x04 /* Register offset */
> 0x000000ff /* Write bitmask, 0 for whole register */
> 0x0000005a /* Write value */
> >;
> }
> };
>
> When parsing a reg-init property, we know if it contains phandles by:
> * If node containing property is a child of a pin controller, the property
> doesn't containt pin controller phandles.
> * Otherwise, it does.
>
> What are people's thoughts. Thinking about all the issues involved, this
> is certainly the approach I like most right now.
>
> --
> nvpublic
>
next prev parent reply other threads:[~2012-02-06 3:07 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-05 5:31 An extremely simplified pinctrl bindings proposal Stephen Warren
2012-02-05 6:07 ` Richard Zhao
2012-02-06 3:07 ` Thomas Abraham [this message]
2012-02-06 5:44 ` Stephen Warren
2012-02-06 4:20 ` Linus Walleij
[not found] ` <CACRpkdahin4srDh7dphgvq306gjz7CGP=h4dVkUY+w0z0wpXRQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-06 5:53 ` Stephen Warren
2012-02-06 17:29 ` Linus Walleij
[not found] ` <CACRpkdbtTPSoX1x4aBtNVGZ2Qex9t77D09V9JgON_jfShQdx6w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-06 19:03 ` Tony Lindgren
[not found] ` <20120206190315.GU1426-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2012-02-06 19:56 ` Linus Walleij
[not found] ` <CACRpkdZthbejmTqRJAWHb8jU-p8LPT_+zj_CY1q0voMb4FKz2Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-06 21:04 ` Tony Lindgren
2012-02-06 23:15 ` Linus Walleij
[not found] ` <CACRpkdYrbD3PpJ3wb69yb3Ya8SeZJnPpgJdtttjWTkS5xsD-4g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-06 23:57 ` Tony Lindgren
[not found] ` <20120206235733.GY1426-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2012-02-07 1:07 ` Linus Walleij
2012-02-07 5:28 ` Stephen Warren
[not found] ` <4F2F6AE2.1040504-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-02-06 19:41 ` Mark Brown
[not found] ` <74CDBE0F657A3D45AFBB94109FB122FF178E5D3160-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2012-02-06 18:57 ` Tony Lindgren
2012-02-06 19:05 ` Mitch Bradley
2012-02-06 19:26 ` Linus Walleij
[not found] ` <CACRpkdYt-L+an5DTdYkS5Hi+18-rszAt7hXwZNUNVK-d0UaCWA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-06 21:24 ` Mitch Bradley
[not found] ` <4F302474.1020701-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
2012-02-07 5:33 ` Stephen Warren
[not found] ` <4F30B79C.4030404-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-02-07 7:07 ` Mitch Bradley
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=CAJuYYwQ2yczBh+CBFWohZPM+9jHXYxyxYzL8CS4puE96v4fDXw@mail.gmail.com \
--to=thomas.abraham@linaro.org \
--cc=B29396@freescale.com \
--cc=cjb@laptop.org \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=dongas86@gmail.com \
--cc=grant.likely@secretlab.ca \
--cc=kernel@pengutronix.de \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rob.herring@calxeda.com \
--cc=s.hauer@pengutronix.de \
--cc=shawn.guo@linaro.org \
--cc=sjg@chromium.org \
--cc=swarren@nvidia.com \
--cc=tony@atomide.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).