Unverified Commit febb7b88 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!14596 ALSA: caiaq: Use snd_card_free_when_closed() at disconnection

parents 8daaebaa b03a7e3f
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -890,14 +890,20 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev)
	return 0;
}

void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev)
void snd_usb_caiaq_audio_disconnect(struct snd_usb_caiaqdev *cdev)
{
	struct device *dev = caiaqdev_to_dev(cdev);

	dev_dbg(dev, "%s(%p)\n", __func__, cdev);
	stream_stop(cdev);
}

void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev)
{
	struct device *dev = caiaqdev_to_dev(cdev);

	dev_dbg(dev, "%s(%p)\n", __func__, cdev);
	free_urbs(cdev->data_urbs_in);
	free_urbs(cdev->data_urbs_out);
	kfree(cdev->data_cb_info);
}
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#define CAIAQ_AUDIO_H

int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev);
void snd_usb_caiaq_audio_disconnect(struct snd_usb_caiaqdev *cdev);
void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *cdev);

#endif /* CAIAQ_AUDIO_H */
+15 −4
Original line number Diff line number Diff line
@@ -402,6 +402,17 @@ static void setup_card(struct snd_usb_caiaqdev *cdev)
		dev_err(dev, "Unable to set up control system (ret=%d)\n", ret);
}

static void card_free(struct snd_card *card)
{
	struct snd_usb_caiaqdev *cdev = caiaqdev(card);

#ifdef CONFIG_SND_USB_CAIAQ_INPUT
	snd_usb_caiaq_input_free(cdev);
#endif
	snd_usb_caiaq_audio_free(cdev);
	usb_reset_device(cdev->chip.dev);
}

static int create_card(struct usb_device *usb_dev,
		       struct usb_interface *intf,
		       struct snd_card **cardp)
@@ -515,6 +526,7 @@ static int init_card(struct snd_usb_caiaqdev *cdev)
		       cdev->vendor_name, cdev->product_name, usbpath);

	setup_card(cdev);
	card->private_free = card_free;
	return 0;

 err_kill_urb:
@@ -560,15 +572,14 @@ static void snd_disconnect(struct usb_interface *intf)
	snd_card_disconnect(card);

#ifdef CONFIG_SND_USB_CAIAQ_INPUT
	snd_usb_caiaq_input_free(cdev);
	snd_usb_caiaq_input_disconnect(cdev);
#endif
	snd_usb_caiaq_audio_free(cdev);
	snd_usb_caiaq_audio_disconnect(cdev);

	usb_kill_urb(&cdev->ep1_in_urb);
	usb_kill_urb(&cdev->midi_out_urb);

	snd_card_free(card);
	usb_reset_device(interface_to_usbdev(intf));
	snd_card_free_when_closed(card);
}


+9 −3
Original line number Diff line number Diff line
@@ -841,15 +841,21 @@ int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)
	return ret;
}

void snd_usb_caiaq_input_free(struct snd_usb_caiaqdev *cdev)
void snd_usb_caiaq_input_disconnect(struct snd_usb_caiaqdev *cdev)
{
	if (!cdev || !cdev->input_dev)
		return;

	usb_kill_urb(cdev->ep4_in_urb);
	input_unregister_device(cdev->input_dev);
}

void snd_usb_caiaq_input_free(struct snd_usb_caiaqdev *cdev)
{
	if (!cdev || !cdev->input_dev)
		return;

	usb_free_urb(cdev->ep4_in_urb);
	cdev->ep4_in_urb = NULL;

	input_unregister_device(cdev->input_dev);
	cdev->input_dev = NULL;
}
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

void snd_usb_caiaq_input_dispatch(struct snd_usb_caiaqdev *cdev, char *buf, unsigned int len);
int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev);
void snd_usb_caiaq_input_disconnect(struct snd_usb_caiaqdev *cdev);
void snd_usb_caiaq_input_free(struct snd_usb_caiaqdev *cdev);

#endif