2009-05-12 10:57:54 +00:00
|
|
|
/****************************************************************
|
|
|
|
|
|
|
|
Siano Mobile Silicon, Inc.
|
|
|
|
MDTV receiver kernel modules.
|
|
|
|
Copyright (C) 2005-2009, Uri Shkolnik, Anatoly Greenblat
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
****************************************************************/
|
2008-05-22 21:05:26 +00:00
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/usb.h>
|
|
|
|
#include <linux/firmware.h>
|
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files. percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed. Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability. As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
only the necessary includes are there. ie. if only gfp is used,
gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
blocks and try to put the new include such that its order conforms
to its surrounding. It's put in the include block which contains
core kernel includes, in the same order that the rest are ordered -
alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
because the file doesn't have fitting include block), it prints out
an error message indicating which .h file needs to be added to the
file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
over 4000 files, deleting around 700 includes and adding ~480 gfp.h
and ~3000 slab.h inclusions. The script emitted errors for ~400
files.
2. Each error was manually checked. Some didn't need the inclusion,
some needed manual addition while adding it to implementation .h or
embedding .c file was more appropriate for others. This step added
inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
e.g. lib/decompress_*.c used malloc/free() wrappers around slab
APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
editing them as sprinkling gfp.h and slab.h inclusions around .h
files could easily lead to inclusion dependency hell. Most gfp.h
inclusion directives were ignored as stuff from gfp.h was usually
wildly available and often used in preprocessor macros. Each
slab.h inclusion directive was examined and added manually as
necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
distributed build env didn't work with gcov compiles) and a few
more options had to be turned off depending on archs to make things
build (like ipr on powerpc/64 which failed due to missing writeq).
* x86 and x86_64 UP and SMP allmodconfig and a custom test config.
* powerpc and powerpc64 SMP allmodconfig
* sparc and sparc64 SMP allmodconfig
* ia64 SMP allmodconfig
* s390 SMP allmodconfig
* alpha SMP allmodconfig
* um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
2010-03-24 08:04:11 +00:00
|
|
|
#include <linux/slab.h>
|
2011-07-03 18:03:12 +00:00
|
|
|
#include <linux/module.h>
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
#include "smscoreapi.h"
|
2008-06-19 01:09:55 +00:00
|
|
|
#include "sms-cards.h"
|
2009-05-12 11:24:07 +00:00
|
|
|
#include "smsendian.h"
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2009-02-27 05:42:16 +00:00
|
|
|
static int sms_dbg;
|
|
|
|
module_param_named(debug, sms_dbg, int, 0644);
|
|
|
|
MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
#define USB1_BUFFER_SIZE 0x1000
|
2013-03-06 12:53:50 +00:00
|
|
|
#define USB2_BUFFER_SIZE 0x2000
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
#define MAX_BUFFERS 50
|
|
|
|
#define MAX_URBS 10
|
|
|
|
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_device_t;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
enum smsusb_state {
|
|
|
|
SMSUSB_DISCONNECTED,
|
|
|
|
SMSUSB_SUSPENDED,
|
|
|
|
SMSUSB_ACTIVE
|
|
|
|
};
|
|
|
|
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_urb_t {
|
2013-03-06 12:53:50 +00:00
|
|
|
struct list_head entry;
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smscore_buffer_t *cb;
|
2013-03-06 12:53:50 +00:00
|
|
|
struct smsusb_device_t *dev;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 20:52:24 +00:00
|
|
|
struct urb urb;
|
|
|
|
};
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_device_t {
|
2008-05-06 06:11:51 +00:00
|
|
|
struct usb_device *udev;
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smscore_device_t *coredev;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_urb_t surbs[MAX_URBS];
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
int response_alignment;
|
|
|
|
int buffer_size;
|
2013-03-06 12:53:50 +00:00
|
|
|
|
|
|
|
unsigned char in_ep;
|
|
|
|
unsigned char out_ep;
|
|
|
|
enum smsusb_state state;
|
2008-06-15 20:52:24 +00:00
|
|
|
};
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb_submit_urb(struct smsusb_device_t *dev,
|
|
|
|
struct smsusb_urb_t *surb);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
/**
|
|
|
|
* Completing URB's callback handler - top half (interrupt context)
|
|
|
|
* adds completing sms urb to the global surbs list and activtes the worker
|
|
|
|
* thread the surb
|
|
|
|
* IMPORTANT - blocking functions must not be called from here !!!
|
|
|
|
|
|
|
|
* @param urb pointer to a completing urb object
|
|
|
|
*/
|
2008-06-21 05:44:02 +00:00
|
|
|
static void smsusb_onresponse(struct urb *urb)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
|
|
|
|
struct smsusb_device_t *dev = surb->dev;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2009-05-12 14:28:41 +00:00
|
|
|
if (urb->status == -ESHUTDOWN) {
|
|
|
|
sms_err("error, urb status %d (-ESHUTDOWN), %d bytes",
|
2008-06-20 01:07:23 +00:00
|
|
|
urb->status, urb->actual_length);
|
2008-05-19 21:56:13 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-05-12 14:28:41 +00:00
|
|
|
if ((urb->actual_length > 0) && (urb->status == 0)) {
|
|
|
|
struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)surb->cb->p;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2009-05-14 19:27:16 +00:00
|
|
|
smsendian_handle_message_header(phdr);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (urb->actual_length >= phdr->msgLength) {
|
2008-05-19 21:56:13 +00:00
|
|
|
surb->cb->size = phdr->msgLength;
|
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (dev->response_alignment &&
|
|
|
|
(phdr->msgFlags & MSG_HDR_FLAG_SPLIT_MSG)) {
|
|
|
|
|
|
|
|
surb->cb->offset =
|
|
|
|
dev->response_alignment +
|
|
|
|
((phdr->msgFlags >> 8) & 3);
|
|
|
|
|
|
|
|
/* sanity check */
|
|
|
|
if (((int) phdr->msgLength +
|
|
|
|
surb->cb->offset) > urb->actual_length) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("invalid response "
|
|
|
|
"msglen %d offset %d "
|
|
|
|
"size %d",
|
|
|
|
phdr->msgLength,
|
|
|
|
surb->cb->offset,
|
|
|
|
urb->actual_length);
|
2008-05-19 21:56:13 +00:00
|
|
|
goto exit_and_resubmit;
|
|
|
|
}
|
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
/* move buffer pointer and
|
|
|
|
* copy header to its new location */
|
2008-05-06 06:52:44 +00:00
|
|
|
memcpy((char *) phdr + surb->cb->offset,
|
2008-06-15 20:52:24 +00:00
|
|
|
phdr, sizeof(struct SmsMsgHdr_ST));
|
2008-06-15 18:14:13 +00:00
|
|
|
} else
|
2008-05-19 21:56:13 +00:00
|
|
|
surb->cb->offset = 0;
|
|
|
|
|
2013-03-09 12:27:39 +00:00
|
|
|
sms_debug("received %s(%d) size: %d",
|
|
|
|
smscore_translate_msg(phdr->msgType),
|
|
|
|
phdr->msgType, phdr->msgLength);
|
|
|
|
|
2013-03-09 14:34:56 +00:00
|
|
|
smsendian_handle_rx_message((struct SmsMsgData_ST *) phdr);
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
smscore_onresponse(dev->coredev, surb->cb);
|
|
|
|
surb->cb = NULL;
|
2008-06-15 18:14:13 +00:00
|
|
|
} else {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("invalid response "
|
|
|
|
"msglen %d actual %d",
|
|
|
|
phdr->msgLength, urb->actual_length);
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
2009-05-12 14:28:41 +00:00
|
|
|
} else
|
|
|
|
sms_err("error, urb status %d, %d bytes",
|
|
|
|
urb->status, urb->actual_length);
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
exit_and_resubmit:
|
|
|
|
smsusb_submit_urb(dev, surb);
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb_submit_urb(struct smsusb_device_t *dev,
|
|
|
|
struct smsusb_urb_t *surb)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 18:14:13 +00:00
|
|
|
if (!surb->cb) {
|
2008-05-19 21:56:13 +00:00
|
|
|
surb->cb = smscore_getbuffer(dev->coredev);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (!surb->cb) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("smscore_getbuffer(...) returned NULL");
|
2008-05-19 21:56:13 +00:00
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
usb_fill_bulk_urb(
|
|
|
|
&surb->urb,
|
|
|
|
dev->udev,
|
2013-03-06 12:53:50 +00:00
|
|
|
usb_rcvbulkpipe(dev->udev, dev->in_ep),
|
2008-05-19 21:56:13 +00:00
|
|
|
surb->cb->p,
|
|
|
|
dev->buffer_size,
|
|
|
|
smsusb_onresponse,
|
|
|
|
surb
|
|
|
|
);
|
|
|
|
surb->urb.transfer_dma = surb->cb->phys;
|
|
|
|
surb->urb.transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
|
|
|
|
|
|
|
return usb_submit_urb(&surb->urb, GFP_ATOMIC);
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static void smsusb_stop_streaming(struct smsusb_device_t *dev)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2008-06-15 18:52:43 +00:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-19 21:56:13 +00:00
|
|
|
usb_kill_urb(&dev->surbs[i].urb);
|
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (dev->surbs[i].cb) {
|
2008-05-19 21:56:13 +00:00
|
|
|
smscore_putbuffer(dev->coredev, dev->surbs[i].cb);
|
|
|
|
dev->surbs[i].cb = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb_start_streaming(struct smsusb_device_t *dev)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
|
|
|
int i, rc;
|
|
|
|
|
2008-06-15 18:52:43 +00:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-19 21:56:13 +00:00
|
|
|
rc = smsusb_submit_urb(dev, &dev->surbs[i]);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("smsusb_submit_urb(...) failed");
|
2008-05-19 21:56:13 +00:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb_sendrequest(void *context, void *buffer, size_t size)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
|
2013-03-09 12:27:39 +00:00
|
|
|
struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) buffer;
|
2008-05-19 21:56:13 +00:00
|
|
|
int dummy;
|
|
|
|
|
2013-03-09 14:34:56 +00:00
|
|
|
if (dev->state != SMSUSB_ACTIVE)
|
|
|
|
return -ENOENT;
|
|
|
|
|
2013-03-09 12:27:39 +00:00
|
|
|
sms_debug("sending %s(%d) size: %d",
|
|
|
|
smscore_translate_msg(phdr->msgType), phdr->msgType,
|
|
|
|
phdr->msgLength);
|
|
|
|
|
2013-03-09 14:34:56 +00:00
|
|
|
smsendian_handle_tx_message((struct SmsMsgData_ST *) phdr);
|
2009-05-12 11:24:07 +00:00
|
|
|
smsendian_handle_message_header((struct SmsMsgHdr_ST *)buffer);
|
2008-06-15 18:14:13 +00:00
|
|
|
return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
|
|
|
buffer, size, &dummy, 1000);
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static char *smsusb1_fw_lkup[] = {
|
2008-05-19 21:56:13 +00:00
|
|
|
"dvbt_stellar_usb.inp",
|
|
|
|
"dvbh_stellar_usb.inp",
|
|
|
|
"tdmb_stellar_usb.inp",
|
|
|
|
"none",
|
|
|
|
"dvbt_bda_stellar_usb.inp",
|
|
|
|
};
|
|
|
|
|
2008-07-01 07:35:26 +00:00
|
|
|
static inline char *sms_get_fw_name(int mode, int board_id)
|
|
|
|
{
|
|
|
|
char **fw = sms_get_board(board_id)->fw;
|
|
|
|
return (fw && fw[mode]) ? fw[mode] : smsusb1_fw_lkup[mode];
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smsusb1_load_firmware(struct usb_device *udev, int id, int board_id)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
|
|
|
const struct firmware *fw;
|
2008-05-06 06:11:51 +00:00
|
|
|
u8 *fw_buffer;
|
2008-05-19 21:56:13 +00:00
|
|
|
int rc, dummy;
|
2008-07-01 07:35:26 +00:00
|
|
|
char *fw_filename;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (id < DEVICE_MODE_DVBT || id > DEVICE_MODE_DVBT_BDA) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("invalid firmware id specified %d", id);
|
2008-05-19 21:56:13 +00:00
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
2008-07-01 07:35:26 +00:00
|
|
|
fw_filename = sms_get_fw_name(id, board_id);
|
|
|
|
|
|
|
|
rc = request_firmware(&fw, fw_filename, &udev->dev);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-07-01 07:35:26 +00:00
|
|
|
sms_warn("failed to open \"%s\" mode %d, "
|
|
|
|
"trying again with default firmware", fw_filename, id);
|
|
|
|
|
|
|
|
fw_filename = smsusb1_fw_lkup[id];
|
|
|
|
rc = request_firmware(&fw, fw_filename, &udev->dev);
|
|
|
|
if (rc < 0) {
|
|
|
|
sms_warn("failed to open \"%s\" mode %d",
|
|
|
|
fw_filename, id);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fw_buffer = kmalloc(fw->size, GFP_KERNEL);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (fw_buffer) {
|
2008-05-19 21:56:13 +00:00
|
|
|
memcpy(fw_buffer, fw->data, fw->size);
|
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
rc = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 2),
|
|
|
|
fw_buffer, fw->size, &dummy, 1000);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-28 23:53:45 +00:00
|
|
|
sms_info("sent %zd(%d) bytes, rc %d", fw->size, dummy, rc);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
kfree(fw_buffer);
|
2008-06-15 18:14:13 +00:00
|
|
|
} else {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("failed to allocate firmware buffer");
|
2008-05-19 21:56:13 +00:00
|
|
|
rc = -ENOMEM;
|
|
|
|
}
|
2008-07-01 07:35:26 +00:00
|
|
|
sms_info("read FW %s, size=%zd", fw_filename, fw->size);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
release_firmware(fw);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static void smsusb1_detectmode(void *context, int *mode)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 20:52:24 +00:00
|
|
|
char *product_string =
|
|
|
|
((struct smsusb_device_t *) context)->udev->product;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
*mode = DEVICE_MODE_NONE;
|
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (!product_string) {
|
2008-05-19 21:56:13 +00:00
|
|
|
product_string = "none";
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_err("product string not found");
|
2008-06-15 18:14:13 +00:00
|
|
|
} else if (strstr(product_string, "DVBH"))
|
|
|
|
*mode = 1;
|
|
|
|
else if (strstr(product_string, "BDA"))
|
|
|
|
*mode = 4;
|
|
|
|
else if (strstr(product_string, "DVBT"))
|
|
|
|
*mode = 0;
|
|
|
|
else if (strstr(product_string, "TDMB"))
|
|
|
|
*mode = 2;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_info("%d \"%s\"", *mode, product_string);
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb1_setmode(void *context, int mode)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 20:52:24 +00:00
|
|
|
struct SmsMsgHdr_ST Msg = { MSG_SW_RELOAD_REQ, 0, HIF_TASK,
|
|
|
|
sizeof(struct SmsMsgHdr_ST), 0 };
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("invalid firmware id specified %d", mode);
|
2008-05-19 21:56:13 +00:00
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return smsusb_sendrequest(context, &Msg, sizeof(Msg));
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static void smsusb_term_device(struct usb_interface *intf)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2010-11-30 21:42:07 +00:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
if (dev) {
|
2013-03-06 12:53:50 +00:00
|
|
|
dev->state = SMSUSB_DISCONNECTED;
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
|
2008-06-15 18:52:43 +00:00
|
|
|
/* unregister from smscore */
|
2008-05-19 21:56:13 +00:00
|
|
|
if (dev->coredev)
|
|
|
|
smscore_unregister_device(dev->coredev);
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
sms_info("device 0x%p destroyed", dev);
|
2011-04-21 21:11:25 +00:00
|
|
|
kfree(dev);
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
usb_set_intfdata(intf, NULL);
|
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
2008-06-15 20:52:24 +00:00
|
|
|
struct smsdevice_params_t params;
|
|
|
|
struct smsusb_device_t *dev;
|
2008-05-19 21:56:13 +00:00
|
|
|
int i, rc;
|
|
|
|
|
2008-06-15 18:52:43 +00:00
|
|
|
/* create device object */
|
2008-06-15 20:52:24 +00:00
|
|
|
dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (!dev) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("kzalloc(sizeof(struct smsusb_device_t) failed");
|
2008-05-19 21:56:13 +00:00
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
|
usb_set_intfdata(intf, dev);
|
|
|
|
dev->udev = interface_to_usbdev(intf);
|
2013-03-06 12:53:50 +00:00
|
|
|
dev->state = SMSUSB_DISCONNECTED;
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-21 08:24:38 +00:00
|
|
|
params.device_type = sms_get_board(board_id)->type;
|
2008-06-14 21:27:18 +00:00
|
|
|
|
2008-06-21 08:24:38 +00:00
|
|
|
switch (params.device_type) {
|
2008-06-19 01:09:55 +00:00
|
|
|
case SMS_STELLAR:
|
2008-06-14 03:43:26 +00:00
|
|
|
dev->buffer_size = USB1_BUFFER_SIZE;
|
|
|
|
|
|
|
|
params.setmode_handler = smsusb1_setmode;
|
|
|
|
params.detectmode_handler = smsusb1_detectmode;
|
|
|
|
break;
|
|
|
|
default:
|
2008-06-21 08:24:38 +00:00
|
|
|
sms_err("Unspecified sms device type!");
|
|
|
|
/* fall-thru */
|
|
|
|
case SMS_NOVA_A0:
|
|
|
|
case SMS_NOVA_B0:
|
|
|
|
case SMS_VEGA:
|
2013-03-06 12:53:50 +00:00
|
|
|
case SMS_VENICE:
|
|
|
|
case SMS_DENVER_1530:
|
2008-06-14 03:43:26 +00:00
|
|
|
dev->buffer_size = USB2_BUFFER_SIZE;
|
2008-06-15 18:14:13 +00:00
|
|
|
dev->response_alignment =
|
2009-05-12 11:24:07 +00:00
|
|
|
le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
|
|
|
|
sizeof(struct SmsMsgHdr_ST);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-14 03:43:26 +00:00
|
|
|
params.flags |= SMS_DEVICE_FAMILY2;
|
|
|
|
break;
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
|
|
|
if (intf->cur_altsetting->endpoint[i].desc. bEndpointAddress & USB_DIR_IN)
|
|
|
|
dev->in_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
|
|
|
else
|
|
|
|
dev->out_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
|
|
|
}
|
|
|
|
|
|
|
|
sms_info("in_ep = %02x, out_ep = %02x",
|
|
|
|
dev->in_ep, dev->out_ep);
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
params.device = &dev->udev->dev;
|
|
|
|
params.buffer_size = dev->buffer_size;
|
|
|
|
params.num_buffers = MAX_BUFFERS;
|
|
|
|
params.sendrequest_handler = smsusb_sendrequest;
|
|
|
|
params.context = dev;
|
2010-08-01 18:30:50 +00:00
|
|
|
usb_make_path(dev->udev, params.devpath, sizeof(params.devpath));
|
2008-05-19 21:56:13 +00:00
|
|
|
|
2008-06-15 18:14:13 +00:00
|
|
|
/* register in smscore */
|
2008-05-19 21:56:13 +00:00
|
|
|
rc = smscore_register_device(¶ms, &dev->coredev);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("smscore_register_device(...) failed, rc %d", rc);
|
2008-05-19 21:56:13 +00:00
|
|
|
smsusb_term_device(intf);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-19 01:09:55 +00:00
|
|
|
smscore_set_board_id(dev->coredev, board_id);
|
|
|
|
|
2008-06-15 18:52:43 +00:00
|
|
|
/* initialize urbs */
|
2008-06-15 18:14:13 +00:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-19 21:56:13 +00:00
|
|
|
dev->surbs[i].dev = dev;
|
|
|
|
usb_init_urb(&dev->surbs[i].urb);
|
|
|
|
}
|
|
|
|
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_info("smsusb_start_streaming(...).");
|
2008-05-19 21:56:13 +00:00
|
|
|
rc = smsusb_start_streaming(dev);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("smsusb_start_streaming(...) failed");
|
2008-05-19 21:56:13 +00:00
|
|
|
smsusb_term_device(intf);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
dev->state = SMSUSB_ACTIVE;
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
rc = smscore_start_device(dev->coredev);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("smscore_start_device(...) failed");
|
2008-05-19 21:56:13 +00:00
|
|
|
smsusb_term_device(intf);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
sms_info("device 0x%p created", dev);
|
2008-05-19 21:56:13 +00:00
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2012-12-21 21:17:53 +00:00
|
|
|
static int smsusb_probe(struct usb_interface *intf,
|
2008-06-21 05:44:02 +00:00
|
|
|
const struct usb_device_id *id)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
2013-03-06 01:35:44 +00:00
|
|
|
char devpath[32];
|
2008-05-19 21:56:13 +00:00
|
|
|
int i, rc;
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
sms_info("interface number %d",
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber);
|
2008-06-14 03:43:26 +00:00
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
if (sms_get_board(id->driver_info)->intf_num !=
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber) {
|
|
|
|
sms_err("interface number is %d expecting %d",
|
|
|
|
sms_get_board(id->driver_info)->intf_num,
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber);
|
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (intf->num_altsetting > 1) {
|
|
|
|
rc = usb_set_interface(udev,
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber,
|
|
|
|
0);
|
2008-06-15 18:14:13 +00:00
|
|
|
if (rc < 0) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("usb_set_interface failed, rc %d", rc);
|
2008-05-19 21:56:13 +00:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_info("smsusb_probe %d",
|
2008-06-15 18:14:13 +00:00
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber);
|
2013-03-06 12:53:50 +00:00
|
|
|
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_info("endpoint %d %02x %02x %d", i,
|
2008-06-15 18:14:13 +00:00
|
|
|
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.bmAttributes,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
|
2013-03-06 12:53:50 +00:00
|
|
|
if (intf->cur_altsetting->endpoint[i].desc.bEndpointAddress &
|
|
|
|
USB_DIR_IN)
|
|
|
|
rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress));
|
|
|
|
else
|
|
|
|
rc = usb_clear_halt(udev, usb_sndbulkpipe(udev,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress));
|
|
|
|
}
|
2008-06-15 18:14:13 +00:00
|
|
|
if ((udev->actconfig->desc.bNumInterfaces == 2) &&
|
|
|
|
(intf->cur_altsetting->desc.bInterfaceNumber == 0)) {
|
2008-06-20 01:07:23 +00:00
|
|
|
sms_err("rom interface 0 is not used");
|
2008-05-19 21:56:13 +00:00
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
2013-03-06 01:35:44 +00:00
|
|
|
if (id->driver_info == SMS1XXX_BOARD_SIANO_STELLAR_ROM) {
|
|
|
|
sms_info("stellar device was found.");
|
|
|
|
snprintf(devpath, sizeof(devpath), "usb\\%d-%s",
|
|
|
|
udev->bus->busnum, udev->devpath);
|
|
|
|
sms_info("stellar device was found.");
|
|
|
|
return smsusb1_load_firmware(
|
|
|
|
udev, smscore_registry_getmode(devpath),
|
|
|
|
id->driver_info);
|
|
|
|
}
|
|
|
|
|
2008-06-19 01:09:55 +00:00
|
|
|
rc = smsusb_init_device(intf, id->driver_info);
|
2008-06-19 23:35:21 +00:00
|
|
|
sms_info("rc %d", rc);
|
2008-08-31 20:39:58 +00:00
|
|
|
sms_board_load_modules(id->driver_info);
|
2008-06-14 03:43:26 +00:00
|
|
|
return rc;
|
2008-05-19 21:56:13 +00:00
|
|
|
}
|
|
|
|
|
2008-06-21 05:44:02 +00:00
|
|
|
static void smsusb_disconnect(struct usb_interface *intf)
|
2008-05-19 21:56:13 +00:00
|
|
|
{
|
|
|
|
smsusb_term_device(intf);
|
|
|
|
}
|
|
|
|
|
2008-11-22 17:08:46 +00:00
|
|
|
static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
|
|
|
|
{
|
2010-11-30 21:42:07 +00:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2013-03-06 12:53:50 +00:00
|
|
|
printk(KERN_INFO "%s Entering status %d.\n", __func__, msg.event);
|
|
|
|
dev->state = SMSUSB_SUSPENDED;
|
|
|
|
/*smscore_set_power_mode(dev, SMS_POWER_MODE_SUSPENDED);*/
|
2008-11-22 17:08:46 +00:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smsusb_resume(struct usb_interface *intf)
|
|
|
|
{
|
|
|
|
int rc, i;
|
2010-11-30 21:42:07 +00:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2008-11-22 17:08:46 +00:00
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
|
|
2013-03-06 12:53:50 +00:00
|
|
|
printk(KERN_INFO "%s Entering.\n", __func__);
|
|
|
|
usb_clear_halt(udev, usb_rcvbulkpipe(udev, dev->in_ep));
|
|
|
|
usb_clear_halt(udev, usb_sndbulkpipe(udev, dev->out_ep));
|
2008-11-22 17:08:46 +00:00
|
|
|
|
|
|
|
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
|
|
|
|
printk(KERN_INFO "endpoint %d %02x %02x %d\n", i,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.bmAttributes,
|
|
|
|
intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
|
|
|
|
|
|
|
|
if (intf->num_altsetting > 0) {
|
|
|
|
rc = usb_set_interface(udev,
|
|
|
|
intf->cur_altsetting->desc.
|
|
|
|
bInterfaceNumber, 0);
|
|
|
|
if (rc < 0) {
|
V4L/DVB (10751): sms1xxx: fix checkpatch.pl violations introduced by previous changeset
Fix checkpatch.pl violations introduced by previous changeset:
ERROR: do not use C99 // comments
156: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1373:
+//#ifdef DVB_CORE
ERROR: do not use C99 // comments
157: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1374:
+// smsdvb_unregister();
ERROR: do not use C99 // comments
158: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1375:
+//#endif
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
163: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1380:
+EXPORT_SYMBOL(smscore_onresponse);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
164: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1381:
+EXPORT_SYMBOL(sms_get_board);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
165: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1382:
+EXPORT_SYMBOL(sms_debug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
166: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1383:
+EXPORT_SYMBOL(smscore_putbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
167: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1384:
+EXPORT_SYMBOL(smscore_registry_getmode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
168: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1385:
+EXPORT_SYMBOL(smscore_register_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
169: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1386:
+EXPORT_SYMBOL(smscore_set_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
170: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1387:
+EXPORT_SYMBOL(smscore_start_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
171: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1388:
+EXPORT_SYMBOL(smsusb_id_table);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
172: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1389:
+EXPORT_SYMBOL(smscore_unregister_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
173: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1390:
+EXPORT_SYMBOL(smscore_getbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
174: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1391:
+EXPORT_SYMBOL(smscore_get_device_mode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
175: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1392:
+EXPORT_SYMBOL(smscore_register_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
176: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1393:
+EXPORT_SYMBOL(smscore_unregister_hotplug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
177: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1394:
+EXPORT_SYMBOL(smsclient_sendrequest);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
178: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1395:
+EXPORT_SYMBOL(smscore_unregister_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
179: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1396:
+EXPORT_SYMBOL(smscore_get_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
180: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1397:
+EXPORT_SYMBOL(smscore_register_hotplug);
WARNING: line over 80 characters
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
ERROR: "foo* bar" should be "foo *bar"
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
WARNING: line over 80 characters
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: "foo* bar" should be "foo *bar"
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: space required after that ',' (ctx:VxV)
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
489: FILE: linux/drivers/media/dvb/siano/smsusb.c:443:
+ printk(KERN_INFO"%s Entering status %d.\n", __FUNCTION__, msg.event);
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
501: FILE: linux/drivers/media/dvb/siano/smsusb.c:455:
+ printk(KERN_INFO "%s Entering.\n", __FUNCTION__);
ERROR: space prohibited before that '++' (ctx:WxB)
505: FILE: linux/drivers/media/dvb/siano/smsusb.c:459:
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i ++)
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
517: FILE: linux/drivers/media/dvb/siano/smsusb.c:471:
+ __FUNCTION__, rc);
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
[mchehab@redhat.com: sms_dbg were declared on 3 different files]
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-08-31 19:08:15 +00:00
|
|
|
printk(KERN_INFO "%s usb_set_interface failed, "
|
|
|
|
"rc %d\n", __func__, rc);
|
2008-11-22 17:08:46 +00:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
smsusb_start_streaming(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-08-18 00:48:26 +00:00
|
|
|
static const struct usb_device_id smsusb_id_table[] = {
|
2008-08-31 20:03:15 +00:00
|
|
|
{ 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 },
|
|
|
|
{ USB_DEVICE(0x2040, 0x1700),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT },
|
|
|
|
{ USB_DEVICE(0x2040, 0x1800),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A },
|
|
|
|
{ USB_DEVICE(0x2040, 0x1801),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
|
|
|
|
{ USB_DEVICE(0x2040, 0x2000),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
|
|
|
|
{ USB_DEVICE(0x2040, 0x2009),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 },
|
|
|
|
{ USB_DEVICE(0x2040, 0x200a),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
|
|
|
|
{ USB_DEVICE(0x2040, 0x2010),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
|
|
|
|
{ USB_DEVICE(0x2040, 0x2011),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
|
|
|
|
{ USB_DEVICE(0x2040, 0x2019),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5500),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5510),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5520),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5530),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5580),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0x5590),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-05-19 12:51:41 +00:00
|
|
|
{ USB_DEVICE(0x187f, 0x0202),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_NICE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0301),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_VENICE },
|
2009-10-21 21:27:29 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xb900),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xb910),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-11-30 21:22:10 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xb980),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xb990),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-10-21 21:27:29 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xc000),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-11-30 21:22:10 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xc010),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xc080),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xc090),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2012-03-22 16:55:05 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xc0a0),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2012-05-25 12:29:12 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0xf5a0),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2013-03-06 01:35:44 +00:00
|
|
|
{ USB_DEVICE(0x187f, 0x0202),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_NICE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0301),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_VENICE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0302),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_VENICE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0310),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_MING },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0500),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_PELE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0600),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_RIO },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0700),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_DENVER_2160 },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0800),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_DENVER_1530 },
|
|
|
|
{ USB_DEVICE(0x19D2, 0x0086),
|
|
|
|
.driver_info = SMS1XXX_BOARD_ZTE_DVB_DATA_CARD },
|
|
|
|
{ USB_DEVICE(0x19D2, 0x0078),
|
|
|
|
.driver_info = SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD },
|
2009-05-19 12:51:41 +00:00
|
|
|
{ } /* Terminating entry */
|
|
|
|
};
|
|
|
|
|
2008-08-31 20:03:15 +00:00
|
|
|
MODULE_DEVICE_TABLE(usb, smsusb_id_table);
|
|
|
|
|
2008-05-19 21:56:13 +00:00
|
|
|
static struct usb_driver smsusb_driver = {
|
2008-08-31 03:44:04 +00:00
|
|
|
.name = "smsusb",
|
2008-05-19 21:56:13 +00:00
|
|
|
.probe = smsusb_probe,
|
2008-06-15 18:14:13 +00:00
|
|
|
.disconnect = smsusb_disconnect,
|
2008-05-19 21:56:13 +00:00
|
|
|
.id_table = smsusb_id_table,
|
2008-11-22 17:08:46 +00:00
|
|
|
|
|
|
|
.suspend = smsusb_suspend,
|
|
|
|
.resume = smsusb_resume,
|
2008-05-19 21:56:13 +00:00
|
|
|
};
|
|
|
|
|
2011-11-18 17:46:12 +00:00
|
|
|
module_usb_driver(smsusb_driver);
|
V4L/DVB (10750): import changes from Siano
Import the following changes from Uri Shkolnik
* Two-ways merge with Siano internal repository
* Continuing with DVB sub-system separation
* kconfig and makefile updates
* Code cleanup
This is a work-in-progress sync with Siano's internal repository.
Some changes had to be altered or dropped in order not to break the build.
This breaks normal operation for the current driver, but it is being committed
now for tracking purposes.
These changes introduce the following checkpatch.pl violations:
ERROR: do not use C99 // comments
156: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1373:
+//#ifdef DVB_CORE
ERROR: do not use C99 // comments
157: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1374:
+// smsdvb_unregister();
ERROR: do not use C99 // comments
158: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1375:
+//#endif
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
163: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1380:
+EXPORT_SYMBOL(smscore_onresponse);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
164: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1381:
+EXPORT_SYMBOL(sms_get_board);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
165: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1382:
+EXPORT_SYMBOL(sms_debug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
166: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1383:
+EXPORT_SYMBOL(smscore_putbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
167: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1384:
+EXPORT_SYMBOL(smscore_registry_getmode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
168: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1385:
+EXPORT_SYMBOL(smscore_register_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
169: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1386:
+EXPORT_SYMBOL(smscore_set_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
170: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1387:
+EXPORT_SYMBOL(smscore_start_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
171: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1388:
+EXPORT_SYMBOL(smsusb_id_table);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
172: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1389:
+EXPORT_SYMBOL(smscore_unregister_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
173: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1390:
+EXPORT_SYMBOL(smscore_getbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
174: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1391:
+EXPORT_SYMBOL(smscore_get_device_mode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
175: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1392:
+EXPORT_SYMBOL(smscore_register_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
176: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1393:
+EXPORT_SYMBOL(smscore_unregister_hotplug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
177: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1394:
+EXPORT_SYMBOL(smsclient_sendrequest);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
178: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1395:
+EXPORT_SYMBOL(smscore_unregister_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
179: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1396:
+EXPORT_SYMBOL(smscore_get_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
180: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1397:
+EXPORT_SYMBOL(smscore_register_hotplug);
WARNING: line over 80 characters
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
ERROR: "foo* bar" should be "foo *bar"
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
WARNING: line over 80 characters
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: "foo* bar" should be "foo *bar"
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: space required after that ',' (ctx:VxV)
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
489: FILE: linux/drivers/media/dvb/siano/smsusb.c:443:
+ printk(KERN_INFO"%s Entering status %d.\n", __FUNCTION__, msg.event);
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
501: FILE: linux/drivers/media/dvb/siano/smsusb.c:455:
+ printk(KERN_INFO "%s Entering.\n", __FUNCTION__);
ERROR: space prohibited before that '++' (ctx:WxB)
505: FILE: linux/drivers/media/dvb/siano/smsusb.c:459:
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i ++)
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
517: FILE: linux/drivers/media/dvb/siano/smsusb.c:471:
+ __FUNCTION__, rc);
total: 7 errors, 23 warnings, 524 lines checked
Signed-off-by: Uri Shkolnik <uris@siano-ms.com>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-08-31 03:44:04 +00:00
|
|
|
|
2009-05-17 12:17:51 +00:00
|
|
|
MODULE_DESCRIPTION("Driver for the Siano SMS1xxx USB dongle");
|
V4L/DVB (10750): import changes from Siano
Import the following changes from Uri Shkolnik
* Two-ways merge with Siano internal repository
* Continuing with DVB sub-system separation
* kconfig and makefile updates
* Code cleanup
This is a work-in-progress sync with Siano's internal repository.
Some changes had to be altered or dropped in order not to break the build.
This breaks normal operation for the current driver, but it is being committed
now for tracking purposes.
These changes introduce the following checkpatch.pl violations:
ERROR: do not use C99 // comments
156: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1373:
+//#ifdef DVB_CORE
ERROR: do not use C99 // comments
157: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1374:
+// smsdvb_unregister();
ERROR: do not use C99 // comments
158: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1375:
+//#endif
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
163: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1380:
+EXPORT_SYMBOL(smscore_onresponse);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
164: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1381:
+EXPORT_SYMBOL(sms_get_board);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
165: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1382:
+EXPORT_SYMBOL(sms_debug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
166: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1383:
+EXPORT_SYMBOL(smscore_putbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
167: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1384:
+EXPORT_SYMBOL(smscore_registry_getmode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
168: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1385:
+EXPORT_SYMBOL(smscore_register_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
169: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1386:
+EXPORT_SYMBOL(smscore_set_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
170: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1387:
+EXPORT_SYMBOL(smscore_start_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
171: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1388:
+EXPORT_SYMBOL(smsusb_id_table);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
172: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1389:
+EXPORT_SYMBOL(smscore_unregister_device);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
173: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1390:
+EXPORT_SYMBOL(smscore_getbuffer);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
174: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1391:
+EXPORT_SYMBOL(smscore_get_device_mode);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
175: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1392:
+EXPORT_SYMBOL(smscore_register_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
176: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1393:
+EXPORT_SYMBOL(smscore_unregister_hotplug);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
177: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1394:
+EXPORT_SYMBOL(smsclient_sendrequest);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
178: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1395:
+EXPORT_SYMBOL(smscore_unregister_client);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
179: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1396:
+EXPORT_SYMBOL(smscore_get_board_id);
WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable
180: FILE: linux/drivers/media/dvb/siano/smscoreapi.c:1397:
+EXPORT_SYMBOL(smscore_register_hotplug);
WARNING: line over 80 characters
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
ERROR: "foo* bar" should be "foo *bar"
391: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:398:
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev, int mode, char* filename);
WARNING: line over 80 characters
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: "foo* bar" should be "foo *bar"
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
ERROR: space required after that ',' (ctx:VxV)
392: FILE: linux/drivers/media/dvb/siano/smscoreapi.h:399:
+extern int smscore_send_fw_file(struct smscore_device_t *coredev, u8* ufwbuf,int size);
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
489: FILE: linux/drivers/media/dvb/siano/smsusb.c:443:
+ printk(KERN_INFO"%s Entering status %d.\n", __FUNCTION__, msg.event);
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
501: FILE: linux/drivers/media/dvb/siano/smsusb.c:455:
+ printk(KERN_INFO "%s Entering.\n", __FUNCTION__);
ERROR: space prohibited before that '++' (ctx:WxB)
505: FILE: linux/drivers/media/dvb/siano/smsusb.c:459:
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i ++)
^
WARNING: __func__ should be used instead of gcc specific __FUNCTION__
517: FILE: linux/drivers/media/dvb/siano/smsusb.c:471:
+ __FUNCTION__, rc);
total: 7 errors, 23 warnings, 524 lines checked
Signed-off-by: Uri Shkolnik <uris@siano-ms.com>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-08-31 03:44:04 +00:00
|
|
|
MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)");
|
|
|
|
MODULE_LICENSE("GPL");
|