tegra: Add fdt definitions and USB driver
Subsystems (7)
v4 cover tegra: Add fdt definitions and USB driver
This series brings in the Linux kernel fdt file 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.
Tegra likes to have cache-aligned buffers. I have dropped the patch which implements this since we will solve this problem by making callers align their buffers (as we did with MMC).
Changes in v2:
- Use "okay" instead of "ok" for fdt node status
- Remove 0x from fdt aliases
- 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
Changes in v3:
- Remove "okay" from nodes since this is the default anyway
- Fix device tree indenting with tabs instead of spaces
- Disable USB2 which is not used on Seaboard
- Remove usbparams properties from fdt and moved them to C code
- Drop Tegra USB alignment patch as we will deal with this another way
Changes in v4:
- Add staging area for device tree bindings used in U-Boot
- Add clock bindings for Tegra2x
- Add fdtdec function to return peripheral ID
- Use updated fdtdec alias functiona to get USB aliases
- Use peripheral clock node to obtain peripheral ID
Simon Glass (20):
fdt: Tidy up a few fdtdec problems
fdt: Add functions to access phandles, arrays and bools
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
fdt: Add staging area for device tree binding documentation
fdt: Add tegra-usb bindings file from linux
tegra: fdt: Add additional USB binding
tegra: fdt: Add clock bindings
tegra: usb: fdt: Add additional device tree definitions for USB ports
tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard
usb: Add support for txfifo threshold
fdt: Add function to return peripheral/clock ID
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 | 3 + arch/arm/cpu/armv7/tegra2/Makefile | 4 +- arch/arm/cpu/armv7/tegra2/config.mk | 2 + arch/arm/cpu/armv7/tegra2/usb.c | 426 ++++++++++++++++++++++++ arch/arm/cpu/armv7/u-boot.lds | 5 + arch/arm/dts/skeleton.dtsi | 13 + arch/arm/dts/tegra20.dtsi | 199 +++++++++++ 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 | 47 +++ doc/device-tree-bindings/README | 19 + doc/device-tree-bindings/clock/tegra-periphclk | 51 +++ doc/device-tree-bindings/usb/tegra-usb.txt | 17 + drivers/usb/host/Makefile | 1 + drivers/usb/host/ehci-hcd.c | 7 + drivers/usb/host/ehci-tegra.c | 63 ++++ drivers/usb/host/ehci.h | 6 +- dts/Makefile | 2 +- include/configs/seaboard.h | 12 + include/configs/tegra2-common.h | 14 + include/fdtdec.h | 121 +++++++- lib/fdtdec.c | 181 ++++++++++- 23 files changed, 1445 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 doc/device-tree-bindings/README create mode 100644 doc/device-tree-bindings/clock/tegra-periphclk create mode 100644 doc/device-tree-bindings/usb/tegra-usb.txt create mode 100644 drivers/usb/host/ehci-tegra.c
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
PATCH v4 1/20 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.
---
include/fdtdec.h | 23 +++++++++++++++++++---- lib/fdtdec.c | 22 ++++++++++++++++------ 2 files changed, 35 insertions(+), 10 deletions(-)
include/fdtdec.h +19 -4
@@ -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 +16 -6
@@ -33,6 +33,7 @@ DECLARE_GLOBAL_DATA_PTR;*/ #define COMPAT (id, name) namestatic const char *const compat_names[COMPAT_COUNT ] = { +COMPAT (UNKNOWN ,"<none>" ), };const char *fdtdec_get_compatible (enum fdt_compat_id id)
@@ -89,14 +90,21 @@ 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; +/* +* It should say "okay", so only allow that. Some fdts use "ok" but +* this is a bug. Please fix your device tree source file. See here +* for discussion: +* +* http://www.mail-archive.com/[email protected]/msg71598.html +*/ 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)
@@ -127,14 +135,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; }/* TODO: Can we tighten this code up a little? */
@@ -254,7 +264,7 @@ int fdtdec_find_aliases_for_id(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.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-2-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Stephen Warren
Acked-byRe: [PATCH v4 01/20] fdt: Tidy up a few fdtdec problems
Quoted 10 lines · Simon Glass
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 firstfdt_compat_idis defined to be invalid.
4. Added a header prototype forfdtdec_next_compatible()
5. Changefdtdec_next_alias()to only increment its 'upto' parameter on success, to make the display error messages in the caller easier.Signed-off-by Simon Glass <[email protected]>
(only because I commented on this before; I'm not an FDT maintainer here)
Signature · 1 line
nvpublic
Jerry Van Baren
Acked-by Gerald Van BarenRe: [U-Boot] [PATCH v4 01/20] fdt: Tidy up a few fdtdec problems
In reply to a message not in the archiveQuoted 10 lines · Simon Glass
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 firstfdt_compat_idis defined to be invalid.
4. Added a header prototype forfdtdec_next_compatible()
5. Changefdtdec_next_alias()to only increment its 'upto' parameter on success, to make the display error messages in the caller easier.Signed-off-by Simon Glass<[email protected]>
Thanks,
gvb
PATCH v4 3/20 fdt: Add basic support for decoding GPIO definitions
In reply to a message not in the archiveThis 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 nodegpio_num is the number of the GPIO (0 to 223)
flags is a flag, as follows:
bit meaning
0 0=polarity normal, 1=active low (inverted)
An example is:
gpio-enable-propounder = <&gpio 43 0>;
which means that GPIO 43 is used to enable the propounder (setting the GPIO high), or that you can detect that the propounder is enabled by checking if the GPIO is high (the fdt does not indicate input/output).
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 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 | 45 +++++++++++++++++++++++++++++++ lib/fdtdec.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 0 deletions(-)
include/fdtdec.h +45 -0
@@ -61,6 +61,23 @@ enum fdt_compat_id { COMPAT_COUNT, }; +/* GPIOs are numbered from 0 */ +enum { +FDT_GPIO_NONE =-1U ,/* an invalid GPIO used to end our list */ + +FDT_GPIO_ACTIVE_LOW =1 <<0 ,/* 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 */ +uint 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.
@@ -227,3 +244,31 @@ 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 */ 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. At present this +* just requests the GPIO. +* +* 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 +78 -0
87 lines not on this page · raw message
Signature · 1 line
1.7.7.3
Re: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Quoted 5 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to
FDT_GPIO_MAXGPIOs in the system. Each GPIO is of the form:gpio-function-name = <phandle
gpio_numflags>;
That's not true in general.
The binding definition for the GPIO controller that provides the GPIO in question defines the number and meaning of all cells after the phandle cell. In practice, this usually does mean two cells with the meanings above, but there's no need for this to be true in general.
For reference, the correct way to parse such a property is:
* Read the first cell.
* Find the node referenced by the phandle.
* Ensure property gpio-controller is present in the controller node.
* Read property #gpio-cells from the controller node.
* Extract #gpio-cells from the original property.
* Keep processing more cells from the original property; there may be multiple GPIOs listed.
Still, I'll review this patch under the assumption that it's understood that its applicability is limited to the subset of controllers that use the same GPIO specifier as Tegra, i.e. that which you documented.
Quoted 8 lines
where:
phandle is a pointer to the GPIO node
gpio_numis the number of the GPIO (0 to 223)
flags is a flag, as follows:bit meaning
0 0=polarity normal, 1=active low (inverted)
For reference, according to the binding documentation in the Linux kernel, Samsung Exynos4 doesn't use this format, and while all other chips do have a flags cell, about 50% of the controllers indicate the cell is unused.
Quoted 3 lines
An example is:
gpio-enable-propounder = <&gpio 43 0>;
It appears to be idiomatic to name GPIO-related properties as plural even when only one GPIO is expected, so e.g. "wp-gpios" for an SDHCI controller's write-proptect GPIO, rather than simply "wp-gpio.
...
Quoted 1 line
include/fdtdec.h +0
-0
...
include/fdtdec.h enum fdt_compat_id { · line 66
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { +FDT_GPIO_NONE =-1U ,/* an invalid GPIO used to end our list */
Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
Ignoring all the above, the code looks correct to perform as documented.
Signature · 1 line
nvpublic
Re: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Hi Stephen,
Quoted 42 lines · Stephen Warren
Quoted 5 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. We permit up to
FDT_GPIO_MAXGPIOs in the system. Each GPIO is of the form:gpio-function-name = <phandle
gpio_numflags>;That's not true in general.
The binding definition for the GPIO controller that provides the GPIO in question defines the number and meaning of all cells after the phandle cell. In practice, this usually does mean two cells with the meanings above, but there's no need for this to be true in general.
For reference, the correct way to parse such a property is:
* Read the first cell.
* Find the node referenced by the phandle.
* Ensure property gpio-controller is present in the controller node.
* Read property #gpio-cells from the controller node.
* Extract #gpio-cells from the original property.
* Keep processing more cells from the original property; there may be multiple GPIOs listed.Still, I'll review this patch under the assumption that it's understood that its applicability is limited to the subset of controllers that use the same GPIO specifier as Tegra, i.e. that which you documented.
Quoted 8 lines
where:
phandle is a pointer to the GPIO node
gpio_numis the number of the GPIO (0 to 223)
flags is a flag, as follows:bit meaning
0 0=polarity normal, 1=active low (inverted)For reference, according to the binding documentation in the Linux kernel, Samsung Exynos4 doesn't use this format, and while all other chips do have a flags cell, about 50% of the controllers indicate the cell is unused.
Quoted 7 lines
Quoted 3 lines
An example is:
gpio-enable-propounder = <&gpio 43 0>;
It appears to be idiomatic to name GPIO-related properties as plural even when only one GPIO is expected, so e.g. "wp-gpios" for an SDHCI controller's write-proptect GPIO, rather than simply "wp-gpio.
OK, for both of those I will update the commit message. I have so far been avoiding having the fdtdec library keep any state around. Looking up a phandle and properties every time we need to decode a GPIO might push me towards adding some sort of structure to speed decoding of the device tree. For now we don't need it, and these functions only do what they say they do, but it looks like at some point in the future we might need more complexity here.
Regarding multiple GPIOs - there is a static function fdtdec_decode_gpios() for decoding such a list which we can export as needed later. But not everything is required to be a list. For many GPIOs it makes no sense to have more than one, so a single GPIO is convenient and conceptually simple for people, and easy to code.
Quoted 4 lines
...
Quoted 1 line
include/fdtdec.h +0
-0...
Quoted 11 lines
include/fdtdec.h enum fdt_compat_id { · line 66
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { + FDT_GPIO_NONE = -1U, /* an invalid GPIO used to end our list */Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
It is nothing to do with U-Boot itself - we can choose any number. What is Linux using now / planning to use?
The number -1U is convenient because it allows us to number GPIOs from 0, which is natural for people and easier to see what is going on when debugging. Off-by-one situations can be very confusing for people.
At present you must call fdtdec_decode_gpio() to decode a gpio property in the node. If you don't then you can't know if anything was there. U-Boot doesn't really have a device model yet, but if it did, and if you wanted to add a GPIO to a core structure that the driver used, then indeed the driver (or the code that owns the structure) would need to call fdtdec_decode_gpio() to set it up. If it did not then the GPIO number would be 0, which is valid.
A few things do come to mind though. First ->name is set to the property name - if that is NULL then fdtdec_decode_gpio() has not been called. Also we could add a 'valid' flag to the flags byte perhaps. Perhaps in Linux a GPIO is represented just with a number, but here we are using a structure and can fairly easily add something else to indicate validity.
Should we try to do something about this now, or later? I am especially interested in what Linux plans to do here.
Quoted 2 lines
Ignoring all the above, the code looks correct to perform as documented.
Thanks for looking at it.
Regards,
Simon
Quoted 3 lines
--
nvpublic
A message that is not in the archive (sent off-list or not yet received): CAPnjgZ0TCNTZjR_Fc1+UvYxyjH-a-Bxtkz60OERR7YmC5tbuug-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Quoted 6 lines · Simon Glass
Hi Stephen,
Quoted 3 lines · Stephen Warren
Quoted 2 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. ...
...
Quoted 14 lines
Quoted 13 lines
Quoted 1 line
include/fdtdec.h +0
-0...
include/fdtdec.h enum fdt_compat_id { · line 66
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { +FDT_GPIO_NONE =-1U ,/* an invalid GPIO used to end our list */ Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
Quoted 1 line
It is nothing to do with U-Boot itself - we can choose any number.
Surely the value you choose for DT parsing has to align with the value that U-Boot's GPIO API chooses, so you can't just choose any number.
Quoted 1 line
What is Linux using now / planning to use?
Linux uses -1 right now, but should really have used 0. I don't think there's an actual plan to change this now, since the numbering scheme is entrenched.
What Linux does isn't relevant; the numbering scheme I'm talking about is the internal numbering scheme within U-Boot or Linux, which are independent from each-other and the values in the device tree.
So that said, I was wondering if U-Boot's GPIO support (covering both non-DT and DT cases) was new enough that it could use 0 to represent "invalid GPIO" rather than -1, and hence FDT_GPIO_NONE be 0 not -1. It probably isn't though; I guess U-Boot's GPIO numbering scheme is also already entrenched?
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Hi Stephen,
Quoted 22 lines · Stephen Warren
Quoted 6 lines · Simon Glass
Hi Stephen,
Quoted 3 lines · Stephen Warren
Quoted 2 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. ...
...
Quoted 14 lines
Quoted 13 lines
Quoted 1 line
include/fdtdec.h +0
-0...
include/fdtdec.h enum fdt_compat_id { · line 66
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { + FDT_GPIO_NONE = -1U, /* an invalid GPIO used to end our list */Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
Quoted 4 lines
Quoted 1 line
It is nothing to do with U-Boot itself - we can choose any number.
Surely the value you choose for DT parsing has to align with the value that U-Boot's GPIO API chooses, so you can't just choose any number.
No, in the fdt we just leave out the gpio if it is not required. The FDT_GPIO_NONE is purely internal to U-Boot.
Quoted 11 lines
Quoted 2 lines
What is Linux using now / planning to use?
Linux uses -1 right now, but should really have used 0. I don't think there's an actual plan to change this now, since the numbering scheme is entrenched.
What Linux does isn't relevant; the numbering scheme I'm talking about is the internal numbering scheme within U-Boot or Linux, which are independent from each-other and the values in the device tree.
Quoted 5 lines
So that said, I was wondering if U-Boot's GPIO support (covering both non-DT and DT cases) was new enough that it could use 0 to represent "invalid GPIO" rather than -1, and hence
FDT_GPIO_NONEbe 0 not -1. It probably isn't though; I guess U-Boot's GPIO numbering scheme is also already entrenched?
Yes it starts at zero. I'm not sure how to even begin such a discussion on the list :-)
Regards,
Simon
Quoted 3 lines
--
nvpublic
A message that is not in the archive (sent off-list or not yet received): CAPnjgZ0eNXhWYtkb+4-FswpByAE7NHXoLz-ngp7Af_P0+u4GiQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
RE: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Simon Glass wrote at Tuesday, January 24, 2012 4:12 PM:
Quoted 23 lines · Stephen Warren
Quoted 22 lines · Simon Glass
Quoted 6 lines
Hi Stephen,
Quoted 3 lines · Stephen Warren
Quoted 2 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. ...
...
Quoted 14 lines
Quoted 13 lines
Quoted 1 line
include/fdtdec.h +0
-0...
include/fdtdec.h
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { + FDT_GPIO_NONE = -1U, /* an invalid GPIO used to end our list */Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
It is nothing to do with U-Boot itself - we can choose any number.
Surely the value you choose for DT parsing has to align with the value that U-Boot's GPIO API chooses, so you can't just choose any number.
No, in the fdt we just leave out the gpio if it is not required. The
FDT_GPIO_NONEis purely internal to U-Boot.
That's consistent with what I said; I'm talking about the value that a missing DT property translates into within U-Boot.
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): 74CDBE0F657A3D45AFBB94109FB122FF178CB81F0D-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org
Re: [PATCH v4 03/20] fdt: Add basic support for decoding GPIO definitions
Hi Stephen,
Quoted 26 lines · Stephen Warren
Simon Glass wrote at Tuesday, January 24, 2012 4:12 PM:
Quoted 25 lines · Stephen Warren
Quoted 24 lines · Simon Glass
Quoted 6 lines
Hi Stephen,
Quoted 3 lines · Stephen Warren
Quoted 2 lines · Simon Glass
This adds some support into fdtdec for reading GPIO definitions from the fdt. ...
...
Quoted 15 lines
Quoted 13 lines
Quoted 1 line
include/fdtdec.h +0
-0...
include/fdtdec.h
Quoted 3 lines
include/fdtdec.h +3
-0+/* GPIOs are numbered from 0 */ +enum { + FDT_GPIO_NONE = -1U, /* an invalid GPIO used to end our list */Is this due to the way U-Boot works right now, or something defined by this patch? It's been pointed out that the kernel's choice to use -1 as "invalid GPIO" rather than 0 was a mistake, since that prevents GPIO fields being easily added to platform data structures, since you then have to go and initialize every new instance to -1, rather than relying on BSS initializing it to 0. I assume this is just the way U-Boot works, so solving this is outside the scope of this patch.
It is nothing to do with U-Boot itself - we can choose any number.
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Surely the value you choose for DT parsing has to align with the value that U-Boot's GPIO API chooses, so you can't just choose any number.
No, in the fdt we just leave out the gpio if it is not required. The
FDT_GPIO_NONEis purely internal to U-Boot.That's consistent with what I said; I'm talking about the value that a missing DT property translates into within U-Boot.
OK I see. I'm not proposing to change U-Boot convention now (if in fact it has one). At least FDT_GPIO_NONE is a constant that people need to check against (but they should use fdt_gpio_isvalid() instead). We can adjust this in the future if U-Boot people want to.
Regards,
Simon
Quoted 4 lines
--
nvpublic
PATCH v4 4/20 arm: fdt: Ensure that an embedded fdt is word-aligned
In reply to a message not in the archiveBy 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
@@ -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
@@ -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.7.3
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Simon,
Quoted 6 lines · Simon Glass
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.
Stop me if I am wrong, but objcopy obviously works with output sections of its input file, not with input ones that this file was linked from, and so it cannot act upon alignment of data input sections, right? And as, before your patch, there is no designated output section for DTS data, it ends up (possibly mis-aligned) in the .data output section (which is globally aligned however), so there is no chance anyway that objcopy can re-align DTS data if they were mis-aligned.
So I must be missing something. Can you clarify the scenario that gets fixed here?
Not that I am against the patch, mind you, quite the opposite. I am just wondering about the pros and cons of having a separated (and aligned) DTS data *output* section and placing that section after .code and .data rather than between them.
Amicalement,
Signature · 1 line
Albert.
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Albert,
Quoted 6 lines · Albert ARIBAUD
Hi Simon,
Quoted 1 line · Simon Glass
By putting the fdt blob into a distinctive area we can ensure that it
appears
Quoted 8 lines
Quoted 5 lines
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.
Stop me if I am wrong, but objcopy obviously works with output sections
of its input file, not with input ones that this file was linked from, and so it cannot act upon alignment of data input sections, right? And as, before your patch, there is no designated output section for DTS data, it ends up (possibly mis-aligned) in the .data output section (which is globally aligned however), so there is no chance anyway that objcopy can re-align DTS data if they were mis-aligned.
Well that's a shame if true. I was rather hoping that it would respect input section alignment when packing into an output section - it must do that in at least some cases since otherise I don't see how code regions could be collected together without one becoming misaligned if the one before was an odd size.
Quoted 2 lines
So I must be missing something. Can you clarify the scenario that gets
fixed here?
The fdt blob is in one of the object files. If during linking the file before it has a data segment whose size is not a multiple of 4, then the fdt object can be misaligned in the output.
Quoted 2 lines
Not that I am against the patch, mind you, quite the opposite. I am just
wondering about the pros and cons of having a separated (and aligned) DTS data *output* section and placing that section after .code and .data rather than between them.
Bear in mind that embedding the fdt in the image is really only for development.
We could have a separate output section if you like. Up to you.
Regards,
Simon
Quoted 4 lines
Amicalement,
--
Albert.
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Simon,
Quoted 25 lines · Simon Glass
Hi Albert,
Quoted 6 lines · Albert ARIBAUD
Hi Simon,
Quoted 1 line · Simon Glass
By putting the fdt blob into a distinctive area we can ensure that it
appears
Quoted 8 lines
Quoted 5 lines
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.
Stop me if I am wrong, but objcopy obviously works with output sections
of its input file, not with input ones that this file was linked from, and so it cannot act upon alignment of data input sections, right? And as, before your patch, there is no designated output section for DTS data, it ends up (possibly mis-aligned) in the .data output section (which is globally aligned however), so there is no chance anyway that objcopy can re-align DTS data if they were mis-aligned.
Quoted 5 lines
Well that's a shame if true. I was rather hoping that it would respect input section alignment when packing into an output section - it must do that in at least some cases since otherise I don't see how code regions could be collected together without one becoming misaligned if the one before was an odd size.
Objcopy is only a utility to convert built binaries from one format to another, and rightly ignores any alignment considerations. Alignment constraints are solved at link time within the .lds file. This is why I suggest a separate output section in u-boot.lds, because then you can set that section's alignment where all alignment constraints are laid out.
Quoted 6 lines
Quoted 1 line
So I must be missing something. Can you clarify the scenario that gets
fixed here?
The fdt blob is in one of the object files. If during linking the file before it has a data segment whose size is not a multiple of 4, then the fdt object can be misaligned in the output.
Understood. This example of an alignment failure scenario shows that the failure cause is indeed that the FDT is embedded in the .data output section at link time.
Quoted 7 lines
Quoted 1 line
Not that I am against the patch, mind you, quite the opposite. I am just
wondering about the pros and cons of having a separated (and aligned) DTS data *output* section and placing that section after .code and .data rather than between them.
Bear in mind that embedding the fdt in the image is really only for development.
Understood, and I think that's one more reason to make sure that the act of FDT embedding does not alter .data input section ordering.
Quoted 1 line
We could have a separate output section if you like. Up to you.
I much prefer embedded FDT data to be explicitly mapped to a a dedicated .fdt output section in u-boot.lds, because it ensures that aligment constaints for .fdt and .data can be controlled independently.
Quoted 2 lines
Regards,
Simon
Amicalement,
Signature · 1 line
Albert.
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Albert,
Quoted 8 lines · Albert ARIBAUD
Hi Simon,
Quoted 3 lines · Simon Glass
Hi Albert,
On Feb 18, 2012 3:51 AM, "Albert ARIBAUD"<[email protected]>
Quoted 18 lines · wrote:
Quoted 18 lines
Quoted 7 lines
Hi Simon,
Quoted 1 line · Simon Glass
By putting the fdt blob into a distinctive area we can ensure that it
appears
Quoted 9 lines
Quoted 6 lines
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.
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
Stop me if I am wrong, but objcopy obviously works with output sections
of its input file, not with input ones that this file was linked from,
and
Quoted 6 lines
Quoted 6 lines
so it cannot act upon alignment of data input sections, right? And as, before your patch, there is no designated output section for DTS data, it ends up (possibly mis-aligned) in the .data output section (which is globally aligned however), so there is no chance anyway that objcopy can re-align DTS data if they were mis-aligned.
Quoted 8 lines
Quoted 5 lines
Well that's a shame if true. I was rather hoping that it would respect input section alignment when packing into an output section - it must do that in at least some cases since otherise I don't see how code regions could be collected together without one becoming misaligned if the one before was an odd size.
Objcopy is only a utility to convert built binaries from one format to
another, and rightly ignores any alignment considerations. Alignment constraints are solved at link time within the .lds file. This is why I suggest a separate output section in u-boot.lds, because then you can set that section's alignment where all alignment constraints are laid out.
Quoted 1 line
Sorry I had that wrong - it's not the link step I am bothered by, it is the objcopy step.
What I would like to do is mark the input section, created by objcopy, with a particular alignment so that the linker does the right thing. This feature appears to be present in objcopy but does not appear to work. Perhaps I should debug that first to see what is going on.
Quoted 11 lines
Quoted 8 lines
Quoted 2 lines
So I must be missing something. Can you clarify the scenario that gets
fixed here?
The fdt blob is in one of the object files. If during linking the file before it has a data segment whose size is not a multiple of 4, then the fdt object can be misaligned in the output.
Understood. This example of an alignment failure scenario shows that the
failure cause is indeed that the FDT is embedded in the .data output section at link time.
Quoted 6 lines
Quoted 6 lines
Quoted 3 lines
Not that I am against the patch, mind you, quite the opposite. I am just
wondering about the pros and cons of having a separated (and aligned) DTS data *output* section and placing that section after .code and .data
rather
Quoted 7 lines
Quoted 4 lines
than between them.
Bear in mind that embedding the fdt in the image is really only for development.
Understood, and I think that's one more reason to make sure that the act
of FDT embedding does not alter .data input section ordering.
Quoted 1 line
Well it is just a data section really.
Quoted 5 lines
Quoted 2 lines
We could have a separate output section if you like. Up to you.
I much prefer embedded FDT data to be explicitly mapped to a a dedicated
.fdt output section in u-boot.lds, because it ensures that aligment constaints for .fdt and .data can be controlled independently.
I will take a look at this.
Regards,
Simon
Quoted 9 lines
Quoted 4 lines
Regards,
SimonAmicalement,
--
Albert.
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Simon,
Quoted 7 lines · Simon Glass
Sorry I had that wrong - it's not the link step I am bothered by, it is the objcopy step.
What I would like to do is mark the input section, created by objcopy, with a particular alignment so that the linker does the right thing. This feature appears to be present in objcopy but does not appear to work. Perhaps I should debug that first to see what is going on.
(Formally there are two "objcopy steps" in u-boot building. One happens after the link step, where from the u-boot ELF binary objcopy derives the u-boot.bin pure binary and u-boot.srec S-Record file. I suspect you're referring to the other one, which happens before the link stage and which turns the binary FDT data into an ELF-linkable object. Correct?)
Maybe one is allowed to specify alignment requirements when making an ELF object file from a pure binary with objcopy; but obviously it does not work as you want it to, whereas section alignment in linker scripts is a tried and proven method.
Quoted 21 lines
Quoted 10 lines
Quoted 7 lines
Quoted 1 line
So I must be missing something. Can you clarify the scenario that gets
fixed here?
The fdt blob is in one of the object files. If during linking the file before it has a data segment whose size is not a multiple of 4, then the fdt object can be misaligned in the output.
Understood. This example of an alignment failure scenario shows that the
failure cause is indeed that the FDT is embedded in the .data output section at link time.
Quoted 6 lines
Quoted 6 lines
Quoted 3 lines
Not that I am against the patch, mind you, quite the opposite. I am just
wondering about the pros and cons of having a separated (and aligned) DTS data *output* section and placing that section after .code and .data
rather
Quoted 2 lines
Quoted 2 lines
than between them.
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Bear in mind that embedding the fdt in the image is really only for development.
Understood, and I think that's one more reason to make sure that the act
of FDT embedding does not alter .data input section ordering.
Well it is just a data section really.
So are the relocation tables in .rel.dyn and .dynsyms, but that does not mean they have to go to the "dot data" output section.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
We could have a separate output section if you like. Up to you.
I much prefer embedded FDT data to be explicitly mapped to a a dedicated
.fdt output section in
u-boot.lds, because it ensures that aligment constaints for .fdt and .data can be controlled independently.I will take a look at this.
Thanks. This should be fairly easy to do in the linker script by inserting an output section (e.g. ".fdt") after .data, aligning the start of that section to a word boundary, and explicitly mapping the .data section of the FDT object file into it.
Quoted 2 lines
Regards,
Simon
Amicalement,
Signature · 1 line
Albert.
Re: [PATCH v4 04/20] arm: fdt: Ensure that an embedded fdt is word-aligned
Hi Albert,
Quoted 83 lines · Albert ARIBAUD
Hi Simon,
Quoted 9 lines · Simon Glass
Sorry I had that wrong - it's not the link step I am bothered by, it is the
objcopy step.What I would like to do is mark the input section, created by objcopy, with
a particular alignment so that the linker does the right thing. This feature appears to be present in objcopy but does not appear to work. Perhaps I should debug that first to see what is going on.(Formally there are two "objcopy steps" in u-boot building. One happens after the link step, where from the u-boot ELF binary objcopy derives the u-boot.bin pure binary and u-boot.srec S-Record file. I suspect you're referring to the other one, which happens before the link stage and which turns the binary FDT data into an ELF-linkable object. Correct?)
Maybe one is allowed to specify alignment requirements when making an ELF object file from a pure binary with objcopy; but obviously it does not work as you want it to, whereas section alignment in linker scripts is a tried and proven method.
Quoted 35 lines
Quoted 5 lines
Quoted 5 lines
Quoted 1 line
So I must be missing something. Can you clarify the scenario that gets
fixed here?
Quoted 7 lines
Quoted 3 lines
The fdt blob is in one of the object files. If during linking the file before it has a data segment whose size is not a multiple of 4, then the fdt object can be misaligned in the output.
Understood. This example of an alignment failure scenario shows that the
failure cause is indeed that the FDT is embedded in the .data output section at link time.
Quoted 10 lines
Quoted 10 lines
Quoted 5 lines
Not that I am against the patch, mind you, quite the opposite. I am just
wondering about the pros and cons of having a separated (and aligned) DTS
data *output* section and placing that section after .code and .datarather
Quoted 8 lines
Quoted 5 lines
than between them.
Bear in mind that embedding the fdt in the image is really only for development.
Quoted 5 lines
Quoted 1 line
Understood, and I think that's one more reason to make sure that the act
of FDT embedding does not alter .data input section ordering.
Well it is just a data section really.
So are the relocation tables in .rel.dyn and .dynsyms, but that does not mean they have to go to the "dot data" output section.
Quoted 9 lines
Quoted 5 lines
Quoted 1 line
We could have a separate output section if you like. Up to you.
I much prefer embedded FDT data to be explicitly mapped to a a dedicated
.fdt output section in
u-boot.lds, because it ensures that aligment constaints for .fdt and .data can be controlled independently.
Quoted 7 lines
Quoted 1 line
I will take a look at this.
Thanks. This should be fairly easy to do in the linker script by inserting an output section (e.g. ".fdt") after .data, aligning the start of that section to a word boundary, and explicitly mapping the .data section of the FDT object file into it.
Just an update on this: I am going to drop this patch from the series now and deal with it later once the lds cleanup series lands. I don't want to patch a file that is being removed.
Regards,
Simon
Quoted 9 lines
Quoted 4 lines
Regards,
SimonAmicalement,
--
Albert.
PATCH v4 6/20 tegra: fdt: Add Tegra2x device tree file from kernel
In reply to a message not in the archiveThis 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
@@ -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.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-7-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Re: [PATCH v4 06/20] tegra: fdt: Add Tegra2x device tree file from kernel
Quoted 11 lines · Simon Glass
This was taken from commit
b48c54e2at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.gitconfig.mk is updated to provide this file to boards through the built-in mechanism:
/include/
ARCH_CPU_DTSSigned-off-by Simon Glass <[email protected]>arch/arm/dts/tegra20.dtsi +0
-0
...
arch/arm/dts/tegra20.dtsi line 45
Quoted 7 lines
arch/arm/dts/tegra20.dtsi +7
-0+ i2c@7000d000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "nvidia,tegra20-i2c"; + reg = <0x7000D000 0x200>; + interrupts = < 85 >; + };
This is slightly out-of-date now; in next-20120118, that node's compatible flag is nvidia,tegra20-i2c-dvc. The HW register layout is somewhat different for this I2C controller, and the different compatible flag is how the driver this.
Still, you can always apply that fix in a later patch before you add I2C support.
Signature · 1 line
nvpublic
Re: [PATCH v4 06/20] tegra: fdt: Add Tegra2x device tree file from kernel
Hi Stephen,
Quoted 21 lines · Stephen Warren
Quoted 11 lines · Simon Glass
This was taken from commit
b48c54e2at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.gitconfig.mk is updated to provide this file to boards through the built-in mechanism:
/include/
ARCH_CPU_DTSSigned-off-by Simon Glass <[email protected]>arch/arm/dts/tegra20.dtsi +0
-0...
Quoted 7 lines
+ i2c@7000d000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "nvidia,tegra20-i2c";
+ reg = <0x7000D0000x200>;
+ interrupts = < 85 >;
+ };
Quoted 7 lines
This is slightly out-of-date now; in next-20120118, that node's compatible flag is nvidia,tegra20-i2c-dvc. The HW register layout is somewhat different for this I2C controller, and the different compatible flag is how the driver this.
Still, you can always apply that fix in a later patch before you add I2C support.
This series was original submitted 24 November, so of course things change. The changes you mention relate to I2C and I think I picked these up in the later I2C patches.
But since we are chasing a moving target, I really don't want to get too worried about redoing all the patches every time the kernel burps :-) The changes you mention are not even in mainline yet and don't relate to USB (this series).
Is it ok to adopt this sort of thinking throughout these series? As you know it is easy to pick up a new fdt file later and make any changes that are needed. I am well aware that things are still in flux.
Regards,
Simon
Quoted 3 lines
--
nvpublic
Re: [PATCH v4 06/20] tegra: fdt: Add Tegra2x device tree file from kernel
Quoted 29 lines · Simon Glass
Hi Stephen,
Quoted 26 lines · Stephen Warren
Quoted 11 lines · Simon Glass
This was taken from commit
b48c54e2at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.gitconfig.mk is updated to provide this file to boards through the built-in mechanism:
/include/
ARCH_CPU_DTSSigned-off-by Simon Glass <[email protected]>arch/arm/dts/tegra20.dtsi +0
-0...
arch/arm/dts/tegra20.dtsi line 45
Quoted 7 lines
arch/arm/dts/tegra20.dtsi +7
-0+ i2c@7000d000 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "nvidia,tegra20-i2c"; + reg = <0x7000D000 0x200>; + interrupts = < 85 >; + };This is slightly out-of-date now; in next-20120118, that node's compatible flag is nvidia,tegra20-i2c-dvc. The HW register layout is somewhat different for this I2C controller, and the different compatible flag is how the driver this.
Quoted 6 lines
Quoted 2 lines
Still, you can always apply that fix in a later patch before you add I2C support.
This series was original submitted 24 November, so of course things change. The changes you mention relate to I2C and I think I picked these up in the later I2C patches.
As I said, as long as this is updated before the I2C support that relies on it (as IIRC your I2C patch series did), that's fine.
Signature · 1 line
nvpublic
PATCH v4 7/20 tegra: fdt: Add device tree file for Tegra2 Seaboard from kernel
In reply to a message not in the archiveThis was taken from commit b48c54e2 at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.git
---
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
@@ -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.7.3
Re: [PATCH v4 07/20] tegra: fdt: Add device tree file for Tegra2 Seaboard from kernel
board/nvidia/dts/tegra2-seaboard.dts
Quoted 6 lines · Simon Glass
This was taken from commit
b48c54e2at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.gitSigned-off-by Simon Glass <[email protected]>board/nvidia/dts/tegra2-seaboard.dts +0
-0
This is also somewhat out-of-date w.r.t. the latest in kernel tag next-20120118. It's probably not too much of an issue, so this is probably fine to apply as-is. U-Boot may benefit from the addition of many status="disable" properties, and clock-frequency properties for the I2C nodes. It'd be good to keep U-Boot up-to-date with the kernel as much as possible. Of course, there are ongoing changes being queued for the kernel as work is done too...
Signature · 1 line
nvpublic
Re: [PATCH v4 07/20] tegra: fdt: Add device tree file for Tegra2 Seaboard from kernel
Hi Stephen,
Quoted 6 lines · Stephen Warren
Quoted 4 lines · Simon Glass
This was taken from commit
b48c54e2at:git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra.gitSigned-off-by Simon Glass <[email protected]>
Quoted 10 lines
board/nvidia/dts/tegra2-seaboard.dts
Quoted 1 line
board/nvidia/dts/tegra2-seaboard.dts +0
-0This is also somewhat out-of-date w.r.t. the latest in kernel tag next-20120118. It's probably not too much of an issue, so this is probably fine to apply as-is. U-Boot may benefit from the addition of many status="disable" properties, and clock-frequency properties for the I2C nodes. It'd be good to keep U-Boot up-to-date with the kernel as much as possible. Of course, there are ongoing changes being queued for the kernel as work is done too...
OK once everything is in we can do any updates that then exist based on what is finalised in the kernel.
Regards,
Simon
Quoted 2 lines
--
nvpublic
PATCH v4 8/20 fdt: Add staging area for device tree binding documentation
In reply to a message not in the archiveAdd a directory to hold device tree binding files, to permit easy review of this material in U-Boot patches.
---
Changes in v4:
- Add staging area for device tree bindings used in U-Boot
doc/device-tree-bindings/README | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) create mode 100644 doc/device-tree-bindings/README
doc/device-tree-bindings/README new file +19 -0
@@ -0,0 +1,19 @@ +Device Tree Bindings Staging Area +================================= + +This directory contains device tree bindings for U-Boot. + +These follow along with Linux kernel bindings, with a few additions. By +adding the files here, U-Boot patches can clearly show thees additions. +This makes it easier for device tree people to review these additions in +patches sent to the U-Boot mailing list. + +The intent is not to commit these files to U-Boot, or at least only +temporarily, Rather we hope that the files will be stored in another +repo (shared with Linux) which is brought in as needed. Failing that, +changes here will be commited to the Linux +Documentation/devicetree/bindings/ directory. + + [email protected] +11-Jan-12
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-9-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Re: [PATCH v4 08/20] fdt: Add staging area for device tree binding documentation
doc/device-tree-bindings/README line 15
Quoted 12 lines · Simon Glass
Add a directory to hold device tree binding files, to permit easy review of this material in U-Boot patches.
Signed-off-by Simon Glass <[email protected]>doc/device-tree-bindings/README +5
-0+The intent is not to commit these files to U-Boot, or at least only +temporarily, Rather we hope that the files will be stored in another +repo (shared with Linux) which is brought in as needed. Failing that, +changes here will be commited to the Linux +Documentation/devicetree/bindings/ directory.
Given there is no shared repo right now, I'd assert we should be specific and explicitly state that the intent /is/ to check in the binding documentation here, and mirror the kernel tree.
But, the patch is fine to me as-is if you wish.
Signature · 1 line
nvpublic
Re: [PATCH v4 08/20] fdt: Add staging area for device tree binding documentation
Hi Stephen,
Quoted 18 lines · Stephen Warren
doc/device-tree-bindings/README line 15
Quoted 12 lines · Simon Glass
Add a directory to hold device tree binding files, to permit easy review of this material in U-Boot patches.
Signed-off-by Simon Glass <[email protected]>doc/device-tree-bindings/README +5
-0+The intent is not to commit these files to U-Boot, or at least only +temporarily, Rather we hope that the files will be stored in another +repo (shared with Linux) which is brought in as needed. Failing that, +changes here will be commited to the Linux +Documentation/devicetree/bindings/ directory.Given there is no shared repo right now, I'd assert we should be specific and explicitly state that the intent /is/ to check in the binding documentation here, and mirror the kernel tree.
Quoted 1 line
But, the patch is fine to me as-is if you wish.
I'm fine with this too, it probably is more sensible if the U-Boot PTB don't mind.
Regards,
Simon
Quoted 3 lines
--
nvpublic
PATCH v4 9/20 fdt: Add tegra-usb bindings file from linux
In reply to a message not in the archiveThis file is taken from the Linux mailing list.
---
doc/device-tree-bindings/usb/tegra-usb.txt | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) create mode 100644 doc/device-tree-bindings/usb/tegra-usb.txt
doc/device-tree-bindings/usb/tegra-usb.txt new file +13 -0
@@ -0,0 +1,13 @@ +Tegra SOC USB controllers + +The device node for a USB controller that is part of a Tegra +SOC is as described in the document "Open Firmware Recommended +Practice : Universal Serial Bus" with the following modifications +and additions : + +Required properties : + - compatible : Should be "nvidia,tegra20-ehci" for USB controllers + used in host mode. + - phy_type : Should be one of "ulpi" or "utmi". + - nvidia,vbus-gpio : If present, specifies a gpio that needs to be + activated for the bus to be powered.
Signature · 1 line
1.7.7.3
PATCH v4 11/20 tegra: fdt: Add clock bindings
In reply to a message not in the archiveThis adds a basic binding for the oscillator and peripheral clocks. The second cell is the clock number, defined as the bit number within the clock enable register if the peripheral clock.
This uses the RFC clock bindings from Grant Likely so may change later:
https://lkml.org/lkml/2011/12/12/498
---
Changes in v4:
- Add clock bindings for Tegra2x
arch/arm/dts/tegra20.dtsi | 27 ++++++++++++ doc/device-tree-bindings/clock/tegra-periphclk | 51 ++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 0 deletions(-) create mode 100644 doc/device-tree-bindings/clock/tegra-periphclk
arch/arm/dts/tegra20.dtsi +27 -0
@@ -4,6 +4,33 @@ compatible = "nvidia,tegra20"; interrupt-parent = <&intc>; + clocks = <&osc_clk>; + clock-names = "osc_clk"; + clock-ranges; + + clocks { + #address-cells = <1>; + #size-cells = <1>; + + /* The frequency of this clock is board-specific */ + osc_clk: oscclk { + compatible = "fixed-clock"; + #clock-cells = <0>; + }; + + /* + * This node provides clocks to all peripherals. We don't + * enumerate the clock names for now since there are no + * users of this information. + */ + periph_clk: periphclk { + compatible = "tegra,periphclk"; + #clock-cells = <1>; + clocks = <&osc_clk>; + reg = <0x60006000 400>; + }; + }; + intc: interrupt-controller@50041000 { compatible = "nvidia,tegra20-gic"; interrupt-controller;
doc/device-tree-bindings/clock/tegra-periphclk new file +51 -0
51 lines not on this page · raw message
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-12-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
PATCH 1/1 ARM: tegra: Define Tegra20 CAR binding
Document a binding for the Tegra20 CAR (Clock And Reset) Controller, add it to tegra20.dtsi, and configure it for the board in tegra- seaboard.dts.
---
All, Simon Glass is attempting to upstream Tegra USB support in U-Boot. The driver is only instantiated from device tree, and needs to configure clocks for the USB module. Hence, he proposed a clock binding for Tegra. I've read through Grant's proposed common clock bindings and reworked Simon's proposal a little, ending up with the patch below for the kernel. I'd appreciate any comments you have.
Grant, can you confirm that it's reasonable to start making use of your proposed common clock bindings in U-Boot, even though they're only an RFC?
Grant, there are a couple of FIXMEs in the binding documentation below. Can you give any insight on these?
A comment on the shared enable issue:
When enabling/disabling clocks, Tegra requires you to reset the HW module that the clock is routed to. Both reset and clock enable registers are part of the CAR. U-Boot currently has an API to do the reset based on a "peripheral ID", which simply means a bit number in a set of 3 "reset" registers. The bits in those registers share the same numbering as the "clock enable" registers. Hence, to make life easy for U-Boot, I've defined the clock IDs in this binding to be equal to these bit numbers. However, this breaks down where there isn't a 1:1 mapping between reset and clock enable bits, and clocks. For example, there's a single reset and clock enable bit for the SPDIF controller, yet this applies to two clocks; spdif_in and spdif_out. Hence, this simplification for U-Boot breaks down. I think the correct solution is to fix U-Boot not to require this simplification, renumber the clocks in the CAR binding in a completely arbitrary fashion, and require U-Boot to contain a mapping table between CAR's DT clock IDs and any other information related to those clocks. Do you see any alternative? We really need the two SPDIF clocks to be different clock IDs in the binding, since each has a completely independant mux for the clock source/parent, and the two clocks obviously can't share the same clock ID (well, hmm, perhaps they could if we used 2 cells for the specifier, 1 for the bit number, and one more to differentiate clocks that use the same bit...). I'm still inclined to simply push back on U-Boot to do it right.
.../bindings/clock/nvidia,tegra20-car.txt | 156 ++++++++++++++++++++ arch/arm/boot/dts/tegra-seaboard.dts | 18 +++ arch/arm/boot/dts/tegra20.dtsi | 7 + 3 files changed, 181 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +156 -0
@@ -0,0 +1,156 @@ +* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc". +- #clock-cells : Should be 1. + In clock consumers, this cell represents the clock ID exposed by the CAR. + For a list of valid values, see the clock-output-names property. + +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls. + + 0 "cpu" + 1 "unassigned" + 2 "unassigned" FIXME: Is it OK to have 2 identical (unused) names? + 3 "ac97" + 4 "rtc" + 5 "tmr" + 6 "uart1" + 7 "uart2" + 8 "gpio" + 9 "sdmmc2" + 10 "spdif" FIXME: One enable bit controls two clocks!!! + 11 "i2s1" + 12 "i2c1" + 13 "ndflash" + 14 "sdmmc1" + 15 "sdmmc4" + 16 "twc" + 17 "pwm" + 18 "i2s2" + 19 "epp" + 20 "vi" FIXME: One enable bit controls two clocks!!! + 21 "2d" + 22 "usbd" + 23 "isp" + 24 "3d" + 25 "ide" + 26 "disp2" + 27 "disp1" + 28 "host1x" + 29 "vcp" + 30 "unassigned" + 31 "cache2" + + 32 "mem" + 33 "ahbdma" + 34 "apbdma" + 35 "unassigned" + 36 "kbc" + 37 "stat_mon" + 38 "pmc" + 39 "fuse" + 40 "kfuse" + 41 "sbc1" + 42 "snor" + 43 "spi" + 44 "sbc2" + 45 "xio" + 46 "sbc3" + 47 "dvc_i2c" + 48 "dsi" + 49 "tvo" + 50 "mipi" + 51 "hdmi" + 52 "csi" + 53 "tvdac" + 54 "i2c2" + 55 "uart3" + 56 "unassigned" + 57 "emc" + 58 "usb2" + 59 "usb3" + 60 "mpe" + 61 "vde" + 62 "bsea" + 63 "bsev" + + 64 "speedo" + 65 "uart4" + 66 "uart5" + 67 "i2c3" + 68 "sbc4" + 69 "sdmmc3" + 70 "pcie" + 71 "owr" + 72 "afi" + 73 "csite" + 74 "unassigned" + 75 "avpucq" + 76 "unassigned" + 77 "unassigned" + 78 "unassigned" + 79 "unassigned" + 80 "unassigned" + 81 "unassigned" + 82 "unassigned" + 83 "unassigned" + 84 "irama" + 85 "iramb" + 86 "iramc" + 87 "iramd" + 88 "cram2" + 89 "audio_2x" + 90 "clk_d" + 91 "unassigned" + 92 "sus" + 93 "cdev1" + 94 "cdev2" + 95 "unassigned" + +Example: + +clocks { + clk_32k: oscillator@0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; +}; + +tegar_car: clock@60006000 { + compatible = "tegra,periphclk"; + reg = <0x60006000 1000>; + clocks = <&clk_32k> <&osc>; + clock-names = "32k_in", "osc"; + #clock-cells = <1>; +}; + +usb@c5004000 { + ... + clocks = <&tegra_car 58>; /* usb2 */ +};
arch/arm/boot/dts/tegra-seaboard.dts +18 -0
@@ -11,6 +11,24 @@ reg = < 0x00000000 0x40000000 >; }; + clocks { + clk_32k: oscillator@0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; + }; + + clock@60006000 { + clocks = <&clk_32k> <&osc>; + }; + i2c@7000c000 { clock-frequency = <400000>; };
arch/arm/boot/dts/tegra20.dtsi +7 -0
@@ -4,6 +4,13 @@ compatible = "nvidia,tegra20"; interrupt-parent = <&intc>; + tegar_car: clock@60006000 { + compatible = "tegra,periphclk"; + reg = <0x60006000 1000>; + clock-names = "32k_in", "osc"; + #clock-cells = <1>; + }; + intc: interrupt-controller@50041000 { compatible = "arm,cortex-a9-gic"; interrupt-controller;
Signature · 1 line
1.7.0.4
A message that is not in the archive (sent off-list or not yet received): 1326932212-30346-1-git-send-email-swarren-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Hi,
Quoted 17 lines · Stephen Warren
.../bindings/clock/nvidia,tegra20-car.txt | 156 ++++++++++++++++++++ arch/arm/boot/dts/tegra-seaboard.dts | 18 +++ arch/arm/boot/dts/tegra20.dtsi | 7 + 3 files changed, 181 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txtDocumentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +5
-0@@ -0,0 +1,156 @@ +* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt +
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 15
Quoted 10 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +10
-0+The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc".
Hmm. I'd prefer to just ditch the notion of "clock-names" in the cases where it isn't strictly necessary. Just because some vendors don't want to define an order between their clocks doesn't mean it's a good idea for everybody to use that model. In this case, just declaring that the two clocks refs have to be to those two clocks in that order should be sufficient.
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 28
Quoted 13 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +13
-0+- #clock-cells : Should be 1. + In clock consumers, this cell represents the clock ID exposed by the CAR. + For a list of valid values, see the clock-output-names property. + +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls.
Aren't these names hardcoded per SoC? If so, they can be derived from the compatible field + output number without having a table in the device tree.
If anything, you might want to enumerate the allowed/expected values, but actually putting them in a property seems overkill.
[...]
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 132
Quoted 4 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {
If it has a unit addres (@<x>) it needs a reg property with the same base address.
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 145
Quoted 13 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +13
-0+ compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; +}; + +tegar_car: clock@60006000 {
typo? tegra_car?
Quoted 11 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +11
-0+ compatible = "tegra,periphclk"; + reg = <0x60006000 1000>; + clocks = <&clk_32k> <&osc>; + clock-names = "32k_in", "osc"; + #clock-cells = <1>; +}; + +usb@c5004000 { + ... + clocks = <&tegra_car 58>; /* usb2 */ +};
A message that is not in the archive (sent off-list or not yet received): [email protected]
RE: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 16 lines · Stephen Warren
Quoted 15 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +14
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in",
Quoted 8 lines
Quoted 1 line
+ and "osc".
Hmm. I'd prefer to just ditch the notion of "clock-names" in the cases where it isn't strictly necessary. Just because some vendors don't want to define an order between their clocks doesn't mean it's a good idea for everybody to use that model. In this case, just declaring that the two clocks refs have to be to those two clocks in that order should be sufficient.
OK, that seems reasonable. I'm happy using of_clk_get() rather than of_clk_get_by_name(). I guess that means we should just avoid any discussion of clock-output-names too.
Quoted 17 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 28
Quoted 13 lines
+- #clock-cells : Should be 1.
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +12
-0+ In clock consumers, this cell represents the clock ID exposed by the CAR. + For a list of valid values, see the clock-output-names property. + +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls.Aren't these names hardcoded per SoC? If so, they can be derived from the compatible field + output number without having a table in the device tree.
Quoted 2 lines
If anything, you might want to enumerate the allowed/expected values, but actually putting them in a property seems overkill.
Yes, the set of clocks is hard-coded per SoC, and the clock is uniquely identified by compatible+id.
clock-output-names doesn't actually serve any functional purpose in Grant's common clock bindings patches; it's more of a documentation thing. As such, yes, I can remove the suggestion to actually put the table into the device tree, and rework the binding to simply define what the mapping is independently.
...
Quoted 7 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 132
Quoted 4 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {If it has a unit addres (@<x>) it needs a reg property with the same base address.
I thought everything needed a unit address period? Is the rule more like the unit address is optional, but if present must match reg, so I can simply remove @0 and @1 here? I guess that makes a lot more sense.
Quoted 11 lines
Quoted 11 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +11
-0+ compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; +};
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): 74CDBE0F657A3D45AFBB94109FB122FF1780DAB0CA-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Hi,
Quoted 26 lines · Stephen Warren
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 16 lines · Stephen Warren
Quoted 15 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +14
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in",Quoted 8 lines
Quoted 1 line
+ and "osc".
Hmm. I'd prefer to just ditch the notion of "clock-names" in the cases where it isn't strictly necessary. Just because some vendors don't want to define an order between their clocks doesn't mean it's a good idea for everybody to use that model. In this case, just declaring that the two clocks refs have to be to those two clocks in that order should be sufficient.
Quoted 3 lines
OK, that seems reasonable. I'm happy using
of_clk_get()rather thanof_clk_get_by_name(). I guess that means we should just avoid any discussion of clock-output-names too.
Sounds good to me. Let's make sure Grant is OK with it too though.
Quoted 20 lines
Quoted 17 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 28
Quoted 13 lines
+- #clock-cells : Should be 1.
+ In clock consumers, this cell represents the clock ID exposed by the CAR.
+ For a list of valid values, see the clock-output-names property.Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +10
-0+ +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls.Aren't these names hardcoded per SoC? If so, they can be derived from the compatible field + output number without having a table in the device tree.
Quoted 2 lines
If anything, you might want to enumerate the allowed/expected values, but actually putting them in a property seems overkill.
Quoted 8 lines
Yes, the set of clocks is hard-coded per SoC, and the clock is uniquely identified by compatible+id.
clock-output-names doesn't actually serve any functional purpose in Grant's common clock bindings patches; it's more of a documentation thing. As such, yes, I can remove the suggestion to actually put the table into the device tree, and rework the binding to simply define what the mapping is independently.
Again, sounds good to me.
Quoted 11 lines
Quoted 7 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 132
Quoted 4 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {If it has a unit addres (@<x>) it needs a reg property with the same base address.
I thought everything needed a unit address period? Is the rule more like the unit address is optional, but if present must match reg, so I can simply remove @0 and @1 here? I guess that makes a lot more sense.
Nope, you only need a unit address to make a node unique, i.e. if you have more than one with the same name. It's not something that's been followed very well on ARM dts files, I have even seen review comments asking for explicit unit IDs when none are needed.
So you can't remove @0 and @1 here, since there are two oscillator subnodes.
I'm not 100% sure if you have to have the unit address represented as "reg" or not, but it should probably be represented by _something_ in the properties of the node. Mitch? Segher? :)
Quoted 11 lines
Quoted 11 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 143
Quoted 11 lines
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <32768>;
+ };Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +7
-0+ + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; +};
-Olof
A message that is not in the archive (sent off-list or not yet received): CAOesGMh=i3EED-XhOpwGj8Vuma3xA0WehRL1iK1LSZfEuetP6Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Quoted 83 lines · Olof Johansson
Hi,
Quoted 26 lines · Stephen Warren
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 16 lines · Stephen Warren
Quoted 15 lines
(quoted diff) +14
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in",Quoted 8 lines
Quoted 1 line
+ and "osc".
Hmm. I'd prefer to just ditch the notion of "clock-names" in the cases where it isn't strictly necessary. Just because some vendors don't want to define an order between their clocks doesn't mean it's a good idea for everybody to use that model. In this case, just declaring that the two clocks refs have to be to those two clocks in that order should be sufficient.
Quoted 3 lines
OK, that seems reasonable. I'm happy using
of_clk_get()rather thanof_clk_get_by_name(). I guess that means we should just avoid any discussion of clock-output-names too.Sounds good to me. Let's make sure Grant is OK with it too though.
Quoted 20 lines
Quoted 17 lines
Review
Quoted 13 lines
+- #clock-cells : Should be 1.
(quoted diff) +12
-0+ In clock consumers, this cell represents the clock ID exposed by the CAR. + For a list of valid values, see the clock-output-names property. + +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls.Aren't these names hardcoded per SoC? If so, they can be derived from the compatible field + output number without having a table in the device tree.
Quoted 2 lines
If anything, you might want to enumerate the allowed/expected values, but actually putting them in a property seems overkill.
Quoted 8 lines
Yes, the set of clocks is hard-coded per SoC, and the clock is uniquely identified by compatible+id.
clock-output-names doesn't actually serve any functional purpose in Grant's common clock bindings patches; it's more of a documentation thing. As such, yes, I can remove the suggestion to actually put the table into the device tree, and rework the binding to simply define what the mapping is independently.
Again, sounds good to me.
Quoted 11 lines
Quoted 7 lines
Review
Quoted 4 lines
(quoted diff) +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {If it has a unit addres (@<x>) it needs a reg property with the same base address.
I thought everything needed a unit address period? Is the rule more like the unit address is optional, but if present must match reg, so I can simply remove @0 and @1 here? I guess that makes a lot more sense.
Nope, you only need a unit address to make a node unique, i.e. if you have more than one with the same name. It's not something that's been followed very well on ARM dts files, I have even seen review comments asking for explicit unit IDs when none are needed.
Quoted 5 lines
So you can't remove @0 and @1 here, since there are two oscillator subnodes.
I'm not 100% sure if you have to have the unit address represented as "reg" or not, but it should probably be represented by _something_ in the properties of the node. Mitch? Segher? :)
unit-address is, by definition, the first address component of reg
Quoted 18 lines
Quoted 13 lines
Quoted 13 lines
Review
Quoted 13 lines
(quoted diff) +11
-0+ compatible = "fixed-clock"; + #clock-cells =<0>; + clock-frequency =<32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells =<0>; + clock-frequency =<12000000>; + }; +};-Olof
RE: [PATCH] ARM: tegra: Define Tegra20 CAR binding
In reply to a message not in the archiveOlof Johansson wrote at Saturday, January 21, 2012 12:32 AM:
Quoted 19 lines · Stephen Warren
Quoted 18 lines
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 17 lines · Stephen Warren
Quoted 16 lines
(quoted diff) +15
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc".
...
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Review
Quoted 4 lines
(quoted diff) +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {If it has a unit addres (@<x>) it needs a reg property with the same base address.
I thought everything needed a unit address period? Is the rule more like the unit address is optional, but if present must match reg, so I can simply remove @0 and @1 here? I guess that makes a lot more sense.
Quoted 6 lines
Nope, you only need a unit address to make a node unique, i.e. if you have more than one with the same name. It's not something that's been followed very well on ARM dts files, I have even seen review comments asking for explicit unit IDs when none are needed.
So you can't remove @0 and @1 here, since there are two oscillator subnodes.
If I keep the unit address, then I need to add a reg property per Mitch's response. But, then I need #address-cells and #size-cells in the clock node too. Yuck, since this isn't an addressable bus.
Instead, is it acceptable to simply rename the nodes to e.g.:
clk_32k: clock {...};
osc: crystal {...};
In the long term, I believe that osc/crystal is going to continue to be a top-level object, but clk_32k is actually an output from the PMU chip, and hence there won't be any naming conflict here anyway...
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): 74CDBE0F657A3D45AFBB94109FB122FF178CB81A90-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Quoted 40 lines · Stephen Warren
Olof Johansson wrote at Saturday, January 21, 2012 12:32 AM:
Quoted 19 lines · Stephen Warren
Quoted 18 lines
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 17 lines · Stephen Warren
Quoted 16 lines
(quoted diff) +15
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc"....
Quoted 12 lines
Quoted 11 lines
Quoted 7 lines
Review
Quoted 4 lines
(quoted diff) +4
-0+Example: + +clocks { + clk_32k: oscillator@0 {If it has a unit addres (@<x>) it needs a reg property with the same base address.
I thought everything needed a unit address period? Is the rule more like the unit address is optional, but if present must match reg, so I can simply remove @0 and @1 here? I guess that makes a lot more sense.
Quoted 6 lines
Nope, you only need a unit address to make a node unique, i.e. if you have more than one with the same name. It's not something that's been followed very well on ARM dts files, I have even seen review comments asking for explicit unit IDs when none are needed.
So you can't remove @0 and @1 here, since there are two oscillator subnodes.
Quoted 8 lines
If I keep the unit address, then I need to add a reg property per Mitch's response. But, then I need #address-cells and #size-cells in the clock node too. Yuck, since this isn't an addressable bus.
Instead, is it acceptable to simply rename the nodes to e.g.:
clk_32k: clock {...};
osc: crystal {...};
One consideration: These nodes are children of a parent, so that parent is implicitly a "bus node", even though there is no physical hardware bus. The path resolution rules say that, in the absence of a "#address-cells" property in a bus node, the default value is 2. So any code that implements that rule will think these nodes are missing a "reg" property, thus triggering the "wildcard node" rule, which says that you can match the node with any unit address.
Whether or not that would cause problems in practice is hard to say. I think that my Open Firmware implementation would handle it okay, but I can't speak to the Linux device tree code.
I'm not sure why you thing "yuck" about synthesizing an address space for the subnodes. It doesn't seem that bad to me.
Quoted 5 lines
In the long term, I believe that osc/crystal is going to continue to be a top-level object, but
clk_32kis actually an output from the PMU chip, and hence there won't be any naming conflict here anyway...
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
In reply to a message not in the archiveQuoted 29 lines · Olof Johansson
Hi,
Quoted 26 lines · Stephen Warren
Olof Johansson wrote at Wednesday, January 18, 2012 10:32 PM:
Quoted 24 lines · Stephen Warren
Quoted 6 lines
(quoted diff) +5
-0+* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt +Review
Quoted 10 lines
(quoted diff) +10
-0+The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc".Hmm. I'd prefer to just ditch the notion of "clock-names" in the cases where it isn't strictly necessary. Just because some vendors don't want to define an order between their clocks doesn't mean it's a good idea for everybody to use that model. In this case, just declaring that the two clocks refs have to be to those two clocks in that order should be sufficient.
Quoted 5 lines
Quoted 3 lines
OK, that seems reasonable. I'm happy using
of_clk_get()rather thanof_clk_get_by_name(). I guess that means we should just avoid any discussion of clock-output-names too.Sounds good to me. Let's make sure Grant is OK with it too though.
Yes, I agree.
g.
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
In reply to a message not in the archiveHi Stephen,
Quoted 35 lines · Stephen Warren
Document a binding for the Tegra20 CAR (Clock And Reset) Controller, add it to
tegra20.dtsi, and configure it for the board in tegra-seaboard.dts.Signed-off-by Stephen Warren <[email protected]>---
All, Simon Glass is attempting to upstream Tegra USB support in U-Boot. The driver is only instantiated from device tree, and needs to configure clocks for the USB module. Hence, he proposed a clock binding for Tegra. I've read through Grant's proposed common clock bindings and reworked Simon's proposal a little, ending up with the patch below for the kernel. I'd appreciate any comments you have.Grant, can you confirm that it's reasonable to start making use of your proposed common clock bindings in U-Boot, even though they're only an RFC?
Grant, there are a couple of FIXMEs in the binding documentation below. Can you give any insight on these?
A comment on the shared enable issue:
When enabling/disabling clocks, Tegra requires you to reset the HW module that the clock is routed to. Both reset and clock enable registers are part of the CAR. U-Boot currently has an API to do the reset based on a "peripheral ID", which simply means a bit number in a set of 3 "reset" registers. The bits in those registers share the same numbering as the "clock enable" registers. Hence, to make life easy for U-Boot, I've defined the clock IDs in this binding to be equal to these bit numbers. However, this breaks down where there isn't a 1:1 mapping between reset and clock enable bits, and clocks. For example, there's a single reset and clock enable bit for the SPDIF controller, yet this applies to two clocks;
spdif_inandspdif_out. Hence, this simplification for U-Boot breaks down. I think the correct solution is to fix U-Boot not to require this simplification, renumber the clocks in the CAR binding in a completely arbitrary fashion, and require U-Boot to contain a mapping
Quoted 8 lines
table between CAR's DT clock IDs and any other information related to those clocks. Do you see any alternative? We really need the two SPDIF clocks to be different clock IDs in the binding, since each has a completely independant mux for the clock source/parent, and the two clocks obviously can't share the same clock ID (well, hmm, perhaps they could if we used 2 cells for the specifier, 1 for the bit number, and one more to differentiate clocks that use the same bit...). I'm still inclined to simply push back on U-Boot to do it right.
Are SPDIF and VI the only examples of this? If so, perhaps just having a special extra clock ID for those two and mapping in a special way would be more efficient. So two IDs would map to one clock/reset bit but different clocks.
Also I note that one is an input and one is an output clock. So we could name them this way, and use the separate ID for the input clocks perhaps.
If you do add an arbitrary mapping, what would it be? It might as well follow along with the registers so far as it can, since the device tree should describe the hardware. Then the mapping becomes a few lines of code in the driver instead of YAT (yet another table).
Poor U-Boot doesn't even use the SPDIF or vi controllers.
Quoted 31 lines
.../bindings/clock/nvidia,tegra20-car.txt | 156 ++++++++++++++++++++
arch/arm/boot/dts/tegra-seaboard.dts| 18 +++arch/arm/boot/dts/tegra20.dtsi| 7 +3 files changed, 181 insertions(+), 0 deletions(-)create mode 100644
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txtDocumentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +18
-0@@ -0,0 +1,156 @@ +* NVIDIA Tegra20 Clock And Reset Controller + +This binding uses the common clock binding: +Documentation/devicetree/bindings/clock/clock-bindings.txt + +The CAR (Clock And Reset) Controller on Tegra is the HW module responsible +for muxing and gating Tegra's clocks, and setting their rates. + +Required properties : +- compatible : Should be "nvidia,<chip>-car" +- reg : Should contain CAR registers location and length +- clocks : Should contain phandle and clock specifiers for two clocks: + the 32 KHz "32k_in", and the board-specific oscillator "osc". +- clock-names : Should contain a list of strings, with values "32k_in", + and "osc". +- #clock-cells : Should be 1. + In clock consumers, this cell represents the clock ID exposed by the CAR. + For a list of valid values, see the clock-output-names property.
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 28
Quoted 10 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +10
-0+ +Optional properties : +- clock-output-names : Should contain a list of strings defining the clocks + that the CAR provides. The list of names and clock IDs is below. The IDs + may be used in clock specifiers. The names should be listed in this clock- + output-names property, sorted in ID order, if this property is present. + + The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB + registers. Later, subsequent IDs will be assigned to all other clocks the + CAR controls.
I hope that at some point these would have symbolic names so that we don't need to use open-coded integers in the device tree cells.
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 32
Quoted 4 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +4
-0+ + 0 "cpu" + 1 "unassigned" + 2 "unassigned" FIXME: Is it OK to have 2 identical (unused) names?
Or in fact just empty so save space?
Quoted 105 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +105
-0+ 3 "ac97" + 4 "rtc" + 5 "tmr" + 6 "uart1" + 7 "uart2" + 8 "gpio" + 9 "sdmmc2" + 10 "spdif" FIXME: One enable bit controls two clocks!!! + 11 "i2s1" + 12 "i2c1" + 13 "ndflash" + 14 "sdmmc1" + 15 "sdmmc4" + 16 "twc" + 17 "pwm" + 18 "i2s2" + 19 "epp" + 20 "vi" FIXME: One enable bit controls two clocks!!! + 21 "2d" + 22 "usbd" + 23 "isp" + 24 "3d" + 25 "ide" + 26 "disp2" + 27 "disp1" + 28 "host1x" + 29 "vcp" + 30 "unassigned" + 31 "cache2" + + 32 "mem" + 33 "ahbdma" + 34 "apbdma" + 35 "unassigned" + 36 "kbc" + 37 "stat_mon" + 38 "pmc" + 39 "fuse" + 40 "kfuse" + 41 "sbc1" + 42 "snor" + 43 "spi" + 44 "sbc2" + 45 "xio" + 46 "sbc3" + 47 "dvc_i2c" + 48 "dsi" + 49 "tvo" + 50 "mipi" + 51 "hdmi" + 52 "csi" + 53 "tvdac" + 54 "i2c2" + 55 "uart3" + 56 "unassigned" + 57 "emc" + 58 "usb2" + 59 "usb3" + 60 "mpe" + 61 "vde" + 62 "bsea" + 63 "bsev" + + 64 "speedo" + 65 "uart4" + 66 "uart5" + 67 "i2c3" + 68 "sbc4" + 69 "sdmmc3" + 70 "pcie" + 71 "owr" + 72 "afi" + 73 "csite" + 74 "unassigned" + 75 "avpucq" + 76 "unassigned" + 77 "unassigned" + 78 "unassigned" + 79 "unassigned" + 80 "unassigned" + 81 "unassigned" + 82 "unassigned" + 83 "unassigned" + 84 "irama" + 85 "iramb" + 86 "iramc" + 87 "iramd" + 88 "cram2" + 89 "audio_2x" + 90 "clk_d" + 91 "unassigned" + 92 "sus" + 93 "cdev1" + 94 "cdev2" + 95 "unassigned" + +Example: + +clocks { + clk_32k: oscillator@0 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; +
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt line 147
Quoted 10 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +10
-0+ osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + }; +}; + +tegar_car: clock@60006000 { + compatible = "tegra,periphclk"; + reg = <0x60006000 1000>;
0x1000 ?
Quoted 19 lines
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt new file +9
-0+ clocks = <&clk_32k> <&osc>; + clock-names = "32k_in", "osc"; + #clock-cells = <1>; +}; + +usb@c5004000 { + ... + clocks = <&tegra_car 58>; /* usb2 */ +};arch/arm/boot/dts/tegra-seaboard.dts +2
-0@@ -11,6 +11,24 @@ reg = < 0x00000000 0x40000000 >; }; + clocks { + clk_32k: oscillator@0 {
arch/arm/boot/dts/tegra-seaboard.dts line 25
Quoted 10 lines
arch/arm/boot/dts/tegra-seaboard.dts +10
-0+ compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + }; + + osc: oscillator@1 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <12000000>; + };
Is there a reason why these two nodes are in the tegra20.dtsi include file? Is it because some boards don't have one of these clocks? Or because the frequency is not know? If the former, perhaps used status = "disabled" and if the latter perhaps define only the frequency in this file? Just trying to reduce boilerplate and complexity for board bring-up engineers.
Also the oscillator frequency seems to be detected at run-time. What happens if it doesn't match the fdt? Should be not detect it at run-time?
arch/arm/boot/dts/tegra-seaboard.dts line 29
Quoted 4 lines
arch/arm/boot/dts/tegra-seaboard.dts +4
-0+ }; + + clock@60006000 { + clocks = <&clk_32k> <&osc>;
Why is the clocks property here, but the clock-names property in the include file?
Quoted 10 lines
arch/arm/boot/dts/tegra-seaboard.dts +2
-0+ }; + i2c@7000c000 { clock-frequency = <400000>; };arch/arm/boot/dts/tegra20.dtsi +0
-0
arch/arm/boot/dts/tegra20.dtsi line 7
Quoted 4 lines
arch/arm/boot/dts/tegra20.dtsi +1
-0@@ -4,6 +4,13 @@ compatible = "nvidia,tegra20"; interrupt-parent = <&intc>; + tegar_car: clock@60006000 {
Is car a standard name? If not tegra_clk_rst would be an alternative.
arch/arm/boot/dts/tegra20.dtsi line 9
Quoted 2 lines
arch/arm/boot/dts/tegra20.dtsi +2
-0+ compatible = "tegra,periphclk"; + reg = <0x60006000 1000>;
0x1000 ?
Quoted 10 lines
arch/arm/boot/dts/tegra20.dtsi +4
-1+ clock-names = "32k_in", "osc"; + #clock-cells = <1>; + }; + intc: interrupt-controller@50041000 { compatible = "arm,cortex-a9-gic"; interrupt-controller; --1.7.0.4
Regards,
Simon
A message that is not in the archive (sent off-list or not yet received): CAPnjgZ2t9FnEubWmLyNMGGhr=jEmfb1qzK=SAzRopjbCbHKdrA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
RE: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Simon Glass wrote at Sunday, January 22, 2012 11:03 AM:
Quoted 4 lines · Stephen Warren
Quoted 3 lines
Document a binding for the Tegra20 CAR (Clock And Reset) Controller, add it to
tegra20.dtsi, and configure it for the board in tegra-seaboard.dts.
...
Quoted 25 lines
Quoted 16 lines
A comment on the shared enable issue:
When enabling/disabling clocks, Tegra requires you to reset the HW module that the clock is routed to. Both reset and clock enable registers are part of the CAR. U-Boot currently has an API to do the reset based on a "peripheral ID", which simply means a bit number in a set of 3 "reset" registers. The bits in those registers share the same numbering as the "clock enable" registers. Hence, to make life easy for U-Boot, I've defined the clock IDs in this binding to be equal to these bit numbers. However, this breaks down where there isn't a 1:1 mapping between reset and clock enable bits, and clocks. For example, there's a single reset and clock enable bit for the SPDIF controller, yet this applies to two clocks;
spdif_inandspdif_out. Hence, this simplification for U-Boot breaks down. I think the correct solution is to fix U-Boot not to require this simplification, renumber the clocks in the CAR binding in a completely arbitrary fashion, and require U-Boot to contain a mappingQuoted 8 lines
table between CAR's DT clock IDs and any other information related to those clocks. Do you see any alternative? We really need the two SPDIF clocks to be different clock IDs in the binding, since each has a completely independant mux for the clock source/parent, and the two clocks obviously can't share the same clock ID (well, hmm, perhaps they could if we used 2 cells for the specifier, 1 for the bit number, and one more to differentiate clocks that use the same bit...). I'm still inclined to simply push back on U-Boot to do it right.
Quoted 1 line
Are SPDIF and VI the only examples of this?
I think so. I should double-check to be sure though before committing to a final binding.
Quoted 4 lines
If so, perhaps just having
a special extra clock ID for those two and mapping in a special way would be more efficient. So two IDs would map to one clock/reset bit but different clocks.
I thought about that initially, but it doesn't make semantic sense; there isn't a 1:1 mapping between clock ID and reset bit, so I don't think we should pretend there is for some clocks, and special-case others.
Quoted 3 lines
Also I note that one is an input and one is an output clock. So we could name them this way, and use the separate ID for the input clocks perhaps.
I don't think that solves the problem; HW modules and drivers use both clocks, so special-casing the input clocks doesn't make the problem less relevant.
Quoted 4 lines
If you do add an arbitrary mapping, what would it be? It might as well follow along with the registers so far as it can, since the device tree should describe the hardware. Then the mapping becomes a few lines of code in the driver instead of YAT (yet another table).
The mapping would be that the clock IDs are unrelated to the bit numbers in the CAR's reset/clock-enable registers.
In practice, this means that to find the reset bit number, you need a table indexed by the .dts's clock number, with the bit number being retrieved from that table.
So instead of bit = of_get_u32(1), we'd have bit = table[of_get_u32(1)].
In practice, I believe we'll need such a table anyway, since each clock has many more parameters than just the reset bit ID; some clocks have no reset bit at all, some clocks have a mux but some don't, the inputs to the mux are different for each clock, some have a divider but some don't, where there's a divider or mux, you need to know the register address to configure them, each clock has a different max rate, etc.
Having thought a little more about this, I'm definitely leaning towards this way; making the clock ID and register bit completely unrelated just to make it really obvious that you can't use the clock ID as a register bit.
Signature · 1 line
nvpublic
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
In reply to a message not in the archiveWhat about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
Thanks,
Peter.
A message that is not in the archive (sent off-list or not yet received): 20120124095241.GO10446-Rysk9IDjsxmJz7etNGeUX8VPkgjIgRvpAL8bYrjMMd8@public.gmane.org
RE: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Peter De Schrijver wrote at Tuesday, January 24, 2012 2:53 AM:
Quoted 4 lines
What about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
In most cases, I think the resets are handled purely within clock enable and disable, so there's no need to explicitly manage them or represent them in the device tree. Do you agree here?
I recall that you mentioned some power-management code might need to manage reset separately though. Can you explain why a module would be reset separately from disabling the clocks though?
If we do need this, I think we can just add a property to the node of each device that needs such explicit management. Something like:
tegra_car: clock@60006000 {
compatible = "nvidia,tegra20-car";
....
};foo@70007000 {
compatible = "nvidia,tegra20-foo";
regs = <...>;
nvidia,car-reset-id = <&tegra_car 30>;
};And the driver for "foo" can ignore cell 0, and extract the cell 1 and pass the value to tegra_periph_reset_assert().
I'd expect to put the CAR phandle into the property in case we ever get a more generalized reset subsystem, and need more general code to interpret the property. I did the same for the Tegra APB DMA controller client binding where clients need to know the "DMA select" value.
Does that all seem reasonable?
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): 74CDBE0F657A3D45AFBB94109FB122FF178CB81EC4-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Quoted 9 lines · Stephen Warren
Peter De Schrijver wrote at Tuesday, January 24, 2012 2:53 AM:
Quoted 4 lines
What about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
In most cases, I think the resets are handled purely within clock enable and disable, so there's no need to explicitly manage them or represent them in the device tree. Do you agree here?
clk_enable could force a deasserted reset, but clk_disable cannot imply asserting reset. The clocks need to be turned off for power management without resetting the registers.
Quoted 3 lines
I recall that you mentioned some power-management code might need to manage reset separately though. Can you explain why a module would be reset separately from disabling the clocks though?
The TRM lists a very specific sequence of clocks, resets, clamps, and power for power domain gating. Other than that, I think the only use for directly calling reset that ended up in the Android Tegra2 tree was for error recovery on HW blocks that could get locked up, probably I2C.
Quoted 27 lines
If we do need this, I think we can just add a property to the node of each device that needs such explicit management. Something like:
tegra_car: clock@60006000 {
compatible = "nvidia,tegra20-car";
....
};foo@70007000 {
compatible = "nvidia,tegra20-foo";
regs = <...>;
nvidia,car-reset-id = <&tegra_car30>;
};And the driver for "foo" can ignore cell 0, and extract the cell 1 and pass the value to
tegra_periph_reset_assert().I'd expect to put the CAR phandle into the property in case we ever get a more generalized reset subsystem, and need more general code to interpret the property. I did the same for the Tegra APB DMA controller client binding where clients need to know the "DMA select" value.
Does that all seem reasonable?
--
nvpublic
A message that is not in the archive (sent off-list or not yet received): CAMbhsRQYt7RoXTDDPxCgGG2UX5_T86saOyns_0f_Sz-p7-gMTw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
RE: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Colin Cross wrote at Tuesday, January 24, 2012 3:33 PM:
Quoted 7 lines · Stephen Warren
Quoted 6 lines
Peter De Schrijver wrote at Tuesday, January 24, 2012 2:53 AM:
Quoted 4 lines
What about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
Quoted 7 lines
Quoted 3 lines
In most cases, I think the resets are handled purely within clock enable and disable, so there's no need to explicitly manage them or represent them in the device tree. Do you agree here?
clk_enablecould force a deasserted reset, butclk_disablecannot imply asserting reset. The clocks need to be turned off for power management without resetting the registers.
Yes, I just spoke to someone off-list, and he said the same thing. He went on to say that therefore even the reset removal with clk_enable was questionable, and that drivers should explicitly manage reset removal themselves. Does that seem a reasonable stance? It'd certainly take away the somewhat asymmetric nature of reset removal just magically working when you first enable the clocks. We'd presumably then want a common reset infra-structure and binding to match that change?
(I know that'd make Simon happy, since then we'd be able to represent the reset IDs directly everywhere, unrelated to the clock IDs, and hence he could just use the reset IDs directly in the U-Boot code he's writing and ignore the non 1:1 mapping between clock and reset IDs)
Quoted 9 lines
Quoted 3 lines
I recall that you mentioned some power-management code might need to manage reset separately though. Can you explain why a module would be reset separately from disabling the clocks though?
The TRM lists a very specific sequence of clocks, resets, clamps, and power for power domain gating. Other than that, I think the only use for directly calling reset that ended up in the Android Tegra2 tree was for error recovery on HW blocks that could get locked up, probably I2C.
OK, those reasons make sense.
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): 74CDBE0F657A3D45AFBB94109FB122FF178CB81EEB-C7FfzLzN0UxDw2glCA4ptUEOCMrvLtNR@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Quoted 16 lines · Stephen Warren
Colin Cross wrote at Tuesday, January 24, 2012 3:33 PM:
Quoted 7 lines · Stephen Warren
Quoted 6 lines
Peter De Schrijver wrote at Tuesday, January 24, 2012 2:53 AM:
Quoted 4 lines
What about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
Quoted 7 lines
Quoted 3 lines
In most cases, I think the resets are handled purely within clock enable and disable, so there's no need to explicitly manage them or represent them in the device tree. Do you agree here?
clk_enablecould force a deasserted reset, butclk_disablecannot imply asserting reset. The clocks need to be turned off for power management without resetting the registers.
Quoted 7 lines
Yes, I just spoke to someone off-list, and he said the same thing. He went on to say that therefore even the reset removal with
clk_enablewas questionable, and that drivers should explicitly manage reset removal themselves. Does that seem a reasonable stance? It'd certainly take away the somewhat asymmetric nature of reset removal just magically working when you first enable the clocks. We'd presumably then want a common reset infra-structure and binding to match that change?
In 99% of drivers reset is irrelevant, as long as the block is out of reset by the time the driver starts writing to registers. clk_enable is a decent place to ensure that - it always has to be done before writing to the registers, and it maps nicely to the reset bits on Tegra. It would be nice if those driver didn't need to deassert reset explicitly, especially if that requires a Tegra-specific API.
Quoted 20 lines
(I know that'd make Simon happy, since then we'd be able to represent the reset IDs directly everywhere, unrelated to the clock IDs, and hence he could just use the reset IDs directly in the U-Boot code he's writing and ignore the non 1:1 mapping between clock and reset IDs)
Quoted 9 lines
Quoted 3 lines
I recall that you mentioned some power-management code might need to manage reset separately though. Can you explain why a module would be reset separately from disabling the clocks though?
The TRM lists a very specific sequence of clocks, resets, clamps, and power for power domain gating. Other than that, I think the only use for directly calling reset that ended up in the Android Tegra2 tree was for error recovery on HW blocks that could get locked up, probably I2C.
OK, those reasons make sense.
--
nvpublic
A message that is not in the archive (sent off-list or not yet received): CAMbhsRScz4edCr4Cxa=QbBhuYW1M3GsbKhCbFuo5Zu9PRdNfSg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH] ARM: tegra: Define Tegra20 CAR binding
Quoted 25 lines · Colin Cross
Quoted 16 lines · Stephen Warren
Colin Cross wrote at Tuesday, January 24, 2012 3:33 PM:
Quoted 7 lines · Stephen Warren
Quoted 6 lines
Peter De Schrijver wrote at Tuesday, January 24, 2012 2:53 AM:
Quoted 4 lines
What about the peripheral resets which are also handled by CAR? Peripheral clock nodes also offer assert and deassert methods for the reset signal associated with them. Those methods are used when powergating domains for example. Should we model this in the same binding?
Quoted 7 lines
Quoted 3 lines
In most cases, I think the resets are handled purely within clock enable and disable, so there's no need to explicitly manage them or represent them in the device tree. Do you agree here?
clk_enablecould force a deasserted reset, butclk_disablecannot imply asserting reset. The clocks need to be turned off for power management without resetting the registers.Quoted 7 lines
Yes, I just spoke to someone off-list, and he said the same thing. He went on to say that therefore even the reset removal with
clk_enablewas questionable, and that drivers should explicitly manage reset removal themselves. Does that seem a reasonable stance? It'd certainly take away the somewhat asymmetric nature of reset removal just magically working when you first enable the clocks. We'd presumably then want a common reset infra-structure and binding to match that change?
Quoted 6 lines
In 99% of drivers reset is irrelevant, as long as the block is out of reset by the time the driver starts writing to registers.
clk_enableis a decent place to ensure that - it always has to be done before writing to the registers, and it maps nicely to the reset bits on Tegra. It would be nice if those driver didn't need to deassert reset explicitly, especially if that requires a Tegra-specific API.
I think this could be solved by moving the drivers to runtime PM and handle the clock and reset bits in tegra platform device specific code. iirc that's the way it's handled in OMAP?
Cheers,
Peter.
PATCH v4 12/20 tegra: usb: fdt: Add additional device tree definitions for USB ports
In reply to a message not in the archiveThis adds clock references to the USB part of the device tree for U-Boot.
The USB timing information may vary between boards sometimes, but for now we hard-code it in C. This is because all current T2x boards use the same values, we will deal with T3x later and we first need to agree on the format for this timing information in the fdt and may in fact decide that it has no place there.
---
arch/arm/dts/tegra20.dtsi | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
arch/arm/dts/tegra20.dtsi +3 -0
@@ -176,6 +176,7 @@ reg = <0xc5000000 0x4000>; interrupts = < 52 >; phy_type = "utmi"; + clocks = <&periph_clk 22>; // PERIPH_ID_USBD }; usb@c5004000 {
@@ -183,6 +184,7 @@ reg = <0xc5004000 0x4000>; interrupts = < 53 >; phy_type = "ulpi"; + clocks = <&periph_clk 58>; // PERIPH_ID_USB2 }; usb@c5008000 {
@@ -190,6 +192,7 @@ reg = <0xc5008000 0x4000>; interrupts = < 129 >; phy_type = "utmi"; + clocks = <&periph_clk 59>; // PERIPH_ID_USB3 }; };
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-13-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Re: [PATCH v4 12/20] tegra: usb: fdt: Add additional device tree definitions for USB ports
arch/arm/dts/tegra20.dtsi
Quoted 11 lines · Simon Glass
This adds clock references to the USB part of the device tree for U-Boot.
The USB timing information may vary between boards sometimes, but for now we hard-code it in C. This is because all current T2x boards use the same values, we will deal with T3x later and we first need to agree on the format for this timing information in the fdt and may in fact decide that it has no place there.
arch/arm/dts/tegra20.dtsi +1
-0+ clocks = <&periph_clk 22>; // PERIPH_ID_USBD
Typically /* */ rather than // I think
Signature · 1 line
nvpublic
Re: [PATCH v4 12/20] tegra: usb: fdt: Add additional device tree definitions for USB ports
Hi Stephen,
Quoted 9 lines · Stephen Warren
Quoted 7 lines · Simon Glass
This adds clock references to the USB part of the device tree for U-Boot.
The USB timing information may vary between boards sometimes, but for now we hard-code it in C. This is because all current T2x boards use the same values, we will deal with T3x later and we first need to agree on the format for this timing information in the fdt and may in fact decide that it has no place there.
Quoted 5 lines
arch/arm/dts/tegra20.dtsi
Quoted 3 lines
arch/arm/dts/tegra20.dtsi +1
-0+ clocks = <&periph_clk 22>; // PERIPH_ID_USBDTypically /* */ rather than // I think
Yes will fix. Looking forward to your symbolic stuff so that I can remove the comment.
Regards,
Simon
Quoted 3 lines
--
nvpublic
PATCH v4 13/20 tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard
In reply to a message not in the archiveWe 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
Changes in v3:
- Remove "okay" from nodes since this is the default anyway
- Fix device tree indenting with tabs instead of spaces
- Disable USB2 which is not used on Seaboard
board/nvidia/dts/tegra2-seaboard.dts | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
board/nvidia/dts/tegra2-seaboard.dts +11 -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"; + }; + memory { device_type = "memory"; reg = < 0x00000000 0x40000000 >;
@@ -32,5 +38,10 @@ usb@c5000000 { nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ + support-host-mode; + }; + + usb@c5004000 { + status = "disabled"; }; };
Signature · 1 line
1.7.7.3
PATCH v4 15/20 fdt: Add function to return peripheral/clock ID
In reply to a message not in the archiveA common requirement is to find the clock ID for a peripheral. This is the second cell of the 'clocks' property (the first being the phandle itself).
---
Changes in v4:
- Add fdtdec function to return peripheral ID
include/fdtdec.h | 13 +++++++++++++ lib/fdtdec.c | 13 +++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-)
include/fdtdec.h +13 -0
@@ -272,3 +272,16 @@ int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,* @return 0 if all ok or gpio was FDT_GPIO_NONE; -1 on error */ int fdtdec_setup_gpio (struct fdt_gpio_state *gpio); + +/** +* Decode a peripheral ID from a device tree node. This may be a temporary +* function depending on what happens with clocks in the Linux fdt. +* +* This works by looking up the peripheral's 'clocks' node and reading out +* the second cell, which is the clock number / peripheral ID. +* +* @param blob FDT blob to use +* @param node Node to look at +* @return +*/ +int fdtdec_decode_periph_id (const void *blob,int node);
lib/fdtdec.c +13 -0
@@ -414,3 +414,16 @@ int fdtdec_setup_gpio(struct fdt_gpio_state *gpio)return -1 ;return 0 ; } + +int fdtdec_decode_periph_id (const void *blob,int node) +{ +u32 cell[2 ]; +int err; + + err =fdtdec_get_int_array (blob, node,"clocks" , cell, +ARRAY_SIZE (cell)); +if (err) +return -1 ; + +return cell[1 ]; +}
Signature · 1 line
1.7.7.3
PATCH v4 20/20 tegra: fdt: Enable FDT support for Seaboard
In reply to a message not in the archiveThis switches Seaboard over to use FDT for run-time config instead of CONFIG options. USB is the only user at present.
---
Changes in v3:
- Drop Tegra USB alignment patch as we will deal with this another way
include/configs/seaboard.h | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
include/configs/seaboard.h +5 -0
@@ -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.7.3
PATCH v4 2/20 fdt: Add functions to access phandles, arrays and bools
In reply to Simon GlassAdd 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.
---
include/fdtdec.h | 39 +++++++++++++++++++++++++++++++ lib/fdtdec.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 0 deletions(-)
include/fdtdec.h +39 -0
@@ -188,3 +188,42 @@ int fdtdec_find_aliases_for_id(const void *blob, const char *name,* @return compatible string for that id */ const char *fdtdec_get_compatible (enum fdt_compat_id id); + +/* 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, regardless of its 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 +*/ +int fdtdec_get_bool (const void *blob,int node,const char *prop_name);
lib/fdtdec.c +67 -0
70 lines not on this page · raw message
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-3-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Stephen Warren
Acked-byRe: [PATCH v4 02/20] fdt: Add functions to access phandles, arrays and bools
Quoted 6 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.
Signed-off-by Simon Glass <[email protected]>
(only because I commented on this before; I'm not an FDT maintainer here)
Signature · 1 line
nvpublic
Jerry Van Baren
Acked-by Gerald Van BarenRe: [U-Boot] [PATCH v4 02/20] fdt: Add functions to access phandles, arrays and bools
In reply to a message not in the archiveQuoted 6 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.
Signed-off-by Simon Glass<[email protected]>
Thanks,
gvb
PATCH v4 5/20 arm: fdt: Add skeleton device tree file from kernel
In reply to Simon GlassThis 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
@@ -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.7.3
PATCH v4 10/20 tegra: fdt: Add additional USB binding
In reply to Simon GlassThis adds a property to indicate a port which can switch between host and device mode.
---
doc/device-tree-bindings/usb/tegra-usb.txt | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
doc/device-tree-bindings/usb/tegra-usb.txt +4 -0
@@ -11,3 +11,7 @@ Required properties : - phy_type : Should be one of "ulpi" or "utmi". - nvidia,vbus-gpio : If present, specifies a gpio that needs to be activated for the bus to be powered. + +Optional properties: + - support-host-mode : If present then this peripheral can switch between + host and device mode
Signature · 1 line
1.7.7.3
A message that is not in the archive (sent off-list or not yet received): 1326342789-5781-11-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Quoted 14 lines · Simon Glass
This adds a property to indicate a port which can switch between host and device mode.
Signed-off-by Simon Glass <[email protected]>---
doc/device-tree-bindings/usb/tegra-usb.txt | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)doc/device-tree-bindings/usb/tegra-usb.txt +0
-0
doc/device-tree-bindings/usb/tegra-usb.txt Required properties : · line 17
Quoted 7 lines
doc/device-tree-bindings/usb/tegra-usb.txt +4
-0@@ -11,3 +11,7 @@ Required properties : - phy_type : Should be one of "ulpi" or "utmi". - nvidia,vbus-gpio : If present, specifies a gpio that needs to be activated for the bus to be powered. + +Optional properties: + - support-host-mode : If present then this peripheral can switch between + host and device mode
All of Tegra's USB ports support host mode, and it's the typical mode of operation. The TRM also indicates that all USB ports support device mode (possibly depending on the PHY type that's been selected for or attached to port). Port 2 explicitly doesn't support run-time switching, but by omission, ports 1 and 3 do.
Hence, "support-host-mode" is not an accurate name, and doesn't match the description given either.
I think that it'd be better to:
* Add properties to explicitly specify whether the port is intended/allowed to operate (per board design) in each of host or device mode.
* Default to static host mode if no properties are present.
i.e.:
+Optional properties:
+ - enable-host-mode : Indicate that the port is intended to operate in
+ host mode.
+ - enable-device-mode : Indicate that the port is intended to operate
+ in device mode.
We should error out if both properties are set for USB 2, since it doesn't support run-time switching. Perhaps you can skip this error-checking for now since we aren't implementing device mode anywhere anyway...
Then in the later patch in your series that was using support-host-mode,
* Do VBUS detection only if both enable-host-mode and enable-device-mode are present.
* Do VBUS GPIO enable if enable-host-mode is present (or assumed by default) and VBUS detection passed (if it ran).
Signature · 1 line
nvpublic
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Quoted 40 lines · Stephen Warren
Quoted 14 lines · Simon Glass
This adds a property to indicate a port which can switch between host and device mode.
Signed-off-by Simon Glass <[email protected]>---
doc/device-tree-bindings/usb/tegra-usb.txt | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)doc/device-tree-bindings/usb/tegra-usb.txt +0
-0doc/device-tree-bindings/usb/tegra-usb.txt Required properties : · line 17
Quoted 7 lines
doc/device-tree-bindings/usb/tegra-usb.txt +4
-0@@ -11,3 +11,7 @@ Required properties : - phy_type : Should be one of "ulpi" or "utmi". - nvidia,vbus-gpio : If present, specifies a gpio that needs to be activated for the bus to be powered. + +Optional properties: + - support-host-mode : If present then this peripheral can switch between + host and device modeAll of Tegra's USB ports support host mode, and it's the typical mode of operation. The TRM also indicates that all USB ports support device mode (possibly depending on the PHY type that's been selected for or attached to port). Port 2 explicitly doesn't support run-time switching, but by omission, ports 1 and 3 do.
Hence, "support-host-mode" is not an accurate name, and doesn't match the description given either.
I think that it'd be better to:
* Add properties to explicitly specify whether the port is intended/allowed to operate (per board design) in each of host or device mode.
* Default to static host mode if no properties are present.i.e.:
Review
Quoted 5 lines
(quoted diff) +5
-0+Optional properties: + - enable-host-mode : Indicate that the port is intended to operate in + host mode. + - enable-device-mode : Indicate that the port is intended to operate + in device mode.
fsl-usb.txt uses "dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:
- dr_mode : indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.
-Olof
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Hi Olof,
Quoted 47 lines · Olof Johansson
Quoted 38 lines · Stephen Warren
Quoted 17 lines · Simon Glass
This adds a property to indicate a port which can switch between host and device mode.
Signed-off-by Simon Glass <[email protected]>---
doc/device-tree-bindings/usb/tegra-usb.txt | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)doc/device-tree-bindings/usb/tegra-usb.txt +0
-0@@ -11,3 +11,7 @@ Required properties :-
phy_type: Should be one of "ulpi" or "utmi".
- nvidia,vbus-gpio : If present, specifies a gpio that needs to be activated for the bus to be powered.doc/device-tree-bindings/usb/tegra-usb.txt Required properties : · line 17
Quoted 4 lines
doc/device-tree-bindings/usb/tegra-usb.txt +4
-0+ +Optional properties: + - support-host-mode : If present then this peripheral can switch between + host and device modeAll of Tegra's USB ports support host mode, and it's the typical mode of operation. The TRM also indicates that all USB ports support device mode (possibly depending on the PHY type that's been selected for or attached to port). Port 2 explicitly doesn't support run-time switching, but by omission, ports 1 and 3 do.
Hence, "support-host-mode" is not an accurate name, and doesn't match the description given either.
I think that it'd be better to:
* Add properties to explicitly specify whether the port is intended/allowed to operate (per board design) in each of host or device mode.
* Default to static host mode if no properties are present.Quoted 7 lines
i.e.:
+Optional properties:
+ - enable-host-mode : Indicate that the port is intended to operate in
+ host mode.
+ - enable-device-mode : Indicate that the port is intended to operate
+ in device mode.
Quoted 6 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.
What does 'dr' mean?
Regards,
Simon
Quoted 3 lines
-Olof
A message that is not in the archive (sent off-list or not yet received): CAPnjgZ0JAyV8+0kLv=EcM-AhBxE-YSyG-Y7rYPS8PhOAOnq6dw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Hi,
Quoted 8 lines · Simon Glass
Quoted 6 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.What does 'dr' mean?
After some searching, it looks like it means "dual-role", which seems appropriate terminology for the tegra SoC as well.
-Olof
A message that is not in the archive (sent off-list or not yet received): CAOesGMjCxryS+3yQZqCP3JYeHpCbUuNHM+rtDBoOQjF6rwLv5g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Hi Olof,
Quoted 7 lines · Olof Johansson
Hi,
Quoted 3 lines · Simon Glass
Quoted 3 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.What does 'dr' mean?
After some searching, it looks like it means "dual-role", which seems appropriate terminology for the tegra SoC as well.
Thanks for looking that up.
Well maybe, but it could mean data reverse mode or distinctive ring...I like Stephen's nice device-tree-friendly naming and explanation :-) Are we stuck with this?
Regards,
Simon
Quoted 3 lines
-Olof
A message that is not in the archive (sent off-list or not yet received): CAPnjgZ10mwQJ7RubrO_VFdHF+39cHOjLPmQNbYBeERjTWJMU4Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Quoted 16 lines · Simon Glass
Hi Olof,
Quoted 13 lines · Olof Johansson
Hi,
Quoted 8 lines · Simon Glass
Quoted 6 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.What does 'dr' mean?
Quoted 8 lines
Quoted 2 lines
After some searching, it looks like it means "dual-role", which seems appropriate terminology for the tegra SoC as well.
Thanks for looking that up.
Well maybe, but it could mean data reverse mode or distinctive ring...I like Stephen's nice device-tree-friendly naming and explanation :-) Are we stuck with this?
I think there's value in staying common with similar bindings on other platforms, yes. Sorry. :)
-Olof
A message that is not in the archive (sent off-list or not yet received): CAOesGMhOe6enf9BFgpCbvEgtT3F-p5rEsxp8=PG57sxBaQvawQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
RE: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Olof Johansson wrote at Thursday, January 19, 2012 12:13 AM:
Quoted 20 lines · Simon Glass
Quoted 19 lines
Hi Olof,
Quoted 15 lines · Olof Johansson
Hi,
Quoted 8 lines · Simon Glass
Quoted 6 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.What does 'dr' mean?
After some searching, it looks like it means "dual-role", which seems appropriate terminology for the tegra SoC as well.
Quoted 8 lines
Quoted 5 lines
Thanks for looking that up.
Well maybe, but it could mean data reverse mode or distinctive ring...I like Stephen's nice device-tree-friendly naming and explanation :-) Are we stuck with this?
I think there's value in staying common with similar bindings on other platforms, yes. Sorry. :)
Ack from me too. If there's an existing convention, I'd prefer to stick with it. Sorry, I should have looked this up before coming up with something new.
Signature · 1 line
nvpublic
Re: [PATCH v4 10/20] tegra: fdt: Add additional USB binding
Hi,
Quoted 27 lines · Stephen Warren
Olof Johansson wrote at Thursday, January 19, 2012 12:13 AM:
Quoted 26 lines · Simon Glass
Quoted 24 lines
Hi Olof,
Quoted 7 lines · Olof Johansson
Hi,
Quoted 3 lines · Simon Glass
Quoted 3 lines
fsl-usb.txt uses "
dr_mode" here, which might make sense to reuse given some of the shared IP in question for device mode:Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
-
dr_mode: indicates the working mode for "fsl-usb2-dr" compatible controllers. Can be "host", "peripheral", or "otg". Default to "host" if not defined for backward compatibility.What does 'dr' mean?
After some searching, it looks like it means "dual-role", which seems appropriate terminology for the tegra SoC as well.
Thanks for looking that up.
Well maybe, but it could mean data reverse mode or distinctive ring...I like Stephen's nice device-tree-friendly naming and explanation :-) Are we stuck with this?
Quoted 6 lines
Quoted 2 lines
I think there's value in staying common with similar bindings on other platforms, yes. Sorry. :)
Ack from me too. If there's an existing convention, I'd prefer to stick with it. Sorry, I should have looked this up before coming up with something new.
OK thanks for that. Will take a look.
Regards,
Simon
Quoted 4 lines
--
nvpublic
PATCH v4 14/20 usb: Add support for txfifo threshold
In reply to Simon GlassCONFIG_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
@@ -1135,6 +1135,9 @@ The following options need to be configured: May be defined to allow interrupt polling instead of using asynchronous interrupts + 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
@@ -259,6 +259,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
@@ -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.7.3
PATCH v4 14/20 usb: Add support for txfifo threshold
Hi,
2012/1/12 Simon Glass <[email protected]>:
Quoted 10 lines
CONFIG_USB_EHCI_TXFIFO_THRESHenables setting of the txfilltuning field in the EHCI controller on reset.Signed-off-by Simon Glass <[email protected]>---
?README ? ? ? ? ? ? ? ? ? ? ?| ? ?3 +++ ?drivers/usb/host/ehci-hcd.c | ? ?7 +++++++ ?drivers/usb/host/ehci.h ? ? | ? ?6 +++++-?3 files changed, 15 insertions(+), 1 deletions(-)
PATCH v4 16/20 tegra: usb: Add support for Tegra USB peripheral
In reply to Simon GlassThis adds basic support for the Tegra2 USB controller. Board files should call board_usb_init() to set things up.
Configuration is performed through the FDT, with aliases used to set the order of the ports, like this fragment:
aliases {
/* This defines the order of our USB ports */
usb0 = "/usb at 0xc5008000";
usb1 = "/usb at 0xc5000000";
};drivers/usb/host files ONLY: Acked-by: Remy Bohmer <[email protected]>
---
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
Changes in v3:
- Remove usbparams properties from fdt and moved them to C code
Changes in v4:
- Use updated fdtdec alias functiona to get USB aliases
- Use peripheral clock node to obtain peripheral ID
arch/arm/cpu/armv7/tegra2/Makefile | 4 +- arch/arm/cpu/armv7/tegra2/usb.c | 426 +++++++++++++++++++++++++++++ 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, 752 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
@@ -33,8 +33,10 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(SOC).o SOBJS := lowlevel_init.o -COBJS := ap20.o board.o clock.o funcmux.o pinmux.o sys_info.o timer.o +COBJS-y := ap20.o board.o clock.o funcmux.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 +426 -0
426 lines not on this page · raw message
arch/arm/include/asm/arch-tegra2/tegra2.h +2 -0
@@ -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
@@ -47,6 +47,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
@@ -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
@@ -37,6 +37,7 @@ DECLARE_GLOBAL_DATA_PTR;#define COMPAT (id, name) namestatic const char *const compat_names[COMPAT_COUNT ] = {COMPAT (UNKNOWN ,"<none>" ), +COMPAT (NVIDIA_TEGRA20_USB ,"nvidia,tegra20-ehci" ), };const char *fdtdec_get_compatible (enum fdt_compat_id id)
Signature · 1 line
1.7.7.3
PATCH v4 16/20 tegra: usb: Add support for Tegra USB peripheral
Hi,
2012/1/12 Simon Glass <[email protected]>:
Quoted 31 lines
This adds basic support for the Tegra2 USB controller. Board files should call
board_usb_init()to set things up.Configuration is performed through the FDT, with aliases used to set the order of the ports, like this fragment:
? ? ? ?aliases {
? ? ? ? ? ? ? ?/* This defines the order of our USB ports */ ? ? ? ? ? ? ? ?usb0 = "/usb at0xc5008000";
? ? ? ? ? ? ? ?usb1 = "/usb at0xc5000000";
? ? ? ?};
drivers/usb/hostfiles ONLY: Acked-by: Remy Bohmer <[email protected]>Signed-off-by Simon Glass <[email protected]>---
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)
- Improvedebug()printouts in case of failure to init USBChanges in v3:
- Remove usbparams properties from fdt and moved them to C codeChanges in v4:
- Use updated fdtdec alias functiona to get USB aliases
- Use peripheral clock node to obtain peripheral ID
Quoted 6 lines
?arch/arm/cpu/armv7/tegra2/Makefile ? ? ? ?| ? ?4 +- ?arch/arm/cpu/armv7/tegra2/usb.c ? ? ? ? ? | ?426 +++++++++++++++++++++++++++++ ?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 +++++
As for the drivers/usb files:
Kind regards,
Remy
PATCH v4 16/20 tegra: usb: Add support for Tegra USB peripheral
In reply to Simon Glassarch/arm/cpu/armv7/tegra2/usb.c line 74
Quoted 7 lines · Simon Glass
This adds basic support for the Tegra2 USB controller. Board files should call
board_usb_init()to set things up.arch/arm/cpu/armv7/tegra2/usb.c +2
-0+/* Record which controller can switch from host to device mode */ +static struct fdt_usb *host_dev_ctlr;
As you'll note from my comments on the DT bindings, it doesn't make sense to have a single global variable for that; both USB1 and USB3 can switch at run-time apparently, and USB2 at initialization time.
Quoted 1 line
+void
usbf_reset_controller(enum periph_id id, struct usb_ctlr *usbctlr)
...
Quoted 6 lines
arch/arm/cpu/armv7/tegra2/usb.c +6
-0+/* +* Set USB1_NO_LEGACY_MODE to 1, Registers are accessible under +* base address +*/ +if (id ==PERIPH_ID_USBD ) +setbits_le32 (&usbctlr->usb1_legacy_ctrl,USB1_NO_LEGACY_MODE );
...
Quoted 3 lines
arch/arm/cpu/armv7/tegra2/usb.c +3
-0+/* Set USB3 to use UTMIP PHY */ +if (id ==PERIPH_ID_USB3 ) +setbits_le32 (&usbctlr->susp_ctrl,UTMIP_PHY_ENB );
...
Quoted 2 lines
arch/arm/cpu/armv7/tegra2/usb.c +2
-0+static void init_usb_controller (enum periph_id id,struct usb_ctlr *usbctlr, +const u32 timing[])
...
arch/arm/cpu/armv7/tegra2/usb.c line 208
Quoted 8 lines
arch/arm/cpu/armv7/tegra2/usb.c +8
-0+/* +* To Use the A Session Valid for cable detection logic, VBUS_WAKEUP +* mux must be switched to actually use a_sess_vld threshold. +*/ +if (id ==PERIPH_ID_USBD ) { +clrsetbits_le32 (&usbctlr->usb1_legacy_ctrl, +VBUS_SENSE_CTL_MASK ,VBUS_SENSE_CTL_A_SESS_VLD ); + }
Uggh. The driver shouldn't really be altering its behaviour based on knowledge of the instance number. Can those conditions be modified to test something else instead?
For the first (USBD) condition, it seems like if the registers are different, we should really have either different compatible values, or a flag in the DT to indicate this.
For the second (USB3) condition, shouldn't this be testing the phy type field, not the instance ID?
For the third (USBD) condition, can it test whether there's a VBUS GPIO defined, or whether an appropriate combination of my proposed enable-host-mode/enable-device-mode properties are present?
Signature · 1 line
nvpublic
PATCH v4 16/20 tegra: usb: Add support for Tegra USB peripheral
Hi Stephen,
Quoted 46 lines · Stephen Warren
arch/arm/cpu/armv7/tegra2/usb.c line 74
Quoted 7 lines · Simon Glass
This adds basic support for the Tegra2 USB controller. Board files should call
board_usb_init()to set things up.arch/arm/cpu/armv7/tegra2/usb.c +2
-0+/* Record which controller can switch from host to device mode */ +static struct fdt_usb *host_dev_ctlr;As you'll note from my comments on the DT bindings, it doesn't make sense to have a single global variable for that; both USB1 and USB3 can switch at run-time apparently, and USB2 at initialization time.
Quoted 1 line
+void
usbf_reset_controller(enum periph_id id, struct usb_ctlr *usbctlr)...
Quoted 6 lines
+ ? ? ? /*
+ ? ? ? ?* SetUSB1_NO_LEGACY_MODEto 1, Registers are accessible under
+ ? ? ? ?* base address
+ ? ? ? ?*/
+ ? ? ? if (id ==PERIPH_ID_USBD)
+ ? ? ? ? ? ? ?setbits_le32(&usbctlr->usb1_legacy_ctrl, USB1_NO_LEGACY_MODE);...
Quoted 3 lines
+ ? ? ? /* Set USB3 to use UTMIP PHY */
+ ? ? ? if (id ==PERIPH_ID_USB3)
+ ? ? ? ? ? ? ?setbits_le32(&usbctlr->susp_ctrl, UTMIP_PHY_ENB);...
Quoted 2 lines
+static void init_usb_controller(enum
periph_idid, structusb_ctlr*usbctlr,
+ ? ? ? ? ? ? ? const u32 timing[])...
Quoted 8 lines
+ ? ? ? /*
+ ? ? ? ?* To Use the A Session Valid for cable detection logic,VBUS_WAKEUP
+ ? ? ? ?* mux must be switched to actually usea_sess_vldthreshold.
+ ? ? ? ?*/
+ ? ? ? if (id ==PERIPH_ID_USBD) {
+ ? ? ? ? ? ? ? clrsetbits_le32(&usbctlr->usb1_legacy_ctrl,
+ ? ? ? ? ? ? ? ? ? ? ?VBUS_SENSE_CTL_MASK,VBUS_SENSE_CTL_A_SESS_VLD);
+ ? ? ? }Uggh. The driver shouldn't really be altering its behaviour based on knowledge of the instance number. Can those conditions be modified to test something else instead?
For the first (USBD) condition, it seems like if the registers are different, we should really have either different compatible values, or a flag in the DT to indicate this.
Quoted 6 lines
For the second (USB3) condition, shouldn't this be testing the phy type field, not the instance ID?
For the third (USBD) condition, can it test whether there's a VBUS GPIO defined, or whether an appropriate combination of my proposed enable-host-mode/enable-device-mode properties are present?
Yes I'm pretty sure I can clean this up to make it more fdt-dependent. Will have a look.
Regards,
Simon
Quoted 3 lines
--
nvpublic
PATCH v4 17/20 tegra: usb: Add USB support to nvidia boards
In reply to Simon GlassThis 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
@@ -33,6 +33,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 ;
@@ -69,6 +70,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.7.3
PATCH v4 17/20 tegra: usb: Add USB support to nvidia boards
board/nvidia/common/board.c int board_init(void) · line 75
Quoted 8 lines · Simon Glass
This adds basic USB support for port 0. The other port is not supported yet.
board/nvidia/common/board.c +3
-0+#ifdef CONFIG_USB_EHCI_TEGRA +/* For USB GPIO PD0. for now, since we have no pinmux in fdt */ +pinmux_tristate_disable (PINGRP_SLXK );
Can we ifdef this so it only happens on Seaboard? Who knows what other boards use that pin group for. Unfortunately, I checked and this really does appear required for Seaboard, since there's no pull on the USB1_VBUS_EN GPIO, so Tegra must drive it.
Signature · 1 line
nvpublic
PATCH v4 17/20 tegra: usb: Add USB support to nvidia boards
Hi Stephen,
Quoted 6 lines · Stephen Warren
Quoted 4 lines · Simon Glass
This adds basic USB support for port 0. The other port is not supported yet.
board/nvidia/common/board.c +0
-0
Quoted 8 lines
Quoted 3 lines
+#ifdef
CONFIG_USB_EHCI_TEGRA
+ ? ? /* For USB GPIO PD0. for now, since we have no pinmux in fdt */
+ ? ?pinmux_tristate_disable(PINGRP_SLXK);Can we ifdef this so it only happens on Seaboard? Who knows what other boards use that pin group for. Unfortunately, I checked and this really does appear required for Seaboard, since there's no pull on the
USB1_VBUS_ENGPIO, so Tegra must drive it.
Yes will do. The pinmux is the hole in our fdt armour at present as you know.
Regards,
Simon
Quoted 3 lines
--
nvpublic
PATCH v4 18/20 tegra: usb: Add common USB defines for tegra2 boards
In reply to Simon GlassAll 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
@@ -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.7.3
PATCH v4 19/20 tegra: usb: Enable USB on Seaboard
In reply to Simon GlassSeaboard 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
@@ -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.7.3
v4 cover tegra: Add fdt definitions and USB driver
In reply to Simon GlassHi,
Quoted 39 lines · Simon Glass
This series brings in the Linux kernel fdt file 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_CONTROLand 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.
Tegra likes to have cache-aligned buffers. I have dropped the patch which implements this since we will solve this problem by making callers align their buffers (as we did with MMC).
Changes in v2:
- Use "okay" instead of "ok" for fdt node status
- Remove 0x from fdt aliases
- 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)
- Improvedebug()printouts in case of failure to init USB
- Add setting of pinmux for USB VBUS GPIO
- Remove unneededCONFIG_TEGRA_USBxdefinesChanges in v3:
- Remove "okay" from nodes since this is the default anyway
- Fix device tree indenting with tabs instead of spaces
- Disable USB2 which is not used on Seaboard
- Remove usbparams properties from fdt and moved them to C code
- Drop Tegra USB alignment patch as we will deal with this another way
Quoted 6 lines
Changes in v4:
- Add staging area for device tree bindings used in U-Boot
- Add clock bindings for Tegra2x
- Add fdtdec function to return peripheral ID
- Use updated fdtdec alias functiona to get USB aliases
- Use peripheral clock node to obtain peripheral ID
There are quite a number of comments for v5 due to the fdt binding changes. So I am sending the entire series again to avoid confusion. It is now down to only 18 patches though, so some light showing through.
Regards,
Simon
Quoted 60 lines
Simon Glass (20):
?fdt: Tidy up a few fdtdec problems
?fdt: Add functions to access phandles, arrays and bools ?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 ?fdt: Add staging area for device tree binding documentation ?fdt: Add tegra-usb bindings file from linux
?tegra: fdt: Add additional USB binding
?tegra: fdt: Add clock bindings
?tegra: usb: fdt: Add additional device tree definitions for USB ports ?tegra: usb: fdt: Add USB definitions for Tegra2 Seaboard ?usb: Add support for txfifo threshold
?fdt: Add function to return peripheral/clock ID
?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 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ?3 + ?arch/arm/cpu/armv7/tegra2/Makefile ? ? ? ? ? ? | ? ?4 +- ?arch/arm/cpu/armv7/tegra2/config.mk ? ? ? ? ? ?| ? ?2 + ?arch/arm/cpu/armv7/tegra2/usb.c ? ? ? ? ? ? ? ?| ?426 ++++++++++++++++++++++++ ?arch/arm/cpu/armv7/u-boot.lds ? ? ? ? ? ? ? ? ?| ? ?5 + ?arch/arm/dts/skeleton.dtsi ? ? ? ? ? ? ? ? ? ? | ? 13 + ?arch/arm/dts/tegra20.dtsi ? ? ? ? ? ? ? ? ? ? ?| ?199 +++++++++++ ?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 ? ? ? ? ? | ? 47 +++ ?doc/device-tree-bindings/README ? ? ? ? ? ? ? ?| ? 19 + ?doc/device-tree-bindings/clock/tegra-periphclk | ? 51 +++ ?doc/device-tree-bindings/usb/tegra-usb.txt ? ? | ? 17 + ?drivers/usb/host/Makefile ? ? ? ? ? ? ? ? ? ? ?| ? ?1 + ?drivers/usb/host/ehci-hcd.c ? ? ? ? ? ? ? ? ? ?| ? ?7 + ?drivers/usb/host/ehci-tegra.c ? ? ? ? ? ? ? ? ?| ? 63 ++++ ?drivers/usb/host/ehci.h ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 +- ?dts/Makefile ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ?2 +- ?include/configs/seaboard.h ? ? ? ? ? ? ? ? ? ? | ? 12 + ?include/configs/tegra2-common.h ? ? ? ? ? ? ? ?| ? 14 + ?include/fdtdec.h ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ?121 +++++++- ?lib/fdtdec.c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ?181 ++++++++++-?23 files changed, 1445 insertions(+), 13 deletions(-) ?create mode 100644
arch/arm/cpu/armv7/tegra2/usb.c?create mode 100644arch/arm/dts/skeleton.dtsi
?create mode 100644arch/arm/dts/tegra20.dtsi
?create mode 100644arch/arm/include/asm/arch-tegra2/usb.h?create mode 100644board/nvidia/dts/tegra2-seaboard.dts?create mode 100644 doc/device-tree-bindings/README ?create mode 100644 doc/device-tree-bindings/clock/tegra-periphclk ?create mode 100644doc/device-tree-bindings/usb/tegra-usb.txt?create mode 100644drivers/usb/host/ehci-tegra.c--
1.7.7.3