diff options
-rw-r--r-- | drivers/media/platform/vsp1/vsp1.h | 1 | ||||
-rw-r--r-- | drivers/media/platform/vsp1/vsp1_drv.c | 40 |
2 files changed, 36 insertions, 5 deletions
diff --git a/drivers/media/platform/vsp1/vsp1.h b/drivers/media/platform/vsp1/vsp1.h index 11ac94bec3a3..d6c6ecd039ff 100644 --- a/drivers/media/platform/vsp1/vsp1.h +++ b/drivers/media/platform/vsp1/vsp1.h | |||
@@ -42,6 +42,7 @@ struct vsp1_device { | |||
42 | 42 | ||
43 | void __iomem *mmio; | 43 | void __iomem *mmio; |
44 | struct clk *clock; | 44 | struct clk *clock; |
45 | struct clk *rt_clock; | ||
45 | 46 | ||
46 | struct mutex lock; | 47 | struct mutex lock; |
47 | int ref_count; | 48 | int ref_count; |
diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c index aa8b9b288e61..1c9e771aa15c 100644 --- a/drivers/media/platform/vsp1/vsp1_drv.c +++ b/drivers/media/platform/vsp1/vsp1_drv.c | |||
@@ -290,6 +290,33 @@ static int vsp1_device_init(struct vsp1_device *vsp1) | |||
290 | return 0; | 290 | return 0; |
291 | } | 291 | } |
292 | 292 | ||
293 | static int vsp1_clocks_enable(struct vsp1_device *vsp1) | ||
294 | { | ||
295 | int ret; | ||
296 | |||
297 | ret = clk_prepare_enable(vsp1->clock); | ||
298 | if (ret < 0) | ||
299 | return ret; | ||
300 | |||
301 | if (IS_ERR(vsp1->rt_clock)) | ||
302 | return 0; | ||
303 | |||
304 | ret = clk_prepare_enable(vsp1->rt_clock); | ||
305 | if (ret < 0) { | ||
306 | clk_disable_unprepare(vsp1->clock); | ||
307 | return ret; | ||
308 | } | ||
309 | |||
310 | return 0; | ||
311 | } | ||
312 | |||
313 | static void vsp1_clocks_disable(struct vsp1_device *vsp1) | ||
314 | { | ||
315 | if (!IS_ERR(vsp1->rt_clock)) | ||
316 | clk_disable_unprepare(vsp1->rt_clock); | ||
317 | clk_disable_unprepare(vsp1->clock); | ||
318 | } | ||
319 | |||
293 | /* | 320 | /* |
294 | * vsp1_device_get - Acquire the VSP1 device | 321 | * vsp1_device_get - Acquire the VSP1 device |
295 | * | 322 | * |
@@ -307,7 +334,7 @@ struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) | |||
307 | if (vsp1->ref_count > 0) | 334 | if (vsp1->ref_count > 0) |
308 | goto done; | 335 | goto done; |
309 | 336 | ||
310 | ret = clk_prepare_enable(vsp1->clock); | 337 | ret = vsp1_clocks_enable(vsp1); |
311 | if (ret < 0) { | 338 | if (ret < 0) { |
312 | __vsp1 = NULL; | 339 | __vsp1 = NULL; |
313 | goto done; | 340 | goto done; |
@@ -315,7 +342,7 @@ struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) | |||
315 | 342 | ||
316 | ret = vsp1_device_init(vsp1); | 343 | ret = vsp1_device_init(vsp1); |
317 | if (ret < 0) { | 344 | if (ret < 0) { |
318 | clk_disable_unprepare(vsp1->clock); | 345 | vsp1_clocks_disable(vsp1); |
319 | __vsp1 = NULL; | 346 | __vsp1 = NULL; |
320 | goto done; | 347 | goto done; |
321 | } | 348 | } |
@@ -339,7 +366,7 @@ void vsp1_device_put(struct vsp1_device *vsp1) | |||
339 | mutex_lock(&vsp1->lock); | 366 | mutex_lock(&vsp1->lock); |
340 | 367 | ||
341 | if (--vsp1->ref_count == 0) | 368 | if (--vsp1->ref_count == 0) |
342 | clk_disable_unprepare(vsp1->clock); | 369 | vsp1_clocks_disable(vsp1); |
343 | 370 | ||
344 | mutex_unlock(&vsp1->lock); | 371 | mutex_unlock(&vsp1->lock); |
345 | } | 372 | } |
@@ -358,7 +385,7 @@ static int vsp1_pm_suspend(struct device *dev) | |||
358 | if (vsp1->ref_count == 0) | 385 | if (vsp1->ref_count == 0) |
359 | return 0; | 386 | return 0; |
360 | 387 | ||
361 | clk_disable_unprepare(vsp1->clock); | 388 | vsp1_clocks_disable(vsp1); |
362 | return 0; | 389 | return 0; |
363 | } | 390 | } |
364 | 391 | ||
@@ -371,7 +398,7 @@ static int vsp1_pm_resume(struct device *dev) | |||
371 | if (vsp1->ref_count) | 398 | if (vsp1->ref_count) |
372 | return 0; | 399 | return 0; |
373 | 400 | ||
374 | return clk_prepare_enable(vsp1->clock); | 401 | return vsp1_clocks_enable(vsp1); |
375 | } | 402 | } |
376 | #endif | 403 | #endif |
377 | 404 | ||
@@ -445,6 +472,9 @@ static int vsp1_probe(struct platform_device *pdev) | |||
445 | return PTR_ERR(vsp1->clock); | 472 | return PTR_ERR(vsp1->clock); |
446 | } | 473 | } |
447 | 474 | ||
475 | /* The RT clock is optional */ | ||
476 | vsp1->rt_clock = devm_clk_get(&pdev->dev, "rt"); | ||
477 | |||
448 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 478 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
449 | if (!irq) { | 479 | if (!irq) { |
450 | dev_err(&pdev->dev, "missing IRQ\n"); | 480 | dev_err(&pdev->dev, "missing IRQ\n"); |