Message ID | 1461845007-23139-2-git-send-email-boris.brezillon@free-electrons.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 >
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
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
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
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
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
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
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
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.
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
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.
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.
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
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
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 --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>; + }; + }; +
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