Commit eae55660 authored by Steven Toth's avatar Steven Toth Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (8268): sms1xxx: usb cleanup

parent 159ed4bb
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1104,6 +1104,12 @@ int smscore_module_init(void)
	INIT_LIST_HEAD(&g_smscore_registry);
	kmutex_init(&g_smscore_registrylock);

	/* USB Register */
	rc = smsusb_register();

	/* DVB Register */
	rc = smsdvb_register();

	printk(KERN_INFO "%s, rc %d\n", __FUNCTION__, rc);

	return rc;
@@ -1111,6 +1117,7 @@ int smscore_module_init(void)

void smscore_module_exit(void)
{

	kmutex_lock(&g_smscore_deviceslock);
	while (!list_empty(&g_smscore_notifyees))
	{
@@ -1131,6 +1138,12 @@ void smscore_module_exit(void)
	}
	kmutex_unlock(&g_smscore_registrylock);

	/* DVB UnRegister */
	smsdvb_unregister();

	/* Unregister USB */
	smsusb_unregister();

	printk(KERN_INFO "%s\n", __FUNCTION__);
}

+6 −2
Original line number Diff line number Diff line
@@ -508,7 +508,11 @@ extern smscore_buffer_t *smscore_getbuffer(smscore_device_t *coredev);
extern void smscore_putbuffer(smscore_device_t *coredev, smscore_buffer_t *cb);

/* smsdvb.c */
int smsdvb_hotplug(smscore_device_t *coredev, struct device* device, int arrival);
void smsdvb_unregister_client(smsdvb_client_t* client);
int smsdvb_register(void);
void smsdvb_unregister(void);

/* smsusb.c */
int smsusb_register(void);
void smsusb_unregister(void);

#endif // __smscoreapi_h__
+27 −0
Original line number Diff line number Diff line
@@ -375,3 +375,30 @@ adapter_error:
	return rc;
}

int smsdvb_register(void)
{
	int rc;

	INIT_LIST_HEAD(&g_smsdvb_clients);
	kmutex_init(&g_smsdvb_clientslock);

	rc = smscore_register_hotplug(smsdvb_hotplug);

	printk(KERN_INFO "%s\n", __FUNCTION__);

	return rc;
}

void smsdvb_unregister(void)
{
	smscore_unregister_hotplug(smsdvb_hotplug);

	kmutex_lock(&g_smsdvb_clientslock);

	while (!list_empty(&g_smsdvb_clients))
		smsdvb_unregister_client((smsdvb_client_t*) g_smsdvb_clients.next);

	kmutex_unlock(&g_smsdvb_clientslock);

}
+2 −28
Original line number Diff line number Diff line
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/firmware.h>

@@ -401,46 +400,21 @@ static struct usb_driver smsusb_driver = {
	.id_table		= smsusb_id_table,
};

extern struct list_head g_smsdvb_clients;
kmutex_t g_smsdvb_clientslock;

int smsusb_module_init(void)
int smsusb_register(void)
{
	int rc = usb_register(&smsusb_driver);
	if (rc)
		printk(KERN_INFO "usb_register failed. Error number %d\n", rc);

	/* Bring up the dvb componenets */
	INIT_LIST_HEAD(&g_smsdvb_clients);
	kmutex_init(&g_smsdvb_clientslock);

	rc = smscore_register_hotplug(smsdvb_hotplug);

	printk(KERN_INFO "%s\n", __FUNCTION__);

	return rc;
}

void smsusb_module_exit(void)
void smsusb_unregister(void)
{
	/* Tear down the DVB components */
	smscore_unregister_hotplug(smsdvb_hotplug);

	kmutex_lock(&g_smsdvb_clientslock);

	while (!list_empty(&g_smsdvb_clients))
		smsdvb_unregister_client((smsdvb_client_t*) g_smsdvb_clients.next);

	kmutex_unlock(&g_smsdvb_clientslock);

	/* Regular USB Cleanup */
	usb_deregister(&smsusb_driver);
	printk(KERN_INFO "%s\n", __FUNCTION__);
}
module_init(smsusb_module_init);
module_exit(smsusb_module_exit);

MODULE_DESCRIPTION("smsusb");
MODULE_AUTHOR("Anatoly Greenblatt,,, (anatolyg@siano-ms.com)");
MODULE_LICENSE("GPL");