forked from luck/tmp_suning_uos_patched
V4L/DVB (8292): sms1xxx: add code to allow device-specific functionality
Set board ID in the usb_device_id table's driver_info field. Use board name when registering the dvb adapter. Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
dd5b2a5c2a
commit
1c11d546b6
|
@ -1,4 +1,4 @@
|
|||
sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o
|
||||
sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o sms-cards.o
|
||||
|
||||
obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o
|
||||
|
||||
|
|
69
drivers/media/dvb/siano/sms-cards.c
Normal file
69
drivers/media/dvb/siano/sms-cards.c
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Card-specific functions for the Siano SMS1xxx USB dongle
|
||||
*
|
||||
* Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 3 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
*
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "sms-cards.h"
|
||||
|
||||
struct usb_device_id smsusb_id_table[] = {
|
||||
{ USB_DEVICE(0x187f, 0x0010),
|
||||
.driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
|
||||
{ USB_DEVICE(0x187f, 0x0100),
|
||||
.driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
|
||||
{ USB_DEVICE(0x187f, 0x0200),
|
||||
.driver_info = SMS1XXX_BOARD_SIANO_NOVA_A },
|
||||
{ USB_DEVICE(0x187f, 0x0201),
|
||||
.driver_info = SMS1XXX_BOARD_SIANO_NOVA_B },
|
||||
{ USB_DEVICE(0x187f, 0x0300),
|
||||
.driver_info = SMS1XXX_BOARD_SIANO_VEGA },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, smsusb_id_table);
|
||||
|
||||
static struct sms_board sms_boards[] = {
|
||||
[SMS_BOARD_UNKNOWN] = {
|
||||
.name = "Unknown board",
|
||||
},
|
||||
[SMS1XXX_BOARD_SIANO_SMS1000] = {
|
||||
.name = "Siano Digital Receiver",
|
||||
.type = SMS_STELLAR,
|
||||
},
|
||||
[SMS1XXX_BOARD_SIANO_STELLAR] = {
|
||||
.name = "Siano Stellar reference board",
|
||||
.type = SMS_STELLAR,
|
||||
},
|
||||
[SMS1XXX_BOARD_SIANO_NOVA_A] = {
|
||||
.name = "Siano Nova A reference board",
|
||||
.type = SMS_NOVA_A0,
|
||||
},
|
||||
[SMS1XXX_BOARD_SIANO_NOVA_B] = {
|
||||
.name = "Siano Nova B reference board",
|
||||
.type = SMS_NOVA_B0,
|
||||
},
|
||||
[SMS1XXX_BOARD_SIANO_VEGA] = {
|
||||
.name = "Siano Vega reference board",
|
||||
.type = SMS_VEGA,
|
||||
},
|
||||
};
|
||||
|
||||
struct sms_board *sms_get_board(int id)
|
||||
{
|
||||
BUG_ON(id >= ARRAY_SIZE(sms_boards));
|
||||
|
||||
return &sms_boards[id];
|
||||
}
|
||||
|
42
drivers/media/dvb/siano/sms-cards.h
Normal file
42
drivers/media/dvb/siano/sms-cards.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Card-specific functions for the Siano SMS1xxx USB dongle
|
||||
*
|
||||
* Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 3 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
|
||||
*
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __SMS_CARDS_H__
|
||||
#define __SMS_CARDS_H__
|
||||
|
||||
#include <linux/usb.h>
|
||||
#include "smscoreapi.h"
|
||||
|
||||
#define SMS_BOARD_UNKNOWN 0
|
||||
#define SMS1XXX_BOARD_SIANO_SMS1000 1
|
||||
#define SMS1XXX_BOARD_SIANO_STELLAR 2
|
||||
#define SMS1XXX_BOARD_SIANO_NOVA_A 3
|
||||
#define SMS1XXX_BOARD_SIANO_NOVA_B 4
|
||||
#define SMS1XXX_BOARD_SIANO_VEGA 5
|
||||
|
||||
struct sms_board {
|
||||
char *name;
|
||||
enum sms_device_type_st type;
|
||||
};
|
||||
|
||||
struct sms_board *sms_get_board(int id);
|
||||
|
||||
extern struct usb_device_id smsusb_id_table[];
|
||||
|
||||
#endif /* __SMS_CARDS_H__ */
|
|
@ -101,8 +101,20 @@ struct smscore_device_t {
|
|||
|
||||
struct completion version_ex_done, data_download_done, trigger_done;
|
||||
struct completion init_device_done, reload_start_done, resume_done;
|
||||
|
||||
int board_id;
|
||||
};
|
||||
|
||||
void smscore_set_board_id(struct smscore_device_t *core, int id)
|
||||
{
|
||||
core->board_id = id;
|
||||
}
|
||||
|
||||
int smscore_get_board_id(struct smscore_device_t *core)
|
||||
{
|
||||
return core->board_id;
|
||||
}
|
||||
|
||||
struct smscore_registry_entry_t {
|
||||
struct list_head entry;
|
||||
char devpath[32];
|
||||
|
|
|
@ -403,6 +403,9 @@ extern struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *cored
|
|||
extern void smscore_putbuffer(struct smscore_device_t *coredev,
|
||||
struct smscore_buffer_t *cb);
|
||||
|
||||
void smscore_set_board_id(struct smscore_device_t *core, int id);
|
||||
int smscore_get_board_id(struct smscore_device_t *core);
|
||||
|
||||
/* smsdvb.c */
|
||||
int smsdvb_register(void);
|
||||
void smsdvb_unregister(void);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/init.h>
|
||||
|
||||
#include "smscoreapi.h"
|
||||
#include "sms-cards.h"
|
||||
|
||||
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
||||
|
||||
|
@ -282,7 +283,7 @@ static void smsdvb_release(struct dvb_frontend *fe)
|
|||
|
||||
static struct dvb_frontend_ops smsdvb_fe_ops = {
|
||||
.info = {
|
||||
.name = "Siano Mobile Digital SMS10xx",
|
||||
.name = "Siano Mobile Digital SMS1xxx",
|
||||
.type = FE_OFDM,
|
||||
.frequency_min = 44250000,
|
||||
.frequency_max = 867250000,
|
||||
|
@ -333,7 +334,9 @@ int smsdvb_hotplug(struct smscore_device_t *coredev,
|
|||
}
|
||||
|
||||
/* register dvb adapter */
|
||||
rc = dvb_register_adapter(&client->adapter, "Siano Digital Receiver",
|
||||
rc = dvb_register_adapter(&client->adapter,
|
||||
sms_get_board(
|
||||
smscore_get_board_id(coredev))->name,
|
||||
THIS_MODULE, device, adapter_nr);
|
||||
if (rc < 0) {
|
||||
printk(KERN_ERR "%s dvb_register_adapter() failed %d\n",
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/firmware.h>
|
||||
|
||||
#include "smscoreapi.h"
|
||||
#include "sms-cards.h"
|
||||
|
||||
#define USB1_BUFFER_SIZE 0x1000
|
||||
#define USB2_BUFFER_SIZE 0x4000
|
||||
|
@ -32,14 +33,6 @@
|
|||
#define MAX_BUFFERS 50
|
||||
#define MAX_URBS 10
|
||||
|
||||
/* TO DO: move these to a header file */
|
||||
#define USB_VID_SIANO 0x187f
|
||||
|
||||
#define USB_PID_STELLAR 0x0100
|
||||
#define USB_PID_NOVA_A 0x0200
|
||||
#define USB_PID_NOVA_B 0x0201
|
||||
#define USB_PID_VEGA 0x0300
|
||||
|
||||
struct smsusb_device_t;
|
||||
|
||||
struct smsusb_urb_t {
|
||||
|
@ -287,10 +280,11 @@ void smsusb_term_device(struct usb_interface *intf)
|
|||
usb_set_intfdata(intf, NULL);
|
||||
}
|
||||
|
||||
int smsusb_init_device(struct usb_interface *intf)
|
||||
int smsusb_init_device(struct usb_interface *intf, int board_id)
|
||||
{
|
||||
struct smsdevice_params_t params;
|
||||
struct smsusb_device_t *dev;
|
||||
struct sms_board *board;
|
||||
int i, rc;
|
||||
|
||||
/* create device object */
|
||||
|
@ -305,9 +299,11 @@ int smsusb_init_device(struct usb_interface *intf)
|
|||
usb_set_intfdata(intf, dev);
|
||||
dev->udev = interface_to_usbdev(intf);
|
||||
|
||||
switch (dev->udev->descriptor.idProduct) {
|
||||
board = sms_get_board(board_id);
|
||||
|
||||
case USB_PID_STELLAR:
|
||||
switch (board->type) {
|
||||
|
||||
case SMS_STELLAR:
|
||||
dev->buffer_size = USB1_BUFFER_SIZE;
|
||||
|
||||
params.setmode_handler = smsusb1_setmode;
|
||||
|
@ -316,19 +312,22 @@ int smsusb_init_device(struct usb_interface *intf)
|
|||
printk(KERN_INFO "%s stellar device found\n", __func__);
|
||||
break;
|
||||
default:
|
||||
switch (dev->udev->descriptor.idProduct) {
|
||||
case USB_PID_NOVA_A:
|
||||
switch (board->type) {
|
||||
case SMS_NOVA_A0:
|
||||
params.device_type = SMS_NOVA_A0;
|
||||
printk(KERN_INFO "%s nova A0 found\n", __func__);
|
||||
break;
|
||||
default:
|
||||
case USB_PID_NOVA_B:
|
||||
case SMS_NOVA_B0:
|
||||
params.device_type = SMS_NOVA_B0;
|
||||
printk(KERN_INFO "%s nova B0 found\n", __func__);
|
||||
break;
|
||||
case USB_PID_VEGA:
|
||||
case SMS_VEGA:
|
||||
params.device_type = SMS_VEGA;
|
||||
printk(KERN_INFO "%s Vega found\n", __func__);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "%s Unspecified sms device type!\n",
|
||||
__func__);
|
||||
}
|
||||
|
||||
dev->buffer_size = USB2_BUFFER_SIZE;
|
||||
|
@ -357,6 +356,8 @@ int smsusb_init_device(struct usb_interface *intf)
|
|||
return rc;
|
||||
}
|
||||
|
||||
smscore_set_board_id(dev->coredev, board_id);
|
||||
|
||||
/* initialize urbs */
|
||||
for (i = 0; i < MAX_URBS; i++) {
|
||||
dev->surbs[i].dev = dev;
|
||||
|
@ -426,7 +427,7 @@ int smsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||
udev, smscore_registry_getmode(devpath));
|
||||
}
|
||||
|
||||
rc = smsusb_init_device(intf);
|
||||
rc = smsusb_init_device(intf, id->driver_info);
|
||||
printk(KERN_INFO "%s rc %d\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
@ -436,15 +437,6 @@ void smsusb_disconnect(struct usb_interface *intf)
|
|||
smsusb_term_device(intf);
|
||||
}
|
||||
|
||||
static struct usb_device_id smsusb_id_table [] = {
|
||||
{ USB_DEVICE(USB_VID_SIANO, USB_PID_STELLAR) },
|
||||
{ USB_DEVICE(USB_VID_SIANO, USB_PID_NOVA_A) },
|
||||
{ USB_DEVICE(USB_VID_SIANO, USB_PID_NOVA_B) },
|
||||
{ USB_DEVICE(USB_VID_SIANO, USB_PID_VEGA) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, smsusb_id_table);
|
||||
|
||||
static struct usb_driver smsusb_driver = {
|
||||
.name = "smsusb",
|
||||
.probe = smsusb_probe,
|
||||
|
|
Loading…
Reference in New Issue
Block a user