Skip to contentSkip to conversation

tegra: Add fdt definitions and USB driver

PATCH Superseded Simon Glass 7 participants 55 messages Dec 3, 2011 – Dec 12, 2011 17 messages not in the archive

Subsystems (6)

v2 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

v2 cover tegra: Add fdt definitions and USB driver

This series brings in the kernel fdt file, adds USB definitions support to it, and provides a working USB driver for Tegra2 Seaboard.

(I have done this in one series since otherwise most of the fdt additions will just look like dead code.)

The driver requires CONFIG_OF_CONTROL and a device tree to operate.

Some enhancements to fdtdec are required to make this easier, and these are included in the series also. I have had to bring in basic GPIO support due to the request to put the USB VBUS into the fdt.

Since the kernel recently got a very minimal USB binding, I have started with that and extended it where appropriate.

Changes in v2:
- Use "okay" rather than "ok" in fdt to signify an enabled node
- Add header prototype for fdtdec_next_compatible()
- Change fdtdec_next_alias() to increment 'upto' only on success
- Rename get_prop_len() to get_prop_check_min_len()
- New patch to add gpio_request() to asm-generic header
- Pulled USB fdt definitions from newer for-next instead of master
- Change fdt property usbparmas to usbtiming
- Add details for port USB2
- Use "okay" instead of "ok" for fdt node status
- Remove 0x from fdt aliases
- Tidy code style in USB buffer alignment code
- Display prominent warning when alignment code is triggered
- Rename params to timing
- Store entire fdt config in port list, not just register pointer
- Remove non-fdt operation of USB, since it is not needed
- Decode USB VBUS GPIO from the fdt
- Decode phy type differently (to match new kernel fdt)
- Rename tegra20-usb to tegra20-ehcui (to match new kernel fdt)
- Improve debug() printouts in case of failure to init USB
- Add setting of pinmux for USB VBUS GPIO
- Remove unneeded CONFIG_TEGRA_USBx defines

Simon Glass (17):
fdt: Tidy up a few fdtdec problems
fdt: Add functions to access phandles, arrays and bools Add gpio_request() to asm-generic header
fdt: Add basic support for decoding GPIO definitions
arm: fdt: Ensure that an embedded fdt is word-aligned
arm: fdt: Add skeleton device tree file from kernel
tegra: fdt: Add Tegra2x device tree file from kernel
tegra: fdt: Add device tree file for Tegra2 Seaboard from kernel
tegra: usb: fdt: Add additional device tree definitions for USB ports
tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard
usb: Add support for data alignment
usb: Add support for txfifo threshold
tegra: usb: Add support for Tegra USB peripheral
tegra: usb: Add USB support to nvidia boards
tegra: usb: Add common USB defines for tegra2 boards
tegra: usb: Enable USB on Seaboard
tegra: fdt: Enable FDT support for Seaboard

 README                                    |    9 +
 arch/arm/cpu/armv7/tegra2/Makefile        |    4 +-
 arch/arm/cpu/armv7/tegra2/config.mk       |    2 +
 arch/arm/cpu/armv7/tegra2/usb.c           |  398 +++++++++++++++++++++++++++++
 arch/arm/cpu/armv7/u-boot.lds             |    5 +
 arch/arm/dts/skeleton.dtsi                |   13 +
 arch/arm/dts/tegra20.dtsi                 |  238 +++++++++++++++++
 arch/arm/include/asm/arch-tegra2/tegra2.h |    2 +
 arch/arm/include/asm/arch-tegra2/usb.h    |  255 ++++++++++++++++++
 board/nvidia/common/board.c               |    8 +
 board/nvidia/dts/tegra2-seaboard.dts      |   48 ++++
 drivers/usb/host/Makefile                 |    1 +
 drivers/usb/host/ehci-hcd.c               |   36 +++
 drivers/usb/host/ehci-tegra.c             |   63 +++++
 drivers/usb/host/ehci.h                   |    6 +-
 dts/Makefile                              |    2 +-
 include/asm-generic/gpio.h                |   10 +
 include/configs/seaboard.h                |   12 +
 include/configs/tegra2-common.h           |   14 +
 include/fdtdec.h                          |  113 ++++++++-
 lib/fdtdec.c                              |  182 +++++++++++++-
 21 files changed, 1408 insertions(+), 13 deletions(-)
 create mode 100644 arch/arm/cpu/armv7/tegra2/usb.c
 create mode 100644 arch/arm/dts/skeleton.dtsi
 create mode 100644 arch/arm/dts/tegra20.dtsi
 create mode 100644 arch/arm/include/asm/arch-tegra2/usb.h
 create mode 100644 board/nvidia/dts/tegra2-seaboard.dts
 create mode 100644 drivers/usb/host/ehci-tegra.c
Signature · 1 line
1.7.3.1
#1 lore raw

PATCH v2 1/17 fdt: Tidy up a few fdtdec problems

This fixes five trivial issues in fdtdec.c:
1. fdtdec_get_is_enabled() doesn't really need a default value
2. The fdt must be word-aligned, since otherwise it will fail on ARM
3. The compat_names[] array is missing its first element. This is needed only because the first fdt_compat_id is defined to be invalid.
4. Added a header prototype for fdtdec_next_compatible()
5. Change fdtdec_next_alias() to only increment its 'upto' parameter on success, to make the display error messages in the caller easier.

---
Changes in v2:
- Use "okay" rather than "ok" in fdt to signify an enabled node
- Add header prototype for fdtdec_next_compatible()
- Change fdtdec_next_alias() to increment 'upto' only on success

 include/fdtdec.h |   23 +++++++++++++++++++----
 lib/fdtdec.c     |   15 +++++++++------
 2 files changed, 28 insertions(+), 10 deletions(-)
include/fdtdec.h +19 -4
index d871cdd..49dbac4 100644
@@ -82,6 +82,21 @@ int fdtdec_next_alias(const void *blob, const char *name,
 		enum fdt_compat_id id, int *upto);
 
 /**
+ * Find the next compatible node for a peripheral.
+ *
+ * Do the first call with node = 0. This function will return a pointer to
+ * the next compatible node. Next time you call this function, pass the
+ * value returned, and the next node will be provided.
+ *
+ * @param blob		FDT blob to use
+ * @param node		Start node for search
+ * @param id		Compatible ID to look for (enum fdt_compat_id)
+ * @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
+ */
+int fdtdec_next_compatible(const void *blob, int node,
+		enum fdt_compat_id id);
+
+/**
  * Look up an address property in a node and return it as an address.
  * The property must hold either one address with no trailing data or
  * one address with a length. This is only tested on 32-bit machines.
@@ -112,14 +127,14 @@ s32 fdtdec_get_int(const void *blob, int node, const char *prop_name,
  * Checks whether a node is enabled.
  * This looks for a 'status' property. If this exists, then returns 1 if
  * the status is 'ok' and 0 otherwise. If there is no status property,
- * it returns the default value.
+ * it returns 1 on the assumption that anything mentioned should be enabled
+ * by default.
  *
  * @param blob	FDT blob
  * @param node	node to examine
- * @param default_val	default value to return if no 'status' property exists
- * @return integer value 0/1, if found, or default_val if not
+ * @return integer value 0 (not enabled) or 1 (enabled)
  */
-int fdtdec_get_is_enabled(const void *blob, int node, int default_val);
+int fdtdec_get_is_enabled(const void *blob, int node);
 
 /**
  * Checks whether we have a valid fdt available to control U-Boot, and panic
lib/fdtdec.c +9 -6
index 0f87163..a0a34e4 100644
@@ -33,6 +33,7 @@ DECLARE_GLOBAL_DATA_PTR;
  */
 #define COMPAT(id, name) name
 static const char * const compat_names[COMPAT_COUNT] = {
+	COMPAT(UNKNOWN, "<none>"),
 };
 
 /**
@@ -84,14 +85,14 @@ s32 fdtdec_get_int(const void *blob, int node, const char *prop_name,
 	return default_val;
 }
 
-int fdtdec_get_is_enabled(const void *blob, int node, int default_val)
+int fdtdec_get_is_enabled(const void *blob, int node)
 {
 	const char *cell;
 
 	cell = fdt_getprop(blob, node, "status", NULL);
 	if (cell)
-		return 0 == strcmp(cell, "ok");
-	return default_val;
+		return 0 == strcmp(cell, "okay");
+	return 1;
 }
 
 enum fdt_compat_id fd_dec_lookup(const void *blob, int node)
@@ -122,14 +123,16 @@ int fdtdec_next_alias(const void *blob, const char *name,
 	/* snprintf() is not available */
 	assert(strlen(name) < MAX_STR_LEN);
 	sprintf(str, "%.*s%d", MAX_STR_LEN, name, *upto);
-	(*upto)++;
 	node = find_alias_node(blob, str);
 	if (node < 0)
 		return node;
 	err = fdt_node_check_compatible(blob, node, compat_names[id]);
 	if (err < 0)
 		return err;
-	return err ? -FDT_ERR_NOTFOUND : node;
+	if (err)
+		return -FDT_ERR_NOTFOUND;
+	(*upto)++;
+	return node;
 }
 
 /*
@@ -140,7 +143,7 @@ int fdtdec_next_alias(const void *blob, const char *name,
 int fdtdec_check_fdt(void)
 {
 	/* We must have an fdt */
-	if (fdt_check_header(gd->fdt_blob))
+	if (((uintptr_t)gd->fdt_blob & 3) || fdt_check_header(gd->fdt_blob))
 		panic("No valid fdt found - please append one to U-Boot\n"
 			"binary or define CONFIG_OF_EMBED\n");
 	return 0;
Signature · 1 line
1.7.3.1
#2 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

On 12/02/2011 07:11 PM, Simon Glass wrote:
...

lib/fdtdec.c s32 fdtdec_get_int(const void *blob, int node, const char *prop_name, · line 96

Quoted 11 lines
lib/fdtdec.c +3 -2
+int fdtdec_get_is_enabled(const void *blob, int node)
 {
 	const char *cell;
 
 	cell = fdt_getprop(blob, node, "status", NULL);
 	if (cell)
-		return 0 == strcmp(cell, "ok");
-	return default_val;
+		return 0 == strcmp(cell, "okay");
+	return 1;
 }

The kernel accepts both okay (standard) and ok (non-standard). I assume the latter is required for some in-use-but-technically-incorrect .dts files. I imagine U-Boot should act like the kernel here.

(Sorry if I wasn't clear here before; that's certainly what I intended to mean)

Signature · 1 line
nvpublic
#3 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Hi Stephen,

Quoted 14 lines · Stephen Warren

On 12/02/2011 07:11 PM, Simon Glass wrote:
...

Quoted 11 lines

+int fdtdec_get_is_enabled(const void *blob, int node) {
      const char *cell;

      cell = fdt_getprop(blob, node, "status", NULL); if (cell)
-             return 0 == strcmp(cell, "ok");
-     return default_val;
+             return 0 == strcmp(cell, "okay");
+     return 1;
 }

Quoted 3 lines

The kernel accepts both okay (standard) and ok (non-standard). I assume the latter is required for some in-use-but-technically-incorrect .dts files. I imagine U-Boot should act like the kernel here.

Given that we are just starting out with fdt, do you think it would be better to not bloat the code in this way? I don't mind either way - just asking :-)

Regards,
Simon

Quoted 6 lines

(Sorry if I wasn't clear here before; that's certainly what I intended to mean)

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ0h39vB2H4MuCwVqb2Tgcr4==yN8Pj6a3s9dciyXPBu1A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#5 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Quoted 17 lines · Simon Glass

Hi Stephen,

Quoted 14 lines · Stephen Warren

On 12/02/2011 07:11 PM, Simon Glass wrote:
...

Quoted 11 lines
lib/fdtdec.c +3 -2
+int fdtdec_get_is_enabled(const void *blob, int node)
 {
      const char *cell;
 
      cell = fdt_getprop(blob, node, "status", NULL);
      if (cell)
-             return 0 == strcmp(cell, "ok");
-     return default_val;
+             return 0 == strcmp(cell, "okay");
+     return 1;
 }
Quoted 7 lines
Quoted 3 lines

The kernel accepts both okay (standard) and ok (non-standard). I assume the latter is required for some in-use-but-technically-incorrect .dts files. I imagine U-Boot should act like the kernel here.

Given that we are just starting out with fdt, do you think it would be better to not bloat the code in this way? I don't mind either way - just asking :-)

My point is that there are probably .dts files using "ok" instead of "okay" or the kernel wouldn't support "ok". People will probably want to use those with U-Boot without changing anything else. So, U-Boot should interpret the FDT in the same way as the kernel.

Signature · 1 line
nvpublic

A message that is not in the archive (sent off-list or not yet received): [email protected]

#7 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Hi Stephen,

Quoted 22 lines · Stephen Warren
Quoted 21 lines · Simon Glass

Hi Stephen,

Quoted 17 lines · Stephen Warren

On 12/02/2011 07:11 PM, Simon Glass wrote:
...

Quoted 11 lines

+int fdtdec_get_is_enabled(const void *blob, int node) {
      const char *cell;

      cell = fdt_getprop(blob, node, "status", NULL); if (cell)
-             return 0 == strcmp(cell, "ok");
-     return default_val;
+             return 0 == strcmp(cell, "okay");
+     return 1;
 }

The kernel accepts both okay (standard) and ok (non-standard). I assume the latter is required for some in-use-but-technically-incorrect .dts files. I imagine U-Boot should act like the kernel here.

Quoted 8 lines
Quoted 3 lines

Given that we are just starting out with fdt, do you think it would be better to not bloat the code in this way? I don't mind either way - just asking :-)

My point is that there are probably .dts files using "ok" instead of "okay" or the kernel wouldn't support "ok". People will probably want to use those with U-Boot without changing anything else. So, U-Boot should interpret the FDT in the same way as the kernel.

OK, how about:

		return 0 == strncmp(cell, "ok", 2);

(I do feel that if you do this sort of thing you end up with people using 'ok' even in new fdts, since they look at code like this and think it is fine)

Regards,
Simon

Quoted 3 lines

--
nvpublic

#8 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Quoted 7 lines · Simon Glass

Hi Stephen,

Quoted 4 lines · Stephen Warren

My point is that there are probably .dts files using "ok" instead of "okay" or the kernel wouldn't support "ok". People will probably want to use those with U-Boot without changing anything else. So, U-Boot should interpret the FDT in the same way as the kernel.

The kernel has to deal with real Open Firmware systems, some of which pass buggy trees. U-Boot should not blindly imitate all of Linux's workarounds.

Quoted 6 lines

OK, how about:

		return 0 == strncmp(cell, "ok", 2);

(I do feel that if you do this sort of thing you end up with people using 'ok' even in new fdts, since they look at code like this and think it is fine)

Indeed.

-Scott

#9 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Quoted 4 lines · Scott Wood
Quoted 3 lines · Simon Glass

Hi Stephen,

On Mon, Dec 5, 2011 at 2:07 PM, Stephen Warren <[email protected]> wrote:

Quoted 8 lines
Quoted 4 lines
Quoted 4 lines

My point is that there are probably .dts files using "ok" instead of "okay" or the kernel wouldn't support "ok". People will probably want to use those with U-Boot without changing anything else. So, U-Boot should interpret the FDT in the same way as the kernel.

The kernel has to deal with real Open Firmware systems, some of which pass buggy trees. U-Boot should not blindly imitate all of Linux's workarounds.

If it's certain that we'll never see anyone writing FDTs with "ok" in them instead of "okay" (because such FDTs were only autogenerated by Open Firmware), then I'm fine with the original code.

Quoted 6 lines
Quoted 6 lines

OK, how about:

		return 0 == strncmp(cell, "ok", 2);

(I do feel that if you do this sort of thing you end up with people using 'ok' even in new fdts, since they look at code like this and think it is fine)

That'd be buggy since it'd allow a lot more than ok/okay. A comment in the code would avoid the issue.

Signature · 1 line
nvpublic
#10 lore raw

Re: [PATCH v2 01/17] fdt: Tidy up a few fdtdec problems

Hi Stephen,

Quoted 21 lines · Stephen Warren
Quoted 4 lines · Scott Wood
Quoted 3 lines · Simon Glass

Hi Stephen,

On Mon, Dec 5, 2011 at 2:07 PM, Stephen Warren <[email protected]> wrote:

Quoted 8 lines
Quoted 4 lines
Quoted 4 lines

My point is that there are probably .dts files using "ok" instead of "okay" or the kernel wouldn't support "ok". People will probably want to use those with U-Boot without changing anything else. So, U-Boot should interpret the FDT in the same way as the kernel.

The kernel has to deal with real Open Firmware systems, some of which pass buggy trees.  U-Boot should not blindly imitate all of Linux's workarounds.

If it's certain that we'll never see anyone writing FDTs with "ok" in them instead of "okay" (because such FDTs were only autogenerated by Open Firmware), then I'm fine with the original code.

Quoted 3 lines
Quoted 3 lines

OK, how about:
             return 0 == strncmp(cell, "ok", 2);

Quoted 6 lines
Quoted 3 lines
Quoted 3 lines

(I do feel that if you do this sort of thing you end up with people using 'ok' even in new fdts, since they look at code like this and think it is fine)

That'd be buggy since it'd allow a lot more than ok/okay. A comment in the code would avoid the issue.

Hmm, ok I will revert to "okay" and add a comment.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): 1322878300-5551-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org

#12 lore raw

PATCH v2 2/17 fdt: Add functions to access phandles, arrays and bools

Add a function to look up a property which is a phandle in a node, and another to read a fixed-length integer array from an fdt property. Also add a function to read boolean properties, although there is no actual boolean type in U-Boot.

---
Changes in v2:
- Rename get_prop_len() to get_prop_check_min_len()

 include/fdtdec.h |   40 ++++++++++++++++++++++++++
 lib/fdtdec.c     |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+), 0 deletions(-)
include/fdtdec.h +40 -0
index 49dbac4..974520a 100644
@@ -141,3 +141,43 @@ int fdtdec_get_is_enabled(const void *blob, int node);
  * if not.
  */
 int fdtdec_check_fdt(void);
+
+/**
+ * Look up a phandle and follow it to its node. Then return the offset
+ * of that node.
+ *
+ * @param blob		FDT blob
+ * @param node		node to examine
+ * @param prop_name	name of property to find
+ * @return node offset if found, -ve error code on error
+ */
+int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name);
+
+/**
+ * Look up a property in a node and return its contents in an integer
+ * array of given length. The property must have at least enough data for
+ * the array (4*count bytes). It may have more, but this will be ignored.
+ *
+ * @param blob		FDT blob
+ * @param node		node to examine
+ * @param prop_name	name of property to find
+ * @param array		array to fill with data
+ * @param count		number of array elements
+ * @return 0 if ok, or -FDT_ERR_NOTFOUND if the property is not found,
+ *		or -FDT_ERR_BADLAYOUT if not enough data
+ */
+int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
+		u32 *array, int count);
+
+/**
+ * Look up a boolean property in a node and return it.
+ *
+ * A boolean properly is true if present in the device tree and false if not
+ * present, or present with a 0 value.
+ *
+ * @param blob	FDT blob
+ * @param node	node to examine
+ * @param prop_name	name of property to find
+ * @return 1 if the properly is present; 0 if it isn't present or is 0
+ */
+int fdtdec_get_bool(const void *blob, int node, const char *prop_name);
lib/fdtdec.c +83 -0

86 lines not on this page · raw message

Signature · 1 line
1.7.3.1

A message that is not in the archive (sent off-list or not yet received): 1322878300-5551-3-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org

#14 lore raw

Re: [PATCH v2 02/17] fdt: Add functions to access phandles, arrays and bools

Quoted 20 lines · Simon Glass

Add a function to look up a property which is a phandle in a node, and another to read a fixed-length integer array from an fdt property. Also add a function to read boolean properties, although there is no actual boolean type in U-Boot.

lib/fdtdec.c +15 -0
+/**
+ * Look up a boolean property in a node and return it.
+ *
+ * A boolean properly is true if present in the device tree and false if not
+ * present, or present with a 0 value.
+ *
+ * @param blob	FDT blob
+ * @param node	node to examine
+ * @param prop_name	name of property to find
+ * @return 1 if the properly is present; 0 if it isn't present or is 0
+ */
+int fdtdec_get_bool(const void *blob, int node, const char *prop_name)
+{
+	const s32 *cell;
+	int len;

lib/fdtdec.c int fdtdec_check_fdt(void) · line 233

Quoted 10 lines
lib/fdtdec.c +10 -0
+
+	debug("%s: %s\n", __func__, prop_name);
+	cell = fdt_getprop(blob, node, prop_name, &len);
+	if (!cell)
+		return 0;
+	if (len >= sizeof(u32) && *cell == 0)
+		return 0;
+
+	return 1;
+}

I'm still slightly worried that this implementation may interpret the FDT differently to the kernel. At least the code I've written for boolean properties /only/ looks at the presence of the property, and never at the contents even if there is one.

That said, the ePAPR specification does only say that boolean properties /might/ have an empty value, thus implying that a non-zero length is permissible. so, perhaps this is fine.

Actually no, I'm more than worried now I think it through. You'd argued for being able to write 0/1 to the property so that U-Boot could modify the value in-place without having to add/remove nodes to/from the FDT image, but rather just change their content. However, if this modified FDT is then passed to the kernel (rather than some other fresh FDT), then it's imperative that U-Boot and the kernel represent boolean properties in the exact same way. Hence, we either can't have U-Boot use this edit-in-place optimization, or U-Boot needs some "cleanup" of the FDT image before passing it to the kernel. However, the latter is impossible, since by then since the boot-the-kernel code has no idea whether a property is a boolean or not, and hence implementing such a cleanup is impossible.

Signature · 1 line
nvpublic

A message that is not in the archive (sent off-list or not yet received): [email protected]

#16 lore raw

Re: [PATCH v2 02/17] fdt: Add functions to access phandles, arrays and bools

Hi Stephen,

Quoted 37 lines · Stephen Warren
Quoted 20 lines · Simon Glass

Add a function to look up a property which is a phandle in a node, and another to read a fixed-length integer array from an fdt property. Also add a function to read boolean properties, although there is no actual boolean type in U-Boot.

lib/fdtdec.c +15 -0
+/**
+ * Look up a boolean property in a node and return it.
+ *
+ * A boolean properly is true if present in the device tree and false if not
+ * present, or present with a 0 value.
+ *
+ * @param blob       FDT blob
+ * @param node       node to examine
+ * @param prop_name  name of property to find
+ * @return 1 if the properly is present; 0 if it isn't present or is 0
+ */
+int fdtdec_get_bool(const void *blob, int node, const char *prop_name)
+{
+     const s32 *cell;
+     int len;

lib/fdtdec.c int fdtdec_check_fdt(void) · line 233

Quoted 10 lines
lib/fdtdec.c +10 -0
+
+     debug("%s: %s\n", __func__, prop_name);
+     cell = fdt_getprop(blob, node, prop_name, &len);
+     if (!cell)
+             return 0;
+     if (len >= sizeof(u32) && *cell == 0)
+             return 0;
+
+     return 1;
+}

I'm still slightly worried that this implementation may interpret the FDT differently to the kernel. At least the code I've written for boolean properties /only/ looks at the presence of the property, and never at the contents even if there is one.

Quoted 3 lines

That said, the ePAPR specification does only say that boolean properties /might/ have an empty value, thus implying that a non-zero length is permissible. so, perhaps this is fine.

OK

Quoted 13 lines

Actually no, I'm more than worried now I think it through. You'd argued for being able to write 0/1 to the property so that U-Boot could modify the value in-place without having to add/remove nodes to/from the FDT image, but rather just change their content. However, if this modified FDT is then passed to the kernel (rather than some other fresh FDT), then it's imperative that U-Boot and the kernel represent boolean properties in the exact same way. Hence, we either can't have U-Boot use this edit-in-place optimization, or U-Boot needs some "cleanup" of the FDT image before passing it to the kernel. However, the latter is impossible, since by then since the boot-the-kernel code has no idea whether a property is a boolean or not, and hence implementing such a cleanup is impossible.

Hang on - this fdt cannot be passed to the kernel! It is for U-Boot's use, for it's own configuration. There is no mechanism to fix up U-Boot's internal fdt and pass it to the kernel. U-Boot scripts can't even find its address!

That side of U-Boot is a complete different use of fdt and I have been careful (so far) to keep them apart.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ30Bmxp4eGCgYss9GHt=SN5X5-sSHrPJpZFjVjprpa_Ag-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#18 lore raw

Re: [PATCH v2 02/17] fdt: Add functions to access phandles, arrays and bools

Quoted 42 lines · Simon Glass
Quoted 21 lines · Stephen Warren
Quoted 4 lines · Simon Glass
lib/fdtdec.c +4 -0
+int fdtdec_get_bool(const void *blob, int node, const char *prop_name)
+{
+     const s32 *cell;
+     int len;

lib/fdtdec.c int fdtdec_check_fdt(void) · line 233

Quoted 10 lines
lib/fdtdec.c +10 -0
+
+     debug("%s: %s\n", __func__, prop_name);
+     cell = fdt_getprop(blob, node, prop_name, &len);
+     if (!cell)
+             return 0;
+     if (len >= sizeof(u32) && *cell == 0)
+             return 0;
+
+     return 1;
+}

I'm still slightly worried that this implementation may interpret the FDT differently to the kernel. At least the code I've written for boolean properties /only/ looks at the presence of the property, and never at the contents even if there is one.

Quoted 3 lines

That said, the ePAPR specification does only say that boolean properties /might/ have an empty value, thus implying that a non-zero length is permissible. so, perhaps this is fine.

OK

Quoted 13 lines

Actually no, I'm more than worried now I think it through. You'd argued for being able to write 0/1 to the property so that U-Boot could modify the value in-place without having to add/remove nodes to/from the FDT image, but rather just change their content. However, if this modified FDT is then passed to the kernel (rather than some other fresh FDT), then it's imperative that U-Boot and the kernel represent boolean properties in the exact same way. Hence, we either can't have U-Boot use this edit-in-place optimization, or U-Boot needs some "cleanup" of the FDT image before passing it to the kernel. However, the latter is impossible, since by then since the boot-the-kernel code has no idea whether a property is a boolean or not, and hence implementing such a cleanup is impossible.

Quoted 7 lines

Hang on - this fdt cannot be passed to the kernel! It is for U-Boot's use, for it's own configuration. There is no mechanism to fix up U-Boot's internal fdt and pass it to the kernel. U-Boot scripts can't even find its address!

That side of U-Boot is a complete different use of fdt and I have been careful (so far) to keep them apart.

Yes, that's certainly the way it is right now.

I'd heard some discussion on changing that, and allowing U-Boot to pass its internal configuration FDT to the kernel instead of loading it from disk a second time. However, it looks like that discussion was purely internal to NVIDIA and might have been motivated by some confusion rather than actual intent.

As such, my comments about fixing stuff up to pass to the kernel don't apply.

Still, I think we should be able pass the same FDT to U-Boot and the kernel, and as such they should both interpret boolean properties in the same way. This patch doesn't do that.

Signature · 1 line
nvpublic
#19 lore raw

Re: [PATCH v2 02/17] fdt: Add functions to access phandles, arrays and bools

Hi Stephen,

Quoted 53 lines · Stephen Warren
Quoted 42 lines · Simon Glass
Quoted 21 lines · Stephen Warren
Quoted 4 lines · Simon Glass
(quoted diff) +4 -0
+int fdtdec_get_bool(const void *blob, int node, const char *prop_name)
+{
+     const s32 *cell;
+     int len;

Review

Quoted 10 lines
(quoted diff) +10 -0
+
+     debug("%s: %s\n", __func__, prop_name);
+     cell = fdt_getprop(blob, node, prop_name, &len);
+     if (!cell)
+             return 0;
+     if (len >= sizeof(u32) && *cell == 0)
+             return 0;
+
+     return 1;
+}

I'm still slightly worried that this implementation may interpret the FDT differently to the kernel. At least the code I've written for boolean properties /only/ looks at the presence of the property, and never at the contents even if there is one.

Quoted 3 lines

That said, the ePAPR specification does only say that boolean properties /might/ have an empty value, thus implying that a non-zero length is permissible. so, perhaps this is fine.

OK

Quoted 13 lines

Actually no, I'm more than worried now I think it through. You'd argued for being able to write 0/1 to the property so that U-Boot could modify the value in-place without having to add/remove nodes to/from the FDT image, but rather just change their content. However, if this modified FDT is then passed to the kernel (rather than some other fresh FDT), then it's imperative that U-Boot and the kernel represent boolean properties in the exact same way. Hence, we either can't have U-Boot use this edit-in-place optimization, or U-Boot needs some "cleanup" of the FDT image before passing it to the kernel. However, the latter is impossible, since by then since the boot-the-kernel code has no idea whether a property is a boolean or not, and hence implementing such a cleanup is impossible.

Quoted 7 lines

Hang on - this fdt cannot be passed to the kernel! It is for U-Boot's use, for it's own configuration. There is no mechanism to fix up U-Boot's internal fdt and pass it to the kernel. U-Boot scripts can't even find its address!

That side of U-Boot is a complete different use of fdt and I have been careful (so far) to keep them apart.

Yes, that's certainly the way it is right now.

Quoted 8 lines

I'd heard some discussion on changing that, and allowing U-Boot to pass its internal configuration FDT to the kernel instead of loading it from disk a second time. However, it looks like that discussion was purely internal to NVIDIA and might have been motivated by some confusion rather than actual intent.

As such, my comments about fixing stuff up to pass to the kernel don't apply.

OK

Quoted 4 lines

Still, I think we should be able pass the same FDT to U-Boot and the kernel, and as such they should both interpret boolean properties in the same way. This patch doesn't do that.

OK, I will change it, and start a separate thread on devicetree-discuss about fdtget/put.

Regards,
Simon

Quoted 3 lines

--
nvpublic

#20 lore raw

PATCH v2 4/17 fdt: Add basic support for decoding GPIO definitions

In reply to a message not in the archive

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output
   2      0=polarity normal, 1=active low (inverted)

An example is:

enable-propounder = <&gpio 43 1>;

which means that GPIO 43 is an output and we can enable the propounder by setting gpio 43 high.

Two main functions are provided:

fdtdec_decode_gpio() reads a GPIO property from an fdt node and decodes it into a structure.

fdtdec_setup_gpio() sets up the GPIO by calling gpio_request and gpio_direction_input/output() for you.

Both functions can cope with the property being missing, which is taken to mean that that GPIO function is not available or is not needed.

---

 include/fdtdec.h |   49 ++++++++++++++++++++++++++++++++
 lib/fdtdec.c     |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 132 insertions(+), 0 deletions(-)
include/fdtdec.h +49 -0
index 974520a..57db42b 100644
@@ -61,6 +61,26 @@ enum fdt_compat_id {
 	COMPAT_COUNT,
 };
 
+/* For now we allow 224 GPIOs. We can extend this later if required */
+enum {
+	FDT_GPIO_NONE = 255,	/* an invalid GPIO used to end our list */
+	FDT_GPIO_MAX  = 224,	/* maximum valid GPIO number */
+
+	FDT_GPIO_OUTPUT	= 1 << 0,	/* set as output (else input) */
+	FDT_GPIO_HIGH	= 1 << 1,	/* set output as high (else low) */
+	FDT_GPIO_ACTIVE_LOW = 1 << 2,	/* input is active low (else high) */
+};
+
+/* This is the state of a GPIO pin as defined by the fdt */
+struct fdt_gpio_state {
+	const char *name;	/* name of the fdt property defining this */
+	u8 gpio;		/* GPIO number, or FDT_GPIO_NONE if none */
+	u8 flags;		/* FDT_GPIO_... flags */
+};
+
+/* This tells us whether a fdt_gpio_state record is valid or not */
+#define fdt_gpio_isvalid(x) ((x)->gpio != FDT_GPIO_NONE)
+
 /**
  * Find the next numbered alias for a peripheral. This is used to enumerate
  * all the peripherals of a certain type.
@@ -181,3 +201,32 @@ int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
  * @return 1 if the properly is present; 0 if it isn't present or is 0
  */
 int fdtdec_get_bool(const void *blob, int node, const char *prop_name);
+
+/**
+ * Decode a single GPIOs from an FDT.
+ *
+ * If the property is not found, then the GPIO structure will still be
+ * initialised, with gpio set to FDT_GPIO_NONE. This makes it easy to
+ * provide optional GPIOs.
+ *
+ * @param blob		FDT blob to use
+ * @param node		Node to look at
+ * @param prop_name	Node property name
+ * @param gpio		gpio elements to fill from FDT
+ * @return 0 if ok, -FDT_ERR_NOTFOUND if the property is missing.
+ */
+int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,
+		struct fdt_gpio_state *gpio);
+
+/**
+ * Set up a GPIO pin according to the provided gpio information. This sets it
+ * to either input or output. If an output, then the defined value is
+ * assigned.
+ *
+ * If the gpio is FDT_GPIO_NONE, no action is taken. This makes it easy to
+ * deal with optional GPIOs.
+ *
+ * @param gpio		GPIO info to use for set up
+ * @return 0 if all ok or gpio was FDT_GPIO_NONE; -1 on error
+ */
+int fdtdec_setup_gpio(struct fdt_gpio_state *gpio);
lib/fdtdec.c +83 -0

92 lines not on this page · raw message

Signature · 1 line
1.7.3.1

A message that is not in the archive (sent off-list or not yet received): 1322878300-5551-5-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org

#22 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output
   2      0=polarity normal, 1=active low (inverted)

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

This implies that a lot of the code isn't correct, but I haven't explicitly mentioned this everywhere for brevity.

Quoted 3 lines

An example is:

enable-propounder = <&gpio 43 1>;

I /think/ convention is to name such properties foo-gpios rather than just foo. Still, this is only a comment on the example and not the code, since the complete property name is passed into the new functions by the caller.

include/fdtdec.h enum fdt_compat_id { · line 66

Quoted 3 lines
include/fdtdec.h +3 -0
+/* For now we allow 224 GPIOs. We can extend this later if required */
+enum {
+	FDT_GPIO_NONE = 255,	/* an invalid GPIO used to end our list */

Can't you use 0 for that? (the kernel currently uses -1, but it seems there's agreement that was a mistake). If you use 255, the number will have to keep getting bumped as more complex systems become supported. If not 0, perhaps U32_MAX or whatever the relevant ${type}_MAX is?

Signature · 1 line
nvpublic
#23 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output 2      0=polarity normal, 1=active low (inverted)

Quoted 6 lines

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

I see this in my version:

Required properties:
- compatible : "nvidia,tegra20-gpio"
- #gpio-cells : Should be two. The first cell is the pin number and the second cell is used to specify optional parameters:
- bit 0 specifies polarity (0 for normal, 1 for inverted)
- gpio-controller : Marks the device node as a GPIO controller.

so how do I go about adding the other two bits?

Quoted 3 lines

This implies that a lot of the code isn't correct, but I haven't explicitly mentioned this everywhere for brevity.

Well it's ok - these flags are only used in one place, and only the input/output flag in fact.

It would be nice to use constants for these in the fdt instead of numbers. Is that in progress?

enable-propounder = <&gpio 43 OUTPUT>;

Quoted 9 lines
Quoted 4 lines

An example is:

enable-propounder = <&gpio 43 1>;

I /think/ convention is to name such properties foo-gpios rather than just foo. Still, this is only a comment on the example and not the code, since the complete property name is passed into the new functions by the caller.

ok, will update.

Quoted 9 lines

include/fdtdec.h enum fdt_compat_id { · line 66

Quoted 4 lines
include/fdtdec.h +3 -0
+/* For now we allow 224 GPIOs. We can extend this later if required */
+enum {
+     FDT_GPIO_NONE = 255,    /* an invalid GPIO used to end our list */

Can't you use 0 for that? (the kernel currently uses -1, but it seems there's agreement that was a mistake). If you use 255, the number will have to keep getting bumped as more complex systems become supported. If not 0, perhaps U32_MAX or whatever the relevant ${type}_MAX is?

But 0 is a valid GPIO isn't it?

I currently use the max value available to the u8. We can change it at will when we update the u8 type to u16 which is why I made it a constant.

Thanks for all your help with this.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ3ARCTXVN2MKhfrdCCmmb21zbYdSq8AuQFPdoA=xFr7Mg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#25 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Quoted 30 lines · Simon Glass

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output
   2      0=polarity normal, 1=active low (inverted)
Quoted 6 lines

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

I see this in my version:

Quoted 8 lines

Required properties:
- compatible : "nvidia,tegra20-gpio"
- #gpio-cells : Should be two. The first cell is the pin number and the second cell is used to specify optional parameters:
- bit 0 specifies polarity (0 for normal, 1 for inverted)
- gpio-controller : Marks the device node as a GPIO controller.

so how do I go about adding the other two bits?

I don't think you would. Input vs. output and output value are set up by APIs such as gpio_direction_input/output based on what the driver wants to do with the GPIOs.

Quoted 10 lines
Quoted 8 lines

include/fdtdec.h enum fdt_compat_id { · line 66

Quoted 3 lines
include/fdtdec.h +3 -0
+/* For now we allow 224 GPIOs. We can extend this later if required */
+enum {
+     FDT_GPIO_NONE = 255,    /* an invalid GPIO used to end our list */

Can't you use 0 for that? (the kernel currently uses -1, but it seems there's agreement that was a mistake). If you use 255, the number will have to keep getting bumped as more complex systems become supported. If not 0, perhaps U32_MAX or whatever the relevant ${type}_MAX is?

But 0 is a valid GPIO isn't it?

Well, it depends how you define your numbering scheme. It may well be!

There are many ways of representing a GPIO:

* GPIO n on a specific controller (of which there may be many). This is what DT GPIO bindings use.

* A system-wide GPIO ID, in which case the numbering is "virtual" (e.g. a concatenation of the GPIOs on all the present controllers), and you can choose to start the first controller's GPIOs at 0, 1, 1000 etc., thus leaving -1, 0, -n..999 etc. as invalid GPIOs. This is what the Linux kernel's gpiolib uses (and some say this global numbering scheme was a mistake).

Quoted 3 lines

I currently use the max value available to the u8. We can change it at will when we update the u8 type to u16 which is why I made it a constant.

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Signature · 1 line
nvpublic

A message that is not in the archive (sent off-list or not yet received): [email protected]

#27 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Hi Stephen,

Quoted 38 lines · Stephen Warren
Quoted 37 lines · Simon Glass

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output 2      0=polarity normal, 1=active low (inverted)

Quoted 6 lines

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

I see this in my version:

Required properties:
- compatible : "nvidia,tegra20-gpio"
- #gpio-cells : Should be two. The first cell is the pin number and the second cell is used to specify optional parameters:
  - bit 0 specifies polarity (0 for normal, 1 for inverted)
- gpio-controller : Marks the device node as a GPIO controller.

Quoted 5 lines
Quoted 1 line

so how do I go about adding the other two bits?

I don't think you would. Input vs. output and output value are set up by APIs such as gpio_direction_input/output based on what the driver wants to do with the GPIOs.

Fair enough. I am wanting to create a way for more information to be provided about a GPIO so that it can be set up automatically ready for use (reduces code size).

Quoted 19 lines
Quoted 11 lines
Quoted 9 lines

Review

Quoted 4 lines
(quoted diff) +3 -0
+/* For now we allow 224 GPIOs. We can extend this later if required */
+enum {
+     FDT_GPIO_NONE = 255,    /* an invalid GPIO used to end our list */

Can't you use 0 for that? (the kernel currently uses -1, but it seems there's agreement that was a mistake). If you use 255, the number will have to keep getting bumped as more complex systems become supported. If not 0, perhaps U32_MAX or whatever the relevant ${type}_MAX is?

But 0 is a valid GPIO isn't it?

Well, it depends how you define your numbering scheme. It may well be!

There are many ways of representing a GPIO:

* GPIO n on a specific controller (of which there may be many). This is what DT GPIO bindings use.

Quoted 6 lines

* A system-wide GPIO ID, in which case the numbering is "virtual" (e.g. a concatenation of the GPIOs on all the present controllers), and you can choose to start the first controller's GPIOs at 0, 1, 1000 etc., thus leaving -1, 0, -n..999 etc. as invalid GPIOs. This is what the Linux kernel's gpiolib uses (and some say this global numbering scheme was a mistake).

Well maybe it was a mistake, but it seems painful for the user to translate GPIO numbers in this way. U-Boot's GPIO command takes a GPIO number, which starts at zero.

Quoted 7 lines
Quoted 4 lines

I currently use the max value available to the u8. We can change it at will when we update the u8 type to u16 which is why I made it a constant.

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Do you mean the fdt_gpio_state structure? I have not used u8 for any function calls and would not.

This adds 3 bytes for every entry. What is the benefit? People get upset when we waste memory!

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ03+tfMhkqo4=uarcAf1E8hTfvSF_Y0=V70tuqP866QQQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#29 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Quoted 43 lines · Simon Glass

Hi Stephen,

Quoted 40 lines · Stephen Warren
Quoted 38 lines · Simon Glass

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output
   2      0=polarity normal, 1=active low (inverted)
Quoted 6 lines

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

I see this in my version:

Required properties:
- compatible : "nvidia,tegra20-gpio"
- #gpio-cells : Should be two. The first cell is the pin number and the second cell is used to specify optional parameters:
- bit 0 specifies polarity (0 for normal, 1 for inverted)
- gpio-controller : Marks the device node as a GPIO controller.

so how do I go about adding the other two bits?

Quoted 7 lines
Quoted 3 lines

I don't think you would. Input vs. output and output value are set up by APIs such as gpio_direction_input/output based on what the driver wants to do with the GPIOs.

Fair enough. I am wanting to create a way for more information to be provided about a GPIO so that it can be set up automatically ready for use (reduces code size).

At least in this case, I don't think it makes sense to do that. The FDT is about representing that a particular GPIO is a VBUS GPIO. That doesn't mean the GPIO /has/ to be an output driven high; that's only true if the driver is enabled and chooses to configure that port as a host port, not a device port.

If you wanted to represent GPIOs that were always configured to a specific output value in DT, I think that'd be an unrelated binding somewhere other than the USB bus's vbus-gpios property, since it'd have a completely different semantic meaning.

Quoted 4 lines
Quoted 2 lines

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Do you mean the fdt_gpio_state structure?

Yes.

Quoted 5 lines

I have not used u8 for any
function calls and would not.

This adds 3 bytes for every entry. What is the benefit? People get upset when we waste memory!

Well, U-boot has already chosen to use an int to represent a GPIO ID. Given that, I assert that all places that store a GPIO ID should use the same type. And realistically, we're only talking about a handful of instances here, and any bloat is completely limited to those platforms that use this feature, and linear with the number of GPIOs.

Signature · 1 line
nvpublic

A message that is not in the archive (sent off-list or not yet received): [email protected]

#31 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Hi Stephen,

Quoted 58 lines · Stephen Warren
Quoted 43 lines · Simon Glass

Hi Stephen,

Quoted 40 lines · Stephen Warren
Quoted 38 lines · Simon Glass

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to FDT_GPIO_MAX GPIOs in the system. Each GPIO is of the form:

gpio-function-name = <phandle gpio_num flags>;

where:

Quoted 8 lines

phandle is a pointer to the GPIO node
gpio_num is the number of the GPIO (0 to 223)
flags is some flags, proposed as follows:

   bit    meaning
   0      0=input, 1=output
   1      for output only: inital value of output 2      0=polarity normal, 1=active low (inverted)

Quoted 6 lines

The meaning of the flags (and even whether there are any flags any if so how many cells there are to contain them) is defined by the GPIO controller's binding. It's not something that can be interpreted in isolation by a generic DT parsing function. See for example #gpio-cells in tegra20.dtsi's gpio node and kernel file Documentation/devicetree/bindings/gpio/gpio_nvidia.txt.

I see this in my version:

Required properties:
- compatible : "nvidia,tegra20-gpio"
- #gpio-cells : Should be two. The first cell is the pin number and the second cell is used to specify optional parameters:
  - bit 0 specifies polarity (0 for normal, 1 for inverted)
- gpio-controller : Marks the device node as a GPIO controller.

so how do I go about adding the other two bits?

Quoted 7 lines
Quoted 3 lines

I don't think you would. Input vs. output and output value are set up by APIs such as gpio_direction_input/output based on what the driver wants to do with the GPIOs.

Fair enough. I am wanting to create a way for more information to be provided about a GPIO so that it can be set up automatically ready for use (reduces code size).

At least in this case, I don't think it makes sense to do that. The FDT is about representing that a particular GPIO is a VBUS GPIO. That doesn't mean the GPIO /has/ to be an output driven high; that's only true if the driver is enabled and chooses to configure that port as a host port, not a device port.

Quoted 4 lines

If you wanted to represent GPIOs that were always configured to a specific output value in DT, I think that'd be an unrelated binding somewhere other than the USB bus's vbus-gpios property, since it'd have a completely different semantic meaning.

I feel that it is useful to have a generic gpio setup function which can at least set gpio to input or output. We could even make it optional with an additional flag. IMO a lot of the reason for only having one flag is that no one can OR together two decimal numbers (i.e. we need symbolic constants in the fdt).

But for now I will drop this comment and the fdtdec_setup_gpio() function. This will increase code size slightly since every driver will need to call gpio_direction_input/output() manually.

Quoted 11 lines
Quoted 5 lines
Quoted 3 lines

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Do you mean the fdt_gpio_state structure?

Yes.

Quoted 3 lines

I have not used u8 for any
function calls and would not.

Quoted 8 lines
Quoted 2 lines

This adds 3 bytes for every entry. What is the benefit? People get upset when we waste memory!

Well, U-boot has already chosen to use an int to represent a GPIO ID. Given that, I assert that all places that store a GPIO ID should use the same type. And realistically, we're only talking about a handful of instances here, and any bloat is completely limited to those platforms that use this feature, and linear with the number of GPIOs.

OK I have changed this. Each structure element is now 4 bytes (50%) bigger than before but I don't think this will add up to more than a few hundred bytes all up.

Regards,
Simon

Quoted 3 lines

--
nvpublic

#32 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

In reply to Simon Glass
Quoted 9 lines · On Monday 05 December 2011 17:52:01 Simon Glass wrote:
Quoted 7 lines · Stephen Warren

On 12/05/2011 02:56 PM, Simon Glass wrote:
* A system-wide GPIO ID, in which case the numbering is "virtual" (e.g. a concatenation of the GPIOs on all the present controllers), and you can choose to start the first controller's GPIOs at 0, 1, 1000 etc., thus leaving -1, 0, -n..999 etc. as invalid GPIOs. This is what the Linux kernel's gpiolib uses (and some say this global numbering scheme was a mistake).

Quoted 3 lines

Well maybe it was a mistake, but it seems painful for the user to translate GPIO numbers in this way. U-Boot's GPIO command takes a GPIO number, which starts at zero.

u-boot should simply follow what linux is doing as it keeps things a hell of a lot simpler for us: the code is done, people moving between the worlds don't get surprised and screw something up, and we don't accidentally forget "oh, in u-boot we do XXX instead of YYY" and screw things up ourselves.

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines

I currently use the max value available to the u8. We can change it at will when we update the u8 type to u16 which is why I made it a constant.

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Do you mean the fdt_gpio_state structure? I have not used u8 for any function calls and would not.

the asm-generic/gpio.h using "int" as a gpio is wrong. it should be "unsigned". there's a patch somewhere to fix this.

Quoted 2 lines

This adds 3 bytes for every entry. What is the benefit? People get upset when we waste memory!

some systems have more than 256 GPIOs. it's actually not that hard to hit the limit.
-mike

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

#33 lore raw

Re: [PATCH v2 04/17] fdt: Add basic support for decoding GPIO definitions

Hi Mike,

Quoted 10 lines · Mike Frysinger
Quoted 9 lines · On Monday 05 December 2011 17:52:01 Simon Glass wrote:
Quoted 7 lines · Stephen Warren

On 12/05/2011 02:56 PM, Simon Glass wrote:
* A system-wide GPIO ID, in which case the numbering is "virtual" (e.g. a concatenation of the GPIOs on all the present controllers), and you can choose to start the first controller's GPIOs at 0, 1, 1000 etc., thus leaving -1, 0, -n..999 etc. as invalid GPIOs. This is what the Linux kernel's gpiolib uses (and some say this global numbering scheme was a mistake).

Quoted 8 lines
Quoted 3 lines

Well maybe it was a mistake, but it seems painful for the user to translate GPIO numbers in this way. U-Boot's GPIO command takes a GPIO number, which starts at zero.

u-boot should simply follow what linux is doing as it keeps things a hell of a lot simpler for us: the code is done, people moving between the worlds don't get surprised and screw something up, and we don't accidentally forget "oh, in u-boot we do XXX instead of YYY" and screw things up ourselves.

Good, I think that is what we are doing. But if Linux changes the GPIO numbering we may need to do something.

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 4 lines

I currently use the max value available to the u8. We can change it at will when we update the u8 type to u16 which is why I made it a constant.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

include/asm-generic/gpio.h seems to use an int to represent a GPIO. I'd suggest these APIs do the same, rather than use a u8.

Do you mean the fdt_gpio_state structure? I have not used u8 for any function calls and would not.

the asm-generic/gpio.h using "int" as a gpio is wrong.  it should be "unsigned".  there's a patch somewhere to fix this.

OK, will wait to see it.

Quoted 7 lines
Quoted 3 lines

This adds 3 bytes for every entry. What is the benefit? People get upset when we waste memory!

some systems have more than 256 GPIOs.  it's actually not that hard to hit the limit.
-mike

Not for me so far, but I don't doubt it. I have changed it to uint in the series.

Regards,
Simon

#34 lore raw

PATCH v2 5/17 arm: fdt: Ensure that an embedded fdt is word-aligned

In reply to a message not in the archive

By putting the fdt blob into a distinctive area we can ensure that it appears at the start of the data section and is word-aligned.

Note: It does not seem to be possible to get objcopy to honour its --section-alignment flag, which would otherwise provide an easier fix for this problem.

---

 arch/arm/cpu/armv7/u-boot.lds |    5 +++++
 dts/Makefile                  |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)
arch/arm/cpu/armv7/u-boot.lds +5 -0
index 40ecf78..793e51b 100644
@@ -43,6 +43,11 @@ SECTIONS
 
 	. = ALIGN(4);
 	.data : {
+		/*
+		 * Sadly objcopy seems to ignore --section-alignment.
+		 * Put any embedded device tree first so it is aligned.
+		 */
+		*(.dts.data)
 		*(.data)
 	}
 
dts/Makefile +1 -1
index 5792afd..83547d4 100644
@@ -79,7 +79,7 @@ $(obj)dt.o: $(DT_BIN)
 	\
 	cd $(dir ${DT_BIN}) && \
 	$(OBJCOPY) -I binary -O $${oformat} -B $${oarch} \
-		$(notdir ${DT_BIN}) $@
+		--prefix-sections=.dts $(notdir ${DT_BIN}) $@
 	rm $(DT_BIN)
 
 OBJS-$(CONFIG_OF_EMBED)	:= dt.o
Signature · 1 line
1.7.3.1
#35 lore raw

PATCH v2 7/17 tegra: fdt: Add Tegra2x device tree file from kernel

In reply to a message not in the archive

This was taken from commit b48c54e2 at:
git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git

config.mk is updated to provide this file to boards through the built-in mechanism:

/include/ ARCH_CPU_DTS

---

 arch/arm/cpu/armv7/tegra2/config.mk |    2 +
 arch/arm/dts/tegra20.dtsi           |  169 +++++++++++++++++++++++++++++++++++
 2 files changed, 171 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/dts/tegra20.dtsi
arch/arm/cpu/armv7/tegra2/config.mk +2 -0
index 2303dba..fe9ef5b 100644
@@ -31,3 +31,5 @@ CFLAGS_arch/arm/lib/board.o += -march=armv4t
 endif
 
 USE_PRIVATE_LIBGCC = yes
+
+CONFIG_ARCH_DEVICE_TREE := tegra20
arch/arm/dts/tegra20.dtsi new file +169 -0

169 lines not on this page · raw message

Signature · 1 line
1.7.3.1
#36 lore raw

PATCH v2 8/17 tegra: fdt: Add device tree file for Tegra2 Seaboard from kernel

In reply to a message not in the archive

This was taken from commit b48c54e2 at:
git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git

---
Changes in v2:
- Pulled USB fdt definitions from newer for-next instead of master

 board/nvidia/dts/tegra2-seaboard.dts |   36 ++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)
 create mode 100644 board/nvidia/dts/tegra2-seaboard.dts
board/nvidia/dts/tegra2-seaboard.dts new file +36 -0
new file mode 100644
index 0000000..dde5d03
@@ -0,0 +1,36 @@
+/dts-v1/;
+
+/memreserve/ 0x1c000000 0x04000000;
+/include/ ARCH_CPU_DTS
+
+/ {
+	model = "NVIDIA Seaboard";
+	compatible = "nvidia,seaboard", "nvidia,tegra20";
+
+	chosen {
+		bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait";
+	};
+
+	memory {
+		device_type = "memory";
+		reg = < 0x00000000 0x40000000 >;
+	};
+
+	serial@70006300 {
+		clock-frequency = < 216000000 >;
+	};
+
+	sdhci@c8000400 {
+		cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+		wp-gpios = <&gpio 57 0>; /* gpio PH1 */
+		power-gpios = <&gpio 70 0>; /* gpio PI6 */
+	};
+
+	sdhci@c8000600 {
+		support-8bit;
+	};
+
+	usb@c5000000 {
+		nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */
+	};
+};
Signature · 1 line
1.7.3.1
#37 lore raw

PATCH v2 9/17 tegra: usb: fdt: Add additional device tree definitions for USB ports

In reply to a message not in the archive

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

---
Changes in v2:
- Change fdt property usbparmas to usbtiming
- Add details for port USB2

 arch/arm/dts/tegra20.dtsi |   69 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 69 insertions(+), 0 deletions(-)
arch/arm/dts/tegra20.dtsi +69 -0
index 6146d24..d7ab843 100644
@@ -144,11 +144,78 @@
 		interrupts = < 63 >;
 	};
 
+/* This table has USB timing parameters for each Oscillator frequency we
+ * support. There are four sets of values:
+ *
+ * 1. PLLU configuration information (reference clock is osc/clk_m and
+ * PLLU-FOs are fixed at 12MHz/60MHz/480MHz).
+ *
+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz
+ *  ----------------------------------------------------------------------
+ *      DIVN                960 (0x3c0)  200 (0c8)    960 (3c0h)   960 (3c0)
+ *      DIVM                13 (0d)      4 (04)       12 (0c)      26 (1a)
+ * Filter frequency (MHz)   1            4.8          6            2
+ * CPCON                    1100b        0011b        1100b        1100b
+ * LFCON0                   0            0            0            0
+ *
+ * 2. PLL CONFIGURATION & PARAMETERS for different clock generators:
+ *
+ * Reference frequency     13.0MHz         19.2MHz         12.0MHz     26.0MHz
+ * ---------------------------------------------------------------------------
+ * PLLU_ENABLE_DLY_COUNT   02 (0x02)       03 (03)         02 (02)     04 (04)
+ * PLLU_STABLE_COUNT       51 (33)         75 (4B)         47 (2F)    102 (66)
+ * PLL_ACTIVE_DLY_COUNT    05 (05)         06 (06)         04 (04)     09 (09)
+ * XTAL_FREQ_COUNT        127 (7F)        187 (BB)        118 (76)    254 (FE)
+ *
+ * 3. Debounce values IdDig, Avalid, Bvalid, VbusValid, VbusWakeUp, and
+ * SessEnd. Each of these signals have their own debouncer and for each of
+ * those one out of two debouncing times can be chosen (BIAS_DEBOUNCE_A or
+ * BIAS_DEBOUNCE_B).
+ *
+ * The values of DEBOUNCE_A and DEBOUNCE_B are calculated as follows:
+ *    0xffff -> No debouncing at all
+ *    <n> ms = <n> *1000 / (1/19.2MHz) / 4
+ *
+ * So to program a 1 ms debounce for BIAS_DEBOUNCE_A, we have:
+ * BIAS_DEBOUNCE_A[15:0] = 1000 * 19.2 / 4  = 4800 = 0x12c0
+ *
+ * We need to use only DebounceA for BOOTROM. We don't need the DebounceB
+ * values, so we can keep those to default.
+ *
+ * a4. The 20 microsecond delay after bias cell operation.
+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz
+ */
+	usbtiming@0 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <13000000>;
+		/* DivN, DivM, DivP, CPCON, LFCON, Delays     Debounce, Bias */
+		timing = <0x3c0 0x0d 0x00 0xc 0  0x02 0x33 0x05 0x7f 0x7ef4 5>;
+	};
+
+	usbtiming@1 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <19200000>;
+		timing = <0x0c8 0x04 0x00 0x3 0  0x03 0x4b 0x06 0xbb 0xbb80 7>;
+	};
+
+	usbtiming@2 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <12000000>;
+		timing = <0x3c0 0x0c 0x00 0xc 0  0x02 0x2f 0x04 0x76 0x7530 5>;
+	};
+
+	usbtiming@3 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <26000000>;
+		timing = <0x3c0 0x1a 0x00 0xc 0  0x04 0x66 0x09 0xfe 0xfde8 9>;
+	};
+
 	usb@c5000000 {
 		compatible = "nvidia,tegra20-ehci", "usb-ehci";
 		reg = <0xc5000000 0x4000>;
 		interrupts = < 52 >;
 		phy_type = "utmi";
+		periph-id = <22>;	// PERIPH_ID_USBD
 	};
 
 	usb@c5004000 {
@@ -156,6 +223,7 @@
 		reg = <0xc5004000 0x4000>;
 		interrupts = < 53 >;
 		phy_type = "ulpi";
+		periph-id = <58>;	// PERIPH_ID_USB2
 	};
 
 	usb@c5008000 {
@@ -163,6 +231,7 @@
 		reg = <0xc5008000 0x4000>;
 		interrupts = < 129 >;
 		phy_type = "utmi";
+		periph-id = <59>;	// PERIPH_ID_USB3
 	};
 
 };
Signature · 1 line
1.7.3.1

A message that is not in the archive (sent off-list or not yet received): 1322878300-5551-10-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org

#39 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Quoted 10 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Which parts vary? Most of it is PLL configuration, and it seems basically impossible for that to vary yet still create the correct output frequency.

Quoted 1 line

+/* This table has USB timing parameters for each Oscillator frequency we

This comment block should be indented to match the nodes.

Quoted 17 lines

+ * support. There are four sets of values:
+ *
+ * 1. PLLU configuration information (reference clock is osc/clk_m and
+ * PLLU-FOs are fixed at 12MHz/60MHz/480MHz).
+ *
+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz
+ * ----------------------------------------------------------------------

+ *      DIVN                960 (0x3c0)  200 (0c8)    960 (3c0h)   960 (3c0)
+ *      DIVM                13 (0d)      4 (04)       12 (0c)      26 (1a)
+ * Filter frequency (MHz)   1            4.8          6            2
+ * CPCON                    1100b        0011b        1100b        1100b
+ * LFCON0                   0            0            0            0

+ *
+ * 2. PLL CONFIGURATION & PARAMETERS for different clock generators:
+ *
+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz
+ * ---------------------------------------------------------------------------

Quoted 4 lines
+ * PLLU_ENABLE_DLY_COUNT   02 (0x02)       03 (03)         02 (02)     04 (04)
+ * PLLU_STABLE_COUNT       51 (33)         75 (4B)         47 (2F)    102 (66)
+ * PLL_ACTIVE_DLY_COUNT    05 (05)         06 (06)         04 (04)     09 (09)

+ * XTAL_FREQ_COUNT 127 (7F) 187 (BB) 118 (76) 254 (FE)

Those two sets of data seem like they should simply be part of the clock driver. Some part of the system boot or USB init process needs to say "enable the USB clocks", and that code needs to write those hard-coded values into the relevant clock registers (or calculate them at run-time; whatever). This stuff can't vary by board.

Quoted 8 lines

+ * 3. Debounce values IdDig, Avalid, Bvalid, VbusValid, VbusWakeUp, and
+ * SessEnd. Each of these signals have their own debouncer and for each of
+ * those one out of two debouncing times can be chosen (BIAS_DEBOUNCE_A or
+ * BIAS_DEBOUNCE_B).
+ *
+ * The values of DEBOUNCE_A and DEBOUNCE_B are calculated as follows:
+ * 0xffff -> No debouncing at all
+ * <n> ms = <n> *1000 / (1/19.2MHz) / 4

Quoted 8 lines

+ *
+ * So to program a 1 ms debounce for BIAS_DEBOUNCE_A, we have:
+ * BIAS_DEBOUNCE_A[15:0] = 1000 * 19.2 / 4 = 4800 = 0x12c0
+ *
+ * We need to use only DebounceA for BOOTROM. We don't need the DebounceB
+ * values, so we can keep those to default.
+ *
+ * a4. The 20 microsecond delay after bias cell operation.

^ typo

Quoted 1 line

+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz

If this data varies at all, then those two sets of data seem port-specific to me, and hence should be moved into a per-port property. Having a single global set of parameters that gets applied to all ports at once doesn't make sense to me, if the data varies.

I imagine the values are board specific too, and hence shouldn't be in tegra20.dtsi but rather in tegra-seaboard.dts.

The values in these fields should be specific in a way that's agnostic to the reference clock, e.g. as a number of mS/nS. That way, you'd just specify the single set of values to use, and the driver would do the calculations to map the time domain into the reference-clock-specific values to put into the registers.

Quoted 16 lines

+ */

arch/arm/dts/tegra20.dtsi +15 -0
+
+	usbtiming@0 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <13000000>;
+		/* DivN, DivM, DivP, CPCON, LFCON, Delays     Debounce, Bias */
+		timing = <0x3c0 0x0d 0x00 0xc 0  0x02 0x33 0x05 0x7f 0x7ef4 5>;
+	};
+
+	usbtiming@1 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <19200000>;
+		timing = <0x0c8 0x04 0x00 0x3 0  0x03 0x4b 0x06 0xbb 0xbb80 7>;
+	};
+
+	usbtiming@2 {

arch/arm/dts/tegra20.dtsi line 211

Quoted 10 lines
arch/arm/dts/tegra20.dtsi +10 -0
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <12000000>;
+		timing = <0x3c0 0x0c 0x00 0xc 0  0x02 0x2f 0x04 0x76 0x7530 5>;
+	};
+
+	usbtiming@3 {
+		compatible = "nvidia,tegra20-usbtiming";
+		osc-frequency = <26000000>;
+		timing = <0x3c0 0x1a 0x00 0xc 0  0x04 0x66 0x09 0xfe 0xfde8 9>;
+	};

You can't include those timing nodes right there, because the unit addresses (@0, ... @3) aren't physical addresses in the same scheme as all the other nodes.

arch/arm/dts/tegra20.dtsi line 218

Quoted 7 lines
arch/arm/dts/tegra20.dtsi +2 -0
+
 	usb@c5000000 {
 		compatible = "nvidia,tegra20-ehci", "usb-ehci";
 		reg = <0xc5000000 0x4000>;
 		interrupts = < 52 >;
 		phy_type = "utmi";
+		periph-id = <22>;	// PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Personally, I'd suggest not having this property at all, but rather have the driver maintain a base_address -> periph_id mapping table internally. That table can be removed once the clock/reset bindings are all set up, and the information can be obtained there instead.

Signature · 1 line
nvpublic
#40 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Hi Stephen,

Quoted 9 lines · Stephen Warren
Quoted 8 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

Quoted 6 lines
Quoted 2 lines

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Which parts vary? Most of it is PLL configuration, and it seems basically impossible for that to vary yet still create the correct output frequency.

See here for T30 differences, for example.

https://gerrit.chromium.org/gerrit/#patch,sidebyside,12440,1,board/nvidia/cardhu/tegra30.dtsi

Quoted 27 lines
Quoted 2 lines

+/* This table has USB timing parameters for each Oscillator frequency we

This comment block should be indented to match the nodes.

Quoted 13 lines

+ * support. There are four sets of values:
+ *
+ * 1. PLLU configuration information (reference clock is osc/clk_m and
+ * PLLU-FOs are fixed at 12MHz/60MHz/480MHz).
+ *
+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz
+ *  ----------------------------------------------------------------------
+ *      DIVN                960 (0x3c0)  200 (0c8)    960 (3c0h)   960 (3c0)
+ *      DIVM                13 (0d)      4 (04)       12 (0c)      26 (1a)
+ * Filter frequency (MHz)   1            4.8          6            2
+ * CPCON                    1100b        0011b        1100b        1100b
+ * LFCON0                   0            0            0            0
+ *

Quoted 8 lines

+ * 2. PLL CONFIGURATION & PARAMETERS for different clock generators:
+ *
+ * Reference frequency     13.0MHz         19.2MHz         12.0MHz     26.0MHz
+ * ---------------------------------------------------------------------------
+ * PLLU_ENABLE_DLY_COUNT   02 (0x02)       03 (03)         02 (02)     04 (04)
+ * PLLU_STABLE_COUNT       51 (33)         75 (4B)         47 (2F)    102 (66)
+ * PLL_ACTIVE_DLY_COUNT    05 (05)         06 (06)         04 (04)     09 (09)
+ * XTAL_FREQ_COUNT        127 (7F)        187 (BB)        118 (76)    254 (FE)

Quoted 5 lines

Those two sets of data seem like they should simply be part of the clock driver. Some part of the system boot or USB init process needs to say "enable the USB clocks", and that code needs to write those hard-coded values into the relevant clock registers (or calculate them at run-time; whatever). This stuff can't vary by board.

We don't have a USB clock driver. This driver is in CPU code, so I am not suggesting that it varies by board, only by SOC. This stuff is in the SOC dts.

Quoted 18 lines
Quoted 17 lines

+ * 3. Debounce values IdDig, Avalid, Bvalid, VbusValid, VbusWakeUp, and
+ * SessEnd. Each of these signals have their own debouncer and for each of
+ * those one out of two debouncing times can be chosen (BIAS_DEBOUNCE_A or
+ * BIAS_DEBOUNCE_B).
+ *
+ * The values of DEBOUNCE_A and DEBOUNCE_B are calculated as follows:
+ *    0xffff -> No debouncing at all
+ *    <n> ms = <n> *1000 / (1/19.2MHz) / 4
+ *
+ * So to program a 1 ms debounce for BIAS_DEBOUNCE_A, we have:
+ * BIAS_DEBOUNCE_A[15:0] = 1000 * 19.2 / 4  = 4800 = 0x12c0
+ *
+ * We need to use only DebounceA for BOOTROM. We don't need the DebounceB
+ * values, so we can keep those to default.
+ *
+ * a4. The 20 microsecond delay after bias cell operation.

Quoted 8 lines

     ^ typo

Quoted 1 line

+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz

If this data varies at all, then those two sets of data seem port-specific to me, and hence should be moved into a per-port property. Having a single global set of parameters that gets applied to all ports at once doesn't make sense to me, if the data varies.

The hardware doesn't support this does it?

Quoted 3 lines

I imagine the values are board specific too, and hence shouldn't be in tegra20.dtsi but rather in tegra-seaboard.dts.

I believe they vary by SOC, not board.

Quoted 6 lines

The values in these fields should be specific in a way that's agnostic to the reference clock, e.g. as a number of mS/nS. That way, you'd just specify the single set of values to use, and the driver would do the calculations to map the time domain into the reference-clock-specific values to put into the registers.

Yes I agree. I don't have time to write this. Shall we go forward with what we have, and Nvidia can tidy up later?

Quoted 23 lines
Quoted 23 lines

+ */

arch/arm/dts/tegra20.dtsi +21 -0
+
+     usbtiming@0 {
+             compatible = "nvidia,tegra20-usbtiming";
+             osc-frequency = <13000000>;
+             /* DivN, DivM, DivP, CPCON, LFCON, Delays     Debounce, Bias */
+             timing = <0x3c0 0x0d 0x00 0xc 0  0x02 0x33 0x05 0x7f 0x7ef4 5>;
+     };
+
+     usbtiming@1 {
+             compatible = "nvidia,tegra20-usbtiming";
+             osc-frequency = <19200000>;
+             timing = <0x0c8 0x04 0x00 0x3 0  0x03 0x4b 0x06 0xbb 0xbb80 7>;
+     };
+
+     usbtiming@2 {
+             compatible = "nvidia,tegra20-usbtiming";
+             osc-frequency = <12000000>;
+             timing = <0x3c0 0x0c 0x00 0xc 0  0x02 0x2f 0x04 0x76 0x7530 5>;
+     };
+
+     usbtiming@3 {
Quoted 8 lines
Quoted 4 lines

+             compatible = "nvidia,tegra20-usbtiming";
+             osc-frequency = <26000000>;
+             timing = <0x3c0 0x1a 0x00 0xc 0  0x04 0x66 0x09 0xfe 0xfde8 9>;
+     };

You can't include those timing nodes right there, because the unit addresses (@0, ... @3) aren't physical addresses in the same scheme as all the other nodes.

Shall I put them inside some other 'timing' node? Bear in mind we don't have clock stuff yet.

Quoted 9 lines
Quoted 8 lines

+
      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci"; reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";
+             periph-id = <22>;       // PERIPH_ID_USBD

Quoted 3 lines

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

ok. I suggest the kernel does something similar.

Quoted 5 lines

Personally, I'd suggest not having this property at all, but rather have the driver maintain a base_address -> periph_id mapping table internally. That table can be removed once the clock/reset bindings are all set up, and the information can be obtained there instead.

I really want to avoid pushing SOC things into the drivers! The SOC code provides clock/reset functions. It seems useful to have a way of identifying all the peripherals in the SOC by number.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ1J_cOS_E+ZiDoZUh79V7LUFzVkx-0nhbPTDwuGCGvDnQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#42 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Quoted 13 lines · Simon Glass
Quoted 12 lines · Stephen Warren
Quoted 10 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Quoted 7 lines
Quoted 3 lines

Which parts vary? Most of it is PLL configuration, and it seems basically impossible for that to vary yet still create the correct output frequency.

See here for T30 differences, for example.

https://gerrit.chromium.org/gerrit/#patch,sidebyside,12440,1,board/nvidia/cardhu/tegra30.dtsi

OK, so that varies by SoC not board.

Quoted 52 lines
Quoted 23 lines
Quoted 18 lines

+/* This table has USB timing parameters for each Oscillator frequency we
+ * support. There are four sets of values:
+ *
+ * 1. PLLU configuration information (reference clock is osc/clk_m and
+ * PLLU-FOs are fixed at 12MHz/60MHz/480MHz).
+ *
+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz
+ * ----------------------------------------------------------------------

+ *      DIVN                960 (0x3c0)  200 (0c8)    960 (3c0h)   960 (3c0)
+ *      DIVM                13 (0d)      4 (04)       12 (0c)      26 (1a)
+ * Filter frequency (MHz)   1            4.8          6            2
+ * CPCON                    1100b        0011b        1100b        1100b
+ * LFCON0                   0            0            0            0

+ *
+ * 2. PLL CONFIGURATION & PARAMETERS for different clock generators:
+ *
+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz
+ * ---------------------------------------------------------------------------

Quoted 4 lines
+ * PLLU_ENABLE_DLY_COUNT   02 (0x02)       03 (03)         02 (02)     04 (04)
+ * PLLU_STABLE_COUNT       51 (33)         75 (4B)         47 (2F)    102 (66)
+ * PLL_ACTIVE_DLY_COUNT    05 (05)         06 (06)         04 (04)     09 (09)

+ * XTAL_FREQ_COUNT 127 (7F) 187 (BB) 118 (76) 254 (FE)

Quoted 5 lines

Those two sets of data seem like they should simply be part of the clock driver. Some part of the system boot or USB init process needs to say "enable the USB clocks", and that code needs to write those hard-coded values into the relevant clock registers (or calculate them at run-time; whatever). This stuff can't vary by board.

We don't have a USB clock driver. This driver is in CPU code, so I am not suggesting that it varies by board, only by SOC. This stuff is in the SOC dts.

Quoted 20 lines
Quoted 17 lines

+ * 3. Debounce values IdDig, Avalid, Bvalid, VbusValid, VbusWakeUp, and
+ * SessEnd. Each of these signals have their own debouncer and for each of
+ * those one out of two debouncing times can be chosen (BIAS_DEBOUNCE_A or
+ * BIAS_DEBOUNCE_B).
+ *
+ * The values of DEBOUNCE_A and DEBOUNCE_B are calculated as follows:
+ * 0xffff -> No debouncing at all
+ * <n> ms = <n> *1000 / (1/19.2MHz) / 4
+ *
+ * So to program a 1 ms debounce for BIAS_DEBOUNCE_A, we have:
+ * BIAS_DEBOUNCE_A[15:0] = 1000 * 19.2 / 4 = 4800 = 0x12c0
+ *
+ * We need to use only DebounceA for BOOTROM. We don't need the DebounceB
+ * values, so we can keep those to default.
+ *
+ * a4. The 20 microsecond delay after bias cell operation.

^ typo

Quoted 8 lines
Quoted 6 lines
Quoted 1 line

+ * Reference frequency 13.0MHz 19.2MHz 12.0MHz 26.0MHz

If this data varies at all, then those two sets of data seem port-specific to me, and hence should be moved into a per-port property. Having a single global set of parameters that gets applied to all ports at once doesn't make sense to me, if the data varies.

The hardware doesn't support this does it?

It looks like it doesn't; there are two debounce count registers and each port (or something) can select which of those two debounce values is used.

Quoted 5 lines
Quoted 2 lines

I imagine the values are board specific too, and hence shouldn't be in tegra20.dtsi but rather in tegra-seaboard.dts.

I believe they vary by SOC, not board.

Quoted 8 lines
Quoted 5 lines

The values in these fields should be specific in a way that's agnostic to the reference clock, e.g. as a number of mS/nS. That way, you'd just specify the single set of values to use, and the driver would do the calculations to map the time domain into the reference-clock-specific values to put into the registers.

Yes I agree. I don't have time to write this. Shall we go forward with what we have, and Nvidia can tidy up later?

I definitely oppose that; the current bindings are simply not conceptually correct. I'm opposed to merging something that's known to be broken even if there's a clear intent/timeframe to fix it; it'd be better to just defer merging it. (Well, even better to fix it to be right an merge it!)

As a blanket statement, the USB driver shouldn't programming PLLs. This applies whether the PLL configuration is hard-coded in the driver, is parsed from DT, or whatever. We should definitely remove all the PLL related stuff from the DT bindings, and have some core or board specific code set up the PLLs. That code can be replaced by DT clock parsing when its ready. The USB driver shouldn't be impacted by that change at all.

Re: the debounce values: The kernel doesn't touch those registers as far as I can tell and everything works. I'd suggest completely removing that from the DT bindings for now. It's quite possible it only works because the HW register defaults are correct (or at least work OK) for a 12MHz reference crystal, and all boards supported by the kernel just happen to use that reference frequency, but I think the same is probably true for (Tegra boards in) U-Boot right now too.

Taking that approach, you can completely remove the contentious parts of the DT binding and defer the problem until more infra-structure is in place to support those features.

Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
arch/arm/dts/tegra20.dtsi +2 -0
+
      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci";
              reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";
+             periph-id = <22>;       // PERIPH_ID_USBD
Quoted 5 lines
Quoted 3 lines

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

I'd strongly suggest that's the cleanest transition plan for U-Boot until the clock bindings are complete, and they are added to tegra20.dtsi, and U-Boot can parse them, since it avoids temporarily defining DT properties to WAR the issue, and then yanking them out later. This mapping would be a part of the core Tegra SoC code, completely isolated from the USB driver.

Signature · 1 line
nvpublic
#43 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Hi Stephen,

Quoted 18 lines · Stephen Warren
Quoted 17 lines · Simon Glass
Quoted 15 lines · Stephen Warren
Quoted 10 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Which parts vary? Most of it is PLL configuration, and it seems basically impossible for that to vary yet still create the correct output frequency.

Quoted 5 lines
Quoted 3 lines

See here for T30 differences, for example.

https://gerrit.chromium.org/gerrit/#patch,sidebyside,12440,1,board/nvidia/cardhu/tegra30.dtsi

OK, so that varies by SoC not board.

Yes that's why I put it in tegra20.dtsi. But I have removed it now.

Quoted 101 lines
Quoted 53 lines
Quoted 24 lines
Quoted 15 lines

+/* This table has USB timing parameters for each Oscillator frequency we
+ * support. There are four sets of values:
+ *
+ * 1. PLLU configuration information (reference clock is osc/clk_m and
+ * PLLU-FOs are fixed at 12MHz/60MHz/480MHz).
+ *
+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz
+ *  ----------------------------------------------------------------------
+ *      DIVN                960 (0x3c0)  200 (0c8)    960 (3c0h)   960 (3c0)
+ *      DIVM                13 (0d)      4 (04)       12 (0c)      26 (1a)
+ * Filter frequency (MHz)   1            4.8          6            2
+ * CPCON                    1100b        0011b        1100b        1100b
+ * LFCON0                   0            0            0            0
+ *

Quoted 8 lines

+ * 2. PLL CONFIGURATION & PARAMETERS for different clock generators:
+ *
+ * Reference frequency     13.0MHz         19.2MHz         12.0MHz     26.0MHz
+ * ---------------------------------------------------------------------------
+ * PLLU_ENABLE_DLY_COUNT   02 (0x02)       03 (03)         02 (02)     04 (04)
+ * PLLU_STABLE_COUNT       51 (33)         75 (4B)         47 (2F)    102 (66)
+ * PLL_ACTIVE_DLY_COUNT    05 (05)         06 (06)         04 (04)     09 (09)
+ * XTAL_FREQ_COUNT        127 (7F)        187 (BB)        118 (76)    254 (FE)

Quoted 5 lines

Those two sets of data seem like they should simply be part of the clock driver. Some part of the system boot or USB init process needs to say "enable the USB clocks", and that code needs to write those hard-coded values into the relevant clock registers (or calculate them at run-time; whatever). This stuff can't vary by board.

We don't have a USB clock driver. This driver is in CPU code, so I am not suggesting that it varies by board, only by SOC. This stuff is in the SOC dts.

Quoted 20 lines
Quoted 17 lines

+ * 3. Debounce values IdDig, Avalid, Bvalid, VbusValid, VbusWakeUp, and
+ * SessEnd. Each of these signals have their own debouncer and for each of
+ * those one out of two debouncing times can be chosen (BIAS_DEBOUNCE_A or
+ * BIAS_DEBOUNCE_B).
+ *
+ * The values of DEBOUNCE_A and DEBOUNCE_B are calculated as follows:
+ *    0xffff -> No debouncing at all
+ *    <n> ms = <n> *1000 / (1/19.2MHz) / 4
+ *
+ * So to program a 1 ms debounce for BIAS_DEBOUNCE_A, we have:
+ * BIAS_DEBOUNCE_A[15:0] = 1000 * 19.2 / 4  = 4800 = 0x12c0
+ *
+ * We need to use only DebounceA for BOOTROM. We don't need the DebounceB
+ * values, so we can keep those to default.
+ *
+ * a4. The 20 microsecond delay after bias cell operation.

     ^ typo

Quoted 8 lines
Quoted 6 lines
Quoted 1 line

+ *  Reference frequency     13.0MHz      19.2MHz      12.0MHz      26.0MHz

If this data varies at all, then those two sets of data seem port-specific to me, and hence should be moved into a per-port property. Having a single global set of parameters that gets applied to all ports at once doesn't make sense to me, if the data varies.

The hardware doesn't support this does it?

It looks like it doesn't; there are two debounce count registers and each port (or something) can select which of those two debounce values is used.

Quoted 5 lines
Quoted 2 lines

I imagine the values are board specific too, and hence shouldn't be in tegra20.dtsi but rather in tegra-seaboard.dts.

I believe they vary by SOC, not board.

Quoted 8 lines
Quoted 5 lines

The values in these fields should be specific in a way that's agnostic to the reference clock, e.g. as a number of mS/nS. That way, you'd just specify the single set of values to use, and the driver would do the calculations to map the time domain into the reference-clock-specific values to put into the registers.

Yes I agree. I don't have time to write this. Shall we go forward with what we have, and Nvidia can tidy up later?

I definitely oppose that; the current bindings are simply not conceptually correct. I'm opposed to merging something that's known to be broken even if there's a clear intent/timeframe to fix it; it'd be better to just defer merging it. (Well, even better to fix it to be right an merge it!)

As a blanket statement, the USB driver shouldn't programming PLLs. This applies whether the PLL configuration is hard-coded in the driver, is parsed from DT, or whatever. We should definitely remove all the PLL related stuff from the DT bindings, and have some core or board specific code set up the PLLs. That code can be replaced by DT clock parsing when its ready. The USB driver shouldn't be impacted by that change at all.

Re: the debounce values: The kernel doesn't touch those registers as far as I can tell and everything works. I'd suggest completely removing that from the DT bindings for now. It's quite possible it only works because the HW register defaults are correct (or at least work OK) for a 12MHz reference crystal, and all boards supported by the kernel just happen to use that reference frequency, but I think the same is probably true for (Tegra boards in) U-Boot right now too.

Quoted 3 lines

Taking that approach, you can completely remove the contentious parts of the DT binding and defer the problem until more infra-structure is in place to support those features.

Sorry - I think this was on another thread - but I am removing the fdt bindings for USB timings from this series. We can deal with it later as needed.

Quoted 13 lines
Quoted 13 lines
Quoted 12 lines
Quoted 8 lines

+
      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci"; reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";
+             periph-id = <22>;       // PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Quoted 5 lines
Quoted 1 line

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

What is the time frame on this working be completed and merged?\

Quoted 5 lines

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

Where does tegra-ehci.2 come from? I don't see that in the fdt.

U-Boot itself does not have a device name or a clock name, or even the concept of a clock. FDT control has only just arrived in U-Boot and it needs to fit with what exists in the code base. There needs to be a multiple sub-arch refactoring effort which I am sure will be taken up once the kernel completes its work. But this is not just an FDT thing.

Quoted 7 lines

I'd strongly suggest that's the cleanest transition plan for U-Boot until the clock bindings are complete, and they are added to tegra20.dtsi, and U-Boot can parse them, since it avoids temporarily defining DT properties to WAR the issue, and then yanking them out later. This mapping would be a part of the core Tegra SoC code, completely isolated from the USB driver.

Tegra U-Boot already uses peripheral IDs internally - it's considerably more efficient to be able to refer to a peripheral by a number than a string. Putting these in the fdt makes it easy for fdt code to use internal clocks, etc. One way or another the driver code needs to figure out the peripheral ID. Please have a look at arch/arm/cpu/armv7/tegra2/clock.c.

I hope that our efforts can continue while we wait for the kernel to implement clocks. We can then look at writing the required plumbing code which presumably will be common across ARM architectures, not tegra-specific. That is going to need review within U-Boot also, and it is not going to happen overnight. Efficiency is much more of a concern and no BSS is available when initial fdt decoding starts.

We will want to incorporate these changes with the pinmux stuff also, since that is already required to do all of this properly.

The one-line addition per peripheral and can easier be converted to use some other approach later. I've added a u-boot prefix on the property to clearly show that this is a U-Boot property. I think this is a reasonable solution.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ035Cen11ObFXjKUCqypvVKzkewhfY2F=yGH8=RWxVuSA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#45 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Quoted 26 lines · Simon Glass
Quoted 25 lines · Stephen Warren
Quoted 24 lines · Simon Glass
Quoted 22 lines · Stephen Warren
Quoted 11 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Quoted 6 lines
      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci";
              reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";

+ periph-id = <22>; // PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Quoted 7 lines
Quoted 5 lines
Quoted 1 line

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

What is the time frame on this working be completed and merged?

Sorry, I have no idea. I've been focusing on other subsystems (pinmux, audio) and haven't been following the clock stuff at all. Hopefully someone will start driving Tegra kernel towards common clock soon, but I don't think exactly who and when has been nailed down yet.

Quoted 6 lines
Quoted 4 lines

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

Where does tegra-ehci.2 come from? I don't see that in the fdt.

Pre-DT, everything was instantiated from platform devices. Each one had a name ("tegra-ehci") and an instance number ("2"), which concatenate to "tegra-ehci.2". All the clocks (and I think other resources like regulators) in the kernel were marked as being for use by a particular device name. For example in arch/arm/mach-tegra/tegra2_clocks.c:

static struct clk tegra_list_clks[] = {
...

        PERIPH_CLK("usb3",      "tegra-ehci.2", ...),

With DT, the device names typically don't follow this format (in this case, it'd be something more like "/usb@c5008000"). However, this prevented the clock lookups by device name from working, so a temporary scheme was put in place to keep the same device names. This is driven by "AUXDATA", for example in arch/arm/mach-tegra/board-dt.c:

struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
...
// compatible, unit address, device name
OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",

This means that any device with the given compatible property value, the given unit address will be named accordingly.

This allows the existing clock/regulator lookups to work unmodified.

Once DT bindings are in place for clocks, regulators, etc., the clock tables can be derived from DT, phandles will be used to match clocks and devices rather than device names, and the AUXDATA table can go away.

The equivalent in U-Boot would be a table that maps from driver type (e.g. COMPAT_NVIDIA_TEGRA20_USB or perhaps NVIDIA_TEGRA20_USB?) and address to periph id. Again, once the clock bindings are complete and the nodes present in the .dts file, that mapping table can be removed and everything will work based on phandles.

I'd like to point out here that everything is in a pretty big state of flux/development, since DT support for ARM is new. Temporary workarounds like AUXDATA allow us to make as much work as possible using device tree, but without having to put temporary nodes/properties into the .dts files themselves. That way, the DT bindings will only ever get added to in a compatible fashion, rather than going through multiple incompatible sets of requirements.

Signature · 1 line
nvpublic

A message that is not in the archive (sent off-list or not yet received): [email protected]

#47 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Hi Stephen,

Quoted 84 lines · Stephen Warren
Quoted 26 lines · Simon Glass
Quoted 25 lines · Stephen Warren
Quoted 24 lines · Simon Glass
Quoted 22 lines · Stephen Warren
Quoted 11 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Quoted 6 lines

      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci"; reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";
+             periph-id = <22>;       // PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Quoted 7 lines
Quoted 5 lines
Quoted 1 line

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

What is the time frame on this working be completed and merged?

Sorry, I have no idea. I've been focusing on other subsystems (pinmux, audio) and haven't been following the clock stuff at all. Hopefully someone will start driving Tegra kernel towards common clock soon, but I don't think exactly who and when has been nailed down yet.

Quoted 6 lines
Quoted 4 lines

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

Where does tegra-ehci.2 come from? I don't see that in the fdt.

Pre-DT, everything was instantiated from platform devices. Each one had a name ("tegra-ehci") and an instance number ("2"), which concatenate to "tegra-ehci.2". All the clocks (and I think other resources like regulators) in the kernel were marked as being for use by a particular device name. For example in arch/arm/mach-tegra/tegra2_clocks.c:

static struct clk tegra_list_clks[] = {
...
       PERIPH_CLK("usb3",      "tegra-ehci.2", ...),

With DT, the device names typically don't follow this format (in this case, it'd be something more like "/usb@c5008000"). However, this prevented the clock lookups by device name from working, so a temporary scheme was put in place to keep the same device names. This is driven by "AUXDATA", for example in arch/arm/mach-tegra/board-dt.c:

struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
...
//             compatible, unit address, device name OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",

This means that any device with the given compatible property value, the given unit address will be named accordingly.

This allows the existing clock/regulator lookups to work unmodified.

Once DT bindings are in place for clocks, regulators, etc., the clock tables can be derived from DT, phandles will be used to match clocks and devices rather than device names, and the AUXDATA table can go away.

The equivalent in U-Boot would be a table that maps from driver type (e.g. COMPAT_NVIDIA_TEGRA20_USB or perhaps NVIDIA_TEGRA20_USB?) and address to periph id. Again, once the clock bindings are complete and the nodes present in the .dts file, that mapping table can be removed and everything will work based on phandles.

Quoted 7 lines

I'd like to point out here that everything is in a pretty big state of flux/development, since DT support for ARM is new. Temporary workarounds like AUXDATA allow us to make as much work as possible using device tree, but without having to put temporary nodes/properties into the .dts files themselves. That way, the DT bindings will only ever get added to in a compatible fashion, rather than going through multiple incompatible sets of requirements.

Gosh.

I have to say that I feel that peripheral IDs are the best solution for Tegra U-Boot until everything is worked out in the kernel.

We can't rely on phandles since they don't exist without an fdt, unless we mandate that everyone must use an fdt. I don't feel comfortable doing that until things are a bit more stable with all the things you are working on.

I really can't see why we want to put a table in U-Boot which does a mapping that is clear a hardware feature and IMO belongs in the fdt (why repeat peripheral addresses in the code and the fdt?).

Plus I still don't have an answer to my question about how we can ensure that instance 0 is a particular device. The fact that this just happens to work in the kernel for uarts, and shouldn't matter for everything else, is not good enough in U-Boot since scripts etc. rely on instance mapping being stable.

So for now I think we should simply add a peripheral ID to the fdt, use the alias mechanism (perhaps augmented by scanning peripherals not mentioned by an alias if you like) and be done with it.

Regards,
Simon

Quoted 3 lines

--
nvpublic

A message that is not in the archive (sent off-list or not yet received): CAPnjgZ1adfU652Z2ob30GTWZiCnah4WsJNfVrroWvtM5LXW93Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#49 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Quoted 95 lines · Simon Glass

Hi Stephen,

Quoted 84 lines · Stephen Warren
Quoted 26 lines · Simon Glass
Quoted 25 lines · Stephen Warren
Quoted 24 lines · Simon Glass
Quoted 22 lines · Stephen Warren
Quoted 11 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Quoted 6 lines
      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci";
              reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";

+ periph-id = <22>; // PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Quoted 7 lines
Quoted 5 lines
Quoted 1 line

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

What is the time frame on this working be completed and merged?

Sorry, I have no idea. I've been focusing on other subsystems (pinmux, audio) and haven't been following the clock stuff at all. Hopefully someone will start driving Tegra kernel towards common clock soon, but I don't think exactly who and when has been nailed down yet.

Quoted 6 lines
Quoted 4 lines

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

Where does tegra-ehci.2 come from? I don't see that in the fdt.

Pre-DT, everything was instantiated from platform devices. Each one had a name ("tegra-ehci") and an instance number ("2"), which concatenate to "tegra-ehci.2". All the clocks (and I think other resources like regulators) in the kernel were marked as being for use by a particular device name. For example in arch/arm/mach-tegra/tegra2_clocks.c:

static struct clk tegra_list_clks[] = {
...

       PERIPH_CLK("usb3",      "tegra-ehci.2", ...),

With DT, the device names typically don't follow this format (in this case, it'd be something more like "/usb@c5008000"). However, this prevented the clock lookups by device name from working, so a temporary scheme was put in place to keep the same device names. This is driven by "AUXDATA", for example in arch/arm/mach-tegra/board-dt.c:

struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
...
// compatible, unit address, device name
OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",

This means that any device with the given compatible property value, the given unit address will be named accordingly.

This allows the existing clock/regulator lookups to work unmodified.

Once DT bindings are in place for clocks, regulators, etc., the clock tables can be derived from DT, phandles will be used to match clocks and devices rather than device names, and the AUXDATA table can go away.

The equivalent in U-Boot would be a table that maps from driver type (e.g. COMPAT_NVIDIA_TEGRA20_USB or perhaps NVIDIA_TEGRA20_USB?) and address to periph id. Again, once the clock bindings are complete and the nodes present in the .dts file, that mapping table can be removed and everything will work based on phandles.

Quoted 7 lines

I'd like to point out here that everything is in a pretty big state of flux/development, since DT support for ARM is new. Temporary workarounds like AUXDATA allow us to make as much work as possible using device tree, but without having to put temporary nodes/properties into the .dts files themselves. That way, the DT bindings will only ever get added to in a compatible fashion, rather than going through multiple incompatible sets of requirements.

Quoted 4 lines

Gosh.

I have to say that I feel that peripheral IDs are the best solution for Tegra U-Boot until everything is worked out in the kernel.

The problem here is that it requires the DT to change incompatibly later; it adds a property to the DT now that will be at best meaningless/unused in the future.

If we simply don't add anything to the DT now, there's nothing to remove from the DT later. Newer U-Boots might require additional information in the DT (i.e. perhaps rely on full clock bindings) but won't deprecate any existing fields.

Quoted 4 lines

We can't rely on phandles since they don't exist without an fdt, unless we mandate that everyone must use an fdt. I don't feel comfortable doing that until things are a bit more stable with all the things you are working on.

Sure, phandles won't work until the complete clock binding is implemnted.

Quoted 3 lines

I really can't see why we want to put a table in U-Boot which does a mapping that is clear a hardware feature and IMO belongs in the fdt (why repeat peripheral addresses in the code and the fdt?).

It's a HW feature of the clock/reset controller, not the USB controller.

Quoted 2 lines

Plus I still don't have an answer to my question about how we can ensure that instance 0 is a particular device.

As I said before, in the context of USB (where IIRC the question was asked), you can enable just a single USB controller. The code only supports a single controller anyway.

For SD/MMC, it does make sense to statically name some/all devices. That is what /aliases is for. It's just that as I said, /aliases is meant to control naming of devices that have been enumerated, not control the enumeration itself.

Signature · 1 line
nvpublic
#50 lore raw

Re: [PATCH v2 09/17] tegra: usb: fdt: Add additional device tree definitions for USB ports

Hi Stephen,

Quoted 101 lines · Stephen Warren
Quoted 95 lines · Simon Glass

Hi Stephen,

Quoted 84 lines · Stephen Warren
Quoted 26 lines · Simon Glass
Quoted 25 lines · Stephen Warren
Quoted 24 lines · Simon Glass
Quoted 22 lines · Stephen Warren
Quoted 11 lines · Simon Glass

This adds peripheral IDs and timing information to the USB part of the device tree for U-Boot.

The peripheral IDs provide easy access to clock registers. We will likely remove this in favor of a full clock tree when it is available in the kernel (but probably still retain the peripheral ID, just move it into a clock node).

The USB timing information does apparently vary between boards sometimes, so is include in the fdt for convenience.

Quoted 6 lines

      usb@c5000000 {
              compatible = "nvidia,tegra20-ehci", "usb-ehci"; reg = <0xc5000000 0x4000>;
              interrupts = < 52 >;
              phy_type = "utmi";
+             periph-id = <22>;       // PERIPH_ID_USBD

Given this is a temporary U-Boot-specific solution, can the property be named u-boot,periph-id so it's obvious that when writing a .dts for the kernel only, you don't care about this value.

Quoted 7 lines
Quoted 5 lines
Quoted 1 line

ok. I suggest the kernel does something similar.

The kernel will use the standardized clock bindings once they're ready and we convert Tegra over to use them. The kernel is extremely unlikely to ever use "periph-id" or "u-boot,periph-id".

What is the time frame on this working be completed and merged?

Sorry, I have no idea. I've been focusing on other subsystems (pinmux, audio) and haven't been following the clock stuff at all. Hopefully someone will start driving Tegra kernel towards common clock soon, but I don't think exactly who and when has been nailed down yet.

Quoted 6 lines
Quoted 4 lines

Right now, the kernel's clock driver contains a mapping table from device name (e.g. tegra-ehci.2) to clock name (e.g. usb3). This allows the kernel USB driver to work without any explicit periph-id or similar DT property.

Where does tegra-ehci.2 come from? I don't see that in the fdt.

Pre-DT, everything was instantiated from platform devices. Each one had a name ("tegra-ehci") and an instance number ("2"), which concatenate to "tegra-ehci.2". All the clocks (and I think other resources like regulators) in the kernel were marked as being for use by a particular device name. For example in arch/arm/mach-tegra/tegra2_clocks.c:

static struct clk tegra_list_clks[] = {
...
       PERIPH_CLK("usb3",      "tegra-ehci.2", ...),

With DT, the device names typically don't follow this format (in this case, it'd be something more like "/usb@c5008000"). However, this prevented the clock lookups by device name from working, so a temporary scheme was put in place to keep the same device names. This is driven by "AUXDATA", for example in arch/arm/mach-tegra/board-dt.c:

struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
...
//             compatible, unit address, device name OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",

This means that any device with the given compatible property value, the given unit address will be named accordingly.

This allows the existing clock/regulator lookups to work unmodified.

Once DT bindings are in place for clocks, regulators, etc., the clock tables can be derived from DT, phandles will be used to match clocks and devices rather than device names, and the AUXDATA table can go away.

The equivalent in U-Boot would be a table that maps from driver type (e.g. COMPAT_NVIDIA_TEGRA20_USB or perhaps NVIDIA_TEGRA20_USB?) and address to periph id. Again, once the clock bindings are complete and the nodes present in the .dts file, that mapping table can be removed and everything will work based on phandles.

Quoted 7 lines

I'd like to point out here that everything is in a pretty big state of flux/development, since DT support for ARM is new. Temporary workarounds like AUXDATA allow us to make as much work as possible using device tree, but without having to put temporary nodes/properties into the .dts files themselves. That way, the DT bindings will only ever get added to in a compatible fashion, rather than going through multiple incompatible sets of requirements.

Quoted 4 lines

Gosh.

I have to say that I feel that peripheral IDs are the best solution for Tegra U-Boot until everything is worked out in the kernel.

Quoted 8 lines

The problem here is that it requires the DT to change incompatibly later; it adds a property to the DT now that will be at best meaningless/unused in the future.

If we simply don't add anything to the DT now, there's nothing to remove from the DT later. Newer U-Boots might require additional information in the DT (i.e. perhaps rely on full clock bindings) but won't deprecate any existing fields.

I really don't see the difference between changing the code later and changing the FDT later. The full clock bindings could be ages away. We have already given it a u-boot prefix. We might even decided to keep it for efficiency reasons.

Quoted 7 lines
Quoted 5 lines

We can't rely on phandles since they don't exist without an fdt, unless we mandate that everyone must use an fdt. I don't feel comfortable doing that until things are a bit more stable with all the things you are working on.

Sure, phandles won't work until the complete clock binding is implemnted.

No I mean they won't work if someone isn't using CONFIG_OF_CONTROL and thus doesn't have a device tree at all. This option is optional in U-Boot, and in fact has only been in mainline for 5 minutes, and there are no users up until this patch. FDT still needs to prove its worth in U-Boot.

Quoted 6 lines
Quoted 4 lines

I really can't see why we want to put a table in U-Boot which does a mapping that is clear a hardware feature and IMO belongs in the fdt (why repeat peripheral addresses in the code and the fdt?).

It's a HW feature of the clock/reset controller, not the USB controller.

I think I was responding to your request to have tables in U-Boot like:

<device_type>, <peripheral_address> -> clock ID

My objection is that <device_type> is already encoded in the compatible string, <peripheral_address> is in the reg property, and we can avoid the same altogether by putting the peripheral ID in the FDT too. In fact I thought we already agreed on u-boot,periph-id.

Quoted 7 lines
Quoted 3 lines

Plus I still don't have an answer to my question about how we can ensure that instance 0 is a particular device.

As I said before, in the context of USB (where IIRC the question was asked), you can enable just a single USB controller. The code only supports a single controller anyway.

Yes but it must be the correct controller. In other words, on Seaboard the side controller must be first for USB to work.

Quoted 5 lines

For SD/MMC, it does make sense to statically name some/all devices. That is what /aliases is for. It's just that as I said, /aliases is meant to control naming of devices that have been enumerated, not control the enumeration itself.

And UARTs I think. So I think this means we are happy with the aliases approach, and we are now just discussing the algorithm.

Regards,
SImon

Quoted 3 lines

--
nvpublic

#51 lore raw

PATCH v2 10/17 tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard

In reply to a message not in the archive

We set up two USB ports, one of which can be host or device. For some reason the kernel version does enable both ports.

---
Changes in v2:
- Use "okay" instead of "ok" for fdt node status
- Remove 0x from fdt aliases

 board/nvidia/dts/tegra2-seaboard.dts |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)
board/nvidia/dts/tegra2-seaboard.dts +13 -1
index dde5d03..19c6503 100644
@@ -11,6 +11,12 @@
 		bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait";
 	};
 
+        aliases {
+		/* This defines the order of our USB ports */
+                usb0 = "/usb@c5008000";
+                usb1 = "/usb@c5000000";
+        };
+
 	memory {
 		device_type = "memory";
 		reg = < 0x00000000 0x40000000 >;
@@ -31,6 +37,12 @@
 	};
 
 	usb@c5000000 {
-		nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */
+		nvidia,vbus-gpio = <&gpio 24 1>; /* PD0 high to enable vbus */
+		support-host-mode;
+		status = "okay";
+	};
+
+	usb@c5008000 {
+		status = "okay";
 	};
 };
Signature · 1 line
1.7.3.1

A message that is not in the archive (sent off-list or not yet received): 1322878300-5551-11-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org

#53 lore raw

Re: [PATCH v2 10/17] tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard

Quoted 6 lines · Simon Glass

We set up two USB ports, one of which can be host or device. For some reason the kernel version does enable both ports.

+++ b/board/nvidia/dts/tegra2-seaboard.dts

board/nvidia/dts/tegra2-seaboard.dts line 19

Quoted 9 lines
board/nvidia/dts/tegra2-seaboard.dts +6 -0
@@ -11,6 +11,12 @@
 		bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait";
 	};
 
+        aliases {
+		/* This defines the order of our USB ports */
+                usb0 = "/usb@c5008000";
+                usb1 = "/usb@c5000000";
+        };
+

That's indented with spaces instead of TABs.

board/nvidia/dts/tegra2-seaboard.dts line 42

Quoted 11 lines
board/nvidia/dts/tegra2-seaboard.dts +3 -1
 	memory {
 		device_type = "memory";
 		reg = < 0x00000000 0x40000000 >;
@@ -31,6 +37,12 @@
 	};
 
 	usb@c5000000 {
-		nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */
+		nvidia,vbus-gpio = <&gpio 24 1>; /* PD0 high to enable vbus */
+		support-host-mode;
+		status = "okay";

That's the default, and tegra20.dtsi doesn't specify status = "disabled", so the status properties are redundant. You may want to specify a disabled status in tegra-seaboard.dts for the other USB port if it isn't used though.

Quoted 6 lines
board/nvidia/dts/tegra2-seaboard.dts +4 -0
+	};
+
+	usb@c5008000 {
+		status = "okay";
 	};
 };
Signature · 1 line
nvpublic
#54 lore raw

PATCH v2 17/17 tegra: fdt: Enable FDT support for Seaboard

In reply to a message not in the archive

This switches Seaboard over to use FDT for run-time config instead of CONFIG options. USB is the only user at present.

---

 include/configs/seaboard.h |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
include/configs/seaboard.h +5 -0
index b6d9f7a..1dc775a 100644
@@ -27,6 +27,11 @@
 #include <asm/sizes.h>
 #include "tegra2-common.h"
 
+/* Enable fdt support for Seaboard. Flash the image in u-boot-dtb.bin */
+#define CONFIG_DEFAULT_DEVICE_TREE	tegra2-seaboard
+#define CONFIG_OF_CONTROL
+#define CONFIG_OF_SEPARATE
+
 /* High-level configuration options */
 #define TEGRA2_SYSMEM		"mem=384M@0M nvmem=128M@384M mem=512M@512M"
 #define V_PROMPT		"Tegra2 (SeaBoard) # "
Signature · 1 line
1.7.3.1
#55 lore raw

PATCH v2 3/17 Add gpio_request() to asm-generic header

In reply to Simon Glass

This function should also be part of the GPIO API, so add it.

---
Changes in v2:
- New patch to add gpio_request() to asm-generic header

 include/asm-generic/gpio.h |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
include/asm-generic/gpio.h +10 -0
index a1ebb28..c1d697f 100644
@@ -72,3 +72,13 @@ int gpio_get_value(int gp);
  * @return 0 if ok, -1 on error
  */
 int gpio_set_value(int gp, int value);
+
+/**
+ * Request a gpio. This should be called before any of the other functions
+ * are used on this gpio.
+ *
+ * @param gp	GPIO number
+ * @param label	User label for this GPIO
+ * @return 0 if ok, -1 on error
+ */
+int gpio_request(unsigned gpio, const char *label);
Signature · 1 line
1.7.3.1
#56 lore raw

PATCH v2 6/17 arm: fdt: Add skeleton device tree file from kernel

In reply to Simon Glass

This was taken from commit b48c54e2 at:
git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git

---

 arch/arm/dts/skeleton.dtsi |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/dts/skeleton.dtsi
arch/arm/dts/skeleton.dtsi new file +13 -0
new file mode 100644
index 0000000..b41d241
@@ -0,0 +1,13 @@
+/*
+ * Skeleton device tree; the bare minimum needed to boot; just include and
+ * add a compatible value.  The bootloader will typically populate the memory
+ * node.
+ */
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+	chosen { };
+	aliases { };
+	memory { device_type = "memory"; reg = <0 0>; };
+};
Signature · 1 line
1.7.3.1
#57 lore raw

PATCH v2 11/17 usb: Add support for data alignment

In reply to Simon Glass

CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of data for USB packets (e.g. 4 means word-aligned). This is required for Tegra to operate.

---
Changes in v2:
- Tidy code style in USB buffer alignment code
- Display prominent warning when alignment code is triggered

 README                      |    6 ++++++
 drivers/usb/host/ehci-hcd.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)
README +6 -0
index fda0190..3194846 100644
@@ -1096,6 +1096,12 @@ The following options need to be configured:
 				May be defined to allow interrupt polling
 				instead of using asynchronous interrupts
 
+		CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of
+		data for USB packets (e.g. 4 means word-aligned). This is
+		required for Tegra to operate. Since we want all callers to
+		align data for us, we display a warning when the alignment
+		code is triggered.
+
 - USB Device:
 		Define the below if you wish to use the USB console.
 		Once firmware is rebuilt from a serial console issue the
drivers/usb/host/ehci-hcd.c +29 -0
index 2197119..23458b6 100644
@@ -322,6 +322,24 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 	int timeout;
 	int ret = 0;
 
+#ifdef CONFIG_USB_EHCI_DATA_ALIGN
+	/* In case ehci host requires alignment for buffers */
+	void *align_buf = NULL;
+	void *orig_buf = buffer;
+	int unaligned = (int)buffer & (CONFIG_USB_EHCI_DATA_ALIGN - 1);
+
+	if (unaligned) {
+		printf("EHCI: Unaligned buffer: performance will suffer\n");
+		align_buf = malloc(length + CONFIG_USB_EHCI_DATA_ALIGN);
+		if (!align_buf)
+			return -1;
+		buffer = (void *)(((ulong)align_buf +
+			CONFIG_USB_EHCI_DATA_ALIGN - 1) &
+				~(CONFIG_USB_EHCI_DATA_ALIGN - 1));
+		if (usb_pipeout(pipe))
+			memcpy(buffer, orig_buf, length);
+	}
+#endif
 	debug("dev=%p, pipe=%lx, buffer=%p, length=%d, req=%p\n", dev, pipe,
 	      buffer, length, req);
 	if (req != NULL)
@@ -513,9 +531,20 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		      ehci_readl(&hcor->or_portsc[1]));
 	}
 
+#ifdef CONFIG_USB_EHCI_DATA_ALIGN
+	if (unaligned) {
+		if (usb_pipein(pipe) && dev->act_len)
+			memcpy(orig_buf, buffer, length);
+		free(align_buf);
+	}
+#endif
 	return (dev->status != USB_ST_NOT_PROC) ? 0 : -1;
 
 fail:
+#ifdef CONFIG_USB_EHCI_DATA_ALIGN
+	if (unaligned)
+		free(align_buf);
+#endif
 	td = (void *)hc32_to_cpu(qh->qh_overlay.qt_next);
 	while (td != (void *)QT_NEXT_TERMINATE) {
 		qh->qh_overlay.qt_next = td->qt_next;
Signature · 1 line
1.7.3.1
#58 lore raw

PATCH v2 11/17 usb: Add support for data alignment

Hi,

2011/12/3 Simon Glass <[email protected]>:

Quoted 46 lines

CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of data for USB packets (e.g. 4 means word-aligned). This is required for Tegra to operate.

---
Changes in v2:
- Tidy code style in USB buffer alignment code
- Display prominent warning when alignment code is triggered

?README ? ? ? ? ? ? ? ? ? ? ?| ? ?6 ++++++ ?drivers/usb/host/ehci-hcd.c | ? 29 +++++++++++++++++++++++++++++ ?2 files changed, 35 insertions(+), 0 deletions(-)

README +0 -0
index fda0190..3194846 100644
@@ -1096,6 +1096,12 @@ The following options need to be configured:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?May be defined to allow interrupt polling ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?instead of using asynchronous interrupts

+ ? ? ? ? ? ? ? CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of
+ ? ? ? ? ? ? ? data for USB packets (e.g. 4 means word-aligned). This is
+ ? ? ? ? ? ? ? required for Tegra to operate. Since we want all callers to
+ ? ? ? ? ? ? ? align data for us, we display a warning when the alignment
+ ? ? ? ? ? ? ? code is triggered.
+
?- USB Device:
? ? ? ? ? ? ? ?Define the below if you wish to use the USB console. ? ? ? ? ? ? ? ?Once firmware is rebuilt from a serial console issue the

drivers/usb/host/ehci-hcd.c +7 -0
index 2197119..23458b6 100644
@@ -322,6 +322,24 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 ? ? ? ?int timeout;
 ? ? ? ?int ret = 0;
 
+#ifdef CONFIG_USB_EHCI_DATA_ALIGN
+ ? ? ? /* In case ehci host requires alignment for buffers */
+ ? ? ? void *align_buf = NULL;
+ ? ? ? void *orig_buf = buffer;
+ ? ? ? int unaligned = (int)buffer & (CONFIG_USB_EHCI_DATA_ALIGN - 1);
+
+ ? ? ? if (unaligned) {

drivers/usb/host/ehci-hcd.c ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer, · line 341

Quoted 10 lines
drivers/usb/host/ehci-hcd.c +10 -0
+ ? ? ? ? ? ? ? printf("EHCI: Unaligned buffer: performance will suffer\n");
+ ? ? ? ? ? ? ? align_buf = malloc(length + CONFIG_USB_EHCI_DATA_ALIGN);
+ ? ? ? ? ? ? ? if (!align_buf)
+ ? ? ? ? ? ? ? ? ? ? ? return -1;
+ ? ? ? ? ? ? ? buffer = (void *)(((ulong)align_buf +
+ ? ? ? ? ? ? ? ? ? ? ? CONFIG_USB_EHCI_DATA_ALIGN - 1) &
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ~(CONFIG_USB_EHCI_DATA_ALIGN - 1));
+ ? ? ? ? ? ? ? if (usb_pipeout(pipe))
+ ? ? ? ? ? ? ? ? ? ? ? memcpy(buffer, orig_buf, length);
+ ? ? ? }

I do not really like this solution. Maybe we can introduce something like an usbbuf_alloc() function that takes care of the alignment. This saves the memcpy() for every transmit. I know it has more impact if we do it like that, but I think it is cleaner.

Kind regards,

Remy

#59 lore raw

PATCH v2 11/17 usb: Add support for data alignment

Hi Remy,

Quoted 56 lines · Remy Bohmer

Hi,

2011/12/3 Simon Glass <[email protected]>:

Quoted 53 lines

CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of data for USB packets (e.g. 4 means word-aligned). This is required for Tegra to operate.

---
Changes in v2:
- Tidy code style in USB buffer alignment code
- Display prominent warning when alignment code is triggered

?README ? ? ? ? ? ? ? ? ? ? ?| ? ?6 ++++++ ?drivers/usb/host/ehci-hcd.c | ? 29 +++++++++++++++++++++++++++++ ?2 files changed, 35 insertions(+), 0 deletions(-)

README +0 -0
index fda0190..3194846 100644
@@ -1096,6 +1096,12 @@ The following options need to be configured:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?May be defined to allow interrupt polling ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?instead of using asynchronous interrupts

+ ? ? ? ? ? ? ? CONFIG_USB_EHCI_DATA_ALIGN sets the required alignment of
+ ? ? ? ? ? ? ? data for USB packets (e.g. 4 means word-aligned). This is
+ ? ? ? ? ? ? ? required for Tegra to operate. Since we want all callers to
+ ? ? ? ? ? ? ? align data for us, we display a warning when the alignment
+ ? ? ? ? ? ? ? code is triggered.
+
?- USB Device:
? ? ? ? ? ? ? ?Define the below if you wish to use the USB console. ? ? ? ? ? ? ? ?Once firmware is rebuilt from a serial console issue the

drivers/usb/host/ehci-hcd.c +14 -0
index 2197119..23458b6 100644
@@ -322,6 +322,24 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 ? ? ? ?int timeout;
 ? ? ? ?int ret = 0;
 
+#ifdef CONFIG_USB_EHCI_DATA_ALIGN
+ ? ? ? /* In case ehci host requires alignment for buffers */
+ ? ? ? void *align_buf = NULL;
+ ? ? ? void *orig_buf = buffer;
+ ? ? ? int unaligned = (int)buffer & (CONFIG_USB_EHCI_DATA_ALIGN - 1);
+
+ ? ? ? if (unaligned) {
+ ? ? ? ? ? ? ? printf("EHCI: Unaligned buffer: performance will suffer\n");
+ ? ? ? ? ? ? ? align_buf = malloc(length + CONFIG_USB_EHCI_DATA_ALIGN);
+ ? ? ? ? ? ? ? if (!align_buf)
+ ? ? ? ? ? ? ? ? ? ? ? return -1;
+ ? ? ? ? ? ? ? buffer = (void *)(((ulong)align_buf +
+ ? ? ? ? ? ? ? ? ? ? ? CONFIG_USB_EHCI_DATA_ALIGN - 1) &
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ~(CONFIG_USB_EHCI_DATA_ALIGN - 1));
Quoted 8 lines

drivers/usb/host/ehci-hcd.c ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer, · line 341

Quoted 3 lines
drivers/usb/host/ehci-hcd.c +3 -0
+ ? ? ? ? ? ? ? if (usb_pipeout(pipe))
+ ? ? ? ? ? ? ? ? ? ? ? memcpy(buffer, orig_buf, length);
+ ? ? ? }

I do not really like this solution. Maybe we can introduce something like an usbbuf_alloc() function that takes care of the alignment. This saves the memcpy() for every transmit. I know it has more impact if we do it like that, but I think it is cleaner.

This is called from usb_bulk_msg() which is called from usb_storage and USB ethernet drivers. A similar problem happened in the MMC stack and was fixed by changing all the callers to cache-align their buffers.

Do you mean that you want a patch which changes the callers so that they align their data to a cache boundary as with MMC? Given the small number of callers at this stage it shouldn't be too hard. Then we could drop this patch.

Please let me know.

Regards,
Simon

Quoted 4 lines

Kind regards,

Remy

#60 lore raw

PATCH v2 11/17 usb: Add support for data alignment

Hi Simon,

2011/12/6 Simon Glass <[email protected]>:

Quoted 11 lines
Quoted 5 lines

I do not really like this solution. Maybe we can introduce something like an usbbuf_alloc() function that takes care of the alignment. This saves the memcpy() for every transmit. I know it has more impact if we do it like that, but I think it is cleaner.

This is called from usb_bulk_msg() which is called from usb_storage and USB ethernet drivers. A similar problem happened in the MMC stack and was fixed by changing all the callers to cache-align their buffers.

Quoted 6 lines

Do you mean that you want a patch which changes the callers so that they align their data to a cache boundary as with MMC? Given the small number of callers at this stage it shouldn't be too hard. Then we could drop this patch.

Please let me know.

That is fine with me too.

Kind regards,

Remy

#61 lore raw

PATCH v2 11/17 usb: Add support for data alignment

Hi Remy,

Quoted 14 lines · Remy Bohmer

Hi Simon,

2011/12/6 Simon Glass <[email protected]>:

Quoted 11 lines
Quoted 5 lines

I do not really like this solution. Maybe we can introduce something like an usbbuf_alloc() function that takes care of the alignment. This saves the memcpy() for every transmit. I know it has more impact if we do it like that, but I think it is cleaner.

This is called from usb_bulk_msg() which is called from usb_storage and USB ethernet drivers. A similar problem happened in the MMC stack and was fixed by changing all the callers to cache-align their buffers.

Quoted 8 lines
Quoted 6 lines

Do you mean that you want a patch which changes the callers so that they align their data to a cache boundary as with MMC? Given the small number of callers at this stage it shouldn't be too hard. Then we could drop this patch.

Please let me know.

That is fine with me too.

OK I will look at that. I dropped this patch from the v3 series.

Regards,
Simon

Quoted 4 lines

Kind regards,

Remy

#62 lore raw

PATCH v2 12/17 usb: Add support for txfifo threshold

In reply to Simon Glass

CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the txfilltuning field in the EHCI controller on reset.

---

 README                      |    3 +++
 drivers/usb/host/ehci-hcd.c |    7 +++++++
 drivers/usb/host/ehci.h     |    6 +++++-
 3 files changed, 15 insertions(+), 1 deletions(-)
README +3 -0
index 3194846..7df3aa1 100644
@@ -1102,6 +1102,9 @@ The following options need to be configured:
 		align data for us, we display a warning when the alignment
 		code is triggered.
 
+		CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the
+		txfilltuning field in the EHCI controller on reset.
+
 - USB Device:
 		Define the below if you wish to use the USB console.
 		Once firmware is rebuilt from a serial console issue the
drivers/usb/host/ehci-hcd.c +7 -0
index 23458b6..3040a6d 100644
@@ -247,6 +247,13 @@ static int ehci_reset(void)
 #endif
 		ehci_writel(reg_ptr, tmp);
 	}
+
+#ifdef CONFIG_USB_EHCI_TXFIFO_THRESH
+	cmd = ehci_readl(&hcor->or_txfilltuning);
+	cmd &= ~TXFIFO_THRESH(0x3f);
+	cmd |= TXFIFO_THRESH(CONFIG_USB_EHCI_TXFIFO_THRESH);
+	ehci_writel(&hcor->or_txfilltuning, cmd);
+#endif
 out:
 	return ret;
 }
drivers/usb/host/ehci.h +5 -1
index 3d0ad0c..cc00ce4 100644
@@ -80,7 +80,11 @@ struct ehci_hcor {
 	uint32_t or_ctrldssegment;
 	uint32_t or_periodiclistbase;
 	uint32_t or_asynclistaddr;
-	uint32_t _reserved_[9];
+	uint32_t _reserved_0_;
+	uint32_t or_burstsize;
+	uint32_t or_txfilltuning;
+#define TXFIFO_THRESH(p)		((p & 0x3f) << 16)
+	uint32_t _reserved_1_[6];
 	uint32_t or_configflag;
 #define FLAG_CF		(1 << 0)	/* true:  we'll support "high speed" */
 	uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];
Signature · 1 line
1.7.3.1
#63 lore raw

PATCH v2 12/17 usb: Add support for txfifo threshold

drivers/usb/host/ehci.h struct ehci_hcor { · line 83

Quoted 13 lines · Simon Glass

CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the txfilltuning field in the EHCI controller on reset.

drivers/usb/host/ehci.h +1 -1
index 3d0ad0c..cc00ce4 100644
@@ -80,7 +80,11 @@ struct ehci_hcor {
 	uint32_t or_ctrldssegment;
 	uint32_t or_periodiclistbase;
 	uint32_t or_asynclistaddr;
-	uint32_t _reserved_[9];
+	uint32_t _reserved_0_;

Why not remove _reserved_0_ ...

drivers/usb/host/ehci.h struct ehci_hcor { · line 87

Quoted 4 lines
drivers/usb/host/ehci.h +4 -0
+	uint32_t or_burstsize;
+	uint32_t or_txfilltuning;
+#define TXFIFO_THRESH(p)		((p & 0x3f) << 16)
+	uint32_t _reserved_1_[6];

... and make _reserved_1_ 1 element bigger and keep it named _reserved_? The result would be a little simpler.

Quoted 3 lines
drivers/usb/host/ehci.h +0 -0
 	uint32_t or_configflag;
 #define FLAG_CF		(1 << 0)	/* true:  we'll support "high speed" */
 	uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];
Signature · 1 line
nvpublic
#64 lore raw

PATCH v2 12/17 usb: Add support for txfifo threshold

Hi Stephen,

Quoted 17 lines · Stephen Warren

drivers/usb/host/ehci.h struct ehci_hcor { · line 83

Quoted 13 lines · Simon Glass

CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the txfilltuning field in the EHCI controller on reset.

drivers/usb/host/ehci.h +1 -1
index 3d0ad0c..cc00ce4 100644
@@ -80,7 +80,11 @@ struct ehci_hcor {
 ? ? ? uint32_t or_ctrldssegment;
 ? ? ? uint32_t or_periodiclistbase;
 ? ? ? uint32_t or_asynclistaddr;
- ? ? uint32_t _reserved_[9];
+ ? ? uint32_t _reserved_0_;

Why not remove _reserved_0_ ...

Quoted 7 lines

drivers/usb/host/ehci.h struct ehci_hcor { · line 87

Quoted 4 lines
drivers/usb/host/ehci.h +4 -0
+ ? ? uint32_t or_burstsize;
+ ? ? uint32_t or_txfilltuning;
+#define TXFIFO_THRESH(p) ? ? ? ? ? ? ((p & 0x3f) << 16)
+ ? ? uint32_t _reserved_1_[6];

... and make _reserved_1_ 1 element bigger and keep it named _reserved_? The result would be a little simpler.

Sorry I'm a bit stuck with that one. I have:

	uint32_t or_asynclistaddr;
	uint32_t _reserved_0_;
	uint32_t or_burstsize;
	uint32_t or_txfilltuning;
	uint32_t _reserved_1_[6];
	uint32_t or_configflag;

How can I remove _reserved_0_? I would need to replace it with something, as need or_burstsize to stay where it is. Can you please explain a little more?

Thanks,
Simon

Quoted 7 lines
Quoted 4 lines
drivers/usb/host/ehci.h +0 -0
 ? ? ? uint32_t or_configflag;

?#define FLAG_CF ? ? ? ? ? ? ?(1 << 0) ? ? ? ?/* true: ?we'll support "high speed" */ ? ? ? uint32_t or_portsc[CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS];

--
nvpublic

#65 lore raw

PATCH v2 12/17 usb: Add support for txfifo threshold

Simon Glass wrote at Monday, December 05, 2011 7:03 PM:

Quoted 35 lines · Stephen Warren
Quoted 17 lines · Simon Glass

drivers/usb/host/ehci.h struct ehci_hcor { · line 83

Quoted 13 lines

CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the txfilltuning field in the EHCI controller on reset.

drivers/usb/host/ehci.h +1 -1
index 3d0ad0c..cc00ce4 100644
@@ -80,7 +80,11 @@ struct ehci_hcor {
 ? ? ? uint32_t or_ctrldssegment;
 ? ? ? uint32_t or_periodiclistbase;
 ? ? ? uint32_t or_asynclistaddr;
- ? ? uint32_t _reserved_[9];
+ ? ? uint32_t _reserved_0_;

Why not remove _reserved_0_ ...

Quoted 7 lines

drivers/usb/host/ehci.h struct ehci_hcor { · line 87

Quoted 4 lines
drivers/usb/host/ehci.h +4 -0
+ ? ? uint32_t or_burstsize;
+ ? ? uint32_t or_txfilltuning;
+#define TXFIFO_THRESH(p) ? ? ? ? ? ? ((p & 0x3f) << 16)
+ ? ? uint32_t _reserved_1_[6];

... and make _reserved_1_ 1 element bigger and keep it named _reserved_? The result would be a little simpler.

Sorry I'm a bit stuck with that one. I have:

	uint32_t or_asynclistaddr;
	uint32_t _reserved_0_;
	uint32_t or_burstsize;
	uint32_t or_txfilltuning;
	uint32_t _reserved_1_[6];
	uint32_t or_configflag;
Quoted 3 lines

How can I remove _reserved_0_? I would need to replace it with something, as need or_burstsize to stay where it is. Can you please explain a little more?

Oh right, this is a HW structure, so the layout is fixed? In which case the patch is fine. I wonder why all the fields weren't just defined from the start rather than being marked "reserved" though; perhaps it'd be best to update the code to completely flesh out the HW description at some point. Not necessarily in this patch though.

Signature · 1 line
nvpublic
#66 lore raw

PATCH v2 12/17 usb: Add support for txfifo threshold

Hi Stephen,

Quoted 40 lines · Stephen Warren

Simon Glass wrote at Monday, December 05, 2011 7:03 PM:

Quoted 35 lines · Stephen Warren
Quoted 17 lines · Simon Glass

drivers/usb/host/ehci.h struct ehci_hcor { · line 83

Quoted 13 lines

CONFIG_USB_EHCI_TXFIFO_THRESH enables setting of the txfilltuning field in the EHCI controller on reset.

drivers/usb/host/ehci.h +1 -1
index 3d0ad0c..cc00ce4 100644
@@ -80,7 +80,11 @@ struct ehci_hcor {
 ? ? ? uint32_t or_ctrldssegment;
 ? ? ? uint32_t or_periodiclistbase;
 ? ? ? uint32_t or_asynclistaddr;
- ? ? uint32_t _reserved_[9];
+ ? ? uint32_t _reserved_0_;

Why not remove _reserved_0_ ...

Quoted 7 lines

drivers/usb/host/ehci.h struct ehci_hcor { · line 87

Quoted 4 lines
drivers/usb/host/ehci.h +4 -0
+ ? ? uint32_t or_burstsize;
+ ? ? uint32_t or_txfilltuning;
+#define TXFIFO_THRESH(p) ? ? ? ? ? ? ((p & 0x3f) << 16)
+ ? ? uint32_t _reserved_1_[6];

... and make _reserved_1_ 1 element bigger and keep it named _reserved_? The result would be a little simpler.

Sorry I'm a bit stuck with that one. I have:

? ? ? uint32_t or_asynclistaddr;
? ? ? uint32_t _reserved_0_;
? ? ? uint32_t or_burstsize;
? ? ? uint32_t or_txfilltuning;
? ? ? uint32_t _reserved_1_[6];
? ? ? uint32_t or_configflag;

Quoted 3 lines

How can I remove _reserved_0_? I would need to replace it with something, as need or_burstsize to stay where it is. Can you please explain a little more?

Quoted 5 lines

Oh right, this is a HW structure, so the layout is fixed? In which case the patch is fine. I wonder why all the fields weren't just defined from the start rather than being marked "reserved" though; perhaps it'd be best to update the code to completely flesh out the HW description at some point. Not necessarily in this patch though.

Yes that's right. Will leave this patch as is and resend series.

There are two sides to this: some people will say they want everything in there in case they want to access a particular field later. Others will say that it adds confusion and dead code. I think I'll sit on the fence.

Regards,
Simon

Quoted 4 lines

--
nvpublic

#67 lore raw

PATCH v2 13/17 tegra: usb: Add support for Tegra USB peripheral

In reply to Simon Glass

This adds basic support for the Tegra2 USB controller. Board files should call board_usb_init() to set things up.

Configuration through FDT and CONFIG is supported. For FDT, the device tree aliases set the order of the port, like this fragment:

        aliases {
		/* This defines the order of our USB ports */
                usb0 = "/usb at 0xc5008000";
                usb1 = "/usb at 0xc5000000";
        };

For CONFIG-based configuration, where CONFIG_OF_CONTROL is not defined, USB ports rely on CONFIG_TEGRA2_USBx macros to select the ordering. For example:

	#define CONFIG_TEGRA_USB0	TEGRA_USB3_BASE
	#define CONFIG_TEGRA_USB1	TEGRA_USB1_BASE

We record the order that the ports are configured and use that to select ports by number.

---
Changes in v2:
- Rename params to timing
- Store entire fdt config in port list, not just register pointer
- Remove non-fdt operation of USB, since it is not needed
- Decode USB VBUS GPIO from the fdt
- Decode phy type differently (to match new kernel fdt)
- Rename tegra20-usb to tegra20-ehcui (to match new kernel fdt)
- Improve debug() printouts in case of failure to init USB

 arch/arm/cpu/armv7/tegra2/Makefile        |    4 +-
 arch/arm/cpu/armv7/tegra2/usb.c           |  398 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-tegra2/tegra2.h |    2 +
 arch/arm/include/asm/arch-tegra2/usb.h    |  255 ++++++++++++++++++
 drivers/usb/host/Makefile                 |    1 +
 drivers/usb/host/ehci-tegra.c             |   63 +++++
 include/fdtdec.h                          |    1 +
 lib/fdtdec.c                              |    1 +
 8 files changed, 724 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/cpu/armv7/tegra2/usb.c
 create mode 100644 arch/arm/include/asm/arch-tegra2/usb.h
 create mode 100644 drivers/usb/host/ehci-tegra.c
arch/arm/cpu/armv7/tegra2/Makefile +3 -1
index 955c3b6..70e7abd 100644
@@ -33,8 +33,10 @@ include $(TOPDIR)/config.mk
 LIB	=  $(obj)lib$(SOC).o
 
 SOBJS	:= lowlevel_init.o
-COBJS	:= ap20.o board.o clock.o pinmux.o sys_info.o timer.o
+COBJS-y	:= ap20.o board.o clock.o pinmux.o sys_info.o timer.o
+COBJS-$(CONFIG_USB_EHCI_TEGRA) += usb.o
 
+COBJS	:= $(COBJS-y)
 SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS) $(SOBJS))
 
arch/arm/cpu/armv7/tegra2/usb.c new file +398 -0

398 lines not on this page · raw message

arch/arm/include/asm/arch-tegra2/tegra2.h +2 -0
index 8941443..baae2eb 100644
@@ -41,6 +41,8 @@
 #define TEGRA2_SPI_BASE		(NV_PA_APB_MISC_BASE + 0xC380)
 #define NV_PA_PMC_BASE		0x7000E400
 #define NV_PA_CSITE_BASE	0x70040000
+#define TEGRA_USB1_BASE		0xC5000000
+#define TEGRA_USB3_BASE		0xC5008000
 
 #define TEGRA2_SDRC_CS0		NV_PA_SDRAM_BASE
 #define LOW_LEVEL_SRAM_STACK	0x4000FFFC
arch/arm/include/asm/arch-tegra2/usb.h new file +255 -0

255 lines not on this page · raw message

drivers/usb/host/Makefile +1 -0
index 09abb75..39134ff 100644
@@ -46,6 +46,7 @@ COBJS-$(CONFIG_USB_EHCI_PPC4XX) += ehci-ppc4xx.o
 COBJS-$(CONFIG_USB_EHCI_IXP4XX) += ehci-ixp.o
 COBJS-$(CONFIG_USB_EHCI_KIRKWOOD) += ehci-kirkwood.o
 COBJS-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o
+COBJS-$(CONFIG_USB_EHCI_TEGRA) += ehci-tegra.o
 COBJS-$(CONFIG_USB_EHCI_VCT) += ehci-vct.o
 
 COBJS	:= $(COBJS-y)
drivers/usb/host/ehci-tegra.c new file +63 -0

63 lines not on this page · raw message

include/fdtdec.h +1 -0
index 57db42b..9871b81 100644
@@ -57,6 +57,7 @@ struct fdt_memory {
  */
 enum fdt_compat_id {
 	COMPAT_UNKNOWN,
+	COMPAT_NVIDIA_TEGRA20_USB,	/* Tegra2 USB port */
 
 	COMPAT_COUNT,
 };
lib/fdtdec.c +1 -0
index 8eed752..509b81f 100644
@@ -37,6 +37,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define COMPAT(id, name) name
 static const char * const compat_names[COMPAT_COUNT] = {
 	COMPAT(UNKNOWN, "<none>"),
+	COMPAT(NVIDIA_TEGRA20_USB, "nvidia,tegra20-ehci"),
 };
 
 /**
Signature · 1 line
1.7.3.1
#68 lore raw

PATCH v2 13/17 tegra: usb: Add support for Tegra USB peripheral

Hi,

2011/12/3 Simon Glass <[email protected]>:

Quoted 34 lines

This adds basic support for the Tegra2 USB controller. Board files should call board_usb_init() to set things up.

Configuration through FDT and CONFIG is supported. For FDT, the device tree aliases set the order of the port, like this fragment:

? ? ? ?aliases {
? ? ? ? ? ? ? ?/* This defines the order of our USB ports */ ? ? ? ? ? ? ? ?usb0 = "/usb at 0xc5008000";
? ? ? ? ? ? ? ?usb1 = "/usb at 0xc5000000";
? ? ? ?};

For CONFIG-based configuration, where CONFIG_OF_CONTROL is not defined, USB ports rely on CONFIG_TEGRA2_USBx macros to select the ordering. For example:

? ? ? ?#define CONFIG_TEGRA_USB0 ? ? ? TEGRA_USB3_BASE ? ? ? ?#define CONFIG_TEGRA_USB1 ? ? ? TEGRA_USB1_BASE

We record the order that the ports are configured and use that to select ports by number.

---
Changes in v2:
- Rename params to timing
- Store entire fdt config in port list, not just register pointer
- Remove non-fdt operation of USB, since it is not needed
- Decode USB VBUS GPIO from the fdt
- Decode phy type differently (to match new kernel fdt)
- Rename tegra20-usb to tegra20-ehcui (to match new kernel fdt)
- Improve debug() printouts in case of failure to init USB

Quoted 2 lines

?drivers/usb/host/Makefile ? ? ? ? ? ? ? ? | ? ?1 + ?drivers/usb/host/ehci-tegra.c ? ? ? ? ? ? | ? 63 +++++

As for this USB part:

Kind regards,

Remy

#69 lore raw

PATCH v2 14/17 tegra: usb: Add USB support to nvidia boards

In reply to Simon Glass

This adds basic USB support for port 0. The other port is not supported yet.

Tegra2 (SeaBoard) # usb start
(Re)start USB...
USB: Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... 5 USB Device(s) found
scanning bus for storage devices... 1 Storage Device(s) found
Tegra2 (SeaBoard) # ext2load usb 0:3 10000000 /boot/vmlinuz Loading file "/boot/vmlinuz" from usb device 0:3 (ROOT-A) 2932976 bytes read

---
Changes in v2:
- Add setting of pinmux for USB VBUS GPIO

 board/nvidia/common/board.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
board/nvidia/common/board.c +8 -0
index f39fb24..c7a33c3 100644
@@ -32,6 +32,7 @@
 #include <asm/arch/pinmux.h>
 #include <asm/arch/uart.h>
 #include <spi.h>
+#include <asm/arch/usb.h>
 #include "board.h"
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -125,6 +126,13 @@ int board_init(void)
 	/* boot param addr */
 	gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100);
 
+#ifdef CONFIG_USB_EHCI_TEGRA
+	/* For USB GPIO PD0. for now, since we have no pinmux in fdt */
+	pinmux_tristate_disable(PINGRP_SLXK);
+
+	board_usb_init(gd->fdt_blob);
+#endif
+
 	return 0;
 }
 
Signature · 1 line
1.7.3.1
#70 lore raw

PATCH v2 15/17 tegra: usb: Add common USB defines for tegra2 boards

In reply to Simon Glass

All Tegra2 boards should include tegra2-common. This adds the required USB config to that file.

---

 include/configs/tegra2-common.h |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)
include/configs/tegra2-common.h +14 -0
index e6f385f..6549d00 100644
@@ -84,6 +84,20 @@
 #define CONFIG_SYS_BAUDRATE_TABLE	{4800, 9600, 19200, 38400, 57600,\
 					115200}
 
+/*
+ * USB Host. Tegra2 requires USB buffers to be aligned to a word boundary
+ */
+#define CONFIG_USB_EHCI_DATA_ALIGN	4
+
+/*
+ * This parameter affects a TXFILLTUNING field that controls how much data is
+ * sent to the latency fifo before it is sent to the wire. Without this
+ * parameter, the default (2) causes occasional Data Buffer Errors in OUT
+ * packets depending on the buffer address and size.
+ */
+#define CONFIG_USB_EHCI_TXFIFO_THRESH	10
+
+#define CONFIG_EHCI_IS_TDI
 /* include default commands */
 #include <config_cmd_default.h>
 
Signature · 1 line
1.7.3.1
#71 lore raw

PATCH v2 16/17 tegra: usb: Enable USB on Seaboard

In reply to Simon Glass

Seaboard has a top port which is USB host or device, and a side port which is host only.

---
Changes in v2:
- Remove unneeded CONFIG_TEGRA_USBx defines

 include/configs/seaboard.h |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
include/configs/seaboard.h +7 -0
index 261f952..b6d9f7a 100644
@@ -72,4 +72,11 @@
 
 #define CONFIG_ENV_SECT_SIZE    CONFIG_ENV_SIZE
 #define CONFIG_ENV_OFFSET       (CONFIG_SPI_FLASH_SIZE - CONFIG_ENV_SECT_SIZE)
+
+/* USB Host support */
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_TEGRA
+#define CONFIG_USB_STORAGE
+#define CONFIG_CMD_USB
+
 #endif /* __CONFIG_H */
Signature · 1 line
1.7.3.1