Commit c161c0fc authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Greg Kroah-Hartman
Browse files

greybus: camera: Factorize link power mode configuration code into a function



Avoid duplicating the same code block multiple times.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: default avatarJacopo Mondi <jacopo.mondi@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 68b1309b
Loading
Loading
Loading
Loading
+52 −64
Original line number Diff line number Diff line
@@ -107,6 +107,54 @@ static const struct gb_camera_fmt_map mbus_to_gbus_format[] = {
 * Camera Protocol Operations
 */

static int gb_camera_set_intf_power_mode(struct gb_camera *gcam, u8 intf_id,
					 bool hs)
{
	struct gb_svc *svc = gcam->connection->hd->svc;
	int ret;

	if (hs)
		ret = gb_svc_intf_set_power_mode(svc, intf_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_PWRM_RXTERMINATION |
						 GB_SVC_PWRM_TXTERMINATION, 0);
	else
		ret = gb_svc_intf_set_power_mode(svc, intf_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 0, 0);

	return ret;
}

static int gb_camera_set_power_mode(struct gb_camera *gcam, bool hs)
{
	struct gb_interface *intf = gcam->connection->intf;
	struct gb_svc *svc = gcam->connection->hd->svc;
	int ret;

	ret = gb_camera_set_intf_power_mode(gcam, intf->interface_id, hs);
	if (ret < 0) {
		gcam_err(gcam, "failed to set module interface to %s (%d)\n",
			 hs ? "HS" : "PWM", ret);
		return ret;
	}

	ret = gb_camera_set_intf_power_mode(gcam, svc->ap_intf_id, hs);
	if (ret < 0) {
		gcam_err(gcam, "failed to set AP interface to %s (%d)\n",
			 hs ? "HS" : "PWM", ret);
		return ret;
	}

	return 0;
}

struct ap_csi_config_request {
	__u8 csi_id;
	__u8 clock_mode;
@@ -120,8 +168,6 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
				       unsigned int *flags,
				       struct gb_camera_stream_config *streams)
{
	struct gb_interface *intf = gcam->connection->intf;
	struct gb_svc *svc = gcam->connection->hd->svc;
	struct gb_camera_configure_streams_request *req;
	struct gb_camera_configure_streams_response *resp;
	struct ap_csi_config_request csi_cfg;
@@ -151,50 +197,14 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
	 * before CSI interfaces gets configured
	 */
	if (nstreams && !(*flags & GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY)) {
		ret = gb_svc_intf_set_power_mode(svc, intf->interface_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_PWRM_RXTERMINATION |
						 GB_SVC_PWRM_TXTERMINATION, 0);
		if (ret < 0)
			goto done;

		ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
						 GB_SVC_PWRM_RXTERMINATION |
						 GB_SVC_PWRM_TXTERMINATION, 0);
		ret = gb_camera_set_power_mode(gcam, true);
		if (ret < 0)
			goto done;
	} else if (nstreams == 0) {
		ret = gb_svc_intf_set_power_mode(svc, intf->interface_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 0, 0);
		if (ret < 0) {
			gcam_err(gcam, "can't take camera link to PWM-G1 auto: %d\n",
				 ret);
			goto done;
		}

		ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
						 GB_SVC_UNIPRO_HS_SERIES_A,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
						 1, 2,
						 0, 0);
		if (ret < 0) {
			gcam_err(gcam, "can't take AP link to PWM-G1 auto: %d\n",
				 ret);
		ret = gb_camera_set_power_mode(gcam, false);
		if (ret < 0)
			goto done;
	}
	}

	req->num_streams = nstreams;
	req->flags = *flags;
@@ -283,29 +293,7 @@ static int gb_camera_configure_streams(struct gb_camera *gcam,
	return ret;

set_unipro_slow_mode:
	ret = gb_svc_intf_set_power_mode(svc, intf->interface_id,
					 GB_SVC_UNIPRO_HS_SERIES_A,
					 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
					 1, 2,
					 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
					 1, 2,
					 0, 0);
	if (ret < 0) {
		gcam_err(gcam, "can't take camera link to PWM-G1 auto: %d\n",
			 ret);
		goto done;
	}

	ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
				   GB_SVC_UNIPRO_HS_SERIES_A,
				   GB_SVC_UNIPRO_SLOW_AUTO_MODE,
				   1, 2,
				   GB_SVC_UNIPRO_SLOW_AUTO_MODE,
				   1, 2,
				   0, 0);
	if (ret < 0)
		gcam_err(gcam, "can't take AP link to PWM-G1 auto: %d\n",
			 ret);
	ret = gb_camera_set_power_mode(gcam, false);

done:
	kfree(req);