diff mbox

[v7,2/2] memory: atmel-ebi: add DT bindings documentation

Message ID 1461845007-23139-2-git-send-email-boris.brezillon@free-electrons.com (mailing list archive)
State New, archived
Headers show

Commit Message

Boris BREZILLON April 28, 2016, 12:03 p.m. UTC
The EBI (External Bus Interface) is used to access external peripherals
(NOR, SRAM, NAND, and other specific devices like ethernet controllers).
Each device is assigned a CS line and an address range and can have its
own configuration (timings, access mode, bus width, ...).
This driver provides a generic DT binding to configure a device according
to its requirements.
For specific device controllers (like the NAND one) the SMC timings
should be configured by the controller driver through the matrix and smc
syscon regmaps.

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
 .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
 1 file changed, 136 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt

Comments

Rob Herring (Arm) May 3, 2016, 4:40 p.m. UTC | #1
On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
> The EBI (External Bus Interface) is used to access external peripherals
> (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> Each device is assigned a CS line and an address range and can have its
> own configuration (timings, access mode, bus width, ...).
> This driver provides a generic DT binding to configure a device according
> to its requirements.
> For specific device controllers (like the NAND one) the SMC timings
> should be configured by the controller driver through the matrix and smc
> syscon regmaps.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> ---
>  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
>  1 file changed, 136 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> 
> diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> new file mode 100644
> index 0000000..a6dca5c
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> @@ -0,0 +1,136 @@
> +* Device tree bindings for Atmel EBI
> +
> +The External Bus Interface (EBI) controller is a bus where you can connect
> +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
> +The EBI provides a glue-less interface to asynchronous memories through the SMC
> +(Static Memory Controller).
> +
> +Required properties:
> +
> +- compatible:		"atmel,at91sam9260-ebi"
> +			"atmel,at91sam9261-ebi"
> +			"atmel,at91sam9263-ebi0"
> +			"atmel,at91sam9263-ebi1"

What are the differences between 0 and 1?

> +			"atmel,at91sam9rl-ebi"
> +			"atmel,at91sam9g45-ebi"
> +			"atmel,at91sam9x5-ebi"
> +			"atmel,sama5d3-ebi"
> +
> +- reg:			Contains offset/length value for EBI memory mapping.
> +			This property might contain several entries if the EBI
> +			memory range is not contiguous
> +
> +- #address-cells:	Must be 2.
> +			The first cell encodes the CS.
> +			The second cell encode the offset into the CS memory
> +			range.
> +
> +- #size-cells:		Must be set to 1.
> +
> +- ranges:		Encodes CS to memory region association.
> +
> +- clocks:		Clock feeding the EBI controller.
> +			See clock-bindings.txt
> +
> +Children device nodes are representing device connected to the EBI bus.
> +
> +Required device node properties:
> +
> +- #reg:			Contains the chip-select id, the offset and the length

s/#reg/reg/

> +			of the memory region requested by the device.
> +
> +EBI bus configuration associated with specific chip-select will be defined in
> +the configs subnode. This configs node will in turn contain several subnodes
> +named config-<cs-id>, each of them containing the following properties.

This is a bit unusual. Why not just part of the child device nodes?

> +
> +Optional config-<cs-id> node properties:
> +
> +- atmel,bus-width:		width of the asynchronous device's data bus
> +				8, 16 or 32.
> +				Default to 8 when undefined.
> +
> +- atmel,byte-access-type	"write" or "select" (see Atmel datasheet).
> +				Default to "select" when undefined.
> +
> +- atmel,read-mode		"nrd" or "ncs".
> +				Default to "ncs" when undefined.
> +
> +- atmel,write-mode		"nwe" or "ncs".
> +				Default to "ncs" when undefined.
> +
> +- atmel,exnw-mode		"disabled", "frozen" or "ready".
> +				Default to "disabled" when undefined.
> +
> +- atmel,page-mode		enable page mode if present. The provided value
> +				defines the page size (supported values: 4, 8,
> +				16 and 32).
> +
> +- atmel,tdf-mode:		"normal" or "optimized". When set to

This should be boolean.

> +				"optimized" the data float time is optimized
> +				depending on the next device being accessed
> +				(next device setup time is subtracted to the
> +				current device data float time).
> +				Default to "normal" when undefined.
> +
> +Mandatory timings expressed in nanoseconds (see Atmel datasheet for a full
> +description).

Required first, then optional properties please.

> +
> +- atmel,ncs-rd-setup-ns
> +- atmel,nrd-setup-ns
> +- atmel,ncs-wr-setup-ns
> +- atmel,nwe-setup-ns
> +- atmel,ncs-rd-pulse-ns
> +- atmel,nrd-pulse-ns
> +- atmel,ncs-wr-pulse-ns
> +- atmel,nwe-pulse-ns
> +- atmel,nwe-cycle-ns
> +- atmel,nrd-cycle-ns
> +- atmel,tdf-ns
> +
> +Example:
> +
> +	ebi: ebi@10000000 {
> +		compatible = "atmel,sama5d3-ebi";
> +		#address-cells = <2>;
> +		#size-cells = <1>;

> +		atmel,smc = <&hsmc>;
> +		atmel,matrix = <&matrix>;

What are these? 

> +		reg = <0x10000000 0x10000000
> +		       0x40000000 0x30000000>;
> +		ranges = <0x0 0x0 0x10000000 0x10000000
> +			  0x1 0x0 0x40000000 0x10000000
> +			  0x2 0x0 0x50000000 0x10000000
> +			  0x3 0x0 0x60000000 0x10000000>;
> +		clocks = <&mck>;
> +
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pinctrl_ebi_addr>;

Not documented.

> +
> +		configs {
> +			config-0 {
> +				atmel,read-mode = "nrd";
> +				atmel,write-mode = "nwe";
> +				atmel,bus-width = <16>;
> +				atmel,ncs-rd-setup-ns = <0>;
> +				atmel,ncs-wr-setup-ns = <0>;
> +				atmel,nwe-setup-ns = <8>;
> +				atmel,nrd-setup-ns = <16>;
> +				atmel,ncs-rd-pulse-ns = <84>;
> +				atmel,ncs-wr-pulse-ns = <84>;
> +				atmel,nrd-pulse-ns = <76>;
> +				atmel,nwe-pulse-ns = <76>;
> +				atmel,nrd-cycle-ns = <107>;
> +				atmel,nwe-cycle-ns = <84>;
> +				atmel,tdf-ns = <16>;
> +			};
> +		};
> +
> +		nor: flash@0,0 {
> +			compatible = "cfi-flash";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +			reg = <0x0 0x0 0x1000000>;
> +			bank-width = <2>;
> +		};
> +	};
> +
> -- 
> 2.7.4
>
Boris BREZILLON May 3, 2016, 4:51 p.m. UTC | #2
Hi Rob,

On Tue, 3 May 2016 11:40:19 -0500
Rob Herring <robh@kernel.org> wrote:

> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
> > The EBI (External Bus Interface) is used to access external peripherals
> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> > Each device is assigned a CS line and an address range and can have its
> > own configuration (timings, access mode, bus width, ...).
> > This driver provides a generic DT binding to configure a device according
> > to its requirements.
> > For specific device controllers (like the NAND one) the SMC timings
> > should be configured by the controller driver through the matrix and smc
> > syscon regmaps.
> > 
> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> > ---
> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
> >  1 file changed, 136 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> > 
> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> > new file mode 100644
> > index 0000000..a6dca5c
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> > @@ -0,0 +1,136 @@
> > +* Device tree bindings for Atmel EBI
> > +
> > +The External Bus Interface (EBI) controller is a bus where you can connect
> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
> > +(Static Memory Controller).
> > +
> > +Required properties:
> > +
> > +- compatible:		"atmel,at91sam9260-ebi"
> > +			"atmel,at91sam9261-ebi"
> > +			"atmel,at91sam9263-ebi0"
> > +			"atmel,at91sam9263-ebi1"  
> 
> What are the differences between 0 and 1?

Because this SoC has 2 EBI busses with different capabilities.

> 
> > +			"atmel,at91sam9rl-ebi"
> > +			"atmel,at91sam9g45-ebi"
> > +			"atmel,at91sam9x5-ebi"
> > +			"atmel,sama5d3-ebi"
> > +
> > +- reg:			Contains offset/length value for EBI memory mapping.
> > +			This property might contain several entries if the EBI
> > +			memory range is not contiguous
> > +
> > +- #address-cells:	Must be 2.
> > +			The first cell encodes the CS.
> > +			The second cell encode the offset into the CS memory
> > +			range.
> > +
> > +- #size-cells:		Must be set to 1.
> > +
> > +- ranges:		Encodes CS to memory region association.
> > +
> > +- clocks:		Clock feeding the EBI controller.
> > +			See clock-bindings.txt
> > +
> > +Children device nodes are representing device connected to the EBI bus.
> > +
> > +Required device node properties:
> > +
> > +- #reg:			Contains the chip-select id, the offset and the length  
> 
> s/#reg/reg/

Will fix that.

> 
> > +			of the memory region requested by the device.
> > +
> > +EBI bus configuration associated with specific chip-select will be defined in
> > +the configs subnode. This configs node will in turn contain several subnodes
> > +named config-<cs-id>, each of them containing the following properties.  
> 
> This is a bit unusual. Why not just part of the child device nodes?

Oh, come on! I reworked the binding because Mark complained about the
previous binding which was doing exactly what you're suggesting. Can
you please be consistent in your reviews... 


> 
> > +
> > +Optional config-<cs-id> node properties:
> > +
> > +- atmel,bus-width:		width of the asynchronous device's data bus
> > +				8, 16 or 32.
> > +				Default to 8 when undefined.
> > +
> > +- atmel,byte-access-type	"write" or "select" (see Atmel datasheet).
> > +				Default to "select" when undefined.
> > +
> > +- atmel,read-mode		"nrd" or "ncs".
> > +				Default to "ncs" when undefined.
> > +
> > +- atmel,write-mode		"nwe" or "ncs".
> > +				Default to "ncs" when undefined.
> > +
> > +- atmel,exnw-mode		"disabled", "frozen" or "ready".
> > +				Default to "disabled" when undefined.
> > +
> > +- atmel,page-mode		enable page mode if present. The provided value
> > +				defines the page size (supported values: 4, 8,
> > +				16 and 32).
> > +
> > +- atmel,tdf-mode:		"normal" or "optimized". When set to  
> 
> This should be boolean.

It was a formerly defined as a boolean, and when it's done like that we
have no way to identify whether the property was forgotten or
intentionally set to normal mode. What's the problem with this approach?

> 
> > +				"optimized" the data float time is optimized
> > +				depending on the next device being accessed
> > +				(next device setup time is subtracted to the
> > +				current device data float time).
> > +				Default to "normal" when undefined.
> > +
> > +Mandatory timings expressed in nanoseconds (see Atmel datasheet for a full
> > +description).  
> 
> Required first, then optional properties please.

Okay.

> 
> > +
> > +- atmel,ncs-rd-setup-ns
> > +- atmel,nrd-setup-ns
> > +- atmel,ncs-wr-setup-ns
> > +- atmel,nwe-setup-ns
> > +- atmel,ncs-rd-pulse-ns
> > +- atmel,nrd-pulse-ns
> > +- atmel,ncs-wr-pulse-ns
> > +- atmel,nwe-pulse-ns
> > +- atmel,nwe-cycle-ns
> > +- atmel,nrd-cycle-ns
> > +- atmel,tdf-ns
> > +
> > +Example:
> > +
> > +	ebi: ebi@10000000 {
> > +		compatible = "atmel,sama5d3-ebi";
> > +		#address-cells = <2>;
> > +		#size-cells = <1>;  
> 
> > +		atmel,smc = <&hsmc>;
> > +		atmel,matrix = <&matrix>;  
> 
> What are these? 
> 
> > +		reg = <0x10000000 0x10000000
> > +		       0x40000000 0x30000000>;
> > +		ranges = <0x0 0x0 0x10000000 0x10000000
> > +			  0x1 0x0 0x40000000 0x10000000
> > +			  0x2 0x0 0x50000000 0x10000000
> > +			  0x3 0x0 0x60000000 0x10000000>;
> > +		clocks = <&mck>;
> > +
> > +		pinctrl-names = "default";
> > +		pinctrl-0 = <&pinctrl_ebi_addr>;  
> 
> Not documented.

Will document those properties.

Regards,

Boris
Rob Herring (Arm) May 3, 2016, 7:11 p.m. UTC | #3
On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
<boris.brezillon@free-electrons.com> wrote:
> Hi Rob,
>
> On Tue, 3 May 2016 11:40:19 -0500
> Rob Herring <robh@kernel.org> wrote:
>
>> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>> > The EBI (External Bus Interface) is used to access external peripherals
>> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>> > Each device is assigned a CS line and an address range and can have its
>> > own configuration (timings, access mode, bus width, ...).
>> > This driver provides a generic DT binding to configure a device according
>> > to its requirements.
>> > For specific device controllers (like the NAND one) the SMC timings
>> > should be configured by the controller driver through the matrix and smc
>> > syscon regmaps.
>> >
>> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
>> > ---
>> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
>> >  1 file changed, 136 insertions(+)
>> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>> >
>> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>> > new file mode 100644
>> > index 0000000..a6dca5c
>> > --- /dev/null
>> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>> > @@ -0,0 +1,136 @@
>> > +* Device tree bindings for Atmel EBI
>> > +
>> > +The External Bus Interface (EBI) controller is a bus where you can connect
>> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
>> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
>> > +(Static Memory Controller).
>> > +
>> > +Required properties:
>> > +
>> > +- compatible:              "atmel,at91sam9260-ebi"
>> > +                   "atmel,at91sam9261-ebi"
>> > +                   "atmel,at91sam9263-ebi0"
>> > +                   "atmel,at91sam9263-ebi1"
>>
>> What are the differences between 0 and 1?
>
> Because this SoC has 2 EBI busses with different capabilities.

Okay, correct answer. :)

[...]

>>
>> > +                   of the memory region requested by the device.
>> > +
>> > +EBI bus configuration associated with specific chip-select will be defined in
>> > +the configs subnode. This configs node will in turn contain several subnodes
>> > +named config-<cs-id>, each of them containing the following properties.
>>
>> This is a bit unusual. Why not just part of the child device nodes?
>
> Oh, come on! I reworked the binding because Mark complained about the
> previous binding which was doing exactly what you're suggesting. Can
> you please be consistent in your reviews...

No, Mark and I both have our opinions. Which part of this patch
explains the history? If the revision history is not in the patch, I'm
not looking at it.

My issue with it this way is that it has invented yet another way to
describe timings. I would like to be consistent across external bus
descriptions, but we're not very consistent to begin with though. The
most common seems to be the way you first did it. But I agree that it
is kind of screwy to have an intermediate node unless the controller
itself has sub-blocks within it and is not the established way to
describe a bus with chip selects. I would either put the properties
directly in the child nodes (e.g. flash@0,0) or put your config nodes
in the device node. I'd call it timings instead of config, but that's
just bikeshedding.

memory-controller@1000 {
  ...
  flash@0,0 {
    timings {
      ...
    };
  };
};

>> > +
>> > +Optional config-<cs-id> node properties:
>> > +
>> > +- atmel,bus-width:         width of the asynchronous device's data bus
>> > +                           8, 16 or 32.
>> > +                           Default to 8 when undefined.
>> > +
>> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
>> > +                           Default to "select" when undefined.
>> > +
>> > +- atmel,read-mode          "nrd" or "ncs".
>> > +                           Default to "ncs" when undefined.
>> > +
>> > +- atmel,write-mode         "nwe" or "ncs".
>> > +                           Default to "ncs" when undefined.
>> > +
>> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
>> > +                           Default to "disabled" when undefined.
>> > +
>> > +- atmel,page-mode          enable page mode if present. The provided value
>> > +                           defines the page size (supported values: 4, 8,
>> > +                           16 and 32).
>> > +
>> > +- atmel,tdf-mode:          "normal" or "optimized". When set to
>>
>> This should be boolean.
>
> It was a formerly defined as a boolean, and when it's done like that we
> have no way to identify whether the property was forgotten or
> intentionally set to normal mode. What's the problem with this approach?

Only preference to use boolean when that is sufficient. With your
argument, then we should never have booleans. You state that missing
means "normal", not forgotten, so all these properties should be
required with no default.

BTW, I debated the same thing on the other properties, but I could see
them being expanded to a 3rd mode. I don't see that here though.

Rob
Boris BREZILLON May 4, 2016, 9:35 a.m. UTC | #4
Hi Rob,

On Tue, 3 May 2016 14:11:04 -0500
Rob Herring <robh@kernel.org> wrote:

> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> <boris.brezillon@free-electrons.com> wrote:
> > Hi Rob,
> >
> > On Tue, 3 May 2016 11:40:19 -0500
> > Rob Herring <robh@kernel.org> wrote:
> >
> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
> >> > The EBI (External Bus Interface) is used to access external peripherals
> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> >> > Each device is assigned a CS line and an address range and can have its
> >> > own configuration (timings, access mode, bus width, ...).
> >> > This driver provides a generic DT binding to configure a device according
> >> > to its requirements.
> >> > For specific device controllers (like the NAND one) the SMC timings
> >> > should be configured by the controller driver through the matrix and smc
> >> > syscon regmaps.
> >> >
> >> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> >> > ---
> >> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
> >> >  1 file changed, 136 insertions(+)
> >> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> >
> >> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> > new file mode 100644
> >> > index 0000000..a6dca5c
> >> > --- /dev/null
> >> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> > @@ -0,0 +1,136 @@
> >> > +* Device tree bindings for Atmel EBI
> >> > +
> >> > +The External Bus Interface (EBI) controller is a bus where you can connect
> >> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
> >> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
> >> > +(Static Memory Controller).
> >> > +
> >> > +Required properties:
> >> > +
> >> > +- compatible:              "atmel,at91sam9260-ebi"
> >> > +                   "atmel,at91sam9261-ebi"
> >> > +                   "atmel,at91sam9263-ebi0"
> >> > +                   "atmel,at91sam9263-ebi1"
> >>
> >> What are the differences between 0 and 1?
> >
> > Because this SoC has 2 EBI busses with different capabilities.
> 
> Okay, correct answer. :)
> 
> [...]
> 
> >>
> >> > +                   of the memory region requested by the device.
> >> > +
> >> > +EBI bus configuration associated with specific chip-select will be defined in
> >> > +the configs subnode. This configs node will in turn contain several subnodes
> >> > +named config-<cs-id>, each of them containing the following properties.
> >>
> >> This is a bit unusual. Why not just part of the child device nodes?
> >
> > Oh, come on! I reworked the binding because Mark complained about the
> > previous binding which was doing exactly what you're suggesting. Can
> > you please be consistent in your reviews...
> 
> No, Mark and I both have our opinions. Which part of this patch
> explains the history?

Hm, it's in patch 1/2 (just dropped the cover letter, which might not
be such a good idea).

> If the revision history is not in the patch, I'm
> not looking at it.
> 
> My issue with it this way is that it has invented yet another way to
> describe timings. I would like to be consistent across external bus
> descriptions, but we're not very consistent to begin with though. The
> most common seems to be the way you first did it. But I agree that it
> is kind of screwy to have an intermediate node unless the controller
> itself has sub-blocks within it and is not the established way to
> describe a bus with chip selects. I would either put the properties
> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> in the device node. I'd call it timings instead of config, but that's
> just bikeshedding.

Well, it's not only describing timings (see atmel,bus-width,
atmel,byte-access-type, ...), but I'm fine with either names :).

> 
> memory-controller@1000 {
>   ...
>   flash@0,0 {
>     timings {
>       ...
>     };
>   };
> };

Okay. Mark, what do you think of this approach?

Note that one of my previous version was defining timings directly in
the EBI device node, and Arnd noted that doing so may cause problems
if one of the EBI property (or the config/timing node name) conflict
with the sub-device binding, which is why I decided to put the EBI
config definitions in a separate subnode.

> 
> >> > +
> >> > +Optional config-<cs-id> node properties:
> >> > +
> >> > +- atmel,bus-width:         width of the asynchronous device's data bus
> >> > +                           8, 16 or 32.
> >> > +                           Default to 8 when undefined.
> >> > +
> >> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
> >> > +                           Default to "select" when undefined.
> >> > +
> >> > +- atmel,read-mode          "nrd" or "ncs".
> >> > +                           Default to "ncs" when undefined.
> >> > +
> >> > +- atmel,write-mode         "nwe" or "ncs".
> >> > +                           Default to "ncs" when undefined.
> >> > +
> >> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
> >> > +                           Default to "disabled" when undefined.
> >> > +
> >> > +- atmel,page-mode          enable page mode if present. The provided value
> >> > +                           defines the page size (supported values: 4, 8,
> >> > +                           16 and 32).
> >> > +
> >> > +- atmel,tdf-mode:          "normal" or "optimized". When set to
> >>
> >> This should be boolean.
> >
> > It was a formerly defined as a boolean, and when it's done like that we
> > have no way to identify whether the property was forgotten or
> > intentionally set to normal mode. What's the problem with this approach?
> 
> Only preference to use boolean when that is sufficient. With your
> argument, then we should never have booleans. You state that missing
> means "normal", not forgotten, so all these properties should be
> required with no default.
> 
> BTW, I debated the same thing on the other properties, but I could see
> them being expanded to a 3rd mode. I don't see that here though.

Well, another reason I switched to a string property is because I
implemented hardware readout in v4, and decided to retrieve the current
state from the hardware and only overload the config with what was
defined in the DT. In this case, if we move to a boolean property we
can't know whether the property is missing because we want to put the
bus in "normal" mode or because we want to keep this config unchanged
(keep the bootloader/bootstrap config).

This is not true in v5, so maybe we should go back to the boolean
atmel,tdf-optimized property.

Thanks,

Boris
Boris BREZILLON May 4, 2016, 9:38 a.m. UTC | #5
Hi Rob,

On Tue, 3 May 2016 14:11:04 -0500
Rob Herring <robh@kernel.org> wrote:

> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> <boris.brezillon@free-electrons.com> wrote:
> > Hi Rob,
> >
> > On Tue, 3 May 2016 11:40:19 -0500
> > Rob Herring <robh@kernel.org> wrote:
> >
> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
> >> > The EBI (External Bus Interface) is used to access external peripherals
> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> >> > Each device is assigned a CS line and an address range and can have its
> >> > own configuration (timings, access mode, bus width, ...).
> >> > This driver provides a generic DT binding to configure a device according
> >> > to its requirements.
> >> > For specific device controllers (like the NAND one) the SMC timings
> >> > should be configured by the controller driver through the matrix and smc
> >> > syscon regmaps.
> >> >
> >> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> >> > ---
> >> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
> >> >  1 file changed, 136 insertions(+)
> >> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> >
> >> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> > new file mode 100644
> >> > index 0000000..a6dca5c
> >> > --- /dev/null
> >> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
> >> > @@ -0,0 +1,136 @@
> >> > +* Device tree bindings for Atmel EBI
> >> > +
> >> > +The External Bus Interface (EBI) controller is a bus where you can connect
> >> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
> >> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
> >> > +(Static Memory Controller).
> >> > +
> >> > +Required properties:
> >> > +
> >> > +- compatible:              "atmel,at91sam9260-ebi"
> >> > +                   "atmel,at91sam9261-ebi"
> >> > +                   "atmel,at91sam9263-ebi0"
> >> > +                   "atmel,at91sam9263-ebi1"
> >>
> >> What are the differences between 0 and 1?
> >
> > Because this SoC has 2 EBI busses with different capabilities.
> 
> Okay, correct answer. :)
> 
> [...]
> 
> >>
> >> > +                   of the memory region requested by the device.
> >> > +
> >> > +EBI bus configuration associated with specific chip-select will be defined in
> >> > +the configs subnode. This configs node will in turn contain several subnodes
> >> > +named config-<cs-id>, each of them containing the following properties.
> >>
> >> This is a bit unusual. Why not just part of the child device nodes?
> >
> > Oh, come on! I reworked the binding because Mark complained about the
> > previous binding which was doing exactly what you're suggesting. Can
> > you please be consistent in your reviews...
> 
> No, Mark and I both have our opinions. Which part of this patch
> explains the history?

Hm, it's in patch 1/2 (just dropped the cover letter, which might not
be such a good idea).

> If the revision history is not in the patch, I'm
> not looking at it.
> 
> My issue with it this way is that it has invented yet another way to
> describe timings. I would like to be consistent across external bus
> descriptions, but we're not very consistent to begin with though. The
> most common seems to be the way you first did it. But I agree that it
> is kind of screwy to have an intermediate node unless the controller
> itself has sub-blocks within it and is not the established way to
> describe a bus with chip selects. I would either put the properties
> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> in the device node. I'd call it timings instead of config, but that's
> just bikeshedding.

Well, it's not only describing timings (see atmel,bus-width,
atmel,byte-access-type, ...), but I'm fine with either names :).

> 
> memory-controller@1000 {
>   ...
>   flash@0,0 {
>     timings {
>       ...
>     };
>   };
> };

Okay. Mark, what do you think of this approach?

Note that one of my previous version was defining timings directly in
the EBI device node, and Arnd noted that doing so may cause problems
if one of the EBI property (or the config/timing node name) conflict
with the sub-device binding, which is why I decided to put the EBI
config definitions in a separate subnode.

> 
> >> > +
> >> > +Optional config-<cs-id> node properties:
> >> > +
> >> > +- atmel,bus-width:         width of the asynchronous device's data bus
> >> > +                           8, 16 or 32.
> >> > +                           Default to 8 when undefined.
> >> > +
> >> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
> >> > +                           Default to "select" when undefined.
> >> > +
> >> > +- atmel,read-mode          "nrd" or "ncs".
> >> > +                           Default to "ncs" when undefined.
> >> > +
> >> > +- atmel,write-mode         "nwe" or "ncs".
> >> > +                           Default to "ncs" when undefined.
> >> > +
> >> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
> >> > +                           Default to "disabled" when undefined.
> >> > +
> >> > +- atmel,page-mode          enable page mode if present. The provided value
> >> > +                           defines the page size (supported values: 4, 8,
> >> > +                           16 and 32).
> >> > +
> >> > +- atmel,tdf-mode:          "normal" or "optimized". When set to
> >>
> >> This should be boolean.
> >
> > It was a formerly defined as a boolean, and when it's done like that we
> > have no way to identify whether the property was forgotten or
> > intentionally set to normal mode. What's the problem with this approach?
> 
> Only preference to use boolean when that is sufficient. With your
> argument, then we should never have booleans. You state that missing
> means "normal", not forgotten, so all these properties should be
> required with no default.
> 
> BTW, I debated the same thing on the other properties, but I could see
> them being expanded to a 3rd mode. I don't see that here though.

Well, another reason I switched to a string property is because I
implemented hardware readout in v4, and decided to retrieve the current
state from the hardware and only overload the config with what was
defined in the DT. In this case, if we move to a boolean property we
can't know whether the property is missing because we want to put the
bus in "normal" mode or because we want to keep this config unchanged
(keep the bootloader/bootstrap config).

This is not true in v5, so maybe we should go back to the boolean
atmel,tdf-optimized property.

Thanks,

Boris
Jean-Jacques Hiblot May 4, 2016, 10:06 a.m. UTC | #6
2016-05-03 21:11 GMT+02:00 Rob Herring <robh@kernel.org>:
> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> <boris.brezillon@free-electrons.com> wrote:
>> Hi Rob,
>>
>> On Tue, 3 May 2016 11:40:19 -0500
>> Rob Herring <robh@kernel.org> wrote:
>>
>>> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>>> > The EBI (External Bus Interface) is used to access external peripherals
>>> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>>> > Each device is assigned a CS line and an address range and can have its
>>> > own configuration (timings, access mode, bus width, ...).
>>> > This driver provides a generic DT binding to configure a device according
>>> > to its requirements.
>>> > For specific device controllers (like the NAND one) the SMC timings
>>> > should be configured by the controller driver through the matrix and smc
>>> > syscon regmaps.
>>> >
>>> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
>>> > ---
>>> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
>>> >  1 file changed, 136 insertions(+)
>>> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>> >
>>> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>> > new file mode 100644
>>> > index 0000000..a6dca5c
>>> > --- /dev/null
>>> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>> > @@ -0,0 +1,136 @@
>>> > +* Device tree bindings for Atmel EBI
>>> > +
>>> > +The External Bus Interface (EBI) controller is a bus where you can connect
>>> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
>>> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
>>> > +(Static Memory Controller).
>>> > +
>>> > +Required properties:
>>> > +
>>> > +- compatible:              "atmel,at91sam9260-ebi"
>>> > +                   "atmel,at91sam9261-ebi"
>>> > +                   "atmel,at91sam9263-ebi0"
>>> > +                   "atmel,at91sam9263-ebi1"
>>>
>>> What are the differences between 0 and 1?
>>
>> Because this SoC has 2 EBI busses with different capabilities.
>
> Okay, correct answer. :)
>
> [...]
>
>>>
>>> > +                   of the memory region requested by the device.
>>> > +
>>> > +EBI bus configuration associated with specific chip-select will be defined in
>>> > +the configs subnode. This configs node will in turn contain several subnodes
>>> > +named config-<cs-id>, each of them containing the following properties.
>>>
>>> This is a bit unusual. Why not just part of the child device nodes?
>>
>> Oh, come on! I reworked the binding because Mark complained about the
>> previous binding which was doing exactly what you're suggesting. Can
>> you please be consistent in your reviews...
>
> No, Mark and I both have our opinions. Which part of this patch
> explains the history? If the revision history is not in the patch, I'm
> not looking at it.
>
> My issue with it this way is that it has invented yet another way to
> describe timings. I would like to be consistent across external bus
> descriptions, but we're not very consistent to begin with though. The
> most common seems to be the way you first did it. But I agree that it
> is kind of screwy to have an intermediate node unless the controller
> itself has sub-blocks within it and is not the established way to
> describe a bus with chip selects. I would either put the properties
> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> in the device node. I'd call it timings instead of config, but that's
> just bikeshedding.
>
> memory-controller@1000 {
>   ...
>   flash@0,0 {
>     timings {
>       ...
>     };
>   };
> };
>

I don't think the timings belong in the child node as they really are
for the chip select and the chip select may select several devices at
once. I'm thinking (again) of a FPGA here that could implement or
example 4 serial ports at different addresses.

JJ

>>> > +
>>> > +Optional config-<cs-id> node properties:
>>> > +
>>> > +- atmel,bus-width:         width of the asynchronous device's data bus
>>> > +                           8, 16 or 32.
>>> > +                           Default to 8 when undefined.
>>> > +
>>> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
>>> > +                           Default to "select" when undefined.
>>> > +
>>> > +- atmel,read-mode          "nrd" or "ncs".
>>> > +                           Default to "ncs" when undefined.
>>> > +
>>> > +- atmel,write-mode         "nwe" or "ncs".
>>> > +                           Default to "ncs" when undefined.
>>> > +
>>> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
>>> > +                           Default to "disabled" when undefined.
>>> > +
>>> > +- atmel,page-mode          enable page mode if present. The provided value
>>> > +                           defines the page size (supported values: 4, 8,
>>> > +                           16 and 32).
>>> > +
>>> > +- atmel,tdf-mode:          "normal" or "optimized". When set to
>>>
>>> This should be boolean.
>>
>> It was a formerly defined as a boolean, and when it's done like that we
>> have no way to identify whether the property was forgotten or
>> intentionally set to normal mode. What's the problem with this approach?
>
> Only preference to use boolean when that is sufficient. With your
> argument, then we should never have booleans. You state that missing
> means "normal", not forgotten, so all these properties should be
> required with no default.
>
> BTW, I debated the same thing on the other properties, but I could see
> them being expanded to a 3rd mode. I don't see that here though.
>
> Rob
Rob Herring (Arm) May 4, 2016, 12:43 p.m. UTC | #7
On Wed, May 4, 2016 at 5:06 AM, Jean-Jacques Hiblot
<jjhiblot@traphandler.com> wrote:
> 2016-05-03 21:11 GMT+02:00 Rob Herring <robh@kernel.org>:
>> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
>> <boris.brezillon@free-electrons.com> wrote:
>>> Hi Rob,
>>>
>>> On Tue, 3 May 2016 11:40:19 -0500
>>> Rob Herring <robh@kernel.org> wrote:
>>>
>>>> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>>>> > The EBI (External Bus Interface) is used to access external peripherals
>>>> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>>>> > Each device is assigned a CS line and an address range and can have its
>>>> > own configuration (timings, access mode, bus width, ...).
>>>> > This driver provides a generic DT binding to configure a device according
>>>> > to its requirements.
>>>> > For specific device controllers (like the NAND one) the SMC timings
>>>> > should be configured by the controller driver through the matrix and smc
>>>> > syscon regmaps.
>>>> >
>>>> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
>>>> > ---
>>>> >  .../bindings/memory-controllers/atmel,ebi.txt      | 136 +++++++++++++++++++++
>>>> >  1 file changed, 136 insertions(+)
>>>> >  create mode 100644 Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>>> >
>>>> > diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>>> > new file mode 100644
>>>> > index 0000000..a6dca5c
>>>> > --- /dev/null
>>>> > +++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
>>>> > @@ -0,0 +1,136 @@
>>>> > +* Device tree bindings for Atmel EBI
>>>> > +
>>>> > +The External Bus Interface (EBI) controller is a bus where you can connect
>>>> > +asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
>>>> > +The EBI provides a glue-less interface to asynchronous memories through the SMC
>>>> > +(Static Memory Controller).
>>>> > +
>>>> > +Required properties:
>>>> > +
>>>> > +- compatible:              "atmel,at91sam9260-ebi"
>>>> > +                   "atmel,at91sam9261-ebi"
>>>> > +                   "atmel,at91sam9263-ebi0"
>>>> > +                   "atmel,at91sam9263-ebi1"
>>>>
>>>> What are the differences between 0 and 1?
>>>
>>> Because this SoC has 2 EBI busses with different capabilities.
>>
>> Okay, correct answer. :)
>>
>> [...]
>>
>>>>
>>>> > +                   of the memory region requested by the device.
>>>> > +
>>>> > +EBI bus configuration associated with specific chip-select will be defined in
>>>> > +the configs subnode. This configs node will in turn contain several subnodes
>>>> > +named config-<cs-id>, each of them containing the following properties.
>>>>
>>>> This is a bit unusual. Why not just part of the child device nodes?
>>>
>>> Oh, come on! I reworked the binding because Mark complained about the
>>> previous binding which was doing exactly what you're suggesting. Can
>>> you please be consistent in your reviews...
>>
>> No, Mark and I both have our opinions. Which part of this patch
>> explains the history? If the revision history is not in the patch, I'm
>> not looking at it.
>>
>> My issue with it this way is that it has invented yet another way to
>> describe timings. I would like to be consistent across external bus
>> descriptions, but we're not very consistent to begin with though. The
>> most common seems to be the way you first did it. But I agree that it
>> is kind of screwy to have an intermediate node unless the controller
>> itself has sub-blocks within it and is not the established way to
>> describe a bus with chip selects. I would either put the properties
>> directly in the child nodes (e.g. flash@0,0) or put your config nodes
>> in the device node. I'd call it timings instead of config, but that's
>> just bikeshedding.
>>
>> memory-controller@1000 {
>>   ...
>>   flash@0,0 {
>>     timings {
>>       ...
>>     };
>>   };
>> };
>>
>
> I don't think the timings belong in the child node as they really are
> for the chip select and the chip select may select several devices at
> once. I'm thinking (again) of a FPGA here that could implement or
> example 4 serial ports at different addresses.

It is an established pattern already in i.MX WEIM and OMAP GPMC
bindings. The timings are a function of the device attached, so having
them in the device's node makes some sense. Arguably we should define
the timings in a generic way, but that's hard and no one wants to do
that.

Rob
Rob Herring (Arm) May 4, 2016, 1:06 p.m. UTC | #8
On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
<boris.brezillon@free-electrons.com> wrote:
> Hi Rob,
>
> On Tue, 3 May 2016 14:11:04 -0500
> Rob Herring <robh@kernel.org> wrote:
>
>> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
>> <boris.brezillon@free-electrons.com> wrote:
>> > Hi Rob,
>> >
>> > On Tue, 3 May 2016 11:40:19 -0500
>> > Rob Herring <robh@kernel.org> wrote:
>> >
>> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>> >> > The EBI (External Bus Interface) is used to access external peripherals
>> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>> >> > Each device is assigned a CS line and an address range and can have its
>> >> > own configuration (timings, access mode, bus width, ...).
>> >> > This driver provides a generic DT binding to configure a device according
>> >> > to its requirements.
>> >> > For specific device controllers (like the NAND one) the SMC timings
>> >> > should be configured by the controller driver through the matrix and smc
>> >> > syscon regmaps.

[...]

>> >> > +EBI bus configuration associated with specific chip-select will be defined in
>> >> > +the configs subnode. This configs node will in turn contain several subnodes
>> >> > +named config-<cs-id>, each of them containing the following properties.
>> >>
>> >> This is a bit unusual. Why not just part of the child device nodes?
>> >
>> > Oh, come on! I reworked the binding because Mark complained about the
>> > previous binding which was doing exactly what you're suggesting. Can
>> > you please be consistent in your reviews...
>>
>> No, Mark and I both have our opinions. Which part of this patch
>> explains the history?
>
> Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> be such a good idea).
>
>> If the revision history is not in the patch, I'm
>> not looking at it.
>>
>> My issue with it this way is that it has invented yet another way to
>> describe timings. I would like to be consistent across external bus
>> descriptions, but we're not very consistent to begin with though. The
>> most common seems to be the way you first did it. But I agree that it
>> is kind of screwy to have an intermediate node unless the controller
>> itself has sub-blocks within it and is not the established way to
>> describe a bus with chip selects. I would either put the properties
>> directly in the child nodes (e.g. flash@0,0) or put your config nodes
>> in the device node. I'd call it timings instead of config, but that's
>> just bikeshedding.
>
> Well, it's not only describing timings (see atmel,bus-width,
> atmel,byte-access-type, ...), but I'm fine with either names :).
>
>>
>> memory-controller@1000 {
>>   ...
>>   flash@0,0 {
>>     timings {
>>       ...
>>     };
>>   };
>> };
>
> Okay. Mark, what do you think of this approach?
>
> Note that one of my previous version was defining timings directly in
> the EBI device node, and Arnd noted that doing so may cause problems
> if one of the EBI property (or the config/timing node name) conflict
> with the sub-device binding, which is why I decided to put the EBI
> config definitions in a separate subnode.

You have vendor prefixes on all the properties so I don't think a
collision is really a problem. It's also an established pattern in
i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
prefer consistency.

>> >> > +
>> >> > +Optional config-<cs-id> node properties:
>> >> > +
>> >> > +- atmel,bus-width:         width of the asynchronous device's data bus
>> >> > +                           8, 16 or 32.
>> >> > +                           Default to 8 when undefined.
>> >> > +
>> >> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
>> >> > +                           Default to "select" when undefined.
>> >> > +
>> >> > +- atmel,read-mode          "nrd" or "ncs".
>> >> > +                           Default to "ncs" when undefined.
>> >> > +
>> >> > +- atmel,write-mode         "nwe" or "ncs".
>> >> > +                           Default to "ncs" when undefined.
>> >> > +
>> >> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
>> >> > +                           Default to "disabled" when undefined.
>> >> > +
>> >> > +- atmel,page-mode          enable page mode if present. The provided value
>> >> > +                           defines the page size (supported values: 4, 8,
>> >> > +                           16 and 32).
>> >> > +
>> >> > +- atmel,tdf-mode:          "normal" or "optimized". When set to
>> >>
>> >> This should be boolean.
>> >
>> > It was a formerly defined as a boolean, and when it's done like that we
>> > have no way to identify whether the property was forgotten or
>> > intentionally set to normal mode. What's the problem with this approach?
>>
>> Only preference to use boolean when that is sufficient. With your
>> argument, then we should never have booleans. You state that missing
>> means "normal", not forgotten, so all these properties should be
>> required with no default.
>>
>> BTW, I debated the same thing on the other properties, but I could see
>> them being expanded to a 3rd mode. I don't see that here though.
>
> Well, another reason I switched to a string property is because I
> implemented hardware readout in v4, and decided to retrieve the current
> state from the hardware and only overload the config with what was
> defined in the DT. In this case, if we move to a boolean property we
> can't know whether the property is missing because we want to put the
> bus in "normal" mode or because we want to keep this config unchanged
> (keep the bootloader/bootstrap config).

Now you are giving yet another definition of what missing means.
Please pick and document one:
- Error, property missing
- Normal mode
- Retain firmware/bootloader settings (this should probably apply to
all or none)

The last is really the only reason I agree with for not doing a boolean.

Rob
Boris BREZILLON May 4, 2016, 1:35 p.m. UTC | #9
On Wed, 4 May 2016 08:06:10 -0500
Rob Herring <robh@kernel.org> wrote:

> On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
> <boris.brezillon@free-electrons.com> wrote:
> > Hi Rob,
> >
> > On Tue, 3 May 2016 14:11:04 -0500
> > Rob Herring <robh@kernel.org> wrote:
> >  
> >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> >> <boris.brezillon@free-electrons.com> wrote:  
> >> > Hi Rob,
> >> >
> >> > On Tue, 3 May 2016 11:40:19 -0500
> >> > Rob Herring <robh@kernel.org> wrote:
> >> >  
> >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:  
> >> >> > The EBI (External Bus Interface) is used to access external peripherals
> >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> >> >> > Each device is assigned a CS line and an address range and can have its
> >> >> > own configuration (timings, access mode, bus width, ...).
> >> >> > This driver provides a generic DT binding to configure a device according
> >> >> > to its requirements.
> >> >> > For specific device controllers (like the NAND one) the SMC timings
> >> >> > should be configured by the controller driver through the matrix and smc
> >> >> > syscon regmaps.  
> 
> [...]
> 
> >> >> > +EBI bus configuration associated with specific chip-select will be defined in
> >> >> > +the configs subnode. This configs node will in turn contain several subnodes
> >> >> > +named config-<cs-id>, each of them containing the following properties.  
> >> >>
> >> >> This is a bit unusual. Why not just part of the child device nodes?  
> >> >
> >> > Oh, come on! I reworked the binding because Mark complained about the
> >> > previous binding which was doing exactly what you're suggesting. Can
> >> > you please be consistent in your reviews...  
> >>
> >> No, Mark and I both have our opinions. Which part of this patch
> >> explains the history?  
> >
> > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> > be such a good idea).
> >  
> >> If the revision history is not in the patch, I'm
> >> not looking at it.
> >>
> >> My issue with it this way is that it has invented yet another way to
> >> describe timings. I would like to be consistent across external bus
> >> descriptions, but we're not very consistent to begin with though. The
> >> most common seems to be the way you first did it. But I agree that it
> >> is kind of screwy to have an intermediate node unless the controller
> >> itself has sub-blocks within it and is not the established way to
> >> describe a bus with chip selects. I would either put the properties
> >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> >> in the device node. I'd call it timings instead of config, but that's
> >> just bikeshedding.  
> >
> > Well, it's not only describing timings (see atmel,bus-width,
> > atmel,byte-access-type, ...), but I'm fine with either names :).
> >  
> >>
> >> memory-controller@1000 {
> >>   ...
> >>   flash@0,0 {
> >>     timings {
> >>       ...
> >>     };
> >>   };
> >> };  
> >
> > Okay. Mark, what do you think of this approach?
> >
> > Note that one of my previous version was defining timings directly in
> > the EBI device node, and Arnd noted that doing so may cause problems
> > if one of the EBI property (or the config/timing node name) conflict
> > with the sub-device binding, which is why I decided to put the EBI
> > config definitions in a separate subnode.  
> 
> You have vendor prefixes on all the properties so I don't think a
> collision is really a problem. It's also an established pattern in
> i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
> prefer consistency.

So let's summarize that.

memory-controller@1000 {
	...
	flash@0,0 {
		atmel,<ebi-prop-name> = <value>;
		...
		<flash-device-prop> = <value>;
	};
};

Would everyone agree on this representation?

With this approach, it's a bit more complicated to detect the case
where we want to keep bootloader/firmware config, but it should be
doable (it's much more easier to test for the presence of a
config/timing node than verifying that either all or none of the
mandatory properties are here).

Still remains the problem mentioned by Jean-Jacques: what if the
sub-device takes 2 CS lines. Should we apply the same setting to those
slots?

> 
> >> >> > +
> >> >> > +Optional config-<cs-id> node properties:
> >> >> > +
> >> >> > +- atmel,bus-width:         width of the asynchronous device's data bus
> >> >> > +                           8, 16 or 32.
> >> >> > +                           Default to 8 when undefined.
> >> >> > +
> >> >> > +- atmel,byte-access-type   "write" or "select" (see Atmel datasheet).
> >> >> > +                           Default to "select" when undefined.
> >> >> > +
> >> >> > +- atmel,read-mode          "nrd" or "ncs".
> >> >> > +                           Default to "ncs" when undefined.
> >> >> > +
> >> >> > +- atmel,write-mode         "nwe" or "ncs".
> >> >> > +                           Default to "ncs" when undefined.
> >> >> > +
> >> >> > +- atmel,exnw-mode          "disabled", "frozen" or "ready".
> >> >> > +                           Default to "disabled" when undefined.
> >> >> > +
> >> >> > +- atmel,page-mode          enable page mode if present. The provided value
> >> >> > +                           defines the page size (supported values: 4, 8,
> >> >> > +                           16 and 32).
> >> >> > +
> >> >> > +- atmel,tdf-mode:          "normal" or "optimized". When set to  
> >> >>
> >> >> This should be boolean.  
> >> >
> >> > It was a formerly defined as a boolean, and when it's done like that we
> >> > have no way to identify whether the property was forgotten or
> >> > intentionally set to normal mode. What's the problem with this approach?  
> >>
> >> Only preference to use boolean when that is sufficient. With your
> >> argument, then we should never have booleans. You state that missing
> >> means "normal", not forgotten, so all these properties should be
> >> required with no default.
> >>
> >> BTW, I debated the same thing on the other properties, but I could see
> >> them being expanded to a 3rd mode. I don't see that here though.  
> >
> > Well, another reason I switched to a string property is because I
> > implemented hardware readout in v4, and decided to retrieve the current
> > state from the hardware and only overload the config with what was
> > defined in the DT. In this case, if we move to a boolean property we
> > can't know whether the property is missing because we want to put the
> > bus in "normal" mode or because we want to keep this config unchanged
> > (keep the bootloader/bootstrap config).  
> 
> Now you are giving yet another definition of what missing means.
> Please pick and document one:
> - Error, property missing
> - Normal mode
> - Retain firmware/bootloader settings (this should probably apply to
> all or none)

As I said, this has changed in v5. In v4 we were first retrieving the
config from the hardware and then overloading this config with the
properties defined in the DT.
This ambiguity has gone along with the approach of putting the timings
directly in the sub-device node. In this version, EBI configs are
defined directly in configs/config-X nodes, which means that
- if configs/config-X exists, then all mandatory properties should be
  defined (otherwise -EINVAL is returned), and we can fallback to
  default values for optional properties.
- if configs/config-X does not exist, we retrieve the config directly
  from the hardware

So, with this assumption, we could definitely switch to a boolean
property. The only reason I did not change that is because I find it
clearer to have both modes clearly named than having a property called
atmel,tdf-optimized.

Anyway that's not something I'm particularly attached to, so let's
switch back to a boolean property.
Boris BREZILLON May 10, 2016, 8:04 a.m. UTC | #10
On Wed, 4 May 2016 15:35:47 +0200
Boris Brezillon <boris.brezillon@free-electrons.com> wrote:

> On Wed, 4 May 2016 08:06:10 -0500
> Rob Herring <robh@kernel.org> wrote:
> 
> > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
> > <boris.brezillon@free-electrons.com> wrote:  
> > > Hi Rob,
> > >
> > > On Tue, 3 May 2016 14:11:04 -0500
> > > Rob Herring <robh@kernel.org> wrote:
> > >    
> > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> > >> <boris.brezillon@free-electrons.com> wrote:    
> > >> > Hi Rob,
> > >> >
> > >> > On Tue, 3 May 2016 11:40:19 -0500
> > >> > Rob Herring <robh@kernel.org> wrote:
> > >> >    
> > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:    
> > >> >> > The EBI (External Bus Interface) is used to access external peripherals
> > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> > >> >> > Each device is assigned a CS line and an address range and can have its
> > >> >> > own configuration (timings, access mode, bus width, ...).
> > >> >> > This driver provides a generic DT binding to configure a device according
> > >> >> > to its requirements.
> > >> >> > For specific device controllers (like the NAND one) the SMC timings
> > >> >> > should be configured by the controller driver through the matrix and smc
> > >> >> > syscon regmaps.    
> > 
> > [...]
> >   
> > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
> > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
> > >> >> > +named config-<cs-id>, each of them containing the following properties.    
> > >> >>
> > >> >> This is a bit unusual. Why not just part of the child device nodes?    
> > >> >
> > >> > Oh, come on! I reworked the binding because Mark complained about the
> > >> > previous binding which was doing exactly what you're suggesting. Can
> > >> > you please be consistent in your reviews...    
> > >>
> > >> No, Mark and I both have our opinions. Which part of this patch
> > >> explains the history?    
> > >
> > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> > > be such a good idea).
> > >    
> > >> If the revision history is not in the patch, I'm
> > >> not looking at it.
> > >>
> > >> My issue with it this way is that it has invented yet another way to
> > >> describe timings. I would like to be consistent across external bus
> > >> descriptions, but we're not very consistent to begin with though. The
> > >> most common seems to be the way you first did it. But I agree that it
> > >> is kind of screwy to have an intermediate node unless the controller
> > >> itself has sub-blocks within it and is not the established way to
> > >> describe a bus with chip selects. I would either put the properties
> > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> > >> in the device node. I'd call it timings instead of config, but that's
> > >> just bikeshedding.    
> > >
> > > Well, it's not only describing timings (see atmel,bus-width,
> > > atmel,byte-access-type, ...), but I'm fine with either names :).
> > >    
> > >>
> > >> memory-controller@1000 {
> > >>   ...
> > >>   flash@0,0 {
> > >>     timings {
> > >>       ...
> > >>     };
> > >>   };
> > >> };    
> > >
> > > Okay. Mark, what do you think of this approach?
> > >
> > > Note that one of my previous version was defining timings directly in
> > > the EBI device node, and Arnd noted that doing so may cause problems
> > > if one of the EBI property (or the config/timing node name) conflict
> > > with the sub-device binding, which is why I decided to put the EBI
> > > config definitions in a separate subnode.    
> > 
> > You have vendor prefixes on all the properties so I don't think a
> > collision is really a problem. It's also an established pattern in
> > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
> > prefer consistency.  
> 
> So let's summarize that.
> 
> memory-controller@1000 {
> 	...
> 	flash@0,0 {
> 		atmel,<ebi-prop-name> = <value>;
> 		...
> 		<flash-device-prop> = <value>;
> 	};
> };
> 
> Would everyone agree on this representation?
> 
> With this approach, it's a bit more complicated to detect the case
> where we want to keep bootloader/firmware config, but it should be
> doable (it's much more easier to test for the presence of a
> config/timing node than verifying that either all or none of the
> mandatory properties are here).
> 
> Still remains the problem mentioned by Jean-Jacques: what if the
> sub-device takes 2 CS lines. Should we apply the same setting to those
> slots?
> 

Rob, Mark, Arnd, can you take a decision regarding this binding? This
driver is floating around for quite some time, and we were asked to
rework the binding several times (in time in an opposite direction).

For the record, here is the thread I mentioned earlier [1]. In his
answer, Arnd suggests to put timing and bus config description
outside of the sub-device node. Mark recently complained about this
representation, which led me to the configs/config-X appraoch, and now
Rob suggests to go back to the first proposal.

I'm fine doing that, but can you please all confirm that you agree on
this binding?

Thanks,

Boris

[1]http://lists.infradead.org/pipermail/linux-arm-kernel/2013-December/222438.html
Mark Rutland May 10, 2016, 11:07 a.m. UTC | #11
On Tue, May 10, 2016 at 10:04:48AM +0200, Boris Brezillon wrote:
> On Wed, 4 May 2016 15:35:47 +0200
> Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
> 
> > On Wed, 4 May 2016 08:06:10 -0500
> > Rob Herring <robh@kernel.org> wrote:
> > 
> > > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
> > > <boris.brezillon@free-electrons.com> wrote:  
> > > > Hi Rob,
> > > >
> > > > On Tue, 3 May 2016 14:11:04 -0500
> > > > Rob Herring <robh@kernel.org> wrote:
> > > >    
> > > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> > > >> <boris.brezillon@free-electrons.com> wrote:    
> > > >> > Hi Rob,
> > > >> >
> > > >> > On Tue, 3 May 2016 11:40:19 -0500
> > > >> > Rob Herring <robh@kernel.org> wrote:
> > > >> >    
> > > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:    
> > > >> >> > The EBI (External Bus Interface) is used to access external peripherals
> > > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> > > >> >> > Each device is assigned a CS line and an address range and can have its
> > > >> >> > own configuration (timings, access mode, bus width, ...).
> > > >> >> > This driver provides a generic DT binding to configure a device according
> > > >> >> > to its requirements.
> > > >> >> > For specific device controllers (like the NAND one) the SMC timings
> > > >> >> > should be configured by the controller driver through the matrix and smc
> > > >> >> > syscon regmaps.    
> > > 
> > > [...]
> > >   
> > > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
> > > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
> > > >> >> > +named config-<cs-id>, each of them containing the following properties.    
> > > >> >>
> > > >> >> This is a bit unusual. Why not just part of the child device nodes?    
> > > >> >
> > > >> > Oh, come on! I reworked the binding because Mark complained about the
> > > >> > previous binding which was doing exactly what you're suggesting. Can
> > > >> > you please be consistent in your reviews...    
> > > >>
> > > >> No, Mark and I both have our opinions. Which part of this patch
> > > >> explains the history?    
> > > >
> > > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> > > > be such a good idea).
> > > >    
> > > >> If the revision history is not in the patch, I'm
> > > >> not looking at it.
> > > >>
> > > >> My issue with it this way is that it has invented yet another way to
> > > >> describe timings. I would like to be consistent across external bus
> > > >> descriptions, but we're not very consistent to begin with though. The
> > > >> most common seems to be the way you first did it. But I agree that it
> > > >> is kind of screwy to have an intermediate node unless the controller
> > > >> itself has sub-blocks within it and is not the established way to
> > > >> describe a bus with chip selects. I would either put the properties
> > > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> > > >> in the device node. I'd call it timings instead of config, but that's
> > > >> just bikeshedding.    
> > > >
> > > > Well, it's not only describing timings (see atmel,bus-width,
> > > > atmel,byte-access-type, ...), but I'm fine with either names :).
> > > >    
> > > >>
> > > >> memory-controller@1000 {
> > > >>   ...
> > > >>   flash@0,0 {
> > > >>     timings {
> > > >>       ...
> > > >>     };
> > > >>   };
> > > >> };    
> > > >
> > > > Okay. Mark, what do you think of this approach?
> > > >
> > > > Note that one of my previous version was defining timings directly in
> > > > the EBI device node, and Arnd noted that doing so may cause problems
> > > > if one of the EBI property (or the config/timing node name) conflict
> > > > with the sub-device binding, which is why I decided to put the EBI
> > > > config definitions in a separate subnode.    
> > > 
> > > You have vendor prefixes on all the properties so I don't think a
> > > collision is really a problem. It's also an established pattern in
> > > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
> > > prefer consistency.  
> > 
> > So let's summarize that.
> > 
> > memory-controller@1000 {
> > 	...
> > 	flash@0,0 {
> > 		atmel,<ebi-prop-name> = <value>;
> > 		...
> > 		<flash-device-prop> = <value>;
> > 	};
> > };
> > 
> > Would everyone agree on this representation?
> > 
> > With this approach, it's a bit more complicated to detect the case
> > where we want to keep bootloader/firmware config, but it should be
> > doable (it's much more easier to test for the presence of a
> > config/timing node than verifying that either all or none of the
> > mandatory properties are here).
> > 
> > Still remains the problem mentioned by Jean-Jacques: what if the
> > sub-device takes 2 CS lines. Should we apply the same setting to those
> > slots?
> > 
> 
> Rob, Mark, Arnd, can you take a decision regarding this binding? This
> driver is floating around for quite some time, and we were asked to
> rework the binding several times (in time in an opposite direction).
> 
> For the record, here is the thread I mentioned earlier [1]. In his
> answer, Arnd suggests to put timing and bus config description
> outside of the sub-device node. Mark recently complained about this
> representation, which led me to the configs/config-X appraoch, and now
> Rob suggests to go back to the first proposal.
> 
> I'm fine doing that, but can you please all confirm that you agree on
> this binding?

Sorry for the delay in getting round to this, and sorry that this
appears to be going in circles.

Please go with Rob's suggestion.

I'm not sure about the case where a device takes 2 CS lines. I would
assume that in practice that a sub-device covered my multiple CS lines
expects the same timings for all its MMIO space, and so having that
uniform makes sense. Do we have a counter-example?

Thanks,
Mark.
Boris BREZILLON May 10, 2016, 12:41 p.m. UTC | #12
On Tue, 10 May 2016 12:07:42 +0100
Mark Rutland <mark.rutland@arm.com> wrote:

> On Tue, May 10, 2016 at 10:04:48AM +0200, Boris Brezillon wrote:
> > On Wed, 4 May 2016 15:35:47 +0200
> > Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
> >   
> > > On Wed, 4 May 2016 08:06:10 -0500
> > > Rob Herring <robh@kernel.org> wrote:
> > >   
> > > > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
> > > > <boris.brezillon@free-electrons.com> wrote:    
> > > > > Hi Rob,
> > > > >
> > > > > On Tue, 3 May 2016 14:11:04 -0500
> > > > > Rob Herring <robh@kernel.org> wrote:
> > > > >      
> > > > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> > > > >> <boris.brezillon@free-electrons.com> wrote:      
> > > > >> > Hi Rob,
> > > > >> >
> > > > >> > On Tue, 3 May 2016 11:40:19 -0500
> > > > >> > Rob Herring <robh@kernel.org> wrote:
> > > > >> >      
> > > > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:      
> > > > >> >> > The EBI (External Bus Interface) is used to access external peripherals
> > > > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> > > > >> >> > Each device is assigned a CS line and an address range and can have its
> > > > >> >> > own configuration (timings, access mode, bus width, ...).
> > > > >> >> > This driver provides a generic DT binding to configure a device according
> > > > >> >> > to its requirements.
> > > > >> >> > For specific device controllers (like the NAND one) the SMC timings
> > > > >> >> > should be configured by the controller driver through the matrix and smc
> > > > >> >> > syscon regmaps.      
> > > > 
> > > > [...]
> > > >     
> > > > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
> > > > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
> > > > >> >> > +named config-<cs-id>, each of them containing the following properties.      
> > > > >> >>
> > > > >> >> This is a bit unusual. Why not just part of the child device nodes?      
> > > > >> >
> > > > >> > Oh, come on! I reworked the binding because Mark complained about the
> > > > >> > previous binding which was doing exactly what you're suggesting. Can
> > > > >> > you please be consistent in your reviews...      
> > > > >>
> > > > >> No, Mark and I both have our opinions. Which part of this patch
> > > > >> explains the history?      
> > > > >
> > > > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> > > > > be such a good idea).
> > > > >      
> > > > >> If the revision history is not in the patch, I'm
> > > > >> not looking at it.
> > > > >>
> > > > >> My issue with it this way is that it has invented yet another way to
> > > > >> describe timings. I would like to be consistent across external bus
> > > > >> descriptions, but we're not very consistent to begin with though. The
> > > > >> most common seems to be the way you first did it. But I agree that it
> > > > >> is kind of screwy to have an intermediate node unless the controller
> > > > >> itself has sub-blocks within it and is not the established way to
> > > > >> describe a bus with chip selects. I would either put the properties
> > > > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> > > > >> in the device node. I'd call it timings instead of config, but that's
> > > > >> just bikeshedding.      
> > > > >
> > > > > Well, it's not only describing timings (see atmel,bus-width,
> > > > > atmel,byte-access-type, ...), but I'm fine with either names :).
> > > > >      
> > > > >>
> > > > >> memory-controller@1000 {
> > > > >>   ...
> > > > >>   flash@0,0 {
> > > > >>     timings {
> > > > >>       ...
> > > > >>     };
> > > > >>   };
> > > > >> };      
> > > > >
> > > > > Okay. Mark, what do you think of this approach?
> > > > >
> > > > > Note that one of my previous version was defining timings directly in
> > > > > the EBI device node, and Arnd noted that doing so may cause problems
> > > > > if one of the EBI property (or the config/timing node name) conflict
> > > > > with the sub-device binding, which is why I decided to put the EBI
> > > > > config definitions in a separate subnode.      
> > > > 
> > > > You have vendor prefixes on all the properties so I don't think a
> > > > collision is really a problem. It's also an established pattern in
> > > > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
> > > > prefer consistency.    
> > > 
> > > So let's summarize that.
> > > 
> > > memory-controller@1000 {
> > > 	...
> > > 	flash@0,0 {
> > > 		atmel,<ebi-prop-name> = <value>;
> > > 		...
> > > 		<flash-device-prop> = <value>;
> > > 	};
> > > };
> > > 
> > > Would everyone agree on this representation?
> > > 
> > > With this approach, it's a bit more complicated to detect the case
> > > where we want to keep bootloader/firmware config, but it should be
> > > doable (it's much more easier to test for the presence of a
> > > config/timing node than verifying that either all or none of the
> > > mandatory properties are here).
> > > 
> > > Still remains the problem mentioned by Jean-Jacques: what if the
> > > sub-device takes 2 CS lines. Should we apply the same setting to those
> > > slots?
> > >   
> > 
> > Rob, Mark, Arnd, can you take a decision regarding this binding? This
> > driver is floating around for quite some time, and we were asked to
> > rework the binding several times (in time in an opposite direction).
> > 
> > For the record, here is the thread I mentioned earlier [1]. In his
> > answer, Arnd suggests to put timing and bus config description
> > outside of the sub-device node. Mark recently complained about this
> > representation, which led me to the configs/config-X appraoch, and now
> > Rob suggests to go back to the first proposal.
> > 
> > I'm fine doing that, but can you please all confirm that you agree on
> > this binding?  
> 
> Sorry for the delay in getting round to this, and sorry that this
> appears to be going in circles.
> 
> Please go with Rob's suggestion.

Okay. This changes a bit the constraints defined in the binding doc
(no default values for undefined properties: we just keep the
bootloader/firmware config), but otherwise should be easy to implement.

> 
> I'm not sure about the case where a device takes 2 CS lines. I would
> assume that in practice that a sub-device covered my multiple CS lines
> expects the same timings for all its MMIO space, and so having that
> uniform makes sense. Do we have a counter-example?

Nope, I don't. JJH had one (interfacing with an FPGA), maybe he can
detail this use case.
Jean-Jacques Hiblot May 10, 2016, 1:08 p.m. UTC | #13
2016-05-10 14:41 GMT+02:00 Boris Brezillon <boris.brezillon@free-electrons.com>:
> On Tue, 10 May 2016 12:07:42 +0100
> Mark Rutland <mark.rutland@arm.com> wrote:
>
>> On Tue, May 10, 2016 at 10:04:48AM +0200, Boris Brezillon wrote:
>> > On Wed, 4 May 2016 15:35:47 +0200
>> > Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
>> >
>> > > On Wed, 4 May 2016 08:06:10 -0500
>> > > Rob Herring <robh@kernel.org> wrote:
>> > >
>> > > > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
>> > > > <boris.brezillon@free-electrons.com> wrote:
>> > > > > Hi Rob,
>> > > > >
>> > > > > On Tue, 3 May 2016 14:11:04 -0500
>> > > > > Rob Herring <robh@kernel.org> wrote:
>> > > > >
>> > > > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
>> > > > >> <boris.brezillon@free-electrons.com> wrote:
>> > > > >> > Hi Rob,
>> > > > >> >
>> > > > >> > On Tue, 3 May 2016 11:40:19 -0500
>> > > > >> > Rob Herring <robh@kernel.org> wrote:
>> > > > >> >
>> > > > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>> > > > >> >> > The EBI (External Bus Interface) is used to access external peripherals
>> > > > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>> > > > >> >> > Each device is assigned a CS line and an address range and can have its
>> > > > >> >> > own configuration (timings, access mode, bus width, ...).
>> > > > >> >> > This driver provides a generic DT binding to configure a device according
>> > > > >> >> > to its requirements.
>> > > > >> >> > For specific device controllers (like the NAND one) the SMC timings
>> > > > >> >> > should be configured by the controller driver through the matrix and smc
>> > > > >> >> > syscon regmaps.
>> > > >
>> > > > [...]
>> > > >
>> > > > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
>> > > > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
>> > > > >> >> > +named config-<cs-id>, each of them containing the following properties.
>> > > > >> >>
>> > > > >> >> This is a bit unusual. Why not just part of the child device nodes?
>> > > > >> >
>> > > > >> > Oh, come on! I reworked the binding because Mark complained about the
>> > > > >> > previous binding which was doing exactly what you're suggesting. Can
>> > > > >> > you please be consistent in your reviews...
>> > > > >>
>> > > > >> No, Mark and I both have our opinions. Which part of this patch
>> > > > >> explains the history?
>> > > > >
>> > > > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
>> > > > > be such a good idea).
>> > > > >
>> > > > >> If the revision history is not in the patch, I'm
>> > > > >> not looking at it.
>> > > > >>
>> > > > >> My issue with it this way is that it has invented yet another way to
>> > > > >> describe timings. I would like to be consistent across external bus
>> > > > >> descriptions, but we're not very consistent to begin with though. The
>> > > > >> most common seems to be the way you first did it. But I agree that it
>> > > > >> is kind of screwy to have an intermediate node unless the controller
>> > > > >> itself has sub-blocks within it and is not the established way to
>> > > > >> describe a bus with chip selects. I would either put the properties
>> > > > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
>> > > > >> in the device node. I'd call it timings instead of config, but that's
>> > > > >> just bikeshedding.
>> > > > >
>> > > > > Well, it's not only describing timings (see atmel,bus-width,
>> > > > > atmel,byte-access-type, ...), but I'm fine with either names :).
>> > > > >
>> > > > >>
>> > > > >> memory-controller@1000 {
>> > > > >>   ...
>> > > > >>   flash@0,0 {
>> > > > >>     timings {
>> > > > >>       ...
>> > > > >>     };
>> > > > >>   };
>> > > > >> };
>> > > > >
>> > > > > Okay. Mark, what do you think of this approach?
>> > > > >
>> > > > > Note that one of my previous version was defining timings directly in
>> > > > > the EBI device node, and Arnd noted that doing so may cause problems
>> > > > > if one of the EBI property (or the config/timing node name) conflict
>> > > > > with the sub-device binding, which is why I decided to put the EBI
>> > > > > config definitions in a separate subnode.
>> > > >
>> > > > You have vendor prefixes on all the properties so I don't think a
>> > > > collision is really a problem. It's also an established pattern in
>> > > > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
>> > > > prefer consistency.
>> > >
>> > > So let's summarize that.
>> > >
>> > > memory-controller@1000 {
>> > >   ...
>> > >   flash@0,0 {
>> > >           atmel,<ebi-prop-name> = <value>;
>> > >           ...
>> > >           <flash-device-prop> = <value>;
>> > >   };
>> > > };
>> > >
>> > > Would everyone agree on this representation?
>> > >
>> > > With this approach, it's a bit more complicated to detect the case
>> > > where we want to keep bootloader/firmware config, but it should be
>> > > doable (it's much more easier to test for the presence of a
>> > > config/timing node than verifying that either all or none of the
>> > > mandatory properties are here).
>> > >
>> > > Still remains the problem mentioned by Jean-Jacques: what if the
>> > > sub-device takes 2 CS lines. Should we apply the same setting to those
>> > > slots?
>> > >
>> >
>> > Rob, Mark, Arnd, can you take a decision regarding this binding? This
>> > driver is floating around for quite some time, and we were asked to
>> > rework the binding several times (in time in an opposite direction).
>> >
>> > For the record, here is the thread I mentioned earlier [1]. In his
>> > answer, Arnd suggests to put timing and bus config description
>> > outside of the sub-device node. Mark recently complained about this
>> > representation, which led me to the configs/config-X appraoch, and now
>> > Rob suggests to go back to the first proposal.
>> >
>> > I'm fine doing that, but can you please all confirm that you agree on
>> > this binding?
>>
>> Sorry for the delay in getting round to this, and sorry that this
>> appears to be going in circles.
>>
>> Please go with Rob's suggestion.
>
> Okay. This changes a bit the constraints defined in the binding doc
> (no default values for undefined properties: we just keep the
> bootloader/firmware config), but otherwise should be easy to implement.
>
>>
>> I'm not sure about the case where a device takes 2 CS lines. I would
>> assume that in practice that a sub-device covered my multiple CS lines
>> expects the same timings for all its MMIO space, and so having that
>> uniform makes sense. Do we have a counter-example?
>
> Nope, I don't. JJH had one (interfacing with an FPGA), maybe he can
> detail this use case.
>
I don't either. It makes sense that a single device with 2 CS uses the
same timings.
My use case was the other way around: 1 CS for several devices.

>
> --
> Boris Brezillon, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com
Rob Herring (Arm) May 10, 2016, 2:52 p.m. UTC | #14
On Tue, May 10, 2016 at 8:08 AM, Jean-Jacques Hiblot
<jjhiblot@traphandler.com> wrote:
> 2016-05-10 14:41 GMT+02:00 Boris Brezillon <boris.brezillon@free-electrons.com>:
>> On Tue, 10 May 2016 12:07:42 +0100
>> Mark Rutland <mark.rutland@arm.com> wrote:
>>
>>> On Tue, May 10, 2016 at 10:04:48AM +0200, Boris Brezillon wrote:
>>> > On Wed, 4 May 2016 15:35:47 +0200
>>> > Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
>>> >
>>> > > On Wed, 4 May 2016 08:06:10 -0500
>>> > > Rob Herring <robh@kernel.org> wrote:
>>> > >
>>> > > > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
>>> > > > <boris.brezillon@free-electrons.com> wrote:
>>> > > > > Hi Rob,
>>> > > > >
>>> > > > > On Tue, 3 May 2016 14:11:04 -0500
>>> > > > > Rob Herring <robh@kernel.org> wrote:
>>> > > > >
>>> > > > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
>>> > > > >> <boris.brezillon@free-electrons.com> wrote:
>>> > > > >> > Hi Rob,
>>> > > > >> >
>>> > > > >> > On Tue, 3 May 2016 11:40:19 -0500
>>> > > > >> > Rob Herring <robh@kernel.org> wrote:
>>> > > > >> >
>>> > > > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:
>>> > > > >> >> > The EBI (External Bus Interface) is used to access external peripherals
>>> > > > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
>>> > > > >> >> > Each device is assigned a CS line and an address range and can have its
>>> > > > >> >> > own configuration (timings, access mode, bus width, ...).
>>> > > > >> >> > This driver provides a generic DT binding to configure a device according
>>> > > > >> >> > to its requirements.
>>> > > > >> >> > For specific device controllers (like the NAND one) the SMC timings
>>> > > > >> >> > should be configured by the controller driver through the matrix and smc
>>> > > > >> >> > syscon regmaps.
>>> > > >
>>> > > > [...]
>>> > > >
>>> > > > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
>>> > > > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
>>> > > > >> >> > +named config-<cs-id>, each of them containing the following properties.
>>> > > > >> >>
>>> > > > >> >> This is a bit unusual. Why not just part of the child device nodes?
>>> > > > >> >
>>> > > > >> > Oh, come on! I reworked the binding because Mark complained about the
>>> > > > >> > previous binding which was doing exactly what you're suggesting. Can
>>> > > > >> > you please be consistent in your reviews...
>>> > > > >>
>>> > > > >> No, Mark and I both have our opinions. Which part of this patch
>>> > > > >> explains the history?
>>> > > > >
>>> > > > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
>>> > > > > be such a good idea).
>>> > > > >
>>> > > > >> If the revision history is not in the patch, I'm
>>> > > > >> not looking at it.
>>> > > > >>
>>> > > > >> My issue with it this way is that it has invented yet another way to
>>> > > > >> describe timings. I would like to be consistent across external bus
>>> > > > >> descriptions, but we're not very consistent to begin with though. The
>>> > > > >> most common seems to be the way you first did it. But I agree that it
>>> > > > >> is kind of screwy to have an intermediate node unless the controller
>>> > > > >> itself has sub-blocks within it and is not the established way to
>>> > > > >> describe a bus with chip selects. I would either put the properties
>>> > > > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
>>> > > > >> in the device node. I'd call it timings instead of config, but that's
>>> > > > >> just bikeshedding.
>>> > > > >
>>> > > > > Well, it's not only describing timings (see atmel,bus-width,
>>> > > > > atmel,byte-access-type, ...), but I'm fine with either names :).
>>> > > > >
>>> > > > >>
>>> > > > >> memory-controller@1000 {
>>> > > > >>   ...
>>> > > > >>   flash@0,0 {
>>> > > > >>     timings {
>>> > > > >>       ...
>>> > > > >>     };
>>> > > > >>   };
>>> > > > >> };
>>> > > > >
>>> > > > > Okay. Mark, what do you think of this approach?
>>> > > > >
>>> > > > > Note that one of my previous version was defining timings directly in
>>> > > > > the EBI device node, and Arnd noted that doing so may cause problems
>>> > > > > if one of the EBI property (or the config/timing node name) conflict
>>> > > > > with the sub-device binding, which is why I decided to put the EBI
>>> > > > > config definitions in a separate subnode.
>>> > > >
>>> > > > You have vendor prefixes on all the properties so I don't think a
>>> > > > collision is really a problem. It's also an established pattern in
>>> > > > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
>>> > > > prefer consistency.
>>> > >
>>> > > So let's summarize that.
>>> > >
>>> > > memory-controller@1000 {
>>> > >   ...
>>> > >   flash@0,0 {
>>> > >           atmel,<ebi-prop-name> = <value>;
>>> > >           ...
>>> > >           <flash-device-prop> = <value>;
>>> > >   };
>>> > > };
>>> > >
>>> > > Would everyone agree on this representation?
>>> > >
>>> > > With this approach, it's a bit more complicated to detect the case
>>> > > where we want to keep bootloader/firmware config, but it should be
>>> > > doable (it's much more easier to test for the presence of a
>>> > > config/timing node than verifying that either all or none of the
>>> > > mandatory properties are here).
>>> > >
>>> > > Still remains the problem mentioned by Jean-Jacques: what if the
>>> > > sub-device takes 2 CS lines. Should we apply the same setting to those
>>> > > slots?
>>> > >
>>> >
>>> > Rob, Mark, Arnd, can you take a decision regarding this binding? This
>>> > driver is floating around for quite some time, and we were asked to
>>> > rework the binding several times (in time in an opposite direction).
>>> >
>>> > For the record, here is the thread I mentioned earlier [1]. In his
>>> > answer, Arnd suggests to put timing and bus config description
>>> > outside of the sub-device node. Mark recently complained about this
>>> > representation, which led me to the configs/config-X appraoch, and now
>>> > Rob suggests to go back to the first proposal.
>>> >
>>> > I'm fine doing that, but can you please all confirm that you agree on
>>> > this binding?
>>>
>>> Sorry for the delay in getting round to this, and sorry that this
>>> appears to be going in circles.
>>>
>>> Please go with Rob's suggestion.
>>
>> Okay. This changes a bit the constraints defined in the binding doc
>> (no default values for undefined properties: we just keep the
>> bootloader/firmware config), but otherwise should be easy to implement.
>>
>>>
>>> I'm not sure about the case where a device takes 2 CS lines. I would
>>> assume that in practice that a sub-device covered my multiple CS lines
>>> expects the same timings for all its MMIO space, and so having that
>>> uniform makes sense. Do we have a counter-example?
>>
>> Nope, I don't. JJH had one (interfacing with an FPGA), maybe he can
>> detail this use case.
>>
> I don't either. It makes sense that a single device with 2 CS uses the
> same timings.
> My use case was the other way around: 1 CS for several devices.

Ah, I thought it was just wanting to share timings for several CS. In
this case, it would probably make sense to have 3 levels of nodes
(EBI, CS node with timings, device nodes) as you do have some logic in
between to do address decoding. But I think the simple case should
still be 2 levels of nodes and that doesn't really affect the EBI
binding. It just cares that timings are in the immediate child nodes.

Rob
Boris BREZILLON May 10, 2016, 3:47 p.m. UTC | #15
On Tue, 10 May 2016 09:52:41 -0500
Rob Herring <robh@kernel.org> wrote:

> On Tue, May 10, 2016 at 8:08 AM, Jean-Jacques Hiblot
> <jjhiblot@traphandler.com> wrote:
> > 2016-05-10 14:41 GMT+02:00 Boris Brezillon <boris.brezillon@free-electrons.com>:  
> >> On Tue, 10 May 2016 12:07:42 +0100
> >> Mark Rutland <mark.rutland@arm.com> wrote:
> >>  
> >>> On Tue, May 10, 2016 at 10:04:48AM +0200, Boris Brezillon wrote:  
> >>> > On Wed, 4 May 2016 15:35:47 +0200
> >>> > Boris Brezillon <boris.brezillon@free-electrons.com> wrote:
> >>> >  
> >>> > > On Wed, 4 May 2016 08:06:10 -0500
> >>> > > Rob Herring <robh@kernel.org> wrote:
> >>> > >  
> >>> > > > On Wed, May 4, 2016 at 4:38 AM, Boris Brezillon
> >>> > > > <boris.brezillon@free-electrons.com> wrote:  
> >>> > > > > Hi Rob,
> >>> > > > >
> >>> > > > > On Tue, 3 May 2016 14:11:04 -0500
> >>> > > > > Rob Herring <robh@kernel.org> wrote:
> >>> > > > >  
> >>> > > > >> On Tue, May 3, 2016 at 11:51 AM, Boris Brezillon
> >>> > > > >> <boris.brezillon@free-electrons.com> wrote:  
> >>> > > > >> > Hi Rob,
> >>> > > > >> >
> >>> > > > >> > On Tue, 3 May 2016 11:40:19 -0500
> >>> > > > >> > Rob Herring <robh@kernel.org> wrote:
> >>> > > > >> >  
> >>> > > > >> >> On Thu, Apr 28, 2016 at 02:03:27PM +0200, Boris Brezillon wrote:  
> >>> > > > >> >> > The EBI (External Bus Interface) is used to access external peripherals
> >>> > > > >> >> > (NOR, SRAM, NAND, and other specific devices like ethernet controllers).
> >>> > > > >> >> > Each device is assigned a CS line and an address range and can have its
> >>> > > > >> >> > own configuration (timings, access mode, bus width, ...).
> >>> > > > >> >> > This driver provides a generic DT binding to configure a device according
> >>> > > > >> >> > to its requirements.
> >>> > > > >> >> > For specific device controllers (like the NAND one) the SMC timings
> >>> > > > >> >> > should be configured by the controller driver through the matrix and smc
> >>> > > > >> >> > syscon regmaps.  
> >>> > > >
> >>> > > > [...]
> >>> > > >  
> >>> > > > >> >> > +EBI bus configuration associated with specific chip-select will be defined in
> >>> > > > >> >> > +the configs subnode. This configs node will in turn contain several subnodes
> >>> > > > >> >> > +named config-<cs-id>, each of them containing the following properties.  
> >>> > > > >> >>
> >>> > > > >> >> This is a bit unusual. Why not just part of the child device nodes?  
> >>> > > > >> >
> >>> > > > >> > Oh, come on! I reworked the binding because Mark complained about the
> >>> > > > >> > previous binding which was doing exactly what you're suggesting. Can
> >>> > > > >> > you please be consistent in your reviews...  
> >>> > > > >>
> >>> > > > >> No, Mark and I both have our opinions. Which part of this patch
> >>> > > > >> explains the history?  
> >>> > > > >
> >>> > > > > Hm, it's in patch 1/2 (just dropped the cover letter, which might not
> >>> > > > > be such a good idea).
> >>> > > > >  
> >>> > > > >> If the revision history is not in the patch, I'm
> >>> > > > >> not looking at it.
> >>> > > > >>
> >>> > > > >> My issue with it this way is that it has invented yet another way to
> >>> > > > >> describe timings. I would like to be consistent across external bus
> >>> > > > >> descriptions, but we're not very consistent to begin with though. The
> >>> > > > >> most common seems to be the way you first did it. But I agree that it
> >>> > > > >> is kind of screwy to have an intermediate node unless the controller
> >>> > > > >> itself has sub-blocks within it and is not the established way to
> >>> > > > >> describe a bus with chip selects. I would either put the properties
> >>> > > > >> directly in the child nodes (e.g. flash@0,0) or put your config nodes
> >>> > > > >> in the device node. I'd call it timings instead of config, but that's
> >>> > > > >> just bikeshedding.  
> >>> > > > >
> >>> > > > > Well, it's not only describing timings (see atmel,bus-width,
> >>> > > > > atmel,byte-access-type, ...), but I'm fine with either names :).
> >>> > > > >  
> >>> > > > >>
> >>> > > > >> memory-controller@1000 {
> >>> > > > >>   ...
> >>> > > > >>   flash@0,0 {
> >>> > > > >>     timings {
> >>> > > > >>       ...
> >>> > > > >>     };
> >>> > > > >>   };
> >>> > > > >> };  
> >>> > > > >
> >>> > > > > Okay. Mark, what do you think of this approach?
> >>> > > > >
> >>> > > > > Note that one of my previous version was defining timings directly in
> >>> > > > > the EBI device node, and Arnd noted that doing so may cause problems
> >>> > > > > if one of the EBI property (or the config/timing node name) conflict
> >>> > > > > with the sub-device binding, which is why I decided to put the EBI
> >>> > > > > config definitions in a separate subnode.  
> >>> > > >
> >>> > > > You have vendor prefixes on all the properties so I don't think a
> >>> > > > collision is really a problem. It's also an established pattern in
> >>> > > > i.MX WEIM and OMAP GPMC (which are hiding in bindings/bus/) and I
> >>> > > > prefer consistency.  
> >>> > >
> >>> > > So let's summarize that.
> >>> > >
> >>> > > memory-controller@1000 {
> >>> > >   ...
> >>> > >   flash@0,0 {
> >>> > >           atmel,<ebi-prop-name> = <value>;
> >>> > >           ...
> >>> > >           <flash-device-prop> = <value>;
> >>> > >   };
> >>> > > };
> >>> > >
> >>> > > Would everyone agree on this representation?
> >>> > >
> >>> > > With this approach, it's a bit more complicated to detect the case
> >>> > > where we want to keep bootloader/firmware config, but it should be
> >>> > > doable (it's much more easier to test for the presence of a
> >>> > > config/timing node than verifying that either all or none of the
> >>> > > mandatory properties are here).
> >>> > >
> >>> > > Still remains the problem mentioned by Jean-Jacques: what if the
> >>> > > sub-device takes 2 CS lines. Should we apply the same setting to those
> >>> > > slots?
> >>> > >  
> >>> >
> >>> > Rob, Mark, Arnd, can you take a decision regarding this binding? This
> >>> > driver is floating around for quite some time, and we were asked to
> >>> > rework the binding several times (in time in an opposite direction).
> >>> >
> >>> > For the record, here is the thread I mentioned earlier [1]. In his
> >>> > answer, Arnd suggests to put timing and bus config description
> >>> > outside of the sub-device node. Mark recently complained about this
> >>> > representation, which led me to the configs/config-X appraoch, and now
> >>> > Rob suggests to go back to the first proposal.
> >>> >
> >>> > I'm fine doing that, but can you please all confirm that you agree on
> >>> > this binding?  
> >>>
> >>> Sorry for the delay in getting round to this, and sorry that this
> >>> appears to be going in circles.
> >>>
> >>> Please go with Rob's suggestion.  
> >>
> >> Okay. This changes a bit the constraints defined in the binding doc
> >> (no default values for undefined properties: we just keep the
> >> bootloader/firmware config), but otherwise should be easy to implement.
> >>  
> >>>
> >>> I'm not sure about the case where a device takes 2 CS lines. I would
> >>> assume that in practice that a sub-device covered my multiple CS lines
> >>> expects the same timings for all its MMIO space, and so having that
> >>> uniform makes sense. Do we have a counter-example?  
> >>
> >> Nope, I don't. JJH had one (interfacing with an FPGA), maybe he can
> >> detail this use case.
> >>  
> > I don't either. It makes sense that a single device with 2 CS uses the
> > same timings.
> > My use case was the other way around: 1 CS for several devices.  
> 
> Ah, I thought it was just wanting to share timings for several CS. In
> this case, it would probably make sense to have 3 levels of nodes
> (EBI, CS node with timings, device nodes) as you do have some logic in
> between to do address decoding. But I think the simple case should
> still be 2 levels of nodes and that doesn't really affect the EBI
> binding. It just cares that timings are in the immediate child nodes.

I'd expect the sub-device driver to change the configuration by itself
in such complex cases (I'm planning to expose APIs to let other drivers
manually configure the EBI bus for their specific use case: it's kind
of required for the NAND controller driver anyway).
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
new file mode 100644
index 0000000..a6dca5c
--- /dev/null
+++ b/Documentation/devicetree/bindings/memory-controllers/atmel,ebi.txt
@@ -0,0 +1,136 @@ 
+* Device tree bindings for Atmel EBI
+
+The External Bus Interface (EBI) controller is a bus where you can connect
+asynchronous (NAND, NOR, SRAM, ....) and synchronous memories (SDR/DDR SDRAMs).
+The EBI provides a glue-less interface to asynchronous memories through the SMC
+(Static Memory Controller).
+
+Required properties:
+
+- compatible:		"atmel,at91sam9260-ebi"
+			"atmel,at91sam9261-ebi"
+			"atmel,at91sam9263-ebi0"
+			"atmel,at91sam9263-ebi1"
+			"atmel,at91sam9rl-ebi"
+			"atmel,at91sam9g45-ebi"
+			"atmel,at91sam9x5-ebi"
+			"atmel,sama5d3-ebi"
+
+- reg:			Contains offset/length value for EBI memory mapping.
+			This property might contain several entries if the EBI
+			memory range is not contiguous
+
+- #address-cells:	Must be 2.
+			The first cell encodes the CS.
+			The second cell encode the offset into the CS memory
+			range.
+
+- #size-cells:		Must be set to 1.
+
+- ranges:		Encodes CS to memory region association.
+
+- clocks:		Clock feeding the EBI controller.
+			See clock-bindings.txt
+
+Children device nodes are representing device connected to the EBI bus.
+
+Required device node properties:
+
+- #reg:			Contains the chip-select id, the offset and the length
+			of the memory region requested by the device.
+
+EBI bus configuration associated with specific chip-select will be defined in
+the configs subnode. This configs node will in turn contain several subnodes
+named config-<cs-id>, each of them containing the following properties.
+
+Optional config-<cs-id> node properties:
+
+- atmel,bus-width:		width of the asynchronous device's data bus
+				8, 16 or 32.
+				Default to 8 when undefined.
+
+- atmel,byte-access-type	"write" or "select" (see Atmel datasheet).
+				Default to "select" when undefined.
+
+- atmel,read-mode		"nrd" or "ncs".
+				Default to "ncs" when undefined.
+
+- atmel,write-mode		"nwe" or "ncs".
+				Default to "ncs" when undefined.
+
+- atmel,exnw-mode		"disabled", "frozen" or "ready".
+				Default to "disabled" when undefined.
+
+- atmel,page-mode		enable page mode if present. The provided value
+				defines the page size (supported values: 4, 8,
+				16 and 32).
+
+- atmel,tdf-mode:		"normal" or "optimized". When set to
+				"optimized" the data float time is optimized
+				depending on the next device being accessed
+				(next device setup time is subtracted to the
+				current device data float time).
+				Default to "normal" when undefined.
+
+Mandatory timings expressed in nanoseconds (see Atmel datasheet for a full
+description).
+
+- atmel,ncs-rd-setup-ns
+- atmel,nrd-setup-ns
+- atmel,ncs-wr-setup-ns
+- atmel,nwe-setup-ns
+- atmel,ncs-rd-pulse-ns
+- atmel,nrd-pulse-ns
+- atmel,ncs-wr-pulse-ns
+- atmel,nwe-pulse-ns
+- atmel,nwe-cycle-ns
+- atmel,nrd-cycle-ns
+- atmel,tdf-ns
+
+Example:
+
+	ebi: ebi@10000000 {
+		compatible = "atmel,sama5d3-ebi";
+		#address-cells = <2>;
+		#size-cells = <1>;
+		atmel,smc = <&hsmc>;
+		atmel,matrix = <&matrix>;
+		reg = <0x10000000 0x10000000
+		       0x40000000 0x30000000>;
+		ranges = <0x0 0x0 0x10000000 0x10000000
+			  0x1 0x0 0x40000000 0x10000000
+			  0x2 0x0 0x50000000 0x10000000
+			  0x3 0x0 0x60000000 0x10000000>;
+		clocks = <&mck>;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_ebi_addr>;
+
+		configs {
+			config-0 {
+				atmel,read-mode = "nrd";
+				atmel,write-mode = "nwe";
+				atmel,bus-width = <16>;
+				atmel,ncs-rd-setup-ns = <0>;
+				atmel,ncs-wr-setup-ns = <0>;
+				atmel,nwe-setup-ns = <8>;
+				atmel,nrd-setup-ns = <16>;
+				atmel,ncs-rd-pulse-ns = <84>;
+				atmel,ncs-wr-pulse-ns = <84>;
+				atmel,nrd-pulse-ns = <76>;
+				atmel,nwe-pulse-ns = <76>;
+				atmel,nrd-cycle-ns = <107>;
+				atmel,nwe-cycle-ns = <84>;
+				atmel,tdf-ns = <16>;
+			};
+		};
+
+		nor: flash@0,0 {
+			compatible = "cfi-flash";
+			#address-cells = <1>;
+			#size-cells = <1>;
+			reg = <0x0 0x0 0x1000000>;
+			bank-width = <2>;
+		};
+	};
+