From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: "Frank Schäfer" <fschaefer.oss@googlemail.com>
Cc: g.liakhovetski@gmx.de, m.chehab@samsung.com,
hans.verkuil@cisco.com, linux-media@vger.kernel.org
Subject: Re: [PATCH RFC] soc_camera: sensors: make v4l2_clk optional
Date: Wed, 21 Aug 2013 23:20:08 +0200 [thread overview]
Message-ID: <459042423.HtSBbTYPmb@avalon> (raw)
In-Reply-To: <1377117917-3891-1-git-send-email-fschaefer.oss@googlemail.com>
Hi Frank,
On Wednesday 21 August 2013 22:45:17 Frank Schäfer wrote:
> commit 9aea470b "soc-camera: switch I2C subdevice drivers to use v4l2-clk"
> made a v4l2_clk mandatory for each sensor.
> While this isn't necessary, it also broke the em28xx driver in connection
> with ov2640 subdevices and maybe other drivers outside soc_camera as well.
While this probably fixes the issue, I don't think it's the way to go. The
em28xx driver should instead provide a clock. If we can fix that in time
reverting the patches until the next kernel version would have my preference.
> Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
> ---
> drivers/media/i2c/soc_camera/imx074.c | 12 ++++++------
> drivers/media/i2c/soc_camera/mt9m001.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/mt9m111.c | 8 +++++---
> drivers/media/i2c/soc_camera/mt9t031.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/mt9t112.c | 7 ++++---
> drivers/media/i2c/soc_camera/mt9v022.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/ov2640.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/ov5642.c | 7 ++++---
> drivers/media/i2c/soc_camera/ov6650.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/ov772x.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/ov9640.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/ov9740.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/rj54n1cb0c.c | 13 ++++++-------
> drivers/media/i2c/soc_camera/tw9910.c | 7 ++++---
> 14 Dateien geändert, 77 Zeilen hinzugefügt(+), 81 Zeilen entfernt(-)
>
> diff --git a/drivers/media/i2c/soc_camera/imx074.c
> b/drivers/media/i2c/soc_camera/imx074.c index 1d384a3..e7b6124 100644
> --- a/drivers/media/i2c/soc_camera/imx074.c
> +++ b/drivers/media/i2c/soc_camera/imx074.c
> @@ -438,10 +438,8 @@ static int imx074_probe(struct i2c_client *client,
> priv->fmt = &imx074_colour_fmts[0];
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - dev_info(&client->dev, "Error %ld getting clock\n", PTR_ERR(priv-
>clk));
> - return -EPROBE_DEFER;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = soc_camera_power_init(&client->dev, ssdd);
> if (ret < 0)
> @@ -455,7 +453,8 @@ static int imx074_probe(struct i2c_client *client,
>
> epwrinit:
> eprobe:
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> return ret;
> }
>
> @@ -465,7 +464,8 @@ static int imx074_remove(struct i2c_client *client)
> struct imx074 *priv = to_imx074(client);
>
> v4l2_async_unregister_subdev(&priv->subdev);
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
>
> if (ssdd->free_bus)
> ssdd->free_bus(ssdd);
> diff --git a/drivers/media/i2c/soc_camera/mt9m001.c
> b/drivers/media/i2c/soc_camera/mt9m001.c index df97033..07af1bc 100644
> --- a/drivers/media/i2c/soc_camera/mt9m001.c
> +++ b/drivers/media/i2c/soc_camera/mt9m001.c
> @@ -685,15 +685,13 @@ static int mt9m001_probe(struct i2c_client *client,
> mt9m001->rect.height = MT9M001_MAX_HEIGHT;
>
> mt9m001->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(mt9m001->clk)) {
> - ret = PTR_ERR(mt9m001->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(mt9m001->clk))
> + mt9m001->clk = NULL;
>
> ret = mt9m001_video_probe(ssdd, client);
> if (ret) {
> - v4l2_clk_put(mt9m001->clk);
> -eclkget:
> + if (mt9m001->clk)
> + v4l2_clk_put(mt9m001->clk);
> v4l2_ctrl_handler_free(&mt9m001->hdl);
> }
>
> @@ -705,7 +703,8 @@ static int mt9m001_remove(struct i2c_client *client)
> struct mt9m001 *mt9m001 = to_mt9m001(client);
> struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
>
> - v4l2_clk_put(mt9m001->clk);
> + if (mt9m001->clk)
> + v4l2_clk_put(mt9m001->clk);
> v4l2_device_unregister_subdev(&mt9m001->subdev);
> v4l2_ctrl_handler_free(&mt9m001->hdl);
> mt9m001_video_remove(ssdd);
> diff --git a/drivers/media/i2c/soc_camera/mt9m111.c
> b/drivers/media/i2c/soc_camera/mt9m111.c index 6f40566..498f22e 100644
> --- a/drivers/media/i2c/soc_camera/mt9m111.c
> +++ b/drivers/media/i2c/soc_camera/mt9m111.c
> @@ -948,7 +948,7 @@ static int mt9m111_probe(struct i2c_client *client,
>
> mt9m111->clk = v4l2_clk_get(&client->dev, "mclk");
> if (IS_ERR(mt9m111->clk))
> - return -EPROBE_DEFER;
> + mt9m111->clk = NULL;
>
> /* Default HIGHPOWER context */
> mt9m111->ctx = &context_b;
> @@ -999,7 +999,8 @@ static int mt9m111_probe(struct i2c_client *client,
> out_hdlfree:
> v4l2_ctrl_handler_free(&mt9m111->hdl);
> out_clkput:
> - v4l2_clk_put(mt9m111->clk);
> + if (mt9m111->clk)
> + v4l2_clk_put(mt9m111->clk);
>
> return ret;
> }
> @@ -1009,7 +1010,8 @@ static int mt9m111_remove(struct i2c_client *client)
> struct mt9m111 *mt9m111 = to_mt9m111(client);
>
> v4l2_async_unregister_subdev(&mt9m111->subdev);
> - v4l2_clk_put(mt9m111->clk);
> + if (mt9m111->clk)
> + v4l2_clk_put(mt9m111->clk);
> v4l2_device_unregister_subdev(&mt9m111->subdev);
> v4l2_ctrl_handler_free(&mt9m111->hdl);
>
> diff --git a/drivers/media/i2c/soc_camera/mt9t031.c
> b/drivers/media/i2c/soc_camera/mt9t031.c index ee7bb0f..3131d36 100644
> --- a/drivers/media/i2c/soc_camera/mt9t031.c
> +++ b/drivers/media/i2c/soc_camera/mt9t031.c
> @@ -792,15 +792,13 @@ static int mt9t031_probe(struct i2c_client *client,
> mt9t031->yskip = 1;
>
> mt9t031->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(mt9t031->clk)) {
> - ret = PTR_ERR(mt9t031->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(mt9t031->clk))
> + mt9t031->clk = NULL;
>
> ret = mt9t031_video_probe(client);
> if (ret) {
> - v4l2_clk_put(mt9t031->clk);
> -eclkget:
> + if (mt9t031->clk)
> + v4l2_clk_put(mt9t031->clk);
> v4l2_ctrl_handler_free(&mt9t031->hdl);
> }
>
> @@ -811,7 +809,8 @@ static int mt9t031_remove(struct i2c_client *client)
> {
> struct mt9t031 *mt9t031 = to_mt9t031(client);
>
> - v4l2_clk_put(mt9t031->clk);
> + if (mt9t031->clk)
> + v4l2_clk_put(mt9t031->clk);
> v4l2_device_unregister_subdev(&mt9t031->subdev);
> v4l2_ctrl_handler_free(&mt9t031->hdl);
>
> diff --git a/drivers/media/i2c/soc_camera/mt9t112.c
> b/drivers/media/i2c/soc_camera/mt9t112.c index 46f431a..0a7d6e7 100644
> --- a/drivers/media/i2c/soc_camera/mt9t112.c
> +++ b/drivers/media/i2c/soc_camera/mt9t112.c
> @@ -1097,14 +1097,14 @@ static int mt9t112_probe(struct i2c_client *client,
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> if (IS_ERR(priv->clk))
> - return PTR_ERR(priv->clk);
> + priv->clk = NULL;
>
> ret = mt9t112_camera_probe(client);
>
> /* Cannot fail: using the default supported pixel code */
> if (!ret)
> mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8);
> - else
> + else if (priv->clk)
> v4l2_clk_put(priv->clk);
>
> return ret;
> @@ -1114,7 +1114,8 @@ static int mt9t112_remove(struct i2c_client *client)
> {
> struct mt9t112_priv *priv = to_mt9t112(client);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> return 0;
> }
>
> diff --git a/drivers/media/i2c/soc_camera/mt9v022.c
> b/drivers/media/i2c/soc_camera/mt9v022.c index f9f95f8..bd0f3947 100644
> --- a/drivers/media/i2c/soc_camera/mt9v022.c
> +++ b/drivers/media/i2c/soc_camera/mt9v022.c
> @@ -940,15 +940,13 @@ static int mt9v022_probe(struct i2c_client *client,
> mt9v022->rect.height = MT9V022_MAX_HEIGHT;
>
> mt9v022->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(mt9v022->clk)) {
> - ret = PTR_ERR(mt9v022->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(mt9v022->clk))
> + mt9v022->clk = NULL;
>
> ret = mt9v022_video_probe(client);
> if (ret) {
> - v4l2_clk_put(mt9v022->clk);
> -eclkget:
> + if (mt9v022->clk)
> + v4l2_clk_put(mt9v022->clk);
> v4l2_ctrl_handler_free(&mt9v022->hdl);
> }
>
> @@ -960,7 +958,8 @@ static int mt9v022_remove(struct i2c_client *client)
> struct mt9v022 *mt9v022 = to_mt9v022(client);
> struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
>
> - v4l2_clk_put(mt9v022->clk);
> + if (mt9v022->clk)
> + v4l2_clk_put(mt9v022->clk);
> v4l2_device_unregister_subdev(&mt9v022->subdev);
> if (ssdd->free_bus)
> ssdd->free_bus(ssdd);
> diff --git a/drivers/media/i2c/soc_camera/ov2640.c
> b/drivers/media/i2c/soc_camera/ov2640.c index 6c6b1c3..b015c4d 100644
> --- a/drivers/media/i2c/soc_camera/ov2640.c
> +++ b/drivers/media/i2c/soc_camera/ov2640.c
> @@ -1101,15 +1101,13 @@ static int ov2640_probe(struct i2c_client *client,
> return priv->hdl.error;
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - ret = PTR_ERR(priv->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = ov2640_video_probe(client);
> if (ret) {
> - v4l2_clk_put(priv->clk);
> -eclkget:
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_ctrl_handler_free(&priv->hdl);
> } else {
> dev_info(&adapter->dev, "OV2640 Probed\n");
> @@ -1122,7 +1120,8 @@ static int ov2640_remove(struct i2c_client *client)
> {
> struct ov2640_priv *priv = to_ov2640(client);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_device_unregister_subdev(&priv->subdev);
> v4l2_ctrl_handler_free(&priv->hdl);
> return 0;
> diff --git a/drivers/media/i2c/soc_camera/ov5642.c
> b/drivers/media/i2c/soc_camera/ov5642.c index 0a5c5d4..86802c9 100644
> --- a/drivers/media/i2c/soc_camera/ov5642.c
> +++ b/drivers/media/i2c/soc_camera/ov5642.c
> @@ -1029,10 +1029,10 @@ static int ov5642_probe(struct i2c_client *client,
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> if (IS_ERR(priv->clk))
> - return PTR_ERR(priv->clk);
> + priv->clk = NULL;
>
> ret = ov5642_video_probe(client);
> - if (ret < 0)
> + if (ret < 0 && priv->clk)
> v4l2_clk_put(priv->clk);
>
> return ret;
> @@ -1043,7 +1043,8 @@ static int ov5642_remove(struct i2c_client *client)
> struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
> struct ov5642 *priv = to_ov5642(client);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> if (ssdd->free_bus)
> ssdd->free_bus(ssdd);
>
> diff --git a/drivers/media/i2c/soc_camera/ov6650.c
> b/drivers/media/i2c/soc_camera/ov6650.c index ab01598..2bbd82c 100644
> --- a/drivers/media/i2c/soc_camera/ov6650.c
> +++ b/drivers/media/i2c/soc_camera/ov6650.c
> @@ -1017,15 +1017,13 @@ static int ov6650_probe(struct i2c_client *client,
> priv->colorspace = V4L2_COLORSPACE_JPEG;
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - ret = PTR_ERR(priv->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = ov6650_video_probe(client);
> if (ret) {
> - v4l2_clk_put(priv->clk);
> -eclkget:
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_ctrl_handler_free(&priv->hdl);
> }
>
> @@ -1036,7 +1034,8 @@ static int ov6650_remove(struct i2c_client *client)
> {
> struct ov6650 *priv = to_ov6650(client);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_device_unregister_subdev(&priv->subdev);
> v4l2_ctrl_handler_free(&priv->hdl);
> return 0;
> diff --git a/drivers/media/i2c/soc_camera/ov772x.c
> b/drivers/media/i2c/soc_camera/ov772x.c index 7f2b3c8..60eea93 100644
> --- a/drivers/media/i2c/soc_camera/ov772x.c
> +++ b/drivers/media/i2c/soc_camera/ov772x.c
> @@ -1076,15 +1076,13 @@ static int ov772x_probe(struct i2c_client *client,
> return priv->hdl.error;
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - ret = PTR_ERR(priv->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = ov772x_video_probe(priv);
> if (ret < 0) {
> - v4l2_clk_put(priv->clk);
> -eclkget:
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_ctrl_handler_free(&priv->hdl);
> } else {
> priv->cfmt = &ov772x_cfmts[0];
> @@ -1098,7 +1096,8 @@ static int ov772x_remove(struct i2c_client *client)
> {
> struct ov772x_priv *priv = to_ov772x(i2c_get_clientdata(client));
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_device_unregister_subdev(&priv->subdev);
> v4l2_ctrl_handler_free(&priv->hdl);
> return 0;
> diff --git a/drivers/media/i2c/soc_camera/ov9640.c
> b/drivers/media/i2c/soc_camera/ov9640.c index e968c3f..8a5830f 100644
> --- a/drivers/media/i2c/soc_camera/ov9640.c
> +++ b/drivers/media/i2c/soc_camera/ov9640.c
> @@ -703,15 +703,13 @@ static int ov9640_probe(struct i2c_client *client,
> return priv->hdl.error;
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - ret = PTR_ERR(priv->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = ov9640_video_probe(client);
> if (ret) {
> - v4l2_clk_put(priv->clk);
> -eclkget:
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_ctrl_handler_free(&priv->hdl);
> }
>
> @@ -723,7 +721,8 @@ static int ov9640_remove(struct i2c_client *client)
> struct v4l2_subdev *sd = i2c_get_clientdata(client);
> struct ov9640_priv *priv = to_ov9640_sensor(sd);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_device_unregister_subdev(&priv->subdev);
> v4l2_ctrl_handler_free(&priv->hdl);
> return 0;
> diff --git a/drivers/media/i2c/soc_camera/ov9740.c
> b/drivers/media/i2c/soc_camera/ov9740.c index ea76863..3906681 100644
> --- a/drivers/media/i2c/soc_camera/ov9740.c
> +++ b/drivers/media/i2c/soc_camera/ov9740.c
> @@ -961,15 +961,13 @@ static int ov9740_probe(struct i2c_client *client,
> return priv->hdl.error;
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(priv->clk)) {
> - ret = PTR_ERR(priv->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(priv->clk))
> + priv->clk = NULL;
>
> ret = ov9740_video_probe(client);
> if (ret < 0) {
> - v4l2_clk_put(priv->clk);
> -eclkget:
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_ctrl_handler_free(&priv->hdl);
> }
>
> @@ -980,7 +978,8 @@ static int ov9740_remove(struct i2c_client *client)
> {
> struct ov9740_priv *priv = i2c_get_clientdata(client);
>
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> v4l2_device_unregister_subdev(&priv->subdev);
> v4l2_ctrl_handler_free(&priv->hdl);
> return 0;
> diff --git a/drivers/media/i2c/soc_camera/rj54n1cb0c.c
> b/drivers/media/i2c/soc_camera/rj54n1cb0c.c index 7e6d978..47a8c76 100644
> --- a/drivers/media/i2c/soc_camera/rj54n1cb0c.c
> +++ b/drivers/media/i2c/soc_camera/rj54n1cb0c.c
> @@ -1359,15 +1359,13 @@ static int rj54n1_probe(struct i2c_client *client,
> (clk_div.ratio_tg + 1) / (clk_div.ratio_t + 1);
>
> rj54n1->clk = v4l2_clk_get(&client->dev, "mclk");
> - if (IS_ERR(rj54n1->clk)) {
> - ret = PTR_ERR(rj54n1->clk);
> - goto eclkget;
> - }
> + if (IS_ERR(rj54n1->clk))
> + rj54n1->clk = NULL;
>
> ret = rj54n1_video_probe(client, rj54n1_priv);
> if (ret < 0) {
> - v4l2_clk_put(rj54n1->clk);
> -eclkget:
> + if (rj54n1->clk)
> + v4l2_clk_put(rj54n1->clk);
> v4l2_ctrl_handler_free(&rj54n1->hdl);
> }
>
> @@ -1379,7 +1377,8 @@ static int rj54n1_remove(struct i2c_client *client)
> struct rj54n1 *rj54n1 = to_rj54n1(client);
> struct soc_camera_subdev_desc *ssdd = soc_camera_i2c_to_desc(client);
>
> - v4l2_clk_put(rj54n1->clk);
> + if (rj54n1->clk)
> + v4l2_clk_put(rj54n1->clk);
> v4l2_device_unregister_subdev(&rj54n1->subdev);
> if (ssdd->free_bus)
> ssdd->free_bus(ssdd);
> diff --git a/drivers/media/i2c/soc_camera/tw9910.c
> b/drivers/media/i2c/soc_camera/tw9910.c index ab54628..2fabae3 100644
> --- a/drivers/media/i2c/soc_camera/tw9910.c
> +++ b/drivers/media/i2c/soc_camera/tw9910.c
> @@ -928,10 +928,10 @@ static int tw9910_probe(struct i2c_client *client,
>
> priv->clk = v4l2_clk_get(&client->dev, "mclk");
> if (IS_ERR(priv->clk))
> - return PTR_ERR(priv->clk);
> + priv->clk = NULL;
>
> ret = tw9910_video_probe(client);
> - if (ret < 0)
> + if (ret < 0 && priv->clk)
> v4l2_clk_put(priv->clk);
>
> return ret;
> @@ -940,7 +940,8 @@ static int tw9910_probe(struct i2c_client *client,
> static int tw9910_remove(struct i2c_client *client)
> {
> struct tw9910_priv *priv = to_tw9910(client);
> - v4l2_clk_put(priv->clk);
> + if (priv->clk)
> + v4l2_clk_put(priv->clk);
> return 0;
> }
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2013-08-21 21:18 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-21 20:45 [PATCH RFC] soc_camera: sensors: make v4l2_clk optional Frank Schäfer
2013-08-21 21:20 ` Laurent Pinchart [this message]
2013-08-22 22:03 ` Frank Schäfer
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=459042423.HtSBbTYPmb@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=fschaefer.oss@googlemail.com \
--cc=g.liakhovetski@gmx.de \
--cc=hans.verkuil@cisco.com \
--cc=linux-media@vger.kernel.org \
--cc=m.chehab@samsung.com \
/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.