[PATCH] staging: greybus: camera: remove broken camera driver

Ashwin Gundarapu posted 1 patch 1 week, 4 days ago
drivers/staging/greybus/camera.c    | 1047 ---------------------------
drivers/staging/greybus/gb-camera.h |  127 ----
2 files changed, 1174 deletions(-)
delete mode 100644 drivers/staging/greybus/camera.c
delete mode 100644 drivers/staging/greybus/gb-camera.h
[PATCH] staging: greybus: camera: remove broken camera driver
Posted by Ashwin Gundarapu 1 week, 4 days ago
The Greybus camera driver has been non-functional since its inclusion
due to a missing greybus_protocols.h header and reliance on deprecated
v4l2_mbus_pixelcode enum.

The Project Ara hardware this driver was written for never shipped,
and the driver has seen no real fixes in over 8 years—only treewide
cleanups such as GFP_KERNEL conversions and debugfs error handling
changes.

Remove the entire camera driver (~2,000 lines).

Signed-off-by: Ashwin Gundarapu <linuxuser509@zohomail.in>
---
 drivers/staging/greybus/camera.c    | 1047 ---------------------------
 drivers/staging/greybus/gb-camera.h |  127 ----
 2 files changed, 1174 deletions(-)
 delete mode 100644 drivers/staging/greybus/camera.c
 delete mode 100644 drivers/staging/greybus/gb-camera.h

diff --git a/drivers/staging/greybus/camera.c b/drivers/staging/greybus/camera.c
deleted file mode 100644
index f448b7713384..000000000000
--- a/drivers/staging/greybus/camera.c
+++ /dev/null
@@ -1,1047 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Greybus Camera protocol driver.
- *
- * Copyright 2015 Google Inc.
- * Copyright 2015 Linaro Ltd.
- */
-
-#include <linux/debugfs.h>
-#include <linux/fs.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/uaccess.h>
-#include <linux/vmalloc.h>
-#include <linux/greybus.h>
-
-#include "gb-camera.h"
-#include "greybus_protocols.h"
-
-enum gb_camera_debugs_buffer_id {
-	GB_CAMERA_DEBUGFS_BUFFER_CAPABILITIES,
-	GB_CAMERA_DEBUGFS_BUFFER_STREAMS,
-	GB_CAMERA_DEBUGFS_BUFFER_CAPTURE,
-	GB_CAMERA_DEBUGFS_BUFFER_FLUSH,
-	GB_CAMERA_DEBUGFS_BUFFER_MAX,
-};
-
-struct gb_camera_debugfs_buffer {
-	char data[PAGE_SIZE];
-	size_t length;
-};
-
-enum gb_camera_state {
-	GB_CAMERA_STATE_UNCONFIGURED,
-	GB_CAMERA_STATE_CONFIGURED,
-};
-
-/**
- * struct gb_camera - A Greybus Camera Device
- * @connection: the greybus connection for camera management
- * @data_connection: the greybus connection for camera data
- * @data_cport_id: the data CPort ID on the module side
- * @mutex: protects the connection and state fields
- * @state: the current module state
- * @debugfs: debugfs entries for camera protocol operations testing
- * @module: Greybus camera module registered to HOST processor.
- */
-struct gb_camera {
-	struct gb_bundle *bundle;
-	struct gb_connection *connection;
-	struct gb_connection *data_connection;
-	u16 data_cport_id;
-
-	struct mutex mutex;
-	enum gb_camera_state state;
-
-	struct {
-		struct dentry *root;
-		struct gb_camera_debugfs_buffer *buffers;
-	} debugfs;
-
-	struct gb_camera_module module;
-};
-
-struct gb_camera_stream_config {
-	unsigned int width;
-	unsigned int height;
-	unsigned int format;
-	unsigned int vc;
-	unsigned int dt[2];
-	unsigned int max_size;
-};
-
-struct gb_camera_fmt_info {
-	enum v4l2_mbus_pixelcode mbus_code;
-	unsigned int gb_format;
-	unsigned int bpp;
-};
-
-/* GB format to media code map */
-static const struct gb_camera_fmt_info gb_fmt_info[] = {
-	{
-		.mbus_code = V4L2_MBUS_FMT_UYVY8_1X16,
-		.gb_format = 0x01,
-		.bpp	   = 16,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_NV12_1x8,
-		.gb_format = 0x12,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_NV21_1x8,
-		.gb_format = 0x13,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_YU12_1x8,
-		.gb_format = 0x16,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_YV12_1x8,
-		.gb_format = 0x17,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_JPEG_1X8,
-		.gb_format = 0x40,
-		.bpp	   = 0,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_GB_CAM_METADATA_1X8,
-		.gb_format = 0x41,
-		.bpp	   = 0,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_GB_CAM_DEBUG_DATA_1X8,
-		.gb_format = 0x42,
-		.bpp	   = 0,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SBGGR10_1X10,
-		.gb_format = 0x80,
-		.bpp	   = 10,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SGBRG10_1X10,
-		.gb_format = 0x81,
-		.bpp	   = 10,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SGRBG10_1X10,
-		.gb_format = 0x82,
-		.bpp	   = 10,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SRGGB10_1X10,
-		.gb_format = 0x83,
-		.bpp	   = 10,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SBGGR12_1X12,
-		.gb_format = 0x84,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SGBRG12_1X12,
-		.gb_format = 0x85,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SGRBG12_1X12,
-		.gb_format = 0x86,
-		.bpp	   = 12,
-	},
-	{
-		.mbus_code = V4L2_MBUS_FMT_SRGGB12_1X12,
-		.gb_format = 0x87,
-		.bpp	   = 12,
-	},
-};
-
-static const struct gb_camera_fmt_info *gb_camera_get_format_info(u16 gb_fmt)
-{
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
-		if (gb_fmt_info[i].gb_format == gb_fmt)
-			return &gb_fmt_info[i];
-	}
-
-	return NULL;
-}
-
-#define ES2_APB_CDSI0_CPORT		16
-#define ES2_APB_CDSI1_CPORT		17
-
-#define GB_CAMERA_MAX_SETTINGS_SIZE	8192
-
-static int gb_camera_operation_sync_flags(struct gb_connection *connection,
-					  int type, unsigned int flags,
-					  void *request, size_t request_size,
-					  void *response, size_t *response_size)
-{
-	struct gb_operation *operation;
-	int ret;
-
-	operation = gb_operation_create_flags(connection, type, request_size,
-					      *response_size, flags,
-					      GFP_KERNEL);
-	if (!operation)
-		return  -ENOMEM;
-
-	if (request_size)
-		memcpy(operation->request->payload, request, request_size);
-
-	ret = gb_operation_request_send_sync(operation);
-	if (ret) {
-		dev_err(&connection->hd->dev,
-			"%s: synchronous operation of type 0x%02x failed: %d\n",
-			connection->name, type, ret);
-	} else {
-		*response_size = operation->response->payload_size;
-
-		if (operation->response->payload_size)
-			memcpy(response, operation->response->payload,
-			       operation->response->payload_size);
-	}
-
-	gb_operation_put(operation);
-
-	return ret;
-}
-
-static int gb_camera_get_max_pkt_size(struct gb_camera *gcam,
-				      struct gb_camera_configure_streams_response *resp)
-{
-	unsigned int max_pkt_size = 0;
-	unsigned int i;
-
-	for (i = 0; i < resp->num_streams; i++) {
-		struct gb_camera_stream_config_response *cfg = &resp->config[i];
-		const struct gb_camera_fmt_info *fmt_info;
-		unsigned int pkt_size;
-
-		fmt_info = gb_camera_get_format_info(cfg->format);
-		if (!fmt_info) {
-			dev_err(&gcam->bundle->dev, "unsupported greybus image format: %d\n",
-				cfg->format);
-			return -EIO;
-		}
-
-		if (fmt_info->bpp == 0) {
-			pkt_size = le32_to_cpu(cfg->max_pkt_size);
-
-			if (pkt_size == 0) {
-				dev_err(&gcam->bundle->dev,
-					"Stream %u: invalid zero maximum packet size\n",
-					i);
-				return -EIO;
-			}
-		} else {
-			pkt_size = le16_to_cpu(cfg->width) * fmt_info->bpp / 8;
-
-			if (pkt_size != le32_to_cpu(cfg->max_pkt_size)) {
-				dev_err(&gcam->bundle->dev,
-					"Stream %u: maximum packet size mismatch (%u/%u)\n",
-					i, pkt_size, cfg->max_pkt_size);
-				return -EIO;
-			}
-		}
-
-		max_pkt_size = max(pkt_size, max_pkt_size);
-	}
-
-	return max_pkt_size;
-}
-
-/*
- * Validate the stream configuration response verifying padding is correctly
- * set and the returned number of streams is supported
- */
-static const int gb_camera_configure_streams_validate_response(struct gb_camera *gcam,
-		struct gb_camera_configure_streams_response *resp,
-		unsigned int nstreams)
-{
-	unsigned int i;
-
-	/* Validate the returned response structure */
-	if (resp->padding[0] || resp->padding[1]) {
-		dev_err(&gcam->bundle->dev, "response padding != 0\n");
-		return -EIO;
-	}
-
-	if (resp->num_streams > nstreams) {
-		dev_err(&gcam->bundle->dev, "got #streams %u > request %u\n",
-			resp->num_streams, nstreams);
-		return -EIO;
-	}
-
-	for (i = 0; i < resp->num_streams; i++) {
-		struct gb_camera_stream_config_response *cfg = &resp->config[i];
-
-		if (cfg->padding) {
-			dev_err(&gcam->bundle->dev, "stream #%u padding != 0\n", i);
-			return -EIO;
-		}
-	}
-
-	return 0;
-}
-
-/* -----------------------------------------------------------------------------
- * Hardware Configuration
- */
-
-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_SMALL_AMPLITUDE,
-						 GB_SVC_NO_DE_EMPHASIS,
-						 GB_SVC_UNIPRO_FAST_MODE, 2, 2,
-						 GB_SVC_PWRM_RXTERMINATION |
-						 GB_SVC_PWRM_TXTERMINATION, 0,
-						 NULL, NULL);
-	else
-		ret = gb_svc_intf_set_power_mode(svc, intf_id,
-						 GB_SVC_UNIPRO_HS_SERIES_A,
-						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
-						 2, 1,
-						 GB_SVC_SMALL_AMPLITUDE,
-						 GB_SVC_NO_DE_EMPHASIS,
-						 GB_SVC_UNIPRO_SLOW_AUTO_MODE,
-						 2, 1,
-						 0, 0,
-						 NULL, NULL);
-
-	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) {
-		dev_err(&gcam->bundle->dev, "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) {
-		gb_camera_set_intf_power_mode(gcam, intf->interface_id, !hs);
-		dev_err(&gcam->bundle->dev, "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 flags;
-#define GB_CAMERA_CSI_FLAG_CLOCK_CONTINUOUS 0x01
-	__u8 num_lanes;
-	__u8 padding;
-	__le32 csi_clk_freq;
-	__le32 max_pkt_size;
-} __packed;
-
-/*
- * TODO: Compute the number of lanes dynamically based on bandwidth
- * requirements.
- */
-#define GB_CAMERA_CSI_NUM_DATA_LANES		4
-
-#define GB_CAMERA_CSI_CLK_FREQ_MAX		999000000U
-#define GB_CAMERA_CSI_CLK_FREQ_MIN		100000000U
-#define GB_CAMERA_CSI_CLK_FREQ_MARGIN		150000000U
-
-static int gb_camera_setup_data_connection(struct gb_camera *gcam,
-					   struct gb_camera_configure_streams_response *resp,
-					   struct gb_camera_csi_params *csi_params)
-{
-	struct ap_csi_config_request csi_cfg;
-	struct gb_connection *conn;
-	unsigned int clk_freq;
-	int ret;
-
-	/*
-	 * Create the data connection between the camera module data CPort and
-	 * APB CDSI1. The CDSI1 CPort ID is hardcoded by the ES2 bridge.
-	 */
-	conn = gb_connection_create_offloaded(gcam->bundle, gcam->data_cport_id,
-					      GB_CONNECTION_FLAG_NO_FLOWCTRL |
-					      GB_CONNECTION_FLAG_CDSI1);
-	if (IS_ERR(conn))
-		return PTR_ERR(conn);
-
-	gcam->data_connection = conn;
-	gb_connection_set_data(conn, gcam);
-
-	ret = gb_connection_enable(conn);
-	if (ret)
-		goto error_conn_destroy;
-
-	/* Set the UniPro link to high speed mode. */
-	ret = gb_camera_set_power_mode(gcam, true);
-	if (ret < 0)
-		goto error_conn_disable;
-
-	/*
-	 * Configure the APB-A CSI-2 transmitter.
-	 *
-	 * Hardcode the number of lanes to 4 and compute the bus clock frequency
-	 * based on the module bandwidth requirements with a safety margin.
-	 */
-	memset(&csi_cfg, 0, sizeof(csi_cfg));
-	csi_cfg.csi_id = 1;
-	csi_cfg.flags = 0;
-	csi_cfg.num_lanes = GB_CAMERA_CSI_NUM_DATA_LANES;
-
-	clk_freq = resp->data_rate / 2 / GB_CAMERA_CSI_NUM_DATA_LANES;
-	clk_freq = clamp(clk_freq + GB_CAMERA_CSI_CLK_FREQ_MARGIN,
-			 GB_CAMERA_CSI_CLK_FREQ_MIN,
-			 GB_CAMERA_CSI_CLK_FREQ_MAX);
-	csi_cfg.csi_clk_freq = clk_freq;
-
-	ret = gb_camera_get_max_pkt_size(gcam, resp);
-	if (ret < 0) {
-		ret = -EIO;
-		goto error_power;
-	}
-	csi_cfg.max_pkt_size = ret;
-
-	ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
-			   sizeof(csi_cfg),
-			   GB_APB_REQUEST_CSI_TX_CONTROL, false);
-	if (ret < 0) {
-		dev_err(&gcam->bundle->dev, "failed to start the CSI transmitter\n");
-		goto error_power;
-	}
-
-	if (csi_params) {
-		csi_params->clk_freq = csi_cfg.csi_clk_freq;
-		csi_params->num_lanes = csi_cfg.num_lanes;
-	}
-
-	return 0;
-
-error_power:
-	gb_camera_set_power_mode(gcam, false);
-error_conn_disable:
-	gb_connection_disable(gcam->data_connection);
-error_conn_destroy:
-	gb_connection_destroy(gcam->data_connection);
-	gcam->data_connection = NULL;
-	return ret;
-}
-
-static void gb_camera_teardown_data_connection(struct gb_camera *gcam)
-{
-	struct ap_csi_config_request csi_cfg;
-	int ret;
-
-	/* Stop the APB1 CSI transmitter. */
-	memset(&csi_cfg, 0, sizeof(csi_cfg));
-	csi_cfg.csi_id = 1;
-
-	ret = gb_hd_output(gcam->connection->hd, &csi_cfg,
-			   sizeof(csi_cfg),
-			   GB_APB_REQUEST_CSI_TX_CONTROL, false);
-
-	if (ret < 0)
-		dev_err(&gcam->bundle->dev, "failed to stop the CSI transmitter\n");
-
-	/* Set the UniPro link to low speed mode. */
-	gb_camera_set_power_mode(gcam, false);
-
-	/* Destroy the data connection. */
-	gb_connection_disable(gcam->data_connection);
-	gb_connection_destroy(gcam->data_connection);
-	gcam->data_connection = NULL;
-}
-
-/* -----------------------------------------------------------------------------
- * Camera Protocol Operations
- */
-
-static int gb_camera_capabilities(struct gb_camera *gcam,
-				  u8 *capabilities, size_t *size)
-{
-	int ret;
-
-	ret = gb_pm_runtime_get_sync(gcam->bundle);
-	if (ret)
-		return ret;
-
-	mutex_lock(&gcam->mutex);
-
-	if (!gcam->connection) {
-		ret = -EINVAL;
-		goto done;
-	}
-
-	ret = gb_camera_operation_sync_flags(gcam->connection,
-					     GB_CAMERA_TYPE_CAPABILITIES,
-					     GB_OPERATION_FLAG_SHORT_RESPONSE,
-					     NULL, 0,
-					     (void *)capabilities, size);
-	if (ret)
-		dev_err(&gcam->bundle->dev, "failed to retrieve capabilities: %d\n", ret);
-
-done:
-	mutex_unlock(&gcam->mutex);
-
-	gb_pm_runtime_put_autosuspend(gcam->bundle);
-
-	return ret;
-}
-
-static int gb_camera_configure_streams(struct gb_camera *gcam,
-				       unsigned int *num_streams,
-				       unsigned int *flags,
-				       struct gb_camera_stream_config *streams,
-				       struct gb_camera_csi_params *csi_params)
-{
-	struct gb_camera_configure_streams_request *req;
-	struct gb_camera_configure_streams_response *resp;
-	unsigned int nstreams = *num_streams;
-	unsigned int i;
-	size_t req_size;
-	size_t resp_size;
-	int ret;
-
-	if (nstreams > GB_CAMERA_MAX_STREAMS)
-		return -EINVAL;
-
-	req_size = sizeof(*req) + nstreams * sizeof(req->config[0]);
-	resp_size = sizeof(*resp) + nstreams * sizeof(resp->config[0]);
-
-	req = kmalloc(req_size, GFP_KERNEL);
-	resp = kmalloc(resp_size, GFP_KERNEL);
-	if (!req || !resp) {
-		kfree(req);
-		kfree(resp);
-		return -ENOMEM;
-	}
-
-	req->num_streams = nstreams;
-	req->flags = *flags;
-	req->padding = 0;
-
-	for (i = 0; i < nstreams; ++i) {
-		struct gb_camera_stream_config_request *cfg = &req->config[i];
-
-		cfg->width = cpu_to_le16(streams[i].width);
-		cfg->height = cpu_to_le16(streams[i].height);
-		cfg->format = cpu_to_le16(streams[i].format);
-		cfg->padding = 0;
-	}
-
-	mutex_lock(&gcam->mutex);
-
-	ret = gb_pm_runtime_get_sync(gcam->bundle);
-	if (ret)
-		goto done_skip_pm_put;
-
-	if (!gcam->connection) {
-		ret = -EINVAL;
-		goto done;
-	}
-
-	ret = gb_camera_operation_sync_flags(gcam->connection,
-					     GB_CAMERA_TYPE_CONFIGURE_STREAMS,
-					     GB_OPERATION_FLAG_SHORT_RESPONSE,
-					     req, req_size,
-					     resp, &resp_size);
-	if (ret < 0)
-		goto done;
-
-	ret = gb_camera_configure_streams_validate_response(gcam, resp,
-							    nstreams);
-	if (ret < 0)
-		goto done;
-
-	*flags = resp->flags;
-	*num_streams = resp->num_streams;
-
-	for (i = 0; i < resp->num_streams; ++i) {
-		struct gb_camera_stream_config_response *cfg = &resp->config[i];
-
-		streams[i].width = le16_to_cpu(cfg->width);
-		streams[i].height = le16_to_cpu(cfg->height);
-		streams[i].format = le16_to_cpu(cfg->format);
-		streams[i].vc = cfg->virtual_channel;
-		streams[i].dt[0] = cfg->data_type[0];
-		streams[i].dt[1] = cfg->data_type[1];
-		streams[i].max_size = le32_to_cpu(cfg->max_size);
-	}
-
-	if ((resp->flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED) ||
-	    (req->flags & GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY))
-		goto done;
-
-	if (gcam->state == GB_CAMERA_STATE_CONFIGURED) {
-		gb_camera_teardown_data_connection(gcam);
-		gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
-
-		/*
-		 * When unconfiguring streams release the PM runtime reference
-		 * that was acquired when streams were configured. The bundle
-		 * won't be suspended until the PM runtime reference acquired at
-		 * the beginning of this function gets released right before
-		 * returning.
-		 */
-		gb_pm_runtime_put_noidle(gcam->bundle);
-	}
-
-	if (resp->num_streams == 0)
-		goto done;
-
-	/*
-	 * Make sure the bundle won't be suspended until streams get
-	 * unconfigured after the stream is configured successfully
-	 */
-	gb_pm_runtime_get_noresume(gcam->bundle);
-
-	/* Setup CSI-2 connection from APB-A to AP */
-	ret = gb_camera_setup_data_connection(gcam, resp, csi_params);
-	if (ret < 0) {
-		memset(req, 0, sizeof(*req));
-		gb_operation_sync(gcam->connection,
-				  GB_CAMERA_TYPE_CONFIGURE_STREAMS,
-				  req, sizeof(*req),
-				  resp, sizeof(*resp));
-		*flags = 0;
-		*num_streams = 0;
-		gb_pm_runtime_put_noidle(gcam->bundle);
-		goto done;
-	}
-
-	gcam->state = GB_CAMERA_STATE_CONFIGURED;
-
-done:
-	gb_pm_runtime_put_autosuspend(gcam->bundle);
-
-done_skip_pm_put:
-	mutex_unlock(&gcam->mutex);
-	kfree(req);
-	kfree(resp);
-	return ret;
-}
-
-static int gb_camera_capture(struct gb_camera *gcam, u32 request_id,
-			     unsigned int streams, unsigned int num_frames,
-			     size_t settings_size, const void *settings)
-{
-	struct gb_camera_capture_request *req;
-	size_t req_size;
-	int ret;
-
-	if (settings_size > GB_CAMERA_MAX_SETTINGS_SIZE)
-		return -EINVAL;
-
-	req_size = sizeof(*req) + settings_size;
-	req = kmalloc(req_size, GFP_KERNEL);
-	if (!req)
-		return -ENOMEM;
-
-	req->request_id = cpu_to_le32(request_id);
-	req->streams = streams;
-	req->padding = 0;
-	req->num_frames = cpu_to_le16(num_frames);
-	memcpy(req->settings, settings, settings_size);
-
-	mutex_lock(&gcam->mutex);
-
-	if (!gcam->connection) {
-		ret = -EINVAL;
-		goto done;
-	}
-
-	ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_CAPTURE,
-				req, req_size, NULL, 0);
-done:
-	mutex_unlock(&gcam->mutex);
-
-	kfree(req);
-
-	return ret;
-}
-
-static int gb_camera_flush(struct gb_camera *gcam, u32 *request_id)
-{
-	struct gb_camera_flush_response resp;
-	int ret;
-
-	mutex_lock(&gcam->mutex);
-
-	if (!gcam->connection) {
-		ret = -EINVAL;
-		goto done;
-	}
-
-	ret = gb_operation_sync(gcam->connection, GB_CAMERA_TYPE_FLUSH, NULL, 0,
-				&resp, sizeof(resp));
-
-	if (ret < 0)
-		goto done;
-
-	if (request_id)
-		*request_id = le32_to_cpu(resp.request_id);
-
-done:
-	mutex_unlock(&gcam->mutex);
-
-	return ret;
-}
-
-static int gb_camera_request_handler(struct gb_operation *op)
-{
-	struct gb_camera *gcam = gb_connection_get_data(op->connection);
-	struct gb_camera_metadata_request *payload;
-	struct gb_message *request;
-
-	if (op->type != GB_CAMERA_TYPE_METADATA) {
-		dev_err(&gcam->bundle->dev, "Unsupported unsolicited event: %u\n", op->type);
-		return -EINVAL;
-	}
-
-	request = op->request;
-
-	if (request->payload_size < sizeof(*payload)) {
-		dev_err(&gcam->bundle->dev, "Wrong event size received (%zu < %zu)\n",
-			request->payload_size, sizeof(*payload));
-		return -EINVAL;
-	}
-
-	payload = request->payload;
-
-	dev_dbg(&gcam->bundle->dev, "received metadata for request %u, frame %u, stream %u\n",
-		payload->request_id, payload->frame_number, payload->stream);
-
-	return 0;
-}
-
-/* -----------------------------------------------------------------------------
- * Interface with HOST gmp camera.
- */
-static unsigned int gb_camera_mbus_to_gb(enum v4l2_mbus_pixelcode mbus_code)
-{
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
-		if (gb_fmt_info[i].mbus_code == mbus_code)
-			return gb_fmt_info[i].gb_format;
-	}
-	return gb_fmt_info[0].gb_format;
-}
-
-static enum v4l2_mbus_pixelcode gb_camera_gb_to_mbus(u16 gb_fmt)
-{
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(gb_fmt_info); i++) {
-		if (gb_fmt_info[i].gb_format == gb_fmt)
-			return gb_fmt_info[i].mbus_code;
-	}
-	return gb_fmt_info[0].mbus_code;
-}
-
-static ssize_t gb_camera_op_capabilities(void *priv, char *data, size_t len)
-{
-	struct gb_camera *gcam = priv;
-	size_t capabilities_len = len;
-	int ret;
-
-	ret = gb_camera_capabilities(gcam, data, &capabilities_len);
-	if (ret)
-		return ret;
-
-	return capabilities_len;
-}
-
-static int gb_camera_op_configure_streams(void *priv, unsigned int *nstreams,
-					  unsigned int *flags, struct gb_camera_stream *streams,
-					  struct gb_camera_csi_params *csi_params)
-{
-	struct gb_camera *gcam = priv;
-	struct gb_camera_stream_config *gb_streams;
-	unsigned int gb_flags = 0;
-	unsigned int gb_nstreams = *nstreams;
-	unsigned int i;
-	int ret;
-
-	if (gb_nstreams > GB_CAMERA_MAX_STREAMS)
-		return -EINVAL;
-
-	gb_streams = kzalloc_objs(*gb_streams, gb_nstreams);
-	if (!gb_streams)
-		return -ENOMEM;
-
-	for (i = 0; i < gb_nstreams; i++) {
-		gb_streams[i].width = streams[i].width;
-		gb_streams[i].height = streams[i].height;
-		gb_streams[i].format =
-			gb_camera_mbus_to_gb(streams[i].pixel_code);
-	}
-
-	if (*flags & GB_CAMERA_IN_FLAG_TEST)
-		gb_flags |= GB_CAMERA_CONFIGURE_STREAMS_TEST_ONLY;
-
-	ret = gb_camera_configure_streams(gcam, &gb_nstreams,
-					  &gb_flags, gb_streams, csi_params);
-	if (ret < 0)
-		goto done;
-	if (gb_nstreams > *nstreams) {
-		ret = -EINVAL;
-		goto done;
-	}
-
-	*flags = 0;
-	if (gb_flags & GB_CAMERA_CONFIGURE_STREAMS_ADJUSTED)
-		*flags |= GB_CAMERA_OUT_FLAG_ADJUSTED;
-
-	for (i = 0; i < gb_nstreams; i++) {
-		streams[i].width = gb_streams[i].width;
-		streams[i].height = gb_streams[i].height;
-		streams[i].vc = gb_streams[i].vc;
-		streams[i].dt[0] = gb_streams[i].dt[0];
-		streams[i].dt[1] = gb_streams[i].dt[1];
-		streams[i].max_size = gb_streams[i].max_size;
-		streams[i].pixel_code =
-			gb_camera_gb_to_mbus(gb_streams[i].format);
-	}
-	*nstreams = gb_nstreams;
-
-done:
-	kfree(gb_streams);
-	return ret;
-}
-
-static int gb_camera_op_capture(void *priv, u32 request_id,
-				unsigned int streams, unsigned int num_frames,
-				size_t settings_size, const void *settings)
-{
-	struct gb_camera *gcam = priv;
-
-	return gb_camera_capture(gcam, request_id, streams, num_frames,
-				 settings_size, settings);
-}
-
-static int gb_camera_op_flush(void *priv, u32 *request_id)
-{
-	struct gb_camera *gcam = priv;
-
-	return gb_camera_flush(gcam, request_id);
-}
-
-static const struct gb_camera_ops gb_cam_ops = {
-	.capabilities = gb_camera_op_capabilities,
-	.configure_streams = gb_camera_op_configure_streams,
-	.capture = gb_camera_op_capture,
-	.flush = gb_camera_op_flush,
-};
-
-/* -----------------------------------------------------------------------------
- * DebugFS
- */
-
-static void gb_camera_cleanup(struct gb_camera *gcam)
-{
-	gb_camera_debugfs_cleanup(gcam);
-
-	mutex_lock(&gcam->mutex);
-	if (gcam->data_connection) {
-		gb_connection_disable(gcam->data_connection);
-		gb_connection_destroy(gcam->data_connection);
-		gcam->data_connection = NULL;
-	}
-
-	if (gcam->connection) {
-		gb_connection_disable(gcam->connection);
-		gb_connection_destroy(gcam->connection);
-		gcam->connection = NULL;
-	}
-	mutex_unlock(&gcam->mutex);
-}
-
-static void gb_camera_release_module(struct kref *ref)
-{
-	struct gb_camera_module *cam_mod =
-		container_of(ref, struct gb_camera_module, refcount);
-	kfree(cam_mod->priv);
-}
-
-static int gb_camera_probe(struct gb_bundle *bundle,
-			   const struct greybus_bundle_id *id)
-{
-	struct gb_connection *conn;
-	struct gb_camera *gcam;
-	u16 mgmt_cport_id = 0;
-	u16 data_cport_id = 0;
-	unsigned int i;
-	int ret;
-
-	/*
-	 * The camera bundle must contain exactly two CPorts, one for the
-	 * camera management protocol and one for the camera data protocol.
-	 */
-	if (bundle->num_cports != 2)
-		return -ENODEV;
-
-	for (i = 0; i < bundle->num_cports; ++i) {
-		struct greybus_descriptor_cport *desc = &bundle->cport_desc[i];
-
-		switch (desc->protocol_id) {
-		case GREYBUS_PROTOCOL_CAMERA_MGMT:
-			mgmt_cport_id = le16_to_cpu(desc->id);
-			break;
-		case GREYBUS_PROTOCOL_CAMERA_DATA:
-			data_cport_id = le16_to_cpu(desc->id);
-			break;
-		default:
-			return -ENODEV;
-		}
-	}
-
-	if (!mgmt_cport_id || !data_cport_id)
-		return -ENODEV;
-
-	gcam = kzalloc_obj(*gcam);
-	if (!gcam)
-		return -ENOMEM;
-
-	mutex_init(&gcam->mutex);
-
-	gcam->bundle = bundle;
-	gcam->state = GB_CAMERA_STATE_UNCONFIGURED;
-	gcam->data_cport_id = data_cport_id;
-
-	conn = gb_connection_create(bundle, mgmt_cport_id,
-				    gb_camera_request_handler);
-	if (IS_ERR(conn)) {
-		ret = PTR_ERR(conn);
-		goto error;
-	}
-
-	gcam->connection = conn;
-	gb_connection_set_data(conn, gcam);
-
-	ret = gb_connection_enable(conn);
-	if (ret)
-		goto error;
-
-	ret = gb_camera_debugfs_init(gcam);
-	if (ret < 0)
-		goto error;
-
-	gcam->module.priv = gcam;
-	gcam->module.ops = &gb_cam_ops;
-	gcam->module.interface_id = gcam->connection->intf->interface_id;
-	gcam->module.release = gb_camera_release_module;
-	ret = gb_camera_register(&gcam->module);
-	if (ret < 0)
-		goto error;
-
-	greybus_set_drvdata(bundle, gcam);
-
-	gb_pm_runtime_put_autosuspend(gcam->bundle);
-
-	return 0;
-
-error:
-	gb_camera_cleanup(gcam);
-	kfree(gcam);
-	return ret;
-}
-
-static void gb_camera_disconnect(struct gb_bundle *bundle)
-{
-	struct gb_camera *gcam = greybus_get_drvdata(bundle);
-	int ret;
-
-	ret = gb_pm_runtime_get_sync(bundle);
-	if (ret)
-		gb_pm_runtime_get_noresume(bundle);
-
-	gb_camera_cleanup(gcam);
-	gb_camera_unregister(&gcam->module);
-}
-
-static const struct greybus_bundle_id gb_camera_id_table[] = {
-	{ GREYBUS_DEVICE_CLASS(GREYBUS_CLASS_CAMERA) },
-	{ },
-};
-
-#ifdef CONFIG_PM
-static int gb_camera_suspend(struct device *dev)
-{
-	struct gb_bundle *bundle = to_gb_bundle(dev);
-	struct gb_camera *gcam = greybus_get_drvdata(bundle);
-
-	if (gcam->data_connection)
-		gb_connection_disable(gcam->data_connection);
-
-	gb_connection_disable(gcam->connection);
-
-	return 0;
-}
-
-static int gb_camera_resume(struct device *dev)
-{
-	struct gb_bundle *bundle = to_gb_bundle(dev);
-	struct gb_camera *gcam = greybus_get_drvdata(bundle);
-	int ret;
-
-	ret = gb_connection_enable(gcam->connection);
-	if (ret) {
-		dev_err(&gcam->bundle->dev, "failed to enable connection: %d\n", ret);
-		return ret;
-	}
-
-	if (gcam->data_connection) {
-		ret = gb_connection_enable(gcam->data_connection);
-		if (ret) {
-			dev_err(&gcam->bundle->dev,
-				"failed to enable data connection: %d\n", ret);
-			return ret;
-		}
-	}
-
-	return 0;
-}
-#endif
-
-static const struct dev_pm_ops gb_camera_pm_ops = {
-	SET_RUNTIME_PM_OPS(gb_camera_suspend, gb_camera_resume, NULL)
-};
-
-static struct greybus_driver gb_camera_driver = {
-	.name		= "camera",
-	.probe		= gb_camera_probe,
-	.disconnect	= gb_camera_disconnect,
-	.id_table	= gb_camera_id_table,
-	.driver.pm	= &gb_camera_pm_ops,
-};
-
-module_greybus_driver(gb_camera_driver);
-
-MODULE_DESCRIPTION("Greybus Camera protocol driver.");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/greybus/gb-camera.h b/drivers/staging/greybus/gb-camera.h
deleted file mode 100644
index d5a33a13f2a4..000000000000
--- a/drivers/staging/greybus/gb-camera.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Greybus Camera protocol driver.
- *
- * Copyright 2015 Google Inc.
- */
-#ifndef __GB_CAMERA_H
-#define __GB_CAMERA_H
-
-#include <linux/v4l2-mediabus.h>
-
-/* Input flags need to be set from the caller */
-#define GB_CAMERA_IN_FLAG_TEST		BIT(0)
-/* Output flags returned */
-#define GB_CAMERA_OUT_FLAG_ADJUSTED	BIT(0)
-
-/**
- * struct gb_camera_stream - Represents greybus camera stream.
- * @width: Stream width in pixels.
- * @height: Stream height in pixels.
- * @pixel_code: Media bus pixel code.
- * @vc: MIPI CSI virtual channel.
- * @dt: MIPI CSI data types. Most formats use a single data type, in which case
- *      the second element will be ignored.
- * @max_size: Maximum size of a frame in bytes. The camera module guarantees
- *            that all data between the Frame Start and Frame End packet for
- *            the associated virtual channel and data type(s) will not exceed
- *            this size.
- */
-struct gb_camera_stream {
-	unsigned int width;
-	unsigned int height;
-	enum v4l2_mbus_pixelcode pixel_code;
-	unsigned int vc;
-	unsigned int dt[2];
-	unsigned int max_size;
-};
-
-/**
- * struct gb_camera_csi_params - CSI configuration parameters
- * @num_lanes: number of CSI data lanes
- * @clk_freq: CSI clock frequency in Hz
- */
-struct gb_camera_csi_params {
-	unsigned int num_lanes;
-	unsigned int clk_freq;
-};
-
-/**
- * struct gb_camera_ops - Greybus camera operations, used by the Greybus camera
- *                        driver to expose operations to the host camera driver.
- * @capabilities: Retrieve camera capabilities and store them in the buffer
- *                'buf' capabilities. The buffer maximum size is specified by
- *                the caller in the 'size' parameter, and the effective
- *                capabilities size is returned from the function. If the buffer
- *                size is too small to hold the capabilities an error is
- *                returned and the buffer is left untouched.
- *
- * @configure_streams: Negotiate configuration and prepare the module for video
- *                     capture. The caller specifies the number of streams it
- *                     requests in the 'nstreams' argument and the associated
- *                     streams configurations in the 'streams' argument. The
- *                     GB_CAMERA_IN_FLAG_TEST 'flag' can be set to test a
- *                     configuration without applying it, otherwise the
- *                     configuration is applied by the module. The module can
- *                     decide to modify the requested configuration, including
- *                     using a different number of streams. In that case the
- *                     modified configuration won't be applied, the
- *                     GB_CAMERA_OUT_FLAG_ADJUSTED 'flag' will be set upon
- *                     return, and the modified configuration and number of
- *                     streams stored in 'streams' and 'array'. The module
- *                     returns its CSI-2 bus parameters in the 'csi_params'
- *                     structure in all cases.
- *
- * @capture: Submit a capture request. The supplied 'request_id' must be unique
- *           and higher than the IDs of all the previously submitted requests.
- *           The 'streams' argument specifies which streams are affected by the
- *           request in the form of a bitmask, with bits corresponding to the
- *           configured streams indexes. If the request contains settings, the
- *           'settings' argument points to the settings buffer and its size is
- *           specified by the 'settings_size' argument. Otherwise the 'settings'
- *           argument should be set to NULL and 'settings_size' to 0.
- *
- * @flush: Flush the capture requests queue. Return the ID of the last request
- *         that will processed by the device before it stops transmitting video
- *         frames. All queued capture requests with IDs higher than the returned
- *         ID will be dropped without being processed.
- */
-struct gb_camera_ops {
-	ssize_t (*capabilities)(void *priv, char *buf, size_t len);
-	int (*configure_streams)(void *priv, unsigned int *nstreams,
-				 unsigned int *flags,
-				 struct gb_camera_stream *streams,
-				 struct gb_camera_csi_params *csi_params);
-	int (*capture)(void *priv, u32 request_id,
-		       unsigned int streams, unsigned int num_frames,
-		       size_t settings_size, const void *settings);
-	int (*flush)(void *priv, u32 *request_id);
-};
-
-/**
- * struct gb_camera_module - Represents greybus camera module.
- * @priv: Module private data, passed to all camera operations.
- * @ops: Greybus camera operation callbacks.
- * @interface_id: Interface id of the module.
- * @refcount: Reference counting object.
- * @release: Module release function.
- * @list: List entry in the camera modules list.
- */
-struct gb_camera_module {
-	void *priv;
-	const struct gb_camera_ops *ops;
-
-	unsigned int interface_id;
-	struct kref refcount;
-	void (*release)(struct kref *kref);
-	struct list_head list; /* Global list */
-};
-
-#define gb_camera_call(f, op, args...)      \
-	(!(f) ? -ENODEV : (((f)->ops->op) ?  \
-	(f)->ops->op((f)->priv, ##args) : -ENOIOCTLCMD))
-
-int gb_camera_register(struct gb_camera_module *module);
-int gb_camera_unregister(struct gb_camera_module *module);
-
-#endif /* __GB_CAMERA_H */
-- 
2.43.0