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

Commit d8ec0961 authored by Josh Wu's avatar Josh Wu Committed by Mauro Carvalho Chehab
Browse files

[media] atmel-isi: add code to enable/disable ISI_MCK clock



This patch
- add ISI_MCK clock enable/disable code.
- change field name in isi_platform_data structure

Signed-off-by: default avatarJosh Wu <josh.wu@atmel.com>
[g.liakhovetski@gmx.de: fix label names]
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 48ecf9fe
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -90,7 +90,10 @@ struct atmel_isi {
	struct isi_dma_desc		dma_desc[MAX_BUFFER_NUM];

	struct completion		complete;
	/* ISI peripherial clock */
	struct clk			*pclk;
	/* ISI_MCK, feed to camera sensor to generate pixel clock */
	struct clk			*mck;
	unsigned int			irq;

	struct isi_platform_data	*pdata;
@@ -766,6 +769,12 @@ static int isi_camera_add_device(struct soc_camera_device *icd)
	if (ret)
		return ret;

	ret = clk_enable(isi->mck);
	if (ret) {
		clk_disable(isi->pclk);
		return ret;
	}

	isi->icd = icd;
	dev_dbg(icd->parent, "Atmel ISI Camera driver attached to camera %d\n",
		 icd->devnum);
@@ -779,6 +788,7 @@ static void isi_camera_remove_device(struct soc_camera_device *icd)

	BUG_ON(icd != isi->icd);

	clk_disable(isi->mck);
	clk_disable(isi->pclk);
	isi->icd = NULL;

@@ -874,7 +884,7 @@ static int isi_camera_set_bus_param(struct soc_camera_device *icd)

	if (isi->pdata->has_emb_sync)
		cfg1 |= ISI_CFG1_EMB_SYNC;
	if (isi->pdata->isi_full_mode)
	if (isi->pdata->full_mode)
		cfg1 |= ISI_CFG1_FULL_MODE;

	isi_writel(isi, ISI_CTRL, ISI_CTRL_DIS);
@@ -912,6 +922,7 @@ static int __devexit atmel_isi_remove(struct platform_device *pdev)
			isi->fb_descriptors_phys);

	iounmap(isi->regs);
	clk_put(isi->mck);
	clk_put(isi->pclk);
	kfree(isi);

@@ -930,7 +941,7 @@ static int __devinit atmel_isi_probe(struct platform_device *pdev)
	struct isi_platform_data *pdata;

	pdata = dev->platform_data;
	if (!pdata || !pdata->data_width_flags) {
	if (!pdata || !pdata->data_width_flags || !pdata->mck_hz) {
		dev_err(&pdev->dev,
			"No config available for Atmel ISI\n");
		return -EINVAL;
@@ -959,6 +970,19 @@ static int __devinit atmel_isi_probe(struct platform_device *pdev)
	INIT_LIST_HEAD(&isi->video_buffer_list);
	INIT_LIST_HEAD(&isi->dma_desc_head);

	/* Get ISI_MCK, provided by programmable clock or external clock */
	isi->mck = clk_get(dev, "isi_mck");
	if (IS_ERR(isi->mck)) {
		dev_err(dev, "Failed to get isi_mck\n");
		ret = PTR_ERR(isi->mck);
		goto err_clk_get;
	}

	/* Set ISI_MCK's frequency, it should be faster than pixel clock */
	ret = clk_set_rate(isi->mck, pdata->mck_hz);
	if (ret < 0)
		goto err_set_mck_rate;

	isi->p_fb_descriptors = dma_alloc_coherent(&pdev->dev,
				sizeof(struct fbd) * MAX_BUFFER_NUM,
				&isi->fb_descriptors_phys,
@@ -1034,6 +1058,9 @@ static int __devinit atmel_isi_probe(struct platform_device *pdev)
			isi->p_fb_descriptors,
			isi->fb_descriptors_phys);
err_alloc_descriptors:
err_set_mck_rate:
	clk_put(isi->mck);
err_clk_get:
	kfree(isi);
err_alloc_isi:
	clk_put(pclk);
+3 −1
Original line number Diff line number Diff line
@@ -110,10 +110,12 @@ struct isi_platform_data {
	u8 hsync_act_low;
	u8 vsync_act_low;
	u8 pclk_act_falling;
	u8 isi_full_mode;
	u8 full_mode;
	u32 data_width_flags;
	/* Using for ISI_CFG1 */
	u32 frate;
	/* Using for ISI_MCK */
	u32 mck_hz;
};

#endif /* __ATMEL_ISI_H__ */