Commit a7983fd9 authored by Nicolas Saenz Julienne's avatar Nicolas Saenz Julienne Committed by Greg Kroah-Hartman
Browse files

staging: vchi: Get rid of struct vchi_instance_handle



The idea behind this was to create an opaque handle to struct
vchiq_instance. This can be achieved without creating a new type by
means of a forward declaration of struct vchiq_instance.

This saves us from a lot of useless casting and overall simplifies code.

Signed-off-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
Link: https://lore.kernel.org/r/20200629150945.10720-12-nsaenzjulienne@suse.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b5f1547b
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ static void audio_vchi_callback(void *param,
}

static int
vc_vchi_audio_init(struct vchi_instance_handle *vchi_instance,
vc_vchi_audio_init(struct vchiq_instance *vchiq_instance,
		   struct bcm2835_audio_instance *instance)
{
	struct service_creation params = {
@@ -134,7 +134,7 @@ vc_vchi_audio_init(struct vchi_instance_handle *vchi_instance,
	int status;

	/* Open the VCHI service connections */
	status = vchi_service_open(vchi_instance, &params,
	status = vchi_service_open(vchiq_instance, &params,
				   &instance->vchi_handle);

	if (status) {
@@ -173,20 +173,20 @@ int bcm2835_new_vchi_ctx(struct device *dev, struct bcm2835_vchi_ctx *vchi_ctx)
	int ret;

	/* Initialize and create a VCHI connection */
	ret = vchi_initialise(&vchi_ctx->vchi_instance);
	ret = vchi_initialise(&vchi_ctx->instance);
	if (ret) {
		dev_err(dev, "failed to initialise VCHI instance (ret=%d)\n",
			ret);
		return -EIO;
	}

	ret = vchi_connect(vchi_ctx->vchi_instance);
	ret = vchi_connect(vchi_ctx->instance);
	if (ret) {
		dev_dbg(dev, "failed to connect VCHI instance (ret=%d)\n",
			ret);

		kfree(vchi_ctx->vchi_instance);
		vchi_ctx->vchi_instance = NULL;
		kfree(vchi_ctx->instance);
		vchi_ctx->instance = NULL;

		return -EIO;
	}
@@ -196,10 +196,10 @@ int bcm2835_new_vchi_ctx(struct device *dev, struct bcm2835_vchi_ctx *vchi_ctx)

void bcm2835_free_vchi_ctx(struct bcm2835_vchi_ctx *vchi_ctx)
{
	/* Close the VCHI connection - it will also free vchi_instance */
	WARN_ON(vchi_disconnect(vchi_ctx->vchi_instance));
	/* Close the VCHI connection - it will also free vchi_ctx->instance */
	WARN_ON(vchi_disconnect(vchi_ctx->instance));

	vchi_ctx->vchi_instance = NULL;
	vchi_ctx->instance = NULL;
}

int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream)
@@ -217,7 +217,7 @@ int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream)
	instance->alsa_stream = alsa_stream;
	alsa_stream->instance = instance;

	err = vc_vchi_audio_init(vchi_ctx->vchi_instance,
	err = vc_vchi_audio_init(vchi_ctx->instance,
				 instance);
	if (err < 0)
		goto free_instance;
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ enum snd_bcm2835_ctrl {
};

struct bcm2835_vchi_ctx {
	struct vchi_instance_handle *vchi_instance;
	struct vchiq_instance *instance;
};

/* definition of the chip-specific record */
+6 −6
Original line number Diff line number Diff line
@@ -49,8 +49,8 @@ struct service_creation {
	void *callback_param;
};

// Opaque handle for a VCHI instance
struct vchi_instance_handle;
// Opaque handle for a VCHIQ instance
struct vchiq_instance;

// Opaque handle for a server or client
struct vchi_service_handle;
@@ -61,19 +61,19 @@ struct vchi_service_handle;
 *****************************************************************************/

// Routine used to initialise the vchi on both local + remote connections
extern int32_t vchi_initialise(struct vchi_instance_handle **instance_handle);
extern int32_t vchi_initialise(struct vchiq_instance **instance);

extern int32_t vchi_connect(struct vchi_instance_handle *instance_handle);
extern int32_t vchi_connect(struct vchiq_instance *instance);

//When this is called, ensure that all services have no data pending.
//Bulk transfers can remain 'queued'
extern int32_t vchi_disconnect(struct vchi_instance_handle *instance_handle);
extern int32_t vchi_disconnect(struct vchiq_instance *instance);

/******************************************************************************
 * Global service API
 *****************************************************************************/
// Routine to open a named service
extern int32_t vchi_service_open(struct vchi_instance_handle *instance_handle,
extern int32_t vchi_service_open(struct vchiq_instance *instance,
				 struct service_creation *setup,
				 struct vchi_service_handle **handle);

+9 −21
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ EXPORT_SYMBOL(vchi_msg_hold);
/***********************************************************
 * Name: vchi_initialise
 *
 * Arguments: struct vchi_instance_handle **instance_handle
 * Arguments: struct vchiq_instance **instance
 *
 * Description: Initialises the hardware but does not transmit anything
 *              When run as a Host App this will be called twice hence the need
@@ -297,23 +297,16 @@ EXPORT_SYMBOL(vchi_msg_hold);
 *
 ***********************************************************/

int32_t vchi_initialise(struct vchi_instance_handle **instance_handle)
int32_t vchi_initialise(struct vchiq_instance **instance)
{
	struct vchiq_instance *instance;
	enum vchiq_status status;

	status = vchiq_initialise(&instance);

	*instance_handle = (struct vchi_instance_handle *)instance;

	return status;
	return vchiq_initialise(instance);
}
EXPORT_SYMBOL(vchi_initialise);

/***********************************************************
 * Name: vchi_connect
 *
 * Arguments: struct vchi_instance_handle *instance_handle
 * Arguments: struct vchiq_instance *instance
 *
 * Description: Starts the command service on each connection,
 *              causing INIT messages to be pinged back and forth
@@ -321,10 +314,8 @@ EXPORT_SYMBOL(vchi_initialise);
 * Returns: 0 if successful, failure otherwise
 *
 ***********************************************************/
int32_t vchi_connect(struct vchi_instance_handle *instance_handle)
int32_t vchi_connect(struct vchiq_instance *instance)
{
	struct vchiq_instance *instance = (struct vchiq_instance *)instance_handle;

	return vchiq_connect(instance);
}
EXPORT_SYMBOL(vchi_connect);
@@ -332,7 +323,7 @@ EXPORT_SYMBOL(vchi_connect);
/***********************************************************
 * Name: vchi_disconnect
 *
 * Arguments: struct vchi_instance_handle *instance_handle
 * Arguments: struct vchiq_instance *instance
 *
 * Description: Stops the command service on each connection,
 *              causing DE-INIT messages to be pinged back and forth
@@ -340,10 +331,8 @@ EXPORT_SYMBOL(vchi_connect);
 * Returns: 0 if successful, failure otherwise
 *
 ***********************************************************/
int32_t vchi_disconnect(struct vchi_instance_handle *instance_handle)
int32_t vchi_disconnect(struct vchiq_instance *instance)
{
	struct vchiq_instance *instance = (struct vchiq_instance *)instance_handle;

	return vchiq_shutdown(instance);
}
EXPORT_SYMBOL(vchi_disconnect);
@@ -352,7 +341,7 @@ EXPORT_SYMBOL(vchi_disconnect);
 * Name: vchi_service_open
 * Name: vchi_service_create
 *
 * Arguments: struct vchi_instance_handle *instance_handle
 * Arguments: struct vchiq_instance *instance
 *            struct service_creation *setup,
 *            struct vchi_service_handle **handle
 *
@@ -446,11 +435,10 @@ static void service_free(struct shim_service *service)
	}
}

int32_t vchi_service_open(struct vchi_instance_handle *instance_handle,
int32_t vchi_service_open(struct vchiq_instance *instance,
	struct service_creation *setup,
	struct vchi_service_handle **handle)
{
	struct vchiq_instance *instance = (struct vchiq_instance *)instance_handle;
	struct shim_service *service = service_alloc(instance, setup);

	*handle = (struct vchi_service_handle *)service;
+4 −4
Original line number Diff line number Diff line
@@ -1864,7 +1864,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
{
	int status;
	struct vchiq_mmal_instance *instance;
	static struct vchi_instance_handle *vchi_instance;
	static struct vchiq_instance *vchiq_instance;
	struct service_creation params = {
		.version		= VCHI_VERSION_EX(VC_MMAL_VER, VC_MMAL_MIN_VER),
		.service_id		= VC_MMAL_SERVER_NAME,
@@ -1886,14 +1886,14 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
	BUILD_BUG_ON(sizeof(struct mmal_port) != 64);

	/* create a vchi instance */
	status = vchi_initialise(&vchi_instance);
	status = vchi_initialise(&vchiq_instance);
	if (status) {
		pr_err("Failed to initialise VCHI instance (status=%d)\n",
		       status);
		return -EIO;
	}

	status = vchi_connect(vchi_instance);
	status = vchi_connect(vchiq_instance);
	if (status) {
		pr_err("Failed to connect VCHI instance (status=%d)\n", status);
		return -EIO;
@@ -1918,7 +1918,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
	if (!instance->bulk_wq)
		goto err_free;

	status = vchi_service_open(vchi_instance, &params, &instance->handle);
	status = vchi_service_open(vchiq_instance, &params, &instance->handle);
	if (status) {
		pr_err("Failed to open VCHI service connection (status=%d)\n",
		       status);