Commit bb8a95aa authored by Dikshita Agarwal's avatar Dikshita Agarwal Committed by Hans Verkuil
Browse files

media: iris: implement power management



Implement runtime power management for iris, including a platform
specific power on/off sequence.

Tested-by: Stefan Schmidt <stefan.schmidt@linaro.org> # x1e80100 (Dell XPS 13 9345)
Reviewed-by: default avatarStefan Schmidt <stefan.schmidt@linaro.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Signed-off-by: default avatarDikshita Agarwal <quic_dikshita@quicinc.com>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
parent fb583a21
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -9,7 +9,10 @@ iris-objs += iris_core.o \
             iris_hfi_queue.o \
             iris_platform_sm8550.o \
             iris_probe.o \
             iris_resources.o \
             iris_vidc.o \
             iris_vpu2.o \
             iris_vpu3.o \
             iris_vpu_common.o \

obj-$(CONFIG_VIDEO_QCOM_IRIS) += iris.o
+14 −1
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#include <linux/pm_runtime.h>

#include "iris_core.h"
#include "iris_firmware.h"
#include "iris_state.h"
@@ -10,11 +12,16 @@

void iris_core_deinit(struct iris_core *core)
{
	pm_runtime_resume_and_get(core->dev);

	mutex_lock(&core->lock);
	iris_fw_unload(core);
	iris_vpu_power_off(core);
	iris_hfi_queues_deinit(core);
	core->state = IRIS_CORE_DEINIT;
	mutex_unlock(&core->lock);

	pm_runtime_put_sync(core->dev);
}

static int iris_wait_for_system_response(struct iris_core *core)
@@ -54,10 +61,14 @@ int iris_core_init(struct iris_core *core)
	if (ret)
		goto error;

	ret = iris_fw_load(core);
	ret = iris_vpu_power_on(core);
	if (ret)
		goto error_queue_deinit;

	ret = iris_fw_load(core);
	if (ret)
		goto error_power_off;

	ret = iris_vpu_boot_firmware(core);
	if (ret)
		goto error_unload_fw;
@@ -72,6 +83,8 @@ int iris_core_init(struct iris_core *core)

error_unload_fw:
	iris_fw_unload(core);
error_power_off:
	iris_vpu_power_off(core);
error_queue_deinit:
	iris_hfi_queues_deinit(core);
error:
+4 −0
Original line number Diff line number Diff line
@@ -7,11 +7,13 @@
#define __IRIS_CORE_H__

#include <linux/types.h>
#include <linux/pm_domain.h>
#include <media/v4l2-device.h>

#include "iris_hfi_common.h"
#include "iris_hfi_queue.h"
#include "iris_platform_common.h"
#include "iris_resources.h"
#include "iris_state.h"

struct icc_info {
@@ -52,6 +54,7 @@ struct icc_info {
 * @response_packet: a pointer to response packet from fw to driver
 * @header_id: id of packet header
 * @packet_id: id of packet
 * @power: a structure for clock and bw information
 * @hfi_ops: iris hfi command ops
 * @hfi_response_ops: iris hfi response ops
 * @core_init_done: structure of signal completion for system response
@@ -86,6 +89,7 @@ struct iris_core {
	u8					*response_packet;
	u32					header_id;
	u32					packet_id;
	struct iris_core_power			power;
	const struct iris_hfi_command_ops	*hfi_ops;
	const struct iris_hfi_response_ops	*hfi_response_ops;
	struct completion			core_init_done;
+5 −0
Original line number Diff line number Diff line
@@ -109,3 +109,8 @@ int iris_fw_unload(struct iris_core *core)
{
	return qcom_scm_pas_shutdown(core->iris_platform_data->pas_id);
}

int iris_set_hw_state(struct iris_core *core, bool resume)
{
	return qcom_scm_set_remote_state(resume, 0);
}
+1 −0
Original line number Diff line number Diff line
@@ -10,5 +10,6 @@ struct iris_core;

int iris_fw_load(struct iris_core *core);
int iris_fw_unload(struct iris_core *core);
int iris_set_hw_state(struct iris_core *core, bool resume);

#endif
Loading