All of lore.kernel.org
 help / color / mirror / Atom feed
From: robherring2@gmail.com (Rob Herring)
To: linux-arm-kernel@lists.infradead.org
Subject: [Patch v5 08/13] ARM: imx6q: add config-on-boot gpios
Date: Wed, 13 Jun 2012 11:50:35 -0500	[thread overview]
Message-ID: <4FD8C4DB.4020908@gmail.com> (raw)
In-Reply-To: <20120613152841.GA23590@richard-laptop>

On 06/13/2012 10:28 AM, Richard Zhao wrote:
> On Wed, Jun 13, 2012 at 10:09:54AM -0500, Rob Herring wrote:
>> On 06/13/2012 07:34 AM, Richard Zhao wrote:
>>> Sometimes, boards have gpios that don't own by any driver or owner
>>> by a generic driver that don't like hacks. Such gpios is normally
>>> output and need setup once on boot. So I introduce the config-on-boot
>>> gpios.
>>>
>>> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
>>> Cc: Shawn Guo <shawn.guo@linaro.org>
>>> Cc: Rob Herring <rob.herring@calxeda.com>
>>> Cc: Grant Likely <grant.likely@secretlab.ca>
>>> ---
>>>  .../devicetree/bindings/arm/config-on-boot.txt     |   12 +++++++
>>>  arch/arm/boot/dts/imx6q-sabrelite.dts              |    7 ++++
>>>  arch/arm/mach-imx/mach-imx6q.c                     |   35 ++++++++++++++++++++
>>>  3 files changed, 54 insertions(+)
>>>  create mode 100644 Documentation/devicetree/bindings/arm/config-on-boot.txt
>>>
>>> diff --git a/Documentation/devicetree/bindings/arm/config-on-boot.txt b/Documentation/devicetree/bindings/arm/config-on-boot.txt
>>> new file mode 100644
>>> index 0000000..f98ed74
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/arm/config-on-boot.txt
>>> @@ -0,0 +1,12 @@
>>> +* Configure on Boot
>>> +
>>> +Node name: config-on-boot
>>> +  It must be in root node. config-on-boot means to describe settings that needs
>>> +  to be set one time on boot but aren't owned by any driver, or the owned driver
>>> +  is too generic to handle such settings. For example, usb hub uses generic
>>> +  driver in usb core code, a on-board usb may need deassert reset pin.
>>
>> NAK. This is not a h/w description
> It's misc things, but is hw description.

You are defining something based on whether linux has a driver or not.
That should not matter to DT. That's backwards.

>> and should be solved within the
>> kernel or bootloader. Either fix this in u-boot,
> Kernel might be better not to depend on uboot.
>> the platform code, or
> How do I get gpio in platfrom code without dts description?
>> make the generic driver support this in a generic way.
> It's called just after populate devices. It's hard for generic driver to
> decide when it's called.

You need to describe that you have a hub on the usb bus and add the gpio
line to that node. Just like PCI is probe-able, you still need DT nodes
sometimes for cases like this. A simpler approach would be to just add
the gpio to the ehci controller node, but that's not exactly correct.

Rob


> 
> Thanks
> Richard
>>
>> Rob
>>
>>> +
>>> +Optional properties:
>>> +- output-gpios: Output gpio array that needs to set.
>>> +- output-gpio-values: This property is required if output-gpios is set.
>>> +  The value is a array of 0 or 1. Total count eaquals the number of gpios.
>>> diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> index e0ec929..1dd2261 100644
>>> --- a/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> @@ -17,6 +17,13 @@
>>>  	model = "Freescale i.MX6 Quad SABRE Lite Board";
>>>  	compatible = "fsl,imx6q-sabrelite", "fsl,imx6q";
>>>  
>>> +	config-on-boot {
>>> +		output-gpios = <
>>> +				&gpio3 22 0>;	/* vbus reset */
>>> +		output-gpio-values = <
>>> +				1>;		/* vbus reset */
>>> +	};
>>> +
>>>  	memory {
>>>  		reg = <0x10000000 0x40000000>;
>>>  	};
>>> diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
>>> index b47e98b..577cf19 100644
>>> --- a/arch/arm/mach-imx/mach-imx6q.c
>>> +++ b/arch/arm/mach-imx/mach-imx6q.c
>>> @@ -19,6 +19,7 @@
>>>  #include <linux/irqdomain.h>
>>>  #include <linux/of.h>
>>>  #include <linux/of_address.h>
>>> +#include <linux/of_gpio.h>
>>>  #include <linux/of_irq.h>
>>>  #include <linux/of_platform.h>
>>>  #include <linux/pinctrl/machine.h>
>>> @@ -113,6 +114,38 @@ static void __init imx6q_sabrelite_init(void)
>>>  	imx6q_sabrelite_cko1_setup();
>>>  }
>>>  
>>> +static void __init imx6q_config_on_boot(void)
>>> +{
>>> +	struct device_node *np;
>>> +	struct property *pp;
>>> +	int cnt, len, i;
>>> +	int gpio;
>>> +
>>> +	np = of_find_node_by_path("/config-on-boot");
>>> +	if (!np)
>>> +		return;
>>> +	cnt = of_gpio_named_count(np, "output-gpios");
>>> +	pp = of_find_property(np, "output-gpio-values", &len);
>>> +	if (!pp || cnt != len / sizeof(u32)) {
>>> +		pr_err("Invalid config-on-boot gpios!\n");
>>> +		of_node_put(np);
>>> +		return;
>>> +	}
>>> +	for (i = 0; i < cnt; i++) {
>>> +		gpio = of_get_named_gpio(np, "output-gpios", i);
>>> +		if (gpio_is_valid(gpio))
>>> +			gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH,
>>> +					"config-on-boot");
>>> +	}
>>> +
>>> +	of_node_put(np);
>>> +}
>>> +
>>> +static void __init imx6q_post_populate(void)
>>> +{
>>> +	imx6q_config_on_boot();
>>> +}
>>> +
>>>  static void __init imx6q_init_machine(void)
>>>  {
>>>  	/*
>>> @@ -126,6 +159,8 @@ static void __init imx6q_init_machine(void)
>>>  
>>>  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
>>>  
>>> +	imx6q_post_populate();
>>> +
>>>  	imx6q_pm_init();
>>>  }
>>>  
>>

WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Richard Zhao <linuxzsc-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Richard Zhao
	<richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org>,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	marex-ynQEQJNshbs@public.gmane.org,
	B20596-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	dong.aisheng-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	alexander.shishkin-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
	B29397-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	balbi-l0cyMroinI0@public.gmane.org,
	Grant Likely
	<grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
	gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
	shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org
Subject: Re: [Patch v5 08/13] ARM: imx6q: add config-on-boot gpios
Date: Wed, 13 Jun 2012 11:50:35 -0500	[thread overview]
Message-ID: <4FD8C4DB.4020908@gmail.com> (raw)
In-Reply-To: <20120613152841.GA23590@richard-laptop>

On 06/13/2012 10:28 AM, Richard Zhao wrote:
> On Wed, Jun 13, 2012 at 10:09:54AM -0500, Rob Herring wrote:
>> On 06/13/2012 07:34 AM, Richard Zhao wrote:
>>> Sometimes, boards have gpios that don't own by any driver or owner
>>> by a generic driver that don't like hacks. Such gpios is normally
>>> output and need setup once on boot. So I introduce the config-on-boot
>>> gpios.
>>>
>>> Signed-off-by: Richard Zhao <richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
>>> Cc: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
>>> Cc: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
>>> Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
>>> ---
>>>  .../devicetree/bindings/arm/config-on-boot.txt     |   12 +++++++
>>>  arch/arm/boot/dts/imx6q-sabrelite.dts              |    7 ++++
>>>  arch/arm/mach-imx/mach-imx6q.c                     |   35 ++++++++++++++++++++
>>>  3 files changed, 54 insertions(+)
>>>  create mode 100644 Documentation/devicetree/bindings/arm/config-on-boot.txt
>>>
>>> diff --git a/Documentation/devicetree/bindings/arm/config-on-boot.txt b/Documentation/devicetree/bindings/arm/config-on-boot.txt
>>> new file mode 100644
>>> index 0000000..f98ed74
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/arm/config-on-boot.txt
>>> @@ -0,0 +1,12 @@
>>> +* Configure on Boot
>>> +
>>> +Node name: config-on-boot
>>> +  It must be in root node. config-on-boot means to describe settings that needs
>>> +  to be set one time on boot but aren't owned by any driver, or the owned driver
>>> +  is too generic to handle such settings. For example, usb hub uses generic
>>> +  driver in usb core code, a on-board usb may need deassert reset pin.
>>
>> NAK. This is not a h/w description
> It's misc things, but is hw description.

You are defining something based on whether linux has a driver or not.
That should not matter to DT. That's backwards.

>> and should be solved within the
>> kernel or bootloader. Either fix this in u-boot,
> Kernel might be better not to depend on uboot.
>> the platform code, or
> How do I get gpio in platfrom code without dts description?
>> make the generic driver support this in a generic way.
> It's called just after populate devices. It's hard for generic driver to
> decide when it's called.

You need to describe that you have a hub on the usb bus and add the gpio
line to that node. Just like PCI is probe-able, you still need DT nodes
sometimes for cases like this. A simpler approach would be to just add
the gpio to the ehci controller node, but that's not exactly correct.

Rob


> 
> Thanks
> Richard
>>
>> Rob
>>
>>> +
>>> +Optional properties:
>>> +- output-gpios: Output gpio array that needs to set.
>>> +- output-gpio-values: This property is required if output-gpios is set.
>>> +  The value is a array of 0 or 1. Total count eaquals the number of gpios.
>>> diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> index e0ec929..1dd2261 100644
>>> --- a/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
>>> @@ -17,6 +17,13 @@
>>>  	model = "Freescale i.MX6 Quad SABRE Lite Board";
>>>  	compatible = "fsl,imx6q-sabrelite", "fsl,imx6q";
>>>  
>>> +	config-on-boot {
>>> +		output-gpios = <
>>> +				&gpio3 22 0>;	/* vbus reset */
>>> +		output-gpio-values = <
>>> +				1>;		/* vbus reset */
>>> +	};
>>> +
>>>  	memory {
>>>  		reg = <0x10000000 0x40000000>;
>>>  	};
>>> diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
>>> index b47e98b..577cf19 100644
>>> --- a/arch/arm/mach-imx/mach-imx6q.c
>>> +++ b/arch/arm/mach-imx/mach-imx6q.c
>>> @@ -19,6 +19,7 @@
>>>  #include <linux/irqdomain.h>
>>>  #include <linux/of.h>
>>>  #include <linux/of_address.h>
>>> +#include <linux/of_gpio.h>
>>>  #include <linux/of_irq.h>
>>>  #include <linux/of_platform.h>
>>>  #include <linux/pinctrl/machine.h>
>>> @@ -113,6 +114,38 @@ static void __init imx6q_sabrelite_init(void)
>>>  	imx6q_sabrelite_cko1_setup();
>>>  }
>>>  
>>> +static void __init imx6q_config_on_boot(void)
>>> +{
>>> +	struct device_node *np;
>>> +	struct property *pp;
>>> +	int cnt, len, i;
>>> +	int gpio;
>>> +
>>> +	np = of_find_node_by_path("/config-on-boot");
>>> +	if (!np)
>>> +		return;
>>> +	cnt = of_gpio_named_count(np, "output-gpios");
>>> +	pp = of_find_property(np, "output-gpio-values", &len);
>>> +	if (!pp || cnt != len / sizeof(u32)) {
>>> +		pr_err("Invalid config-on-boot gpios!\n");
>>> +		of_node_put(np);
>>> +		return;
>>> +	}
>>> +	for (i = 0; i < cnt; i++) {
>>> +		gpio = of_get_named_gpio(np, "output-gpios", i);
>>> +		if (gpio_is_valid(gpio))
>>> +			gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH,
>>> +					"config-on-boot");
>>> +	}
>>> +
>>> +	of_node_put(np);
>>> +}
>>> +
>>> +static void __init imx6q_post_populate(void)
>>> +{
>>> +	imx6q_config_on_boot();
>>> +}
>>> +
>>>  static void __init imx6q_init_machine(void)
>>>  {
>>>  	/*
>>> @@ -126,6 +159,8 @@ static void __init imx6q_init_machine(void)
>>>  
>>>  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
>>>  
>>> +	imx6q_post_populate();
>>> +
>>>  	imx6q_pm_init();
>>>  }
>>>  
>>

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

  parent reply	other threads:[~2012-06-13 16:50 UTC|newest]

Thread overview: 132+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-13 12:34 [Patch v5 00/13] add imx usb driver for mx28/6x Richard Zhao
2012-06-13 12:34 ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 01/13] usb: otg: add notify_connect/notify_disconnect callback Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 02/13] USB: move transceiver from ehci_hcd and ohci_hcd to hcd and rename it as phy Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 18:17   ` Alan Stern
2012-06-13 18:17     ` Alan Stern
2012-06-13 12:34 ` [Patch v5 03/13] USB: notify phy when root hub port connect change Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 18:25   ` Alan Stern
2012-06-13 18:25     ` Alan Stern
2012-06-14  0:36     ` Richard Zhao
2012-06-14  0:36       ` Richard Zhao
2012-06-14 14:11       ` Alan Stern
2012-06-14 14:11         ` Alan Stern
2012-06-13 12:34 ` [Patch v5 04/13] usb: chipidea: permit driver bindings pass phy pointer Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 05/13] usb: otg: add basic mxs phy driver support Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 21:33   ` Sascha Hauer
2012-06-13 21:33     ` Sascha Hauer
2012-06-13 21:56     ` Marek Vasut
2012-06-13 21:56       ` Marek Vasut
2012-06-13 22:03       ` Sascha Hauer
2012-06-13 22:03         ` Sascha Hauer
2012-06-14  1:12       ` Richard Zhao
2012-06-14  1:12         ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 06/13] usb: chipidea: add imx platform driver Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 21:46   ` Sascha Hauer
2012-06-13 21:46     ` Sascha Hauer
2012-06-13 21:57     ` Marek Vasut
2012-06-13 21:57       ` Marek Vasut
2012-06-13 22:07       ` Sascha Hauer
2012-06-13 22:07         ` Sascha Hauer
2012-06-14  1:21         ` Richard Zhao
2012-06-14  1:21           ` Richard Zhao
2012-06-14  1:56     ` Richard Zhao
2012-06-14  1:56       ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 07/13] ARM: imx6q: correct device name of usbphy and usb controller clock export Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 08/13] ARM: imx6q: add config-on-boot gpios Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 15:09   ` Rob Herring
2012-06-13 15:09     ` Rob Herring
2012-06-13 15:19     ` Marek Vasut
2012-06-13 15:19       ` Marek Vasut
2012-06-13 16:45       ` Rob Herring
2012-06-13 16:45         ` Rob Herring
2012-06-13 17:15         ` Marek Vasut
2012-06-13 17:15           ` Marek Vasut
2012-06-13 15:28     ` Richard Zhao
2012-06-13 15:28       ` Richard Zhao
2012-06-13 16:00       ` Marek Vasut
2012-06-13 16:00         ` Marek Vasut
2012-06-15 15:34         ` Shawn Guo
2012-06-15 15:34           ` Shawn Guo
2012-06-13 16:50       ` Rob Herring [this message]
2012-06-13 16:50         ` Rob Herring
2012-06-14  1:33         ` Richard Zhao
2012-06-14  1:33           ` Richard Zhao
2012-06-20 14:29           ` Rob Herring
2012-06-20 14:29             ` Rob Herring
2012-06-20 15:05             ` Shawn Guo
2012-06-20 15:05               ` Shawn Guo
2012-06-21 21:32               ` Rob Herring
2012-06-21 21:32                 ` Rob Herring
2012-06-20 15:41             ` Stephen Warren
2012-06-20 15:41               ` Stephen Warren
2012-06-21  1:32               ` Chen Peter-B29397
2012-06-21  1:32                 ` Chen Peter-B29397
2012-06-21 22:22                 ` Stephen Warren
2012-06-21 22:22                   ` Stephen Warren
2012-06-22  0:03                   ` Chen Peter-B29397
2012-06-22  0:03                     ` Chen Peter-B29397
2012-06-25 15:43                     ` Stephen Warren
2012-06-25 15:43                       ` Stephen Warren
2012-06-26  2:05                       ` Chen Peter-B29397
2012-06-26  2:05                         ` Chen Peter-B29397
2012-06-19 23:36   ` Fabio Estevam
2012-06-19 23:36     ` Fabio Estevam
2012-06-19 23:41     ` Richard Zhao
2012-06-19 23:41       ` Richard Zhao
2012-07-17 12:30   ` Dirk Behme
2012-07-17 12:30     ` Dirk Behme
2012-07-19  2:15     ` Richard Zhao
2012-07-19  2:15       ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 09/13] ARM: imx6q: add usbphy clocks Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 21:54   ` Sascha Hauer
2012-06-13 21:54     ` Sascha Hauer
2012-06-14  0:15     ` Chen Peter-B29397
2012-06-14  0:15       ` Chen Peter-B29397
2012-06-13 12:34 ` [Patch v5 10/13] ARM: imx6q: disable usb charger detector Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 11/13] ARM: dts: imx6q-sabrelite: add usb devices Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-19 23:39   ` Fabio Estevam
2012-06-19 23:39     ` Fabio Estevam
2012-06-13 12:34 ` [Patch v5 12/13] ARM: mxs: clk_register_clkdev mx28 usb clocks Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-13 12:34 ` [Patch v5 13/13] ARM: dts: imx28-evk: add usb devices Richard Zhao
2012-06-13 12:34   ` Richard Zhao
2012-06-18 17:10 ` [Patch v5 00/13] add imx usb driver for mx28/6x Fabio Estevam
2012-06-18 17:10   ` Fabio Estevam
2012-06-18 17:13   ` Marek Vasut
2012-06-18 17:13     ` Marek Vasut
2012-06-18 17:25     ` Fabio Estevam
2012-06-18 17:25       ` Fabio Estevam
2012-06-19  1:14       ` Chen Peter-B29397
2012-06-19  1:14         ` Chen Peter-B29397
2012-06-19  1:33         ` Fabio Estevam
2012-06-19  1:33           ` Fabio Estevam
2012-06-19  2:07           ` Marek Vasut
2012-06-19  2:07             ` Marek Vasut
2012-06-19  2:17             ` Fabio Estevam
2012-06-19  2:17               ` Fabio Estevam
2012-06-19  6:14       ` Shawn Guo
2012-06-19  6:14         ` Shawn Guo
2012-06-19 12:24         ` Fabio Estevam
2012-06-19 12:24           ` Fabio Estevam
2012-06-19 12:38           ` Shawn Guo
2012-06-19 12:38             ` Shawn Guo
2012-06-19 13:54             ` Fabio Estevam
2012-06-19 13:54               ` Fabio Estevam
2012-06-19 18:34               ` Fabio Estevam
2012-06-19 18:34                 ` Fabio Estevam
2012-06-19 19:03                 ` Dirk Behme
2012-06-19 12:59           ` Marek Vasut
2012-06-19 12:59             ` Marek Vasut
2012-06-20 17:53 ` Subodh Nijsure

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FD8C4DB.4020908@gmail.com \
    --to=robherring2@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.