aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2013-11-22 21:06:54 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-12-18 03:45:10 -0500
commitf389e89c35fbfe17ffcb94378c225c933c28bdb2 (patch)
treed75f717eaa6b984048908bf7afc71ae3b230b457 /drivers/media/platform
parentc768626479187f1fcc3697e5f150b7af259c657c (diff)
[media] v4l: atmel-isi: Make the MCK clock optional
ISI_MCK is the sensor master clock. It should be handled by the sensor driver directly, as the ISI has no use for that clock. Make the clock optional here while platforms transition to the correct model. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Josh Wu <josh.wu@atmel.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/soc_camera/atmel-isi.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/drivers/media/platform/soc_camera/atmel-isi.c b/drivers/media/platform/soc_camera/atmel-isi.c
index ae2c8c1f3c46..3e8d4129b0ba 100644
--- a/drivers/media/platform/soc_camera/atmel-isi.c
+++ b/drivers/media/platform/soc_camera/atmel-isi.c
@@ -725,10 +725,12 @@ static int isi_camera_clock_start(struct soc_camera_host *ici)
725 if (ret) 725 if (ret)
726 return ret; 726 return ret;
727 727
728 ret = clk_prepare_enable(isi->mck); 728 if (!IS_ERR(isi->mck)) {
729 if (ret) { 729 ret = clk_prepare_enable(isi->mck);
730 clk_disable_unprepare(isi->pclk); 730 if (ret) {
731 return ret; 731 clk_disable_unprepare(isi->pclk);
732 return ret;
733 }
732 } 734 }
733 735
734 return 0; 736 return 0;
@@ -739,7 +741,8 @@ static void isi_camera_clock_stop(struct soc_camera_host *ici)
739{ 741{
740 struct atmel_isi *isi = ici->priv; 742 struct atmel_isi *isi = ici->priv;
741 743
742 clk_disable_unprepare(isi->mck); 744 if (!IS_ERR(isi->mck))
745 clk_disable_unprepare(isi->mck);
743 clk_disable_unprepare(isi->pclk); 746 clk_disable_unprepare(isi->pclk);
744} 747}
745 748
@@ -883,7 +886,7 @@ static int atmel_isi_probe(struct platform_device *pdev)
883 struct isi_platform_data *pdata; 886 struct isi_platform_data *pdata;
884 887
885 pdata = dev->platform_data; 888 pdata = dev->platform_data;
886 if (!pdata || !pdata->data_width_flags || !pdata->mck_hz) { 889 if (!pdata || !pdata->data_width_flags) {
887 dev_err(&pdev->dev, 890 dev_err(&pdev->dev,
888 "No config available for Atmel ISI\n"); 891 "No config available for Atmel ISI\n");
889 return -EINVAL; 892 return -EINVAL;
@@ -905,18 +908,21 @@ static int atmel_isi_probe(struct platform_device *pdev)
905 INIT_LIST_HEAD(&isi->video_buffer_list); 908 INIT_LIST_HEAD(&isi->video_buffer_list);
906 INIT_LIST_HEAD(&isi->dma_desc_head); 909 INIT_LIST_HEAD(&isi->dma_desc_head);
907 910
908 /* Get ISI_MCK, provided by programmable clock or external clock */ 911 /* ISI_MCK is the sensor master clock. It should be handled by the
912 * sensor driver directly, as the ISI has no use for that clock. Make
913 * the clock optional here while platforms transition to the correct
914 * model.
915 */
909 isi->mck = devm_clk_get(dev, "isi_mck"); 916 isi->mck = devm_clk_get(dev, "isi_mck");
910 if (IS_ERR(isi->mck)) { 917 if (!IS_ERR(isi->mck)) {
911 dev_err(dev, "Failed to get isi_mck\n"); 918 /* Set ISI_MCK's frequency, it should be faster than pixel
912 return PTR_ERR(isi->mck); 919 * clock.
920 */
921 ret = clk_set_rate(isi->mck, pdata->mck_hz);
922 if (ret < 0)
923 return ret;
913 } 924 }
914 925
915 /* Set ISI_MCK's frequency, it should be faster than pixel clock */
916 ret = clk_set_rate(isi->mck, pdata->mck_hz);
917 if (ret < 0)
918 return ret;
919
920 isi->p_fb_descriptors = dma_alloc_coherent(&pdev->dev, 926 isi->p_fb_descriptors = dma_alloc_coherent(&pdev->dev,
921 sizeof(struct fbd) * MAX_BUFFER_NUM, 927 sizeof(struct fbd) * MAX_BUFFER_NUM,
922 &isi->fb_descriptors_phys, 928 &isi->fb_descriptors_phys,