All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: "Jernej Škrabec" <jernej.skrabec@siol.net>
Cc: mark.rutland@arm.com, linux-pwm@vger.kernel.org,
	devicetree@vger.kernel.org, linux-sunxi@googlegroups.com,
	linux-kernel@vger.kernel.org, mripard@kernel.org, wens@csie.org,
	robh+dt@kernel.org, thierry.reding@gmail.com,
	kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 3/6] pwm: sun4i: Add a quirk for bus clock
Date: Mon, 29 Jul 2019 18:14:35 +0200	[thread overview]
Message-ID: <20190729161435.5bnj3ikocsyep4dd@pengutronix.de> (raw)
In-Reply-To: <4022372.WfP88Fa4Lu@jernej-laptop>

Hello Jernej,

On Mon, Jul 29, 2019 at 05:48:36PM +0200, Jernej Škrabec wrote:
> Dne ponedeljek, 29. julij 2019 ob 08:38:25 CEST je Uwe Kleine-König 
> napisal(a):
> > Hello,
> > 
> > On Fri, Jul 26, 2019 at 08:40:42PM +0200, Jernej Skrabec wrote:
> > > H6 PWM core needs bus clock to be enabled in order to work.
> > > 
> > > Add a quirk for it.
> > > 
> > > Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
> > > ---
> > > 
> > >  drivers/pwm/pwm-sun4i.c | 15 +++++++++++++++
> > >  1 file changed, 15 insertions(+)
> > > 
> > > diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
> > > index 1b7be8fbde86..7d3ac3f2dc3f 100644
> > > --- a/drivers/pwm/pwm-sun4i.c
> > > +++ b/drivers/pwm/pwm-sun4i.c
> > > @@ -72,6 +72,7 @@ static const u32 prescaler_table[] = {
> > > 
> > >  };
> > >  
> > >  struct sun4i_pwm_data {
> > > 
> > > +	bool has_bus_clock;
> > > 
> > >  	bool has_prescaler_bypass;
> > >  	bool has_reset;
> > >  	unsigned int npwm;
> > > 
> > > @@ -79,6 +80,7 @@ struct sun4i_pwm_data {
> > > 
> > >  struct sun4i_pwm_chip {
> > >  
> > >  	struct pwm_chip chip;
> > > 
> > > +	struct clk *bus_clk;
> > > 
> > >  	struct clk *clk;
> > >  	struct reset_control *rst;
> > >  	void __iomem *base;
> > > 
> > > @@ -382,6 +384,16 @@ static int sun4i_pwm_probe(struct platform_device
> > > *pdev)> 
> > >  		reset_control_deassert(pwm->rst);
> > >  	
> > >  	}
> > > 
> > > +	if (pwm->data->has_bus_clock) {
> > > +		pwm->bus_clk = devm_clk_get(&pdev->dev, "bus");
> > 
> > Similar to my suggestion in patch 2: I'd use devm_clk_get_optional() and
> > drop struct sun4i_pwm_data::has_bus_clock.
> 
> This one is not so simple. This patch has incorrect logic. Correct logic would 
> be to use "devm_clk_get(&pdev->dev, NULL)" for variants without bus clock as 
> it is done already and "devm_clk_get(&pdev->dev, "bus")" and 
> "devm_clk_get(&pdev->dev, "mod")" for variants with bus clock.

Then maybe something like the following?:

	busclk = devm_clk_get_optional(..., "bus");
	modclk = devm_clk_get_optional(..., "mod");

	/*
	 * old dtbs might have a single clock but no clock names. Fall
	 * back to this for compatibility reasons.
	 */
	if (!modclk) {
		modclk = devm_clk_get(..., NULL);
	}
 
> You see, DT nodes for other variants don't have clock-names property at all. 
> If it would be specified, it would be "mod". So, DT nodes for other variants 
> have "mod" clock specified on first place (the only one), while H6 DT node will 
> have "mod" clock specified on second place (see one of e-mails from Maxime), so 
> "NULL" can't be used instead of "mod" in both cases.
> 
> So I would say quirk is beneficial to know if you have to look up clocks by 
> name or you just take first clock specified.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
To: "Jernej Škrabec" <jernej.skrabec-gGgVlfcn5nU@public.gmane.org>
Cc: mark.rutland-5wv7dgnIgG8@public.gmane.org,
	linux-pwm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	mripard-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	wens-jdAy2FN1RRM@public.gmane.org,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH 3/6] pwm: sun4i: Add a quirk for bus clock
Date: Mon, 29 Jul 2019 18:14:35 +0200	[thread overview]
Message-ID: <20190729161435.5bnj3ikocsyep4dd@pengutronix.de> (raw)
In-Reply-To: <4022372.WfP88Fa4Lu@jernej-laptop>

Hello Jernej,

On Mon, Jul 29, 2019 at 05:48:36PM +0200, Jernej Škrabec wrote:
> Dne ponedeljek, 29. julij 2019 ob 08:38:25 CEST je Uwe Kleine-König 
> napisal(a):
> > Hello,
> > 
> > On Fri, Jul 26, 2019 at 08:40:42PM +0200, Jernej Skrabec wrote:
> > > H6 PWM core needs bus clock to be enabled in order to work.
> > > 
> > > Add a quirk for it.
> > > 
> > > Signed-off-by: Jernej Skrabec <jernej.skrabec-gGgVlfcn5nU@public.gmane.org>
> > > ---
> > > 
> > >  drivers/pwm/pwm-sun4i.c | 15 +++++++++++++++
> > >  1 file changed, 15 insertions(+)
> > > 
> > > diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
> > > index 1b7be8fbde86..7d3ac3f2dc3f 100644
> > > --- a/drivers/pwm/pwm-sun4i.c
> > > +++ b/drivers/pwm/pwm-sun4i.c
> > > @@ -72,6 +72,7 @@ static const u32 prescaler_table[] = {
> > > 
> > >  };
> > >  
> > >  struct sun4i_pwm_data {
> > > 
> > > +	bool has_bus_clock;
> > > 
> > >  	bool has_prescaler_bypass;
> > >  	bool has_reset;
> > >  	unsigned int npwm;
> > > 
> > > @@ -79,6 +80,7 @@ struct sun4i_pwm_data {
> > > 
> > >  struct sun4i_pwm_chip {
> > >  
> > >  	struct pwm_chip chip;
> > > 
> > > +	struct clk *bus_clk;
> > > 
> > >  	struct clk *clk;
> > >  	struct reset_control *rst;
> > >  	void __iomem *base;
> > > 
> > > @@ -382,6 +384,16 @@ static int sun4i_pwm_probe(struct platform_device
> > > *pdev)> 
> > >  		reset_control_deassert(pwm->rst);
> > >  	
> > >  	}
> > > 
> > > +	if (pwm->data->has_bus_clock) {
> > > +		pwm->bus_clk = devm_clk_get(&pdev->dev, "bus");
> > 
> > Similar to my suggestion in patch 2: I'd use devm_clk_get_optional() and
> > drop struct sun4i_pwm_data::has_bus_clock.
> 
> This one is not so simple. This patch has incorrect logic. Correct logic would 
> be to use "devm_clk_get(&pdev->dev, NULL)" for variants without bus clock as 
> it is done already and "devm_clk_get(&pdev->dev, "bus")" and 
> "devm_clk_get(&pdev->dev, "mod")" for variants with bus clock.

Then maybe something like the following?:

	busclk = devm_clk_get_optional(..., "bus");
	modclk = devm_clk_get_optional(..., "mod");

	/*
	 * old dtbs might have a single clock but no clock names. Fall
	 * back to this for compatibility reasons.
	 */
	if (!modclk) {
		modclk = devm_clk_get(..., NULL);
	}
 
> You see, DT nodes for other variants don't have clock-names property at all. 
> If it would be specified, it would be "mod". So, DT nodes for other variants 
> have "mod" clock specified on first place (the only one), while H6 DT node will 
> have "mod" clock specified on second place (see one of e-mails from Maxime), so 
> "NULL" can't be used instead of "mod" in both cases.
> 
> So I would say quirk is beneficial to know if you have to look up clocks by 
> name or you just take first clock specified.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web, visit https://groups.google.com/d/msgid/linux-sunxi/20190729161435.5bnj3ikocsyep4dd%40pengutronix.de.

WARNING: multiple messages have this Message-ID (diff)
From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: "Jernej Škrabec" <jernej.skrabec@siol.net>
Cc: mark.rutland@arm.com, linux-pwm@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	mripard@kernel.org, linux-sunxi@googlegroups.com,
	robh+dt@kernel.org, thierry.reding@gmail.com,
	kernel@pengutronix.de, wens@csie.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 3/6] pwm: sun4i: Add a quirk for bus clock
Date: Mon, 29 Jul 2019 18:14:35 +0200	[thread overview]
Message-ID: <20190729161435.5bnj3ikocsyep4dd@pengutronix.de> (raw)
In-Reply-To: <4022372.WfP88Fa4Lu@jernej-laptop>

Hello Jernej,

On Mon, Jul 29, 2019 at 05:48:36PM +0200, Jernej Škrabec wrote:
> Dne ponedeljek, 29. julij 2019 ob 08:38:25 CEST je Uwe Kleine-König 
> napisal(a):
> > Hello,
> > 
> > On Fri, Jul 26, 2019 at 08:40:42PM +0200, Jernej Skrabec wrote:
> > > H6 PWM core needs bus clock to be enabled in order to work.
> > > 
> > > Add a quirk for it.
> > > 
> > > Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
> > > ---
> > > 
> > >  drivers/pwm/pwm-sun4i.c | 15 +++++++++++++++
> > >  1 file changed, 15 insertions(+)
> > > 
> > > diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
> > > index 1b7be8fbde86..7d3ac3f2dc3f 100644
> > > --- a/drivers/pwm/pwm-sun4i.c
> > > +++ b/drivers/pwm/pwm-sun4i.c
> > > @@ -72,6 +72,7 @@ static const u32 prescaler_table[] = {
> > > 
> > >  };
> > >  
> > >  struct sun4i_pwm_data {
> > > 
> > > +	bool has_bus_clock;
> > > 
> > >  	bool has_prescaler_bypass;
> > >  	bool has_reset;
> > >  	unsigned int npwm;
> > > 
> > > @@ -79,6 +80,7 @@ struct sun4i_pwm_data {
> > > 
> > >  struct sun4i_pwm_chip {
> > >  
> > >  	struct pwm_chip chip;
> > > 
> > > +	struct clk *bus_clk;
> > > 
> > >  	struct clk *clk;
> > >  	struct reset_control *rst;
> > >  	void __iomem *base;
> > > 
> > > @@ -382,6 +384,16 @@ static int sun4i_pwm_probe(struct platform_device
> > > *pdev)> 
> > >  		reset_control_deassert(pwm->rst);
> > >  	
> > >  	}
> > > 
> > > +	if (pwm->data->has_bus_clock) {
> > > +		pwm->bus_clk = devm_clk_get(&pdev->dev, "bus");
> > 
> > Similar to my suggestion in patch 2: I'd use devm_clk_get_optional() and
> > drop struct sun4i_pwm_data::has_bus_clock.
> 
> This one is not so simple. This patch has incorrect logic. Correct logic would 
> be to use "devm_clk_get(&pdev->dev, NULL)" for variants without bus clock as 
> it is done already and "devm_clk_get(&pdev->dev, "bus")" and 
> "devm_clk_get(&pdev->dev, "mod")" for variants with bus clock.

Then maybe something like the following?:

	busclk = devm_clk_get_optional(..., "bus");
	modclk = devm_clk_get_optional(..., "mod");

	/*
	 * old dtbs might have a single clock but no clock names. Fall
	 * back to this for compatibility reasons.
	 */
	if (!modclk) {
		modclk = devm_clk_get(..., NULL);
	}
 
> You see, DT nodes for other variants don't have clock-names property at all. 
> If it would be specified, it would be "mod". So, DT nodes for other variants 
> have "mod" clock specified on first place (the only one), while H6 DT node will 
> have "mod" clock specified on second place (see one of e-mails from Maxime), so 
> "NULL" can't be used instead of "mod" in both cases.
> 
> So I would say quirk is beneficial to know if you have to look up clocks by 
> name or you just take first clock specified.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2019-07-29 16:14 UTC|newest]

Thread overview: 128+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-26 18:40 [PATCH 0/6] pwm: sun4i: Add support for Allwinner H6 Jernej Skrabec
2019-07-26 18:40 ` Jernej Skrabec
2019-07-26 18:40 ` Jernej Skrabec
2019-07-26 18:40 ` [PATCH 1/6] dt-bindings: pwm: allwinner: Add H6 PWM description Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-27 10:42   ` Maxime Ripard
2019-07-27 10:42     ` Maxime Ripard
2019-07-27 10:42     ` Maxime Ripard
2019-07-26 18:40 ` [PATCH 2/6] pwm: sun4i: Add a quirk for reset line Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-27 10:42   ` Maxime Ripard
2019-07-27 10:42     ` Maxime Ripard
2019-07-29  6:36   ` Uwe Kleine-König
2019-07-29  6:36     ` Uwe Kleine-König
2019-07-29  6:36     ` Uwe Kleine-König
2019-07-29  6:43     ` Chen-Yu Tsai
2019-07-29  6:43       ` Chen-Yu Tsai
2019-07-29  6:43       ` Chen-Yu Tsai
2019-07-29  7:12       ` Uwe Kleine-König
2019-07-29  7:12         ` Uwe Kleine-König
2019-07-29  7:12         ` Uwe Kleine-König
2019-07-29 10:18         ` Philipp Zabel
2019-07-29 10:18           ` Philipp Zabel
2019-07-29 16:37         ` Maxime Ripard
2019-07-29 16:37           ` Maxime Ripard
2019-07-29 18:20           ` Uwe Kleine-König
2019-07-29 18:20             ` Uwe Kleine-König
2019-07-29 18:20             ` Uwe Kleine-König
2019-07-26 18:40 ` [PATCH 3/6] pwm: sun4i: Add a quirk for bus clock Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-27 10:46   ` Maxime Ripard
2019-07-27 10:46     ` Maxime Ripard
2019-07-27 14:15     ` Jernej Škrabec
2019-07-27 14:15       ` Jernej Škrabec
2019-07-27 14:15       ` Jernej Škrabec
2019-07-27 14:27     ` Chen-Yu Tsai
2019-07-27 14:27       ` Chen-Yu Tsai
2019-07-27 14:27       ` Chen-Yu Tsai
2019-07-29  6:38   ` Uwe Kleine-König
2019-07-29  6:38     ` Uwe Kleine-König
2019-07-29 15:48     ` Jernej Škrabec
2019-07-29 15:48       ` Jernej Škrabec
2019-07-29 15:48       ` Jernej Škrabec
2019-07-29 16:14       ` Uwe Kleine-König [this message]
2019-07-29 16:14         ` Uwe Kleine-König
2019-07-29 16:14         ` Uwe Kleine-König
2019-07-29 16:45         ` Maxime Ripard
2019-07-29 16:45           ` Maxime Ripard
2019-07-29 19:04           ` Uwe Kleine-König
2019-07-29 19:04             ` Uwe Kleine-König
2019-07-29 19:04             ` Uwe Kleine-König
2019-07-26 18:40 ` [PATCH 4/6] pwm: sun4i: Add support for H6 PWM Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-29  6:40   ` Uwe Kleine-König
2019-07-29  6:40     ` Uwe Kleine-König
2019-07-29  6:40     ` Uwe Kleine-König
2019-07-29 15:55     ` Jernej Škrabec
2019-07-29 15:55       ` Jernej Škrabec
2019-07-29 15:55       ` Jernej Škrabec
2019-07-29 16:07       ` Uwe Kleine-König
2019-07-29 16:07         ` Uwe Kleine-König
2019-07-29 16:07         ` Uwe Kleine-König
2019-07-29 16:09         ` [linux-sunxi] " Chen-Yu Tsai
2019-07-29 16:09           ` Chen-Yu Tsai
2019-07-29 16:24           ` Uwe Kleine-König
2019-07-29 16:24             ` Uwe Kleine-König
2019-07-29 16:24             ` Uwe Kleine-König
2019-07-29 16:24             ` Uwe Kleine-König
2019-07-29 16:40             ` [linux-sunxi] " Jernej Škrabec
2019-07-29 16:40               ` Jernej Škrabec
2019-07-29 16:40               ` Jernej Škrabec
2019-07-29 18:40               ` [linux-sunxi] " Uwe Kleine-König
2019-07-29 18:40                 ` Uwe Kleine-König
2019-07-29 18:40                 ` Uwe Kleine-König
2019-07-29 18:46                 ` [linux-sunxi] " Jernej Škrabec
2019-07-29 18:46                   ` Jernej Škrabec
2019-07-29 18:46                   ` Jernej Škrabec
2019-07-29 18:51                   ` [linux-sunxi] " Uwe Kleine-König
2019-07-29 18:51                     ` Uwe Kleine-König
2019-07-29 18:51                     ` Uwe Kleine-König
2019-07-29 22:04                     ` [linux-sunxi] " Jernej Škrabec
2019-07-29 22:04                       ` Jernej Škrabec
2019-07-29 22:04                       ` Jernej Škrabec
2019-07-30  8:09                       ` [linux-sunxi] " Uwe Kleine-König
2019-07-30  8:09                         ` Uwe Kleine-König
2019-07-30  8:09                         ` Uwe Kleine-König
2019-07-30  8:32                         ` [linux-sunxi] " Chen-Yu Tsai
2019-07-30  8:32                           ` Chen-Yu Tsai
2019-07-30  8:32                           ` Chen-Yu Tsai
2019-07-30 17:06                         ` [linux-sunxi] " Maxime Ripard
2019-07-30 17:06                           ` Maxime Ripard
2019-07-31  6:52                           ` Uwe Kleine-König
2019-07-31  6:52                             ` Uwe Kleine-König
2019-07-31  6:52                             ` Uwe Kleine-König
2019-08-12  9:56                             ` [linux-sunxi] " Maxime Ripard
2019-08-12  9:56                               ` Maxime Ripard
2019-08-12 10:47                               ` Uwe Kleine-König
2019-08-12 10:47                                 ` Uwe Kleine-König
2019-08-12 10:47                                 ` Uwe Kleine-König
2019-08-12 10:51                                 ` [linux-sunxi] " Jernej Škrabec
2019-08-12 10:51                                   ` Jernej Škrabec
2019-08-12 10:51                                   ` Jernej Škrabec
2019-07-26 18:40 ` [PATCH 5/6] pwm: sun4i: Add support to output source clock directly Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-27 10:50   ` Maxime Ripard
2019-07-27 10:50     ` Maxime Ripard
2019-07-27 14:28     ` Jernej Škrabec
2019-07-27 14:28       ` Jernej Škrabec
2019-07-27 14:28       ` Jernej Škrabec
2019-07-27 14:54       ` [linux-sunxi] " Chen-Yu Tsai
2019-07-27 14:54         ` Chen-Yu Tsai
2019-07-27 14:54         ` Chen-Yu Tsai
2019-07-29  7:06   ` Uwe Kleine-König
2019-07-29  7:06     ` Uwe Kleine-König
2019-07-29  7:06     ` Uwe Kleine-König
2019-07-29 16:16     ` Jernej Škrabec
2019-07-29 16:16       ` Jernej Škrabec
2019-07-29 16:16       ` Jernej Škrabec
2019-07-29 16:29       ` Uwe Kleine-König
2019-07-29 16:29         ` Uwe Kleine-König
2019-07-26 18:40 ` [PATCH 6/6] arm64: dts: allwinner: h6: Add PWM node Jernej Skrabec
2019-07-26 18:40   ` Jernej Skrabec
2019-07-27 10:51   ` Maxime Ripard
2019-07-27 10:51     ` Maxime Ripard

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=20190729161435.5bnj3ikocsyep4dd@pengutronix.de \
    --to=u.kleine-koenig@pengutronix.de \
    --cc=devicetree@vger.kernel.org \
    --cc=jernej.skrabec@siol.net \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=linux-sunxi@googlegroups.com \
    --cc=mark.rutland@arm.com \
    --cc=mripard@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=wens@csie.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.