#ifndef __smscoreapi_h__
#define __smscoreapi_h__
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "dvb_demux.h"
+#include "dvb_frontend.h"
+
/* From sysksyms.h */
#include <linux/version.h>
/* End types.h */
+typedef struct _smsdvb_client
+{
+ struct list_head entry;
+
+ smscore_device_t *coredev;
+ smscore_client_t *smsclient;
+
+ struct dvb_adapter adapter;
+ struct dvb_demux demux;
+ struct dmxdev dmxdev;
+ struct dvb_frontend frontend;
+
+ fe_status_t fe_status;
+ int fe_ber, fe_snr, fe_signal_strength;
+
+ struct completion tune_done, stat_done;
+
+ // todo: save freq/band instead whole struct
+ struct dvb_frontend_parameters fe_params;
+
+} smsdvb_client_t;
+
extern void smscore_registry_setmode(char *devpath, int mode);
extern int smscore_registry_getmode(char *devpath);
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);
+
#endif // __smscoreapi_h__
#include <linux/module.h>
#include <linux/init.h>
-#include "dmxdev.h"
-#include "dvbdev.h"
-#include "dvb_demux.h"
-#include "dvb_frontend.h"
-
#include "smscoreapi.h"
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
-typedef struct _smsdvb_client
-{
- struct list_head entry;
-
- smscore_device_t *coredev;
- smscore_client_t *smsclient;
-
- struct dvb_adapter adapter;
- struct dvb_demux demux;
- struct dmxdev dmxdev;
- struct dvb_frontend frontend;
-
- fe_status_t fe_status;
- int fe_ber, fe_snr, fe_signal_strength;
-
- struct completion tune_done, stat_done;
-
- // todo: save freq/band instead whole struct
- struct dvb_frontend_parameters fe_params;
-
-} smsdvb_client_t;
-
struct list_head g_smsdvb_clients;
kmutex_t g_smsdvb_clientslock;
return rc;
}
-int smsdvb_module_init(void)
-{
- int rc;
-
- INIT_LIST_HEAD(&g_smsdvb_clients);
- kmutex_init(&g_smsdvb_clientslock);
-
- rc = smscore_register_hotplug(smsdvb_hotplug);
-
- printk(KERN_INFO "%s, rc %d\n", __FUNCTION__, rc);
-
- return rc;
-}
-
-void smsdvb_module_exit(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);
-
- printk(KERN_INFO "%s\n", __FUNCTION__);
-}
-
-module_init(smsdvb_module_init);
-module_exit(smsdvb_module_exit);
-
-MODULE_DESCRIPTION("smsdvb dvb-api module");
-MODULE_AUTHOR("Anatoly Greenblatt,,, (anatolyg@siano-ms.com)");
-MODULE_LICENSE("GPL");
.id_table = smsusb_id_table,
};
+extern struct list_head g_smsdvb_clients;
+kmutex_t g_smsdvb_clientslock;
+
int smsusb_module_init(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)
{
+ /* 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__);
}