[2/4] pinctrl: Add skew-delay pin config and bindings

Message ID 20171028133719.27528-2-linus.walleij@linaro.org
State Accepted
Commit e0e1e39de490a2d9b8a173363ccf2415ddada871
Headers show
Series
  • [1/4] pinctrl: gemini: Add missing functions
Related show

Commit Message

Linus Walleij Oct. 28, 2017, 1:37 p.m.
Some pin controllers (such as the Gemini) can control the
expected clock skew and output delay on certain pins with a
sub-nanosecond granularity. This is typically done by shunting
in a number of double inverters in front of or behind the pin.
Make it possible to configure this with a generic binding.

Cc: devicetree@vger.kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

---
 Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt | 4 ++++
 drivers/pinctrl/pinconf-generic.c                              | 2 ++
 include/linux/pinctrl/pinconf-generic.h                        | 5 +++++
 3 files changed, 11 insertions(+)

-- 
2.13.6

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Hans Ulli Kroll Nov. 1, 2017, 5:56 a.m. | #1
Hi Linus,

On Sat, 28 Oct 2017, Linus Walleij wrote:

> Some pin controllers (such as the Gemini) can control the

> expected clock skew and output delay on certain pins with a

> sub-nanosecond granularity. This is typically done by shunting

> in a number of double inverters in front of or behind the pin.

> Make it possible to configure this with a generic binding.

> 

> Cc: devicetree@vger.kernel.org

> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

> ---


Acked-by: Hans Ulli Kroll <ulli.kroll@googlemail.com>


--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Herring Nov. 8, 2017, 12:38 a.m. | #2
On Thu, Nov 2, 2017 at 9:32 AM, Linus Walleij <linus.walleij@linaro.org> wrote:
> On Wed, Nov 1, 2017 at 10:26 PM, Rob Herring <robh@kernel.org> wrote:

>> On Sat, Oct 28, 2017 at 03:37:17PM +0200, Linus Walleij wrote:

>>> Some pin controllers (such as the Gemini) can control the

>>> expected clock skew and output delay on certain pins with a

>>> sub-nanosecond granularity. This is typically done by shunting

>>> in a number of double inverters in front of or behind the pin.

>>> Make it possible to configure this with a generic binding.

>>>

>>> Cc: devicetree@vger.kernel.org

>>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

>>> ---

>>>  Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt | 4 ++++

>>>  drivers/pinctrl/pinconf-generic.c                              | 2 ++

>>>  include/linux/pinctrl/pinconf-generic.h                        | 5 +++++

>>>  3 files changed, 11 insertions(+)

>>>

>>> diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt

>>> index 4483cc31e531..ad9bbbba36e9 100644

>>> --- a/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt

>>> +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt

>>> @@ -271,6 +271,10 @@ output-high              - set the pin to output mode with high level

>>>  sleep-hardware-state - indicate this is sleep related state which will be programmed

>>>                         into the registers for the sleep state.

>>>  slew-rate            - set the slew rate

>>> +skew-delay           - this affects the expected clock skew on input pins

>>> +                       and the delay before latching a value to an output

>>> +                       pin. Typically indicates how many double-inverters are

>>> +                       used to delay the signal.

>>

>> Units?

>

> Number of double-inverters I guess, just as it says.

>

> skew-delay = <1>; // number of inverter pairs

>

> Like with other bindings of this type they are custom.

>

> The Gemini datasheet says "every unit represents about 0.2 ns".

>

> So if you set it to 1, that means (as far as I can guess) this

> is shunted in:

>

>    |\    |\

> --+ >o--+ >o---

>    |/    |/

>

> The signal will take ~0.2 ns to propagate through this.

> For 2, there will be four inverters etc.

>

> It is dependent of production technology, and I do not know

> if everyone is using something like double-inverters.

>

> We could try to define a value in picoseconds instead so I

> would need to set this to 200 in that case if you think that is better:

>

> skew-delay = <200>; // picoseconds

>

> I think it would be kludgy since with increasing clock speeds

> maybe picoseconds would be too big even. Nanoseconds is

> apparently already a to coarse unit.


Okay, it is fine.

Acked-by: Rob Herring <robh@kernel.org>

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
index 4483cc31e531..ad9bbbba36e9 100644
--- a/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
+++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
@@ -271,6 +271,10 @@  output-high		- set the pin to output mode with high level
 sleep-hardware-state	- indicate this is sleep related state which will be programmed
 			  into the registers for the sleep state.
 slew-rate		- set the slew rate
+skew-delay		- this affects the expected clock skew on input pins
+			  and the delay before latching a value to an output
+			  pin. Typically indicates how many double-inverters are
+			  used to delay the signal.
 
 For example:
 
diff --git a/drivers/pinctrl/pinconf-generic.c b/drivers/pinctrl/pinconf-generic.c
index 8eaa25c3384f..b4f7f8a458ea 100644
--- a/drivers/pinctrl/pinconf-generic.c
+++ b/drivers/pinctrl/pinconf-generic.c
@@ -49,6 +49,7 @@  static const struct pin_config_item conf_items[] = {
 	PCONFDUMP(PIN_CONFIG_POWER_SOURCE, "pin power source", "selector", true),
 	PCONFDUMP(PIN_CONFIG_SLEEP_HARDWARE_STATE, "sleep hardware state", NULL, false),
 	PCONFDUMP(PIN_CONFIG_SLEW_RATE, "slew rate", NULL, true),
+	PCONFDUMP(PIN_CONFIG_SKEW_DELAY, "skew delay", NULL, true),
 };
 
 static void pinconf_generic_dump_one(struct pinctrl_dev *pctldev,
@@ -181,6 +182,7 @@  static const struct pinconf_generic_params dt_params[] = {
 	{ "power-source", PIN_CONFIG_POWER_SOURCE, 0 },
 	{ "sleep-hardware-state", PIN_CONFIG_SLEEP_HARDWARE_STATE, 0 },
 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
+	{ "skew-delay", PIN_CONFIG_SKEW_DELAY, 0 },
 };
 
 /**
diff --git a/include/linux/pinctrl/pinconf-generic.h b/include/linux/pinctrl/pinconf-generic.h
index 5d8bc7f21c2a..ec6dadcc1fde 100644
--- a/include/linux/pinctrl/pinconf-generic.h
+++ b/include/linux/pinctrl/pinconf-generic.h
@@ -90,6 +90,10 @@ 
  * @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to
  *	this parameter (on a custom format) tells the driver which alternative
  *	slew rate to use.
+ * @PIN_CONFIG_SKEW_DELAY: if the pin has programmable skew rate (on inputs)
+ *	or latch delay (on outputs) this parameter (in a custom format)
+ *	specifies the clock skew or latch delay. It typically controls how
+ *	many double inverters are put in front of the line.
  * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
  *	you need to pass in custom configurations to the pin controller, use
  *	PIN_CONFIG_END+1 as the base offset.
@@ -117,6 +121,7 @@  enum pin_config_param {
 	PIN_CONFIG_POWER_SOURCE,
 	PIN_CONFIG_SLEEP_HARDWARE_STATE,
 	PIN_CONFIG_SLEW_RATE,
+	PIN_CONFIG_SKEW_DELAY,
 	PIN_CONFIG_END = 0x7F,
 	PIN_CONFIG_MAX = 0xFF,
 };