summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/media/video/msm-cam.txt4
-rw-r--r--arch/arm/boot/dts/qcom/sdm660-camera.dtsi1
-rw-r--r--drivers/media/platform/msm/camera_v2/msm.c20
-rw-r--r--drivers/media/platform/msm/camera_v2/msm.h4
4 files changed, 27 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/media/video/msm-cam.txt b/Documentation/devicetree/bindings/media/video/msm-cam.txt
index 9763bf8e4051..371447cfb64e 100644
--- a/Documentation/devicetree/bindings/media/video/msm-cam.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-cam.txt
@@ -6,10 +6,14 @@ Required properties:
- reg : offset and length of msm camera device registers.
- reg-names : should specify relevant names for each reg property defined.
+Optional properties:
+- qcom,gpu-limit : valid kgsl frequency.
+
Example:
qcom,msm-cam@fd8c0000 {
compatible = "qcom,msm-cam";
reg = <0xfd8C0000 0x10000>;
reg-names = "msm-cam";
+ qcom,gpu-limit = <700000000>;
};
diff --git a/arch/arm/boot/dts/qcom/sdm660-camera.dtsi b/arch/arm/boot/dts/qcom/sdm660-camera.dtsi
index 16127bfccf35..d6a3a143d304 100644
--- a/arch/arm/boot/dts/qcom/sdm660-camera.dtsi
+++ b/arch/arm/boot/dts/qcom/sdm660-camera.dtsi
@@ -19,6 +19,7 @@
status = "ok";
bus-vectors = "suspend", "svs", "nominal", "turbo";
qcom,bus-votes = <0 150000000 320000000 320000000>;
+ qcom,gpu-limit = <700000000>;
};
qcom,csiphy@c824000 {
diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c
index c6dc4b75e479..5cf5582b55ab 100644
--- a/drivers/media/platform/msm/camera_v2/msm.c
+++ b/drivers/media/platform/msm/camera_v2/msm.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -53,6 +53,8 @@ spinlock_t msm_eventq_lock;
static struct pid *msm_pid;
spinlock_t msm_pid_lock;
+static uint32_t gpu_limit;
+
/*
* It takes 20 bytes + NULL character to write the
* largest decimal value of an uint64_t
@@ -442,6 +444,14 @@ int msm_create_session(unsigned int session_id, struct video_device *vdev)
mutex_init(&session->lock);
mutex_init(&session->lock_q);
mutex_init(&session->close_lock);
+
+ if (gpu_limit) {
+ session->sysfs_pwr_limit = kgsl_pwr_limits_add(KGSL_DEVICE_3D0);
+ if (session->sysfs_pwr_limit)
+ kgsl_pwr_limits_set_freq(session->sysfs_pwr_limit,
+ gpu_limit);
+ }
+
return 0;
}
EXPORT_SYMBOL(msm_create_session);
@@ -607,6 +617,11 @@ int msm_destroy_session(unsigned int session_id)
if (!session)
return -EINVAL;
+ if (gpu_limit && session->sysfs_pwr_limit) {
+ kgsl_pwr_limits_set_default(session->sysfs_pwr_limit);
+ kgsl_pwr_limits_del(session->sysfs_pwr_limit);
+ }
+
msm_destroy_session_streams(session);
msm_remove_session_cmd_ack_q(session);
mutex_destroy(&session->lock);
@@ -1290,6 +1305,9 @@ static int msm_probe(struct platform_device *pdev)
goto v4l2_fail;
}
+ of_property_read_u32(pdev->dev.of_node,
+ "qcom,gpu-limit", &gpu_limit);
+
goto probe_end;
v4l2_fail:
diff --git a/drivers/media/platform/msm/camera_v2/msm.h b/drivers/media/platform/msm/camera_v2/msm.h
index 2b3576b8edd2..7474cb119147 100644
--- a/drivers/media/platform/msm/camera_v2/msm.h
+++ b/drivers/media/platform/msm/camera_v2/msm.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -20,6 +20,7 @@
#include <linux/pm_qos.h>
#include <linux/msm_ion.h>
#include <linux/iommu.h>
+#include <linux/msm_kgsl.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-device.h>
@@ -110,6 +111,7 @@ struct msm_session {
struct mutex lock;
struct mutex lock_q;
struct mutex close_lock;
+ struct kgsl_pwr_limit *sysfs_pwr_limit;
};
static inline bool msm_is_daemon_present(void)