Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 434d40df authored by Fabio Estevam's avatar Fabio Estevam Committed by Mauro Carvalho Chehab
Browse files

media: imx7-media-csi: Acquire a single clock



As per the i.MX7D Reference Manual only the MCLK is used for
the CSI block, so only handle this single clock.

Signed-off-by: default avatarFabio Estevam <festevam@gmail.com>
Tested-by: default avatarRui Miguel Silva <rmfrfs@gmail.com>
Reviewed-by: default avatarRui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 87562287
Loading
Loading
Loading
Loading
+8 −43
Original line number Diff line number Diff line
@@ -152,8 +152,6 @@
#define CSI_CSICR18		0x48
#define CSI_CSICR19		0x4c

static const char * const imx7_csi_clk_id[] = {"axi", "dcic", "mclk"};

struct imx7_csi {
	struct device *dev;
	struct v4l2_subdev sd;
@@ -180,9 +178,7 @@ struct imx7_csi {

	void __iomem *regbase;
	int irq;

	int num_clks;
	struct clk_bulk_data *clks;
	struct clk *mclk;

	/* active vb2 buffers to send to video dev sink */
	struct imx_media_buffer *active_vb2_buf[2];
@@ -204,20 +200,6 @@ struct imx7_csi {
#define imx7_csi_reg_write(_csi, _val, _offset) \
	__raw_writel(_val, (_csi)->regbase + (_offset))

static void imx7_csi_clk_enable(struct imx7_csi *csi)
{
	int ret;

	ret = clk_bulk_prepare_enable(csi->num_clks, csi->clks);
	if (ret < 0)
		dev_err(csi->dev, "failed to enable clocks\n");
}

static void imx7_csi_clk_disable(struct imx7_csi *csi)
{
	clk_bulk_disable_unprepare(csi->num_clks, csi->clks);
}

static void imx7_csi_hw_reset(struct imx7_csi *csi)
{
	imx7_csi_reg_write(csi,
@@ -413,7 +395,7 @@ static void imx7_csi_init(struct imx7_csi *csi)
	if (csi->is_init)
		return;

	imx7_csi_clk_enable(csi);
	clk_prepare_enable(csi->mclk);
	imx7_csi_hw_reset(csi);
	imx7_csi_init_interface(csi);
	imx7_csi_dmareq_rff_enable(csi);
@@ -429,7 +411,7 @@ static void imx7_csi_deinit(struct imx7_csi *csi)
	imx7_csi_hw_reset(csi);
	imx7_csi_init_interface(csi);
	imx7_csi_dmareq_rff_disable(csi);
	imx7_csi_clk_disable(csi);
	clk_disable_unprepare(csi->mclk);

	csi->is_init = false;
}
@@ -1176,24 +1158,6 @@ static int imx7_csi_parse_endpoint(struct device *dev,
	return fwnode_device_is_available(asd->match.fwnode) ? 0 : -EINVAL;
}

static int imx7_csi_clocks_get(struct imx7_csi *csi)
{
	struct device *dev = csi->dev;
	int i;

	csi->num_clks = ARRAY_SIZE(imx7_csi_clk_id);
	csi->clks = devm_kcalloc(dev, csi->num_clks, sizeof(*csi->clks),
				 GFP_KERNEL);

	if (!csi->clks)
		return -ENOMEM;

	for (i = 0; i < csi->num_clks; i++)
		csi->clks[i].id = imx7_csi_clk_id[i];

	return devm_clk_bulk_get(dev, csi->num_clks, csi->clks);
}

static int imx7_csi_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
@@ -1209,10 +1173,11 @@ static int imx7_csi_probe(struct platform_device *pdev)

	csi->dev = dev;

	ret = imx7_csi_clocks_get(csi);
	if (ret < 0) {
		dev_err(dev, "Failed to get clocks");
		return -ENODEV;
	csi->mclk = devm_clk_get(&pdev->dev, "mclk");
	if (IS_ERR(csi->mclk)) {
		ret = PTR_ERR(csi->mclk);
		dev_err(dev, "Failed to get mclk: %d", ret);
		return ret;
	}

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);