2009-05-12 18:57:54 +08: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-23 05:05:26 +08:00
|
|
|
|
2015-02-22 21:46:56 +08:00
|
|
|
#include "smscoreapi.h"
|
|
|
|
|
2008-05-20 05:56:13 +08: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 16:04:11 +08:00
|
|
|
#include <linux/slab.h>
|
2011-07-04 02:03:12 +08:00
|
|
|
#include <linux/module.h>
|
2016-02-22 22:42:04 +08:00
|
|
|
#include <media/media-device.h>
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-19 09:09:55 +08:00
|
|
|
#include "sms-cards.h"
|
2009-05-12 19:24:07 +08:00
|
|
|
#include "smsendian.h"
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
#define USB1_BUFFER_SIZE 0x1000
|
2013-03-06 20:53:50 +08:00
|
|
|
#define USB2_BUFFER_SIZE 0x2000
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
#define MAX_BUFFERS 50
|
|
|
|
#define MAX_URBS 10
|
|
|
|
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_device_t;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2013-03-06 20:53:50 +08:00
|
|
|
enum smsusb_state {
|
|
|
|
SMSUSB_DISCONNECTED,
|
|
|
|
SMSUSB_SUSPENDED,
|
|
|
|
SMSUSB_ACTIVE
|
|
|
|
};
|
|
|
|
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_urb_t {
|
2013-03-06 20:53:50 +08:00
|
|
|
struct list_head entry;
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smscore_buffer_t *cb;
|
2013-03-06 20:53:50 +08:00
|
|
|
struct smsusb_device_t *dev;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 04:52:24 +08:00
|
|
|
struct urb urb;
|
2016-02-16 17:22:27 +08:00
|
|
|
|
|
|
|
/* For the bottom half */
|
|
|
|
struct work_struct wq;
|
2008-06-16 04:52:24 +08:00
|
|
|
};
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_device_t {
|
2008-05-06 14:11:51 +08:00
|
|
|
struct usb_device *udev;
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smscore_device_t *coredev;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_urb_t surbs[MAX_URBS];
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
int response_alignment;
|
|
|
|
int buffer_size;
|
2013-03-06 20:53:50 +08:00
|
|
|
|
|
|
|
unsigned char in_ep;
|
|
|
|
unsigned char out_ep;
|
|
|
|
enum smsusb_state state;
|
2008-06-16 04:52:24 +08:00
|
|
|
};
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb_submit_urb(struct smsusb_device_t *dev,
|
|
|
|
struct smsusb_urb_t *surb);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2016-02-16 17:22:27 +08:00
|
|
|
/**
|
|
|
|
* Completing URB's callback handler - bottom half (proccess context)
|
|
|
|
* submits the URB prepared on smsusb_onresponse()
|
|
|
|
*/
|
|
|
|
static void do_submit_urb(struct work_struct *work)
|
|
|
|
{
|
|
|
|
struct smsusb_urb_t *surb = container_of(work, struct smsusb_urb_t, wq);
|
|
|
|
struct smsusb_device_t *dev = surb->dev;
|
|
|
|
|
|
|
|
smsusb_submit_urb(dev, surb);
|
|
|
|
}
|
|
|
|
|
2013-03-06 20:53:50 +08: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 13:44:02 +08:00
|
|
|
static void smsusb_onresponse(struct urb *urb)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
|
|
|
|
struct smsusb_device_t *dev = surb->dev;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2009-05-12 22:28:41 +08:00
|
|
|
if (urb->status == -ESHUTDOWN) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("error, urb status %d (-ESHUTDOWN), %d bytes\n",
|
2008-06-20 09:07:23 +08:00
|
|
|
urb->status, urb->actual_length);
|
2008-05-20 05:56:13 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-05-12 22:28:41 +08:00
|
|
|
if ((urb->actual_length > 0) && (urb->status == 0)) {
|
2013-03-21 19:49:43 +08:00
|
|
|
struct sms_msg_hdr *phdr = (struct sms_msg_hdr *)surb->cb->p;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2009-05-15 03:27:16 +08:00
|
|
|
smsendian_handle_message_header(phdr);
|
2013-03-21 19:49:43 +08:00
|
|
|
if (urb->actual_length >= phdr->msg_length) {
|
|
|
|
surb->cb->size = phdr->msg_length;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (dev->response_alignment &&
|
2013-03-21 19:49:43 +08:00
|
|
|
(phdr->msg_flags & MSG_HDR_FLAG_SPLIT_MSG)) {
|
2008-06-16 02:14:13 +08:00
|
|
|
|
|
|
|
surb->cb->offset =
|
|
|
|
dev->response_alignment +
|
2013-03-21 19:49:43 +08:00
|
|
|
((phdr->msg_flags >> 8) & 3);
|
2008-06-16 02:14:13 +08:00
|
|
|
|
|
|
|
/* sanity check */
|
2013-03-21 19:49:43 +08:00
|
|
|
if (((int) phdr->msg_length +
|
2008-06-16 02:14:13 +08:00
|
|
|
surb->cb->offset) > urb->actual_length) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("invalid response msglen %d offset %d size %d\n",
|
2013-03-21 19:49:43 +08:00
|
|
|
phdr->msg_length,
|
2008-06-20 09:07:23 +08:00
|
|
|
surb->cb->offset,
|
|
|
|
urb->actual_length);
|
2008-05-20 05:56:13 +08:00
|
|
|
goto exit_and_resubmit;
|
|
|
|
}
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
/* move buffer pointer and
|
|
|
|
* copy header to its new location */
|
2008-05-06 14:52:44 +08:00
|
|
|
memcpy((char *) phdr + surb->cb->offset,
|
2013-03-21 19:49:43 +08:00
|
|
|
phdr, sizeof(struct sms_msg_hdr));
|
2008-06-16 02:14:13 +08:00
|
|
|
} else
|
2008-05-20 05:56:13 +08:00
|
|
|
surb->cb->offset = 0;
|
|
|
|
|
2015-02-22 22:33:37 +08:00
|
|
|
pr_debug("received %s(%d) size: %d\n",
|
2013-03-21 19:49:43 +08:00
|
|
|
smscore_translate_msg(phdr->msg_type),
|
|
|
|
phdr->msg_type, phdr->msg_length);
|
2013-03-09 20:27:39 +08:00
|
|
|
|
2013-03-21 19:49:43 +08:00
|
|
|
smsendian_handle_rx_message((struct sms_msg_data *) phdr);
|
2013-03-09 22:34:56 +08:00
|
|
|
|
2008-05-20 05:56:13 +08:00
|
|
|
smscore_onresponse(dev->coredev, surb->cb);
|
|
|
|
surb->cb = NULL;
|
2008-06-16 02:14:13 +08:00
|
|
|
} else {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("invalid response msglen %d actual %d\n",
|
2013-03-21 19:49:43 +08:00
|
|
|
phdr->msg_length, urb->actual_length);
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
2009-05-12 22:28:41 +08:00
|
|
|
} else
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("error, urb status %d, %d bytes\n",
|
2009-05-12 22:28:41 +08:00
|
|
|
urb->status, urb->actual_length);
|
|
|
|
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
exit_and_resubmit:
|
2016-02-16 17:22:27 +08:00
|
|
|
INIT_WORK(&surb->wq, do_submit_urb);
|
|
|
|
schedule_work(&surb->wq);
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb_submit_urb(struct smsusb_device_t *dev,
|
|
|
|
struct smsusb_urb_t *surb)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2008-06-16 02:14:13 +08:00
|
|
|
if (!surb->cb) {
|
2016-02-16 17:22:27 +08:00
|
|
|
/* This function can sleep */
|
2008-05-20 05:56:13 +08:00
|
|
|
surb->cb = smscore_getbuffer(dev->coredev);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (!surb->cb) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("smscore_getbuffer(...) returned NULL\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
usb_fill_bulk_urb(
|
|
|
|
&surb->urb,
|
|
|
|
dev->udev,
|
2013-03-06 20:53:50 +08:00
|
|
|
usb_rcvbulkpipe(dev->udev, dev->in_ep),
|
2008-05-20 05:56:13 +08: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 13:44:02 +08:00
|
|
|
static void smsusb_stop_streaming(struct smsusb_device_t *dev)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2008-06-16 02:52:43 +08:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-20 05:56:13 +08:00
|
|
|
usb_kill_urb(&dev->surbs[i].urb);
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (dev->surbs[i].cb) {
|
2008-05-20 05:56:13 +08:00
|
|
|
smscore_putbuffer(dev->coredev, dev->surbs[i].cb);
|
|
|
|
dev->surbs[i].cb = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb_start_streaming(struct smsusb_device_t *dev)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
|
|
|
int i, rc;
|
|
|
|
|
2008-06-16 02:52:43 +08:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-20 05:56:13 +08:00
|
|
|
rc = smsusb_submit_urb(dev, &dev->surbs[i]);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("smsusb_submit_urb(...) failed\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb_sendrequest(void *context, void *buffer, size_t size)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
|
2017-02-15 03:47:57 +08:00
|
|
|
struct sms_msg_hdr *phdr;
|
|
|
|
int dummy, ret;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2013-09-13 03:59:59 +08:00
|
|
|
if (dev->state != SMSUSB_ACTIVE) {
|
2015-02-22 22:33:37 +08:00
|
|
|
pr_debug("Device not active yet\n");
|
2013-03-09 22:34:56 +08:00
|
|
|
return -ENOENT;
|
2013-09-13 03:59:59 +08:00
|
|
|
}
|
2013-03-09 22:34:56 +08:00
|
|
|
|
2017-02-15 03:47:57 +08:00
|
|
|
phdr = kmalloc(size, GFP_KERNEL);
|
|
|
|
if (!phdr)
|
|
|
|
return -ENOMEM;
|
|
|
|
memcpy(phdr, buffer, size);
|
|
|
|
|
2015-02-22 22:33:37 +08:00
|
|
|
pr_debug("sending %s(%d) size: %d\n",
|
2013-03-21 19:49:43 +08:00
|
|
|
smscore_translate_msg(phdr->msg_type), phdr->msg_type,
|
|
|
|
phdr->msg_length);
|
2013-03-09 20:27:39 +08:00
|
|
|
|
2013-03-21 19:49:43 +08:00
|
|
|
smsendian_handle_tx_message((struct sms_msg_data *) phdr);
|
2017-02-15 03:47:57 +08:00
|
|
|
smsendian_handle_message_header((struct sms_msg_hdr *)phdr);
|
|
|
|
ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
|
|
|
phdr, size, &dummy, 1000);
|
|
|
|
|
|
|
|
kfree(phdr);
|
|
|
|
return ret;
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static char *smsusb1_fw_lkup[] = {
|
2008-05-20 05:56:13 +08:00
|
|
|
"dvbt_stellar_usb.inp",
|
|
|
|
"dvbh_stellar_usb.inp",
|
|
|
|
"tdmb_stellar_usb.inp",
|
|
|
|
"none",
|
|
|
|
"dvbt_bda_stellar_usb.inp",
|
|
|
|
};
|
|
|
|
|
2008-07-01 15:35:26 +08: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-20 05:56:13 +08:00
|
|
|
{
|
|
|
|
const struct firmware *fw;
|
2008-05-06 14:11:51 +08:00
|
|
|
u8 *fw_buffer;
|
2008-05-20 05:56:13 +08:00
|
|
|
int rc, dummy;
|
2008-07-01 15:35:26 +08:00
|
|
|
char *fw_filename;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2013-09-13 04:04:07 +08:00
|
|
|
if (id < 0)
|
|
|
|
id = sms_get_board(board_id)->default_mode;
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (id < DEVICE_MODE_DVBT || id > DEVICE_MODE_DVBT_BDA) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("invalid firmware id specified %d\n", id);
|
2008-05-20 05:56:13 +08:00
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
2008-07-01 15:35:26 +08:00
|
|
|
fw_filename = sms_get_fw_name(id, board_id);
|
|
|
|
|
|
|
|
rc = request_firmware(&fw, fw_filename, &udev->dev);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 21:55:55 +08:00
|
|
|
pr_warn("failed to open '%s' mode %d, trying again with default firmware\n",
|
|
|
|
fw_filename, id);
|
2008-07-01 15:35:26 +08:00
|
|
|
|
|
|
|
fw_filename = smsusb1_fw_lkup[id];
|
|
|
|
rc = request_firmware(&fw, fw_filename, &udev->dev);
|
|
|
|
if (rc < 0) {
|
2015-02-22 21:55:55 +08:00
|
|
|
pr_warn("failed to open '%s' mode %d\n",
|
2008-07-01 15:35:26 +08:00
|
|
|
fw_filename, id);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
fw_buffer = kmalloc(fw->size, GFP_KERNEL);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (fw_buffer) {
|
2008-05-20 05:56:13 +08:00
|
|
|
memcpy(fw_buffer, fw->data, fw->size);
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
rc = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 2),
|
|
|
|
fw_buffer, fw->size, &dummy, 1000);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("sent %zu(%d) bytes, rc %d\n", fw->size, dummy, rc);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
kfree(fw_buffer);
|
2008-06-16 02:14:13 +08:00
|
|
|
} else {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("failed to allocate firmware buffer\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
rc = -ENOMEM;
|
|
|
|
}
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("read FW %s, size=%zu\n", fw_filename, fw->size);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
release_firmware(fw);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static void smsusb1_detectmode(void *context, int *mode)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2008-06-16 04:52:24 +08:00
|
|
|
char *product_string =
|
|
|
|
((struct smsusb_device_t *) context)->udev->product;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
*mode = DEVICE_MODE_NONE;
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (!product_string) {
|
2008-05-20 05:56:13 +08:00
|
|
|
product_string = "none";
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("product string not found\n");
|
2008-06-16 02:14:13 +08: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-20 05:56:13 +08:00
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("%d \"%s\"\n", *mode, product_string);
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb1_setmode(void *context, int mode)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2013-03-21 20:27:37 +08:00
|
|
|
struct sms_msg_hdr msg = { MSG_SW_RELOAD_REQ, 0, HIF_TASK,
|
2013-03-21 19:49:43 +08:00
|
|
|
sizeof(struct sms_msg_hdr), 0 };
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("invalid firmware id specified %d\n", mode);
|
2008-05-20 05:56:13 +08:00
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
2013-03-21 20:27:37 +08:00
|
|
|
return smsusb_sendrequest(context, &msg, sizeof(msg));
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static void smsusb_term_device(struct usb_interface *intf)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2010-12-01 05:42:07 +08:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
if (dev) {
|
2013-03-06 20:53:50 +08:00
|
|
|
dev->state = SMSUSB_DISCONNECTED;
|
|
|
|
|
2008-05-20 05:56:13 +08:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
|
2008-06-16 02:52:43 +08:00
|
|
|
/* unregister from smscore */
|
2008-05-20 05:56:13 +08:00
|
|
|
if (dev->coredev)
|
|
|
|
smscore_unregister_device(dev->coredev);
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("device 0x%p destroyed\n", dev);
|
2011-04-22 05:11:25 +08:00
|
|
|
kfree(dev);
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
usb_set_intfdata(intf, NULL);
|
|
|
|
}
|
|
|
|
|
2015-02-22 23:29:23 +08:00
|
|
|
static void *siano_media_device_register(struct smsusb_device_t *dev,
|
|
|
|
int board_id)
|
2015-01-07 19:03:03 +08:00
|
|
|
{
|
|
|
|
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
|
|
|
struct media_device *mdev;
|
|
|
|
struct usb_device *udev = dev->udev;
|
|
|
|
struct sms_board *board = sms_get_board(board_id);
|
|
|
|
int ret;
|
|
|
|
|
2016-02-22 23:10:49 +08:00
|
|
|
mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
|
2015-01-07 19:03:03 +08:00
|
|
|
if (!mdev)
|
2015-02-22 23:29:23 +08:00
|
|
|
return NULL;
|
2015-01-07 19:03:03 +08:00
|
|
|
|
2016-02-22 23:10:49 +08:00
|
|
|
media_device_usb_init(mdev, udev, board->name);
|
|
|
|
|
2015-01-07 19:03:03 +08:00
|
|
|
ret = media_device_register(mdev);
|
|
|
|
if (ret) {
|
2015-12-12 06:57:08 +08:00
|
|
|
media_device_cleanup(mdev);
|
2015-01-07 19:03:03 +08:00
|
|
|
kfree(mdev);
|
2015-02-22 23:29:23 +08:00
|
|
|
return NULL;
|
2015-01-07 19:03:03 +08:00
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_info("media controller created\n");
|
2015-01-07 19:03:03 +08:00
|
|
|
|
2015-02-22 23:29:23 +08:00
|
|
|
return mdev;
|
|
|
|
#else
|
|
|
|
return NULL;
|
2015-01-07 19:03:03 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
2008-06-16 04:52:24 +08:00
|
|
|
struct smsdevice_params_t params;
|
|
|
|
struct smsusb_device_t *dev;
|
2015-02-22 23:29:23 +08:00
|
|
|
void *mdev;
|
2008-05-20 05:56:13 +08:00
|
|
|
int i, rc;
|
|
|
|
|
2008-06-16 02:52:43 +08:00
|
|
|
/* create device object */
|
2008-06-16 04:52:24 +08:00
|
|
|
dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
|
2015-02-22 22:04:35 +08:00
|
|
|
if (!dev)
|
2008-05-20 05:56:13 +08:00
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
|
usb_set_intfdata(intf, dev);
|
|
|
|
dev->udev = interface_to_usbdev(intf);
|
2013-03-06 20:53:50 +08:00
|
|
|
dev->state = SMSUSB_DISCONNECTED;
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-21 16:24:38 +08:00
|
|
|
params.device_type = sms_get_board(board_id)->type;
|
2008-06-15 05:27:18 +08:00
|
|
|
|
2008-06-21 16:24:38 +08:00
|
|
|
switch (params.device_type) {
|
2008-06-19 09:09:55 +08:00
|
|
|
case SMS_STELLAR:
|
2008-06-14 11:43:26 +08:00
|
|
|
dev->buffer_size = USB1_BUFFER_SIZE;
|
|
|
|
|
|
|
|
params.setmode_handler = smsusb1_setmode;
|
|
|
|
params.detectmode_handler = smsusb1_detectmode;
|
|
|
|
break;
|
2013-03-19 23:59:50 +08:00
|
|
|
case SMS_UNKNOWN_TYPE:
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("Unspecified sms device type!\n");
|
2008-06-21 16:24:38 +08:00
|
|
|
/* fall-thru */
|
2013-03-19 23:59:50 +08:00
|
|
|
default:
|
2008-06-14 11:43:26 +08:00
|
|
|
dev->buffer_size = USB2_BUFFER_SIZE;
|
2008-06-16 02:14:13 +08:00
|
|
|
dev->response_alignment =
|
2009-05-12 19:24:07 +08:00
|
|
|
le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
|
2013-03-21 19:49:43 +08:00
|
|
|
sizeof(struct sms_msg_hdr);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2008-06-14 11:43:26 +08:00
|
|
|
params.flags |= SMS_DEVICE_FAMILY2;
|
|
|
|
break;
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2013-03-06 20:53:50 +08: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;
|
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("in_ep = %02x, out_ep = %02x\n",
|
2013-03-06 20:53:50 +08:00
|
|
|
dev->in_ep, dev->out_ep);
|
|
|
|
|
2008-05-20 05:56:13 +08: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-02 02:30:50 +08:00
|
|
|
usb_make_path(dev->udev, params.devpath, sizeof(params.devpath));
|
2008-05-20 05:56:13 +08:00
|
|
|
|
2015-02-22 23:29:23 +08:00
|
|
|
mdev = siano_media_device_register(dev, board_id);
|
|
|
|
|
2008-06-16 02:14:13 +08:00
|
|
|
/* register in smscore */
|
2015-02-22 23:29:23 +08:00
|
|
|
rc = smscore_register_device(¶ms, &dev->coredev, mdev);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("smscore_register_device(...) failed, rc %d\n", rc);
|
2008-05-20 05:56:13 +08:00
|
|
|
smsusb_term_device(intf);
|
2015-03-03 01:17:01 +08:00
|
|
|
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
|
2015-02-22 23:29:23 +08:00
|
|
|
media_device_unregister(mdev);
|
2015-03-03 01:17:01 +08:00
|
|
|
#endif
|
2015-02-22 23:29:23 +08:00
|
|
|
kfree(mdev);
|
2008-05-20 05:56:13 +08:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2008-06-19 09:09:55 +08:00
|
|
|
smscore_set_board_id(dev->coredev, board_id);
|
|
|
|
|
2013-03-10 20:04:44 +08:00
|
|
|
dev->coredev->is_usb_device = true;
|
|
|
|
|
2008-06-16 02:52:43 +08:00
|
|
|
/* initialize urbs */
|
2008-06-16 02:14:13 +08:00
|
|
|
for (i = 0; i < MAX_URBS; i++) {
|
2008-05-20 05:56:13 +08:00
|
|
|
dev->surbs[i].dev = dev;
|
|
|
|
usb_init_urb(&dev->surbs[i].urb);
|
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("smsusb_start_streaming(...).\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
rc = smsusb_start_streaming(dev);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("smsusb_start_streaming(...) failed\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
smsusb_term_device(intf);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2013-03-06 20:53:50 +08:00
|
|
|
dev->state = SMSUSB_ACTIVE;
|
|
|
|
|
2008-05-20 05:56:13 +08:00
|
|
|
rc = smscore_start_device(dev->coredev);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("smscore_start_device(...) failed\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
smsusb_term_device(intf);
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("device 0x%p created\n", dev);
|
2008-05-20 05:56:13 +08:00
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
2012-12-22 05:17:53 +08:00
|
|
|
static int smsusb_probe(struct usb_interface *intf,
|
2008-06-21 13:44:02 +08:00
|
|
|
const struct usb_device_id *id)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
2013-03-06 09:35:44 +08:00
|
|
|
char devpath[32];
|
2008-05-20 05:56:13 +08:00
|
|
|
int i, rc;
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_info("board id=%lu, interface number %d\n",
|
2013-09-13 03:59:59 +08:00
|
|
|
id->driver_info,
|
2013-03-06 20:53:50 +08:00
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber);
|
2008-06-14 11:43:26 +08:00
|
|
|
|
2013-03-06 20:53:50 +08:00
|
|
|
if (sms_get_board(id->driver_info)->intf_num !=
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber) {
|
2015-02-22 22:33:37 +08:00
|
|
|
pr_debug("interface %d won't be used. Expecting interface %d to popup\n",
|
2013-09-13 03:59:59 +08:00
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber,
|
|
|
|
sms_get_board(id->driver_info)->intf_num);
|
2013-03-06 20:53:50 +08:00
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (intf->num_altsetting > 1) {
|
|
|
|
rc = usb_set_interface(udev,
|
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber,
|
|
|
|
0);
|
2008-06-16 02:14:13 +08:00
|
|
|
if (rc < 0) {
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("usb_set_interface failed, rc %d\n", rc);
|
2008-05-20 05:56:13 +08:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("smsusb_probe %d\n",
|
2008-06-16 02:14:13 +08:00
|
|
|
intf->cur_altsetting->desc.bInterfaceNumber);
|
2013-03-06 20:53:50 +08:00
|
|
|
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_debug("endpoint %d %02x %02x %d\n", i,
|
2008-06-16 02:14:13 +08: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 20:53:50 +08: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-16 02:14:13 +08:00
|
|
|
if ((udev->actconfig->desc.bNumInterfaces == 2) &&
|
|
|
|
(intf->cur_altsetting->desc.bInterfaceNumber == 0)) {
|
2015-02-22 22:33:37 +08:00
|
|
|
pr_debug("rom interface 0 is not used\n");
|
2008-05-20 05:56:13 +08:00
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
2013-03-06 09:35:44 +08:00
|
|
|
if (id->driver_info == SMS1XXX_BOARD_SIANO_STELLAR_ROM) {
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
/* Detected a Siano Stellar uninitialized */
|
|
|
|
|
2013-03-06 09:35:44 +08:00
|
|
|
snprintf(devpath, sizeof(devpath), "usb\\%d-%s",
|
|
|
|
udev->bus->busnum, udev->devpath);
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_info("stellar device in cold state was found at %s.\n",
|
|
|
|
devpath);
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
rc = smsusb1_load_firmware(
|
2013-03-06 09:35:44 +08:00
|
|
|
udev, smscore_registry_getmode(devpath),
|
|
|
|
id->driver_info);
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
|
|
|
|
/* This device will reset and gain another USB ID */
|
|
|
|
if (!rc)
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_info("stellar device now in warm state\n");
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
else
|
2015-02-22 22:04:35 +08:00
|
|
|
pr_err("Failed to put stellar in warm state. Error: %d\n",
|
|
|
|
rc);
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
|
|
|
|
return rc;
|
|
|
|
} else {
|
|
|
|
rc = smsusb_init_device(intf, id->driver_info);
|
2013-03-06 09:35:44 +08:00
|
|
|
}
|
|
|
|
|
2015-02-22 22:49:28 +08:00
|
|
|
pr_info("Device initialized with return code %d\n", rc);
|
2008-09-01 04:39:58 +08:00
|
|
|
sms_board_load_modules(id->driver_info);
|
2008-06-14 11:43:26 +08:00
|
|
|
return rc;
|
2008-05-20 05:56:13 +08:00
|
|
|
}
|
|
|
|
|
2008-06-21 13:44:02 +08:00
|
|
|
static void smsusb_disconnect(struct usb_interface *intf)
|
2008-05-20 05:56:13 +08:00
|
|
|
{
|
|
|
|
smsusb_term_device(intf);
|
|
|
|
}
|
|
|
|
|
2008-11-23 01:08:46 +08:00
|
|
|
static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
|
|
|
|
{
|
2010-12-01 05:42:07 +08:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2013-03-06 20:53:50 +08: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-23 01:08:46 +08:00
|
|
|
smsusb_stop_streaming(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smsusb_resume(struct usb_interface *intf)
|
|
|
|
{
|
|
|
|
int rc, i;
|
2010-12-01 05:42:07 +08:00
|
|
|
struct smsusb_device_t *dev = usb_get_intfdata(intf);
|
2008-11-23 01:08:46 +08:00
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
|
|
2013-03-06 20:53:50 +08: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-23 01:08:46 +08: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) {
|
[media] siano: don't break long lines
Due to the 80-cols restrictions, and latter due to checkpatch
warnings, several strings were broken into multiple lines. This
is not considered a good practice anymore, as it makes harder
to grep for strings at the source code.
As we're right now fixing other drivers due to KERN_CONT, we need
to be able to identify what printk strings don't end with a "\n".
It is a way easier to detect those if we don't break long lines.
So, join those continuation lines.
The patch was generated via the script below, and manually
adjusted if needed.
</script>
use Text::Tabs;
while (<>) {
if ($next ne "") {
$c=$_;
if ($c =~ /^\s+\"(.*)/) {
$c2=$1;
$next =~ s/\"\n$//;
$n = expand($next);
$funpos = index($n, '(');
$pos = index($c2, '",');
if ($funpos && $pos > 0) {
$s1 = substr $c2, 0, $pos + 2;
$s2 = ' ' x ($funpos + 1) . substr $c2, $pos + 2;
$s2 =~ s/^\s+//;
$s2 = ' ' x ($funpos + 1) . $s2 if ($s2 ne "");
print unexpand("$next$s1\n");
print unexpand("$s2\n") if ($s2 ne "");
} else {
print "$next$c2\n";
}
$next="";
next;
} else {
print $next;
}
$next="";
} else {
if (m/\"$/) {
if (!m/\\n\"$/) {
$next=$_;
next;
}
}
}
print $_;
}
</script>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-10-19 03:44:19 +08:00
|
|
|
printk(KERN_INFO "%s usb_set_interface failed, rc %d\n",
|
|
|
|
__func__, rc);
|
2008-11-23 01:08:46 +08:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
smsusb_start_streaming(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-08-18 08:48:26 +08:00
|
|
|
static const struct usb_device_id smsusb_id_table[] = {
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
/* This device is only present before firmware load */
|
2008-09-01 04:03:15 +08:00
|
|
|
{ USB_DEVICE(0x187f, 0x0010),
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_STELLAR_ROM },
|
|
|
|
/* This device pops up after firmware load */
|
2008-09-01 04:03:15 +08:00
|
|
|
{ USB_DEVICE(0x187f, 0x0100),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
|
[media] siano: Fix initialization for Stellar models
Since kernel 3.8, the initialization for Stellar (sms1000)
devices are broken.
Those devices have a behaviour different than usual sms1100
and sms2270: they start with one USB ID (devices in cold state),
but after firmware load, they get a different USB ID.
This weren't docummented at the driver. So, the patches that added
support for sms2270 broke it.
Properly documment it, and provide a debug log that allows to
follow all phases of the device initialization:
smsusb_probe: board id=13, interface number 0
smsusb_probe: interface 0 won't be used. Expecting interface 1 to popup
smsusb_probe: board id=13, interface number 1
smsusb_probe: smsusb_probe 1
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_probe: stellar device in cold state was found at usb\4-2.
smsusb1_load_firmware: sent 38144(38144) bytes, rc 0
smsusb1_load_firmware: read FW dvbt_bda_stellar_usb.inp, size=38144
smsusb_probe: stellar device now in warm state
usbcore: registered new interface driver smsusb
usb 4-2: USB disconnect, device number 52
usb 4-2: new full-speed USB device number 53 using uhci_hcd
usb 4-2: New USB device found, idVendor=187f, idProduct=0100
usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 4-2: Product: SMS DVBT-BDA Receiver
usb 4-2: Manufacturer: Siano Mobile Silicon
smsusb_probe: board id=1, interface number 0
smsusb_probe: smsusb_probe 0
smsusb_probe: endpoint 0 81 02 64
smsusb_probe: endpoint 1 02 02 64
smsusb_init_device: in_ep = 81, out_ep = 02
smscore_register_device: allocated 50 buffers
smscore_register_device: device ffff88012a00bc00 created
smsusb_init_device: smsusb_start_streaming(...).
smscore_set_device_mode: set device mode to 4
smsusb1_detectmode: 4 "SMS DVBT-BDA Receiver"
smsusb_sendrequest: sending MSG_SMS_INIT_DEVICE_REQ(578) size: 12
smsusb_onresponse: received MSG_SMS_INIT_DEVICE_RES(579) size: 12
smscore_set_device_mode: Success setting device mode.
smscore_init_ir: IR port has not been detected
smscore_start_device: device ffff88012a00bc00 started, rc 0
smsusb_init_device: device 0xffff88002cfa6000 created
smsusb_probe: Device initialized with return code 0
DVB: registering new adapter (Siano Stellar Digital Receiver)
usb 4-2: DVB: registering adapter 0 frontend 0 (Siano Mobile Digital MDTV Receiver)...
smscore_register_client: ffff88012174a000 693 1
sms_board_dvb3_event: DVB3_EVENT_HOTPLUG
smsdvb_hotplug: success
smsdvb_module_init:
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Tested-by: André Roth <neolynx@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
2013-09-13 04:00:00 +08:00
|
|
|
|
2008-09-01 04:03:15 +08:00
|
|
|
{ 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 20:51:41 +08:00
|
|
|
{ USB_DEVICE(0x187f, 0x0202),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_NICE },
|
|
|
|
{ USB_DEVICE(0x187f, 0x0301),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_VENICE },
|
2009-10-22 05:27:29 +08:00
|
|
|
{ USB_DEVICE(0x2040, 0xb900),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xb910),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-12-01 05:22:10 +08:00
|
|
|
{ USB_DEVICE(0x2040, 0xb980),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
|
|
|
{ USB_DEVICE(0x2040, 0xb990),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-10-22 05:27:29 +08:00
|
|
|
{ USB_DEVICE(0x2040, 0xc000),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2009-12-01 05:22:10 +08: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-23 00:55:05 +08:00
|
|
|
{ USB_DEVICE(0x2040, 0xc0a0),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2012-05-25 20:29:12 +08:00
|
|
|
{ USB_DEVICE(0x2040, 0xf5a0),
|
|
|
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
2013-03-06 09:35:44 +08: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 },
|
2014-02-10 17:45:29 +08:00
|
|
|
{ USB_DEVICE(0x3275, 0x0080),
|
|
|
|
.driver_info = SMS1XXX_BOARD_SIANO_RIO },
|
2014-08-12 05:09:32 +08:00
|
|
|
{ USB_DEVICE(0x2013, 0x0257),
|
|
|
|
.driver_info = SMS1XXX_BOARD_PCTV_77E },
|
2009-05-19 20:51:41 +08:00
|
|
|
{ } /* Terminating entry */
|
|
|
|
};
|
|
|
|
|
2008-09-01 04:03:15 +08:00
|
|
|
MODULE_DEVICE_TABLE(usb, smsusb_id_table);
|
|
|
|
|
2008-05-20 05:56:13 +08:00
|
|
|
static struct usb_driver smsusb_driver = {
|
2008-08-31 11:44:04 +08:00
|
|
|
.name = "smsusb",
|
2008-05-20 05:56:13 +08:00
|
|
|
.probe = smsusb_probe,
|
2008-06-16 02:14:13 +08:00
|
|
|
.disconnect = smsusb_disconnect,
|
2008-05-20 05:56:13 +08:00
|
|
|
.id_table = smsusb_id_table,
|
2008-11-23 01:08:46 +08:00
|
|
|
|
|
|
|
.suspend = smsusb_suspend,
|
|
|
|
.resume = smsusb_resume,
|
2008-05-20 05:56:13 +08:00
|
|
|
};
|
|
|
|
|
2011-11-19 01:46:12 +08: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 11:44:04 +08:00
|
|
|
|
2009-05-17 20:17:51 +08: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 11:44:04 +08:00
|
|
|
MODULE_AUTHOR("Siano Mobile Silicon, INC. (uris@siano-ms.com)");
|
|
|
|
MODULE_LICENSE("GPL");
|