aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/dvb/siano
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/siano')
-rw-r--r--drivers/media/dvb/siano/Kconfig26
-rw-r--r--drivers/media/dvb/siano/Makefile8
-rw-r--r--drivers/media/dvb/siano/sms-cards.c227
-rw-r--r--drivers/media/dvb/siano/sms-cards.h58
-rw-r--r--drivers/media/dvb/siano/smscoreapi.c1329
-rw-r--r--drivers/media/dvb/siano/smscoreapi.h468
-rw-r--r--drivers/media/dvb/siano/smsdvb.c501
-rw-r--r--drivers/media/dvb/siano/smsusb.c504
8 files changed, 0 insertions, 3121 deletions
diff --git a/drivers/media/dvb/siano/Kconfig b/drivers/media/dvb/siano/Kconfig
deleted file mode 100644
index dd863f26167..00000000000
--- a/drivers/media/dvb/siano/Kconfig
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Siano Mobile Silicon Digital TV device configuration
-#
-
-config DVB_SIANO_SMS1XXX
- tristate "Siano SMS1XXX USB dongle support"
- depends on DVB_CORE && USB
- ---help---
- Choose Y here if you have a USB dongle with a SMS1XXX chipset.
-
- To compile this driver as a module, choose M here: the
- module will be called sms1xxx.
-
-config DVB_SIANO_SMS1XXX_SMS_IDS
- bool "Enable support for Siano Mobile Silicon default USB IDs"
- depends on DVB_SIANO_SMS1XXX
- default y
- ---help---
- Choose Y here if you have a USB dongle with a SMS1XXX chipset
- that uses Siano Mobile Silicon's default usb vid:pid.
-
- Choose N here if you would prefer to use Siano's external driver.
-
- Further documentation on this driver can be found on the WWW at
- <http://www.siano-ms.com/>.
-
diff --git a/drivers/media/dvb/siano/Makefile b/drivers/media/dvb/siano/Makefile
deleted file mode 100644
index ee0737af98c..00000000000
--- a/drivers/media/dvb/siano/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o sms-cards.o
-
-obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o
-
-EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
-
-EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m)
-
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
deleted file mode 100644
index 4307e4e8aa3..00000000000
--- a/drivers/media/dvb/siano/sms-cards.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Card-specific functions for the Siano SMS1xxx USB dongle
- *
- * Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "sms-cards.h"
-
-struct usb_device_id smsusb_id_table[] = {
-#ifdef CONFIG_DVB_SIANO_SMS1XXX_SMS_IDS
- { 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 },
-#endif
- { 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, 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 },
- { } /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, smsusb_id_table);
-
-static struct sms_board sms_boards[] = {
- [SMS_BOARD_UNKNOWN] = {
- .name = "Unknown board",
- },
- [SMS1XXX_BOARD_SIANO_STELLAR] = {
- .name = "Siano Stellar Digital Receiver",
- .type = SMS_STELLAR,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-stellar-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_SIANO_NOVA_A] = {
- .name = "Siano Nova A Digital Receiver",
- .type = SMS_NOVA_A0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-a-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_SIANO_NOVA_B] = {
- .name = "Siano Nova B Digital Receiver",
- .type = SMS_NOVA_B0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_SIANO_VEGA] = {
- .name = "Siano Vega Digital Receiver",
- .type = SMS_VEGA,
- },
- [SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT] = {
- .name = "Hauppauge Catamount",
- .type = SMS_STELLAR,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-stellar-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A] = {
- .name = "Hauppauge Okemo-A",
- .type = SMS_NOVA_A0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-a-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B] = {
- .name = "Hauppauge Okemo-B",
- .type = SMS_NOVA_B0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
- },
- [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
- .name = "Hauppauge WinTV MiniStick",
- .type = SMS_NOVA_B0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
- .led_power = 26,
- .led_lo = 27,
- .led_hi = 28,
- },
- [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD] = {
- .name = "Hauppauge WinTV MiniCard",
- .type = SMS_NOVA_B0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
- .lna_ctrl = 29,
- },
- [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = {
- .name = "Hauppauge WinTV MiniCard",
- .type = SMS_NOVA_B0,
- .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
- .lna_ctrl = -1,
- },
-};
-
-struct sms_board *sms_get_board(int id)
-{
- BUG_ON(id >= ARRAY_SIZE(sms_boards));
-
- return &sms_boards[id];
-}
-
-static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
-{
- int lvl, ret;
- u32 gpio;
- struct smscore_gpio_config gpioconfig = {
- .direction = SMS_GPIO_DIRECTION_OUTPUT,
- .pullupdown = SMS_GPIO_PULLUPDOWN_NONE,
- .inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL,
- .outputslewrate = SMS_GPIO_OUTPUTSLEWRATE_FAST,
- .outputdriving = SMS_GPIO_OUTPUTDRIVING_4mA,
- };
-
- if (pin == 0)
- return -EINVAL;
-
- if (pin < 0) {
- /* inverted gpio */
- gpio = pin * -1;
- lvl = enable ? 0 : 1;
- } else {
- gpio = pin;
- lvl = enable ? 1 : 0;
- }
-
- ret = smscore_configure_gpio(coredev, gpio, &gpioconfig);
- if (ret < 0)
- return ret;
-
- return smscore_set_gpio(coredev, gpio, lvl);
-}
-
-int sms_board_setup(struct smscore_device_t *coredev)
-{
- int board_id = smscore_get_board_id(coredev);
- struct sms_board *board = sms_get_board(board_id);
-
- switch (board_id) {
- case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
- /* turn off all LEDs */
- sms_set_gpio(coredev, board->led_power, 0);
- sms_set_gpio(coredev, board->led_hi, 0);
- sms_set_gpio(coredev, board->led_lo, 0);
- break;
- case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
- case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
- /* turn off LNA */
- sms_set_gpio(coredev, board->lna_ctrl, 0);
- break;
- }
- return 0;
-}
-
-int sms_board_power(struct smscore_device_t *coredev, int onoff)
-{
- int board_id = smscore_get_board_id(coredev);
- struct sms_board *board = sms_get_board(board_id);
-
- switch (board_id) {
- case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
- /* power LED */
- sms_set_gpio(coredev,
- board->led_power, onoff ? 1 : 0);
- break;
- case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
- case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
- /* LNA */
- sms_set_gpio(coredev,
- board->lna_ctrl, onoff ? 1 : 0);
- break;
- }
- return 0;
-}
-
-int sms_board_led_feedback(struct smscore_device_t *coredev, int led)
-{
- int board_id = smscore_get_board_id(coredev);
- struct sms_board *board = sms_get_board(board_id);
-
- /* dont touch GPIO if LEDs are already set */
- if (smscore_led_state(coredev, -1) == led)
- return 0;
-
- switch (board_id) {
- case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
- sms_set_gpio(coredev,
- board->led_lo, (led & SMS_LED_LO) ? 1 : 0);
- sms_set_gpio(coredev,
- board->led_hi, (led & SMS_LED_HI) ? 1 : 0);
-
- smscore_led_state(coredev, led);
- break;
- }
- return 0;
-}
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h
deleted file mode 100644
index 8e0fe9fd261..00000000000
--- a/drivers/media/dvb/siano/sms-cards.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Card-specific functions for the Siano SMS1xxx USB dongle
- *
- * Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __SMS_CARDS_H__
-#define __SMS_CARDS_H__
-
-#include <linux/usb.h>
-#include "smscoreapi.h"
-
-#define SMS_BOARD_UNKNOWN 0
-#define SMS1XXX_BOARD_SIANO_STELLAR 1
-#define SMS1XXX_BOARD_SIANO_NOVA_A 2
-#define SMS1XXX_BOARD_SIANO_NOVA_B 3
-#define SMS1XXX_BOARD_SIANO_VEGA 4
-#define SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT 5
-#define SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A 6
-#define SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B 7
-#define SMS1XXX_BOARD_HAUPPAUGE_WINDHAM 8
-#define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD 9
-#define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 10
-
-struct sms_board {
- enum sms_device_type_st type;
- char *name, *fw[DEVICE_MODE_MAX];
-
- /* gpios */
- int led_power, led_hi, led_lo, lna_ctrl;
-};
-
-struct sms_board *sms_get_board(int id);
-
-int sms_board_setup(struct smscore_device_t *coredev);
-
-#define SMS_LED_OFF 0
-#define SMS_LED_LO 1
-#define SMS_LED_HI 2
-int sms_board_led_feedback(struct smscore_device_t *coredev, int led);
-int sms_board_power(struct smscore_device_t *coredev, int onoff);
-
-extern struct usb_device_id smsusb_id_table[];
-
-#endif /* __SMS_CARDS_H__ */
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c
deleted file mode 100644
index cf613f22fb8..00000000000
--- a/drivers/media/dvb/siano/smscoreapi.c
+++ /dev/null
@@ -1,1329 +0,0 @@
-/*
- * Siano core API module
- *
- * This file contains implementation for the interface to sms core component
- *
- * author: Anatoly Greenblat
- *
- * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/dma-mapping.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-
-#include <linux/firmware.h>
-
-#include "smscoreapi.h"
-#include "sms-cards.h"
-
-int sms_debug;
-module_param_named(debug, sms_debug, int, 0644);
-MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
-
-struct smscore_device_notifyee_t {
- struct list_head entry;
- hotplug_t hotplug;
-};
-
-struct smscore_idlist_t {
- struct list_head entry;
- int id;
- int data_type;
-};
-
-struct smscore_client_t {
- struct list_head entry;
- struct smscore_device_t *coredev;
- void *context;
- struct list_head idlist;
- onresponse_t onresponse_handler;
- onremove_t onremove_handler;
-};
-
-struct smscore_device_t {
- struct list_head entry;
-
- struct list_head clients;
- struct list_head subclients;
- spinlock_t clientslock;
-
- struct list_head buffers;
- spinlock_t bufferslock;
- int num_buffers;
-
- void *common_buffer;
- int common_buffer_size;
- dma_addr_t common_buffer_phys;
-
- void *context;
- struct device *device;
-
- char devpath[32];
- unsigned long device_flags;
-
- setmode_t setmode_handler;
- detectmode_t detectmode_handler;
- sendrequest_t sendrequest_handler;
- preload_t preload_handler;
- postload_t postload_handler;
-
- int mode, modes_supported;
-
- struct completion version_ex_done, data_download_done, trigger_done;
- struct completion init_device_done, reload_start_done, resume_done;
-
- int board_id;
- int led_state;
-};
-
-void smscore_set_board_id(struct smscore_device_t *core, int id)
-{
- core->board_id = id;
-}
-
-int smscore_led_state(struct smscore_device_t *core, int led)
-{
- if (led >= 0)
- core->led_state = led;
- return core->led_state;
-}
-
-int smscore_get_board_id(struct smscore_device_t *core)
-{
- return core->board_id;
-}
-
-struct smscore_registry_entry_t {
- struct list_head entry;
- char devpath[32];
- int mode;
- enum sms_device_type_st type;
-};
-
-static struct list_head g_smscore_notifyees;
-static struct list_head g_smscore_devices;
-static struct mutex g_smscore_deviceslock;
-
-static struct list_head g_smscore_registry;
-static struct mutex g_smscore_registrylock;
-
-static int default_mode = 4;
-
-module_param(default_mode, int, 0644);
-MODULE_PARM_DESC(default_mode, "default firmware id (device mode)");
-
-static struct smscore_registry_entry_t *smscore_find_registry(char *devpath)
-{
- struct smscore_registry_entry_t *entry;
- struct list_head *next;
-
- kmutex_lock(&g_smscore_registrylock);
- for (next = g_smscore_registry.next;
- next != &g_smscore_registry;
- next = next->next) {
- entry = (struct smscore_registry_entry_t *) next;
- if (!strcmp(entry->devpath, devpath)) {
- kmutex_unlock(&g_smscore_registrylock);
- return entry;
- }
- }
- entry = (struct smscore_registry_entry_t *)
- kmalloc(sizeof(struct smscore_registry_entry_t),
- GFP_KERNEL);
- if (entry) {
- entry->mode = default_mode;
- strcpy(entry->devpath, devpath);
- list_add(&entry->entry, &g_smscore_registry);
- } else
- sms_err("failed to create smscore_registry.");
- kmutex_unlock(&g_smscore_registrylock);
- return entry;
-}
-
-int smscore_registry_getmode(char *devpath)
-{
- struct smscore_registry_entry_t *entry;
-
- entry = smscore_find_registry(devpath);
- if (entry)
- return entry->mode;
- else
- sms_err("No registry found.");
-
- return default_mode;
-}
-
-static enum sms_device_type_st smscore_registry_gettype(char *devpath)
-{
- struct smscore_registry_entry_t *entry;
-
- entry = smscore_find_registry(devpath);
- if (entry)
- return entry->type;
- else
- sms_err("No registry found.");
-
- return -1;
-}
-
-void smscore_registry_setmode(char *devpath, int mode)
-{
- struct smscore_registry_entry_t *entry;
-
- entry = smscore_find_registry(devpath);
- if (entry)
- entry->mode = mode;
- else
- sms_err("No registry found.");
-}
-
-static void smscore_registry_settype(char *devpath,
- enum sms_device_type_st type)
-{
- struct smscore_registry_entry_t *entry;
-
- entry = smscore_find_registry(devpath);
- if (entry)
- entry->type = type;
- else
- sms_err("No registry found.");
-}
-
-
-static void list_add_locked(struct list_head *new, struct list_head *head,
- spinlock_t *lock)
-{
- unsigned long flags;
-
- spin_lock_irqsave(lock, flags);
-
- list_add(new, head);
-
- spin_unlock_irqrestore(lock, flags);
-}
-
-/**
- * register a client callback that called when device plugged in/unplugged
- * NOTE: if devices exist callback is called immediately for each device
- *
- * @param hotplug callback
- *
- * @return 0 on success, <0 on error.
- */
-int smscore_register_hotplug(hotplug_t hotplug)
-{
- struct smscore_device_notifyee_t *notifyee;
- struct list_head *next, *first;
- int rc = 0;
-
- kmutex_lock(&g_smscore_deviceslock);
-
- notifyee = kmalloc(sizeof(struct smscore_device_notifyee_t),
- GFP_KERNEL);
- if (notifyee) {
- /* now notify callback about existing devices */
- first = &g_smscore_devices;
- for (next = first->next;
- next != first && !rc;
- next = next->next) {
- struct smscore_device_t *coredev =
- (struct smscore_device_t *) next;
- rc = hotplug(coredev, coredev->device, 1);
- }
-
- if (rc >= 0) {
- notifyee->hotplug = hotplug;
- list_add(&notifyee->entry, &g_smscore_notifyees);
- } else
- kfree(notifyee);
- } else
- rc = -ENOMEM;
-
- kmutex_unlock(&g_smscore_deviceslock);
-
- return rc;
-}
-
-/**
- * unregister a client callback that called when device plugged in/unplugged
- *
- * @param hotplug callback
- *
- */
-void smscore_unregister_hotplug(hotplug_t hotplug)
-{
- struct list_head *next, *first;
-
- kmutex_lock(&g_smscore_deviceslock);
-
- first = &g_smscore_notifyees;
-
- for (next = first->next; next != first;) {
- struct smscore_device_notifyee_t *notifyee =
- (struct smscore_device_notifyee_t *) next;
- next = next->next;
-
- if (notifyee->hotplug == hotplug) {
- list_del(&notifyee->entry);
- kfree(notifyee);
- }
- }
-
- kmutex_unlock(&g_smscore_deviceslock);
-}
-
-static void smscore_notify_clients(struct smscore_device_t *coredev)
-{
- struct smscore_client_t *client;
-
- /* the client must call smscore_unregister_client from remove handler */
- while (!list_empty(&coredev->clients)) {
- client = (struct smscore_client_t *) coredev->clients.next;
- client->onremove_handler(client->context);
- }
-}
-
-static int smscore_notify_callbacks(struct smscore_device_t *coredev,
- struct device *device, int arrival)
-{
- struct list_head *next, *first;
- int rc = 0;
-
- /* note: must be called under g_deviceslock */
-
- first = &g_smscore_notifyees;
-
- for (next = first->next; next != first; next = next->next) {
- rc = ((struct smscore_device_notifyee_t *) next)->
- hotplug(coredev, device, arrival);
- if (rc < 0)
- break;
- }
-
- return rc;
-}
-
-static struct
-smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer,
- dma_addr_t common_buffer_phys)
-{
- struct smscore_buffer_t *cb =
- kmalloc(sizeof(struct smscore_buffer_t), GFP_KERNEL);
- if (!cb) {
- sms_info("kmalloc(...) failed");
- return NULL;
- }
-
- cb->p = buffer;
- cb->offset_in_common = buffer - (u8 *) common_buffer;
- cb->phys = common_buffer_phys + cb->offset_in_common;
-
- return cb;
-}
-
-/**
- * creates coredev object for a device, prepares buffers,
- * creates buffer mappings, notifies registered hotplugs about new device.
- *
- * @param params device pointer to struct with device specific parameters
- * and handlers
- * @param coredev pointer to a value that receives created coredev object
- *
- * @return 0 on success, <0 on error.
- */
-int smscore_register_device(struct smsdevice_params_t *params,
- struct smscore_device_t **coredev)
-{
- struct smscore_device_t *dev;
- u8 *buffer;
-
- dev = kzalloc(sizeof(struct smscore_device_t), GFP_KERNEL);
- if (!dev) {
- sms_info("kzalloc(...) failed");
- return -ENOMEM;
- }
-
- /* init list entry so it could be safe in smscore_unregister_device */
- INIT_LIST_HEAD(&dev->entry);
-
- /* init queues */
- INIT_LIST_HEAD(&dev->clients);
- INIT_LIST_HEAD(&dev->buffers);
-
- /* init locks */
- spin_lock_init(&dev->clientslock);
- spin_lock_init(&dev->bufferslock);
-
- /* init completion events */
- init_completion(&dev->version_ex_done);
- init_completion(&dev->data_download_done);
- init_completion(&dev->trigger_done);
- init_completion(&dev->init_device_done);
- init_completion(&dev->reload_start_done);
- init_completion(&dev->resume_done);
-
- /* alloc common buffer */
- dev->common_buffer_size = params->buffer_size * params->num_buffers;
- dev->common_buffer = dma_alloc_coherent(NULL, dev->common_buffer_size,
- &dev->common_buffer_phys,
- GFP_KERNEL | GFP_DMA);
- if (!dev->common_buffer) {
- smscore_unregister_device(dev);
- return -ENOMEM;
- }
-
- /* prepare dma buffers */
- for (buffer = dev->common_buffer;
- dev->num_buffers < params->num_buffers;
- dev->num_buffers++, buffer += params->buffer_size) {
- struct smscore_buffer_t *cb =
- smscore_createbuffer(buffer, dev->common_buffer,
- dev->common_buffer_phys);
- if (!cb) {
- smscore_unregister_device(dev);
- return -ENOMEM;
- }
-
- smscore_putbuffer(dev, cb);
- }
-
- sms_info("allocated %d buffers", dev->num_buffers);
-
- dev->mode = DEVICE_MODE_NONE;
- dev->context = params->context;
- dev->device = params->device;
- dev->setmode_handler = params->setmode_handler;
- dev->detectmode_handler = params->detectmode_handler;
- dev->sendrequest_handler = params->sendrequest_handler;
- dev->preload_handler = params->preload_handler;
- dev->postload_handler = params->postload_handler;
-
- dev->device_flags = params->flags;
- strcpy(dev->devpath, params->devpath);
-
- smscore_registry_settype(dev->devpath, params->device_type);
-
- /* add device to devices list */
- kmutex_lock(&g_smscore_deviceslock);
- list_add(&dev->entry, &g_smscore_devices);
- kmutex_unlock(&g_smscore_deviceslock);
-
- *coredev = dev;
-
- sms_info("device %p created", dev);
-
- return 0;
-}
-
-/**
- * sets initial device mode and notifies client hotplugs that device is ready
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- *
- * @return 0 on success, <0 on error.
- */
-int smscore_start_device(struct smscore_device_t *coredev)
-{
- int rc = smscore_set_device_mode(
- coredev, smscore_registry_getmode(coredev->devpath));
- if (rc < 0) {
- sms_info("set device mode faile , rc %d", rc);
- return rc;
- }
-
- kmutex_lock(&g_smscore_deviceslock);
-
- rc = smscore_notify_callbacks(coredev, coredev->device, 1);
-
- sms_info("device %p started, rc %d", coredev, rc);
-
- kmutex_unlock(&g_smscore_deviceslock);
-
- return rc;
-}
-
-static int smscore_sendrequest_and_wait(struct smscore_device_t *coredev,
- void *buffer, size_t size,
- struct completion *completion)
-{
- int rc = coredev->sendrequest_handler(coredev->context, buffer, size);
- if (rc < 0) {
- sms_info("sendrequest returned error %d", rc);
- return rc;
- }
-
- return wait_for_completion_timeout(completion,
- msecs_to_jiffies(10000)) ?
- 0 : -ETIME;
-}
-
-static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
- void *buffer, size_t size)
-{
- struct SmsFirmware_ST *firmware = (struct SmsFirmware_ST *) buffer;
- struct SmsMsgHdr_ST *msg;
- u32 mem_address = firmware->StartAddress;
- u8 *payload = firmware->Payload;
- int rc = 0;
-
- sms_info("loading FW to addr 0x%x size %d",
- mem_address, firmware->Length);
- if (coredev->preload_handler) {
- rc = coredev->preload_handler(coredev->context);
- if (rc < 0)
- return rc;
- }
-
- /* PAGE_SIZE buffer shall be enough and dma aligned */
- msg = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
- if (!msg)
- return -ENOMEM;
-
- if (coredev->mode != DEVICE_MODE_NONE) {
- sms_debug("sending reload command.");
- SMS_INIT_MSG(msg, MSG_SW_RELOAD_START_REQ,
- sizeof(struct SmsMsgHdr_ST));
- rc = smscore_sendrequest_and_wait(coredev, msg,
- msg->msgLength,
- &coredev->reload_start_done);
- mem_address = *(u32 *) &payload[20];
- }
-
- while (size && rc >= 0) {
- struct SmsDataDownload_ST *DataMsg =
- (struct SmsDataDownload_ST *) msg;
- int payload_size = min((int) size, SMS_MAX_PAYLOAD_SIZE);
-
- SMS_INIT_MSG(msg, MSG_SMS_DATA_DOWNLOAD_REQ,
- (u16)(sizeof(struct SmsMsgHdr_ST) +
- sizeof(u32) + payload_size));
-
- DataMsg->MemAddr = mem_address;
- memcpy(DataMsg->Payload, payload, payload_size);
-
- if ((coredev->device_flags & SMS_ROM_NO_RESPONSE) &&
- (coredev->mode == DEVICE_MODE_NONE))
- rc = coredev->sendrequest_handler(
- coredev->context, DataMsg,
- DataMsg->xMsgHeader.msgLength);
- else
- rc = smscore_sendrequest_and_wait(
- coredev, DataMsg,
- DataMsg->xMsgHeader.msgLength,
- &coredev->data_download_done);
-
- payload += payload_size;
- size -= payload_size;
- mem_address += payload_size;
- }
-
- if (rc >= 0) {
- if (coredev->mode == DEVICE_MODE_NONE) {
- struct SmsMsgData_ST *TriggerMsg =
- (struct SmsMsgData_ST *) msg;
-
- SMS_INIT_MSG(msg, MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
- sizeof(struct SmsMsgHdr_ST) +
- sizeof(u32) * 5);
-
- TriggerMsg->msgData[0] = firmware->StartAddress;
- /* Entry point */
- TriggerMsg->msgData[1] = 5; /* Priority */
- TriggerMsg->msgData[2] = 0x200; /* Stack size */
- TriggerMsg->msgData[3] = 0; /* Parameter */
- TriggerMsg->msgData[4] = 4; /* Task ID */
-
- if (coredev->device_flags & SMS_ROM_NO_RESPONSE) {
- rc = coredev->sendrequest_handler(
- coredev->context, TriggerMsg,
- TriggerMsg->xMsgHeader.msgLength);
- msleep(100);
- } else
- rc = smscore_sendrequest_and_wait(
- coredev, TriggerMsg,
- TriggerMsg->xMsgHeader.msgLength,
- &coredev->trigger_done);
- } else {
- SMS_INIT_MSG(msg, MSG_SW_RELOAD_EXEC_REQ,
- sizeof(struct SmsMsgHdr_ST));
-
- rc = coredev->sendrequest_handler(coredev->context,
- msg, msg->msgLength);
- }
- msleep(500);
- }
-
- sms_debug("rc=%d, postload=%p ", rc,
- coredev->postload_handler);
-
- kfree(msg);
-
- return ((rc >= 0) && coredev->postload_handler) ?
- coredev->postload_handler(coredev->context) :
- rc;
-}
-
-/**
- * loads specified firmware into a buffer and calls device loadfirmware_handler
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- * @param filename null-terminated string specifies firmware file name
- * @param loadfirmware_handler device handler that loads firmware
- *
- * @return 0 on success, <0 on error.
- */
-static int smscore_load_firmware_from_file(struct smscore_device_t *coredev,
- char *filename,
- loadfirmware_t loadfirmware_handler)
-{
- int rc = -ENOENT;
- const struct firmware *fw;
- u8 *fw_buffer;
-
- if (loadfirmware_handler == NULL && !(coredev->device_flags &
- SMS_DEVICE_FAMILY2))
- return -EINVAL;
-
- rc = request_firmware(&fw, filename, coredev->device);
- if (rc < 0) {
- sms_info("failed to open \"%s\"", filename);
- return rc;
- }
- sms_info("read FW %s, size=%zd", filename, fw->size);
- fw_buffer = kmalloc(ALIGN(fw->size, SMS_ALLOC_ALIGNMENT),
- GFP_KERNEL | GFP_DMA);
- if (fw_buffer) {
- memcpy(fw_buffer, fw->data, fw->size);
-
- rc = (coredev->device_flags & SMS_DEVICE_FAMILY2) ?
- smscore_load_firmware_family2(coredev,
- fw_buffer,
- fw->size) :
- loadfirmware_handler(coredev->context,
- fw_buffer, fw->size);
-
- kfree(fw_buffer);
- } else {
- sms_info("failed to allocate firmware buffer");
- rc = -ENOMEM;
- }
-
- release_firmware(fw);
-
- return rc;
-}
-
-/**
- * notifies all clients registered with the device, notifies hotplugs,
- * frees all buffers and coredev object
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- *
- * @return 0 on success, <0 on error.
- */
-void smscore_unregister_device(struct smscore_device_t *coredev)
-{
- struct smscore_buffer_t *cb;
- int num_buffers = 0;
- int retry = 0;
-
- kmutex_lock(&g_smscore_deviceslock);
-
- smscore_notify_clients(coredev);
- smscore_notify_callbacks(coredev, NULL, 0);
-
- /* at this point all buffers should be back
- * onresponse must no longer be called */
-
- while (1) {
- while ((cb = smscore_getbuffer(coredev))) {
- kfree(cb);
- num_buffers++;
- }
- if (num_buffers == coredev->num_buffers)
- break;
- if (++retry > 10) {
- sms_info("exiting although "
- "not all buffers released.");
- break;
- }
-
- sms_info("waiting for %d buffer(s)",
- coredev->num_buffers - num_buffers);
- msleep(100);
- }
-
- sms_info("freed %d buffers", num_buffers);
-
- if (coredev->common_buffer)
- dma_free_coherent(NULL, coredev->common_buffer_size,
- coredev->common_buffer,
- coredev->common_buffer_phys);
-
- list_del(&coredev->entry);
- kfree(coredev);
-
- kmutex_unlock(&g_smscore_deviceslock);
-
- sms_info("device %p destroyed", coredev);
-}
-
-static int smscore_detect_mode(struct smscore_device_t *coredev)
-{
- void *buffer = kmalloc(sizeof(struct SmsMsgHdr_ST) + SMS_DMA_ALIGNMENT,
- GFP_KERNEL | GFP_DMA);
- struct SmsMsgHdr_ST *msg =
- (struct SmsMsgHdr_ST *) SMS_ALIGN_ADDRESS(buffer);
- int rc;
-
- if (!buffer)
- return -ENOMEM;
-
- SMS_INIT_MSG(msg, MSG_SMS_GET_VERSION_EX_REQ,
- sizeof(struct SmsMsgHdr_ST));
-
- rc = smscore_sendrequest_and_wait(coredev, msg, msg->msgLength,
- &coredev->version_ex_done);
- if (rc == -ETIME) {
- sms_err("MSG_SMS_GET_VERSION_EX_REQ failed first try");
-
- if (wait_for_completion_timeout(&coredev->resume_done,
- msecs_to_jiffies(5000))) {
- rc = smscore_sendrequest_and_wait(
- coredev, msg, msg->msgLength,
- &coredev->version_ex_done);
- if (rc < 0)
- sms_err("MSG_SMS_GET_VERSION_EX_REQ failed "
- "second try, rc %d", rc);
- } else
- rc = -ETIME;
- }
-
- kfree(buffer);
-
- return rc;
-}
-
-static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = {
- /*Stellar NOVA A0 Nova B0 VEGA*/
- /*DVBT*/
- {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"},
- /*DVBH*/
- {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"},
- /*TDMB*/
- {"none", "tdmb_nova_12mhz.inp", "none", "none"},
- /*DABIP*/
- {"none", "none", "none", "none"},
- /*BDA*/
- {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"},
- /*ISDBT*/
- {"none", "isdbt_nova_12mhz.inp", "dvb_nova_12mhz.inp", "none"},
- /*ISDBTBDA*/
- {"none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none"},
- /*CMMB*/
- {"none", "none", "none", "cmmb_vega_12mhz.inp"}
-};
-
-static inline char *sms_get_fw_name(struct smscore_device_t *coredev,
- int mode, enum sms_device_type_st type)
-{
- char **fw = sms_get_board(smscore_get_board_id(coredev))->fw;
- return (fw && fw[mode]) ? fw[mode] : smscore_fw_lkup[mode][type];
-}
-
-/**
- * calls device handler to change mode of operation
- * NOTE: stellar/usb may disconnect when changing mode
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- * @param mode requested mode of operation
- *
- * @return 0 on success, <0 on error.
- */
-int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
-{
- void *buffer;
- int rc = 0;
- enum sms_device_type_st type;
-
- sms_debug("set device mode to %d", mode);
- if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
- if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_RAW_TUNER) {
- sms_err("invalid mode specified %d", mode);
- return -EINVAL;
- }
-
- smscore_registry_setmode(coredev->devpath, mode);
-
- if (!(coredev->device_flags & SMS_DEVICE_NOT_READY)) {
- rc = smscore_detect_mode(coredev);
- if (rc < 0) {
- sms_err("mode detect failed %d", rc);
- return rc;
- }
- }
-
- if (coredev->mode == mode) {
- sms_info("device mode %d already set", mode);
- return 0;
- }
-
- if (!(coredev->modes_supported & (1 << mode))) {
- char *fw_filename;
-
- type = smscore_registry_gettype(coredev->devpath);
- fw_filename = sms_get_fw_name(coredev, mode, type);
-
- rc = smscore_load_firmware_from_file(coredev,
- fw_filename, NULL);
- if (rc < 0) {
- sms_warn("error %d loading firmware: %s, "
- "trying again with default firmware",
- rc, fw_filename);
-
- /* try again with the default firmware */
- fw_filename = smscore_fw_lkup[mode][type];
- rc = smscore_load_firmware_from_file(coredev,
- fw_filename, NULL);
-
- if (rc < 0) {
- sms_warn("error %d loading "
- "firmware: %s", rc,
- fw_filename);
- return rc;
- }
- }
- sms_log("firmware download success: %s", fw_filename);
- } else
- sms_info("mode %d supported by running "
- "firmware", mode);
-
- buffer = kmalloc(sizeof(struct SmsMsgData_ST) +
- SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA);
- if (buffer) {
- struct SmsMsgData_ST *msg =
- (struct SmsMsgData_ST *)
- SMS_ALIGN_ADDRESS(buffer);
-
- SMS_INIT_MSG(&msg->xMsgHeader, MSG_SMS_INIT_DEVICE_REQ,
- sizeof(struct SmsMsgData_ST));
- msg->msgData[0] = mode;
-
- rc = smscore_sendrequest_and_wait(
- coredev, msg, msg->xMsgHeader.msgLength,
- &coredev->init_device_done);
-
- kfree(buffer);
- } else {
- sms_err("Could not allocate buffer for "
- "init device message.");
- rc = -ENOMEM;
- }
- } else {
- if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
- sms_err("invalid mode specified %d", mode);
- return -EINVAL;
- }
-
- smscore_registry_setmode(coredev->devpath, mode);
-
- if (coredev->detectmode_handler)
- coredev->detectmode_handler(coredev->context,
- &coredev->mode);
-
- if (coredev->mode != mode && coredev->setmode_handler)
- rc = coredev->setmode_handler(coredev->context, mode);
- }
-
- if (rc >= 0) {
- coredev->mode = mode;
- coredev->device_flags &= ~SMS_DEVICE_NOT_READY;
- }
-
- if (rc != 0)
- sms_err("return error code %d.", rc);
- return rc;
-}
-
-/**
- * calls device handler to get current mode of operation
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- *
- * @return current mode
- */
-int smscore_get_device_mode(struct smscore_device_t *coredev)
-{
- return coredev->mode;
-}
-
-/**
- * find client by response id & type within the clients list.
- * return client handle or NULL.
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- * @param data_type client data type (SMS_DONT_CARE for all types)
- * @param id client id (SMS_DONT_CARE for all id)
- *
- */
-static struct
-smscore_client_t *smscore_find_client(struct smscore_device_t *coredev,
- int data_type, int id)
-{
- struct smscore_client_t *client = NULL;
- struct list_head *next, *first;
- unsigned long flags;
- struct list_head *firstid, *nextid;
-
-
- spin_lock_irqsave(&coredev->clientslock, flags);
- first = &coredev->clients;
- for (next = first->next;
- (next != first) && !client;
- next = next->next) {
- firstid = &((struct smscore_client_t *)next)->idlist;
- for (nextid = firstid->next;
- nextid != firstid;
- nextid = nextid->next) {
- if ((((struct smscore_idlist_t *)nextid)->id == id) &&
- (((struct smscore_idlist_t *)nextid)->data_type == data_type ||
- (((struct smscore_idlist_t *)nextid)->data_type == 0))) {
- client = (struct smscore_client_t *) next;
- break;
- }
- }
- }
- spin_unlock_irqrestore(&coredev->clientslock, flags);
- return client;
-}
-
-/**
- * find client by response id/type, call clients onresponse handler
- * return buffer to pool on error
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- * @param cb pointer to response buffer descriptor
- *
- */
-void smscore_onresponse(struct smscore_device_t *coredev,
- struct smscore_buffer_t *cb)
-{
- struct SmsMsgHdr_ST *phdr =
- (struct SmsMsgHdr_ST *)((u8 *) cb->p + cb->offset);
- struct smscore_client_t *client =
- smscore_find_client(coredev, phdr->msgType, phdr->msgDstId);
- int rc = -EBUSY;
-
- static unsigned long last_sample_time; /* = 0; */
- static int data_total; /* = 0; */
- unsigned long time_now = jiffies_to_msecs(jiffies);
-
- if (!last_sample_time)
- last_sample_time = time_now;
-
- if (time_now - last_sample_time > 10000) {
- sms_debug("\ndata rate %d bytes/secs",
- (int)((data_total * 1000) /
- (time_now - last_sample_time)));
-
- last_sample_time = time_now;
- data_total = 0;
- }
-
- data_total += cb->size;
- /* If no client registered for type & id,
- * check for control client where type is not registered */
- if (client)
- rc = client->onresponse_handler(client->context, cb);
-
- if (rc < 0) {
- switch (phdr->msgType) {
- case MSG_SMS_GET_VERSION_EX_RES:
- {
- struct SmsVersionRes_ST *ver =
- (struct SmsVersionRes_ST *) phdr;
- sms_debug("MSG_SMS_GET_VERSION_EX_RES "
- "id %d prots 0x%x ver %d.%d",
- ver->FirmwareId, ver->SupportedProtocols,
- ver->RomVersionMajor, ver->RomVersionMinor);
-
- coredev->mode = ver->FirmwareId == 255 ?
- DEVICE_MODE_NONE : ver->FirmwareId;
- coredev->modes_supported = ver->SupportedProtocols;
-
- complete(&coredev->version_ex_done);
- break;
- }
- case MSG_SMS_INIT_DEVICE_RES:
- sms_debug("MSG_SMS_INIT_DEVICE_RES");
- complete(&coredev->init_device_done);
- break;
- case MSG_SW_RELOAD_START_RES:
- sms_debug("MSG_SW_RELOAD_START_RES");
- complete(&coredev->reload_start_done);
- break;
- case MSG_SMS_DATA_DOWNLOAD_RES:
- complete(&coredev->data_download_done);
- break;
- case MSG_SW_RELOAD_EXEC_RES:
- sms_debug("MSG_SW_RELOAD_EXEC_RES");
- break;
- case MSG_SMS_SWDOWNLOAD_TRIGGER_RES:
- sms_debug("MSG_SMS_SWDOWNLOAD_TRIGGER_RES");
- complete(&coredev->trigger_done);
- break;
- case MSG_SMS_SLEEP_RESUME_COMP_IND:
- complete(&coredev->resume_done);
- break;
- default:
- break;
- }
- smscore_putbuffer(coredev, cb);
- }
-}
-
-/**
- * return pointer to next free buffer descriptor from core pool
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- *
- * @return pointer to descriptor on success, NULL on error.
- */
-struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
-{
- struct smscore_buffer_t *cb = NULL;
- unsigned long flags;
-
- spin_lock_irqsave(&coredev->bufferslock, flags);
-
- if (!list_empty(&coredev->buffers)) {
- cb = (struct smscore_buffer_t *) coredev->buffers.next;
- list_del(&cb->entry);
- }
-
- spin_unlock_irqrestore(&coredev->bufferslock, flags);
-
- return cb;
-}
-
-/**
- * return buffer descriptor to a pool
- *
- * @param coredev pointer to a coredev object returned by
- * smscore_register_device
- * @param cb pointer buffer descriptor
- *
- */
-void smscore_putbuffer(struct smscore_device_t *coredev,
- struct smscore_buffer_t *cb)
-{
- list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock);
-}
-
-static int smscore_validate_client(struct smscore_device_t *coredev,
- struct smscore_client_t *client,
- int data_type, int id)
-{
- struct smscore_idlist_t *listentry;
- struct smscore_client_t *registered_client;
-
- if (!client) {
- sms_err("bad parameter.");
- return -EFAULT;
- }
- registered_client = smscore_find_client(coredev, data_type, id);
- if (registered_client == client)
- return 0;
-
- if (registered_client) {
- sms_err("The msg ID already registered to another client.");
- return -EEXIST;
- }
- listentry = kzalloc(sizeof(struct smscore_idlist_t), GFP_KERNEL);
- if (!listentry) {
- sms_err("Can't allocate memory for client id.");
- return -ENOMEM;
- }
- listentry->id = id;
- listentry->data_type = data_type;
- list_add_locked(&listentry->entry, &client->idlist,
- &coredev->clientslock);
- return 0;
-}
-
-/**
- * creates smsclient object, check that id is taken by another client
- *
- * @param coredev pointer to a coredev object from clients hotplug
- * @param initial_id all messages with this id would be sent to this client
- * @param data_type all messages of this type would be sent to this client
- * @param onresponse_handler client handler that is called to
- * process incoming messages
- * @param onremove_handler client handler that is called when device is removed
- * @param context client-specific context
- * @param client pointer to a value that receives created smsclient object
- *
- * @return 0 on success, <0 on error.
- */
-int smscore_register_client(struct smscore_device_t *coredev,
- struct smsclient_params_t *params,
- struct smscore_client_t **client)
-{
- struct smscore_client_t *newclient;
- /* check that no other channel with same parameters exists */
- if (smscore_find_client(coredev, params->data_type,
- params->initial_id)) {
- sms_err("Client already exist.");
- return -EEXIST;
- }
-
- newclient = kzalloc(sizeof(struct smscore_client_t), GFP_KERNEL);
- if (!newclient) {
- sms_err("Failed to allocate memory for client.");
- return -ENOMEM;
- }
-
- INIT_LIST_HEAD(&newclient->idlist);
- newclient->coredev = coredev;
- newclient->onresponse_handler = params->onresponse_handler;
- newclient->onremove_handler = params->onremove_handler;
- newclient->context = params->context;
- list_add_locked(&newclient->entry, &coredev->clients,
- &coredev->clientslock);
- smscore_validate_client(coredev, newclient, params->data_type,
- params->initial_id);
- *client = newclient;
- sms_debug("%p %d %d", params->context, params->data_type,
- params->initial_id);
-
- return 0;
-}
-
-/**
- * frees smsclient object and all subclients associated with it
- *
- * @param client pointer to smsclient object returned by
- * smscore_register_client
- *
- */
-void smscore_unregister_client(struct smscore_client_t *client)
-{
- struct smscore_device_t *coredev = client->coredev;
- unsigned long flags;
-
- spin_lock_irqsave(&coredev->clientslock, flags);
-
-
- while (!list_empty(&client->idlist)) {
- struct smscore_idlist_t *identry =
- (struct smscore_idlist_t *) client->idlist.next;
- list_del(&identry->entry);
- kfree(identry);
- }
-
- sms_info("%p", client->context);
-
- list_del(&client->entry);
- kfree(client);
-
- spin_unlock_irqrestore(&coredev->clientslock, flags);
-}
-
-/**
- * verifies that source id is not taken by another client,
- * calls device handler to send requests to the device
- *
- * @param client pointer to smsclient object returned by
- * smscore_register_client
- * @param buffer pointer to a request buffer
- * @param size size (in bytes) of request buffer
- *
- * @return 0 on success, <0 on error.
- */
-int smsclient_sendrequest(struct smscore_client_t *client,
- void *buffer, size_t size)
-{
- struct smscore_device_t *coredev;
- struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) buffer;
- int rc;
-
- if (client == NULL) {
- sms_err("Got NULL client");
- return -EINVAL;
- }
-
- coredev = client->coredev;
-
- /* check that no other channel with same id exists */
- if (coredev == NULL) {
- sms_err("Got NULL coredev");
- return -EINVAL;
- }
-
- rc = smscore_validate_client(client->coredev, client, 0,
- phdr->msgSrcId);
- if (rc < 0)
- return rc;
-
- return coredev->sendrequest_handler(coredev->context, buffer, size);
-}
-
-
-int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin,
- struct smscore_gpio_config *pinconfig)
-{
- struct {
- struct SmsMsgHdr_ST hdr;
- u32 data[6];
- } msg;
-
- if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
- msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
- msg.hdr.msgDstId = HIF_TASK;
- msg.hdr.msgFlags = 0;
- msg.hdr.msgType = MSG_SMS_GPIO_CONFIG_EX_REQ;
- msg.hdr.msgLength = sizeof(msg);
-
- msg.data[0] = pin;
- msg.data[1] = pinconfig->pullupdown;
-
- /* Convert slew rate for Nova: Fast(0) = 3 / Slow(1) = 0; */
- msg.data[2] = pinconfig->outputslewrate == 0 ? 3 : 0;
-
- switch (pinconfig->outputdriving) {
- case SMS_GPIO_OUTPUTDRIVING_16mA:
- msg.data[3] = 7; /* Nova - 16mA */
- break;
- case SMS_GPIO_OUTPUTDRIVING_12mA:
- msg.data[3] = 5; /* Nova - 11mA */
- break;
- case SMS_GPIO_OUTPUTDRIVING_8mA:
- msg.data[3] = 3; /* Nova - 7mA */
- break;
- case SMS_GPIO_OUTPUTDRIVING_4mA:
- default:
- msg.data[3] = 2; /* Nova - 4mA */
- break;
- }
-
- msg.data[4] = pinconfig->direction;
- msg.data[5] = 0;
- } else /* TODO: SMS_DEVICE_FAMILY1 */
- return -EINVAL;
-
- return coredev->sendrequest_handler(coredev->context,
- &msg, sizeof(msg));
-}
-
-int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level)
-{
- struct {
- struct SmsMsgHdr_ST hdr;
- u32 data[3];
- } msg;
-
- if (pin > MAX_GPIO_PIN_NUMBER)
- return -EINVAL;
-
- msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
- msg.hdr.msgDstId = HIF_TASK;
- msg.hdr.msgFlags = 0;
- msg.hdr.msgType = MSG_SMS_GPIO_SET_LEVEL_REQ;
- msg.hdr.msgLength = sizeof(msg);
-
- msg.data[0] = pin;
- msg.data[1] = level ? 1 : 0;
- msg.data[2] = 0;
-
- return coredev->sendrequest_handler(coredev->context,
- &msg, sizeof(msg));
-}
-
-static int __init smscore_module_init(void)
-{
- int rc = 0;
-
- INIT_LIST_HEAD(&g_smscore_notifyees);
- INIT_LIST_HEAD(&g_smscore_devices);
- kmutex_init(&g_smscore_deviceslock);
-
- INIT_LIST_HEAD(&g_smscore_registry);
- kmutex_init(&g_smscore_registrylock);
-
- /* USB Register */
- rc = smsusb_register();
-
- /* DVB Register */
- rc = smsdvb_register();
-
- sms_debug("rc %d", rc);
-
- return rc;
-}
-
-static void __exit smscore_module_exit(void)
-{
-
- kmutex_lock(&g_smscore_deviceslock);
- while (!list_empty(&g_smscore_notifyees)) {
- struct smscore_device_notifyee_t *notifyee =
- (struct smscore_device_notifyee_t *)
- g_smscore_notifyees.next;
-
- list_del(&notifyee->entry);
- kfree(notifyee);
- }
- kmutex_unlock(&g_smscore_deviceslock);
-
- kmutex_lock(&g_smscore_registrylock);
- while (!list_empty(&g_smscore_registry)) {
- struct smscore_registry_entry_t *entry =
- (struct smscore_registry_entry_t *)
- g_smscore_registry.next;
-
- list_del(&entry->entry);
- kfree(entry);
- }
- kmutex_unlock(&g_smscore_registrylock);
-
- /* DVB UnRegister */
- smsdvb_unregister();
-
- /* Unregister USB */
- smsusb_unregister();
-
- sms_debug("");
-}
-
-module_init(smscore_module_init);
-module_exit(smscore_module_exit);
-
-MODULE_DESCRIPTION("Driver for the Siano SMS1XXX USB dongle");
-MODULE_AUTHOR("Siano Mobile Silicon,,, (doronc@siano-ms.com)");
-MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/siano/smscoreapi.h b/drivers/media/dvb/siano/smscoreapi.h
deleted file mode 100644
index 760e233fcbc..00000000000
--- a/drivers/media/dvb/siano/smscoreapi.h
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Driver for the Siano SMS1xxx USB dongle
- *
- * author: Anatoly Greenblat
- *
- * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __smscoreapi_h__
-#define __smscoreapi_h__
-
-#include <linux/version.h>
-#include <linux/device.h>
-#include <linux/list.h>
-#include <linux/mm.h>
-#include <linux/scatterlist.h>
-#include <linux/types.h>
-#include <asm/page.h>
-
-#include "dmxdev.h"
-#include "dvbdev.h"
-#include "dvb_demux.h"
-#include "dvb_frontend.h"
-
-#include <linux/mutex.h>
-
-#define kmutex_init(_p_) mutex_init(_p_)
-#define kmutex_lock(_p_) mutex_lock(_p_)
-#define kmutex_trylock(_p_) mutex_trylock(_p_)
-#define kmutex_unlock(_p_) mutex_unlock(_p_)
-
-#ifndef min
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-#endif
-
-#define SMS_ALLOC_ALIGNMENT 128
-#define SMS_DMA_ALIGNMENT 16
-#define SMS_ALIGN_ADDRESS(addr) \
- ((((uintptr_t)(addr)) + (SMS_DMA_ALIGNMENT-1)) & ~(SMS_DMA_ALIGNMENT-1))
-
-#define SMS_DEVICE_FAMILY2 1
-#define SMS_ROM_NO_RESPONSE 2
-#define SMS_DEVICE_NOT_READY 0x8000000
-
-enum sms_device_type_st {
- SMS_STELLAR = 0,
- SMS_NOVA_A0,
- SMS_NOVA_B0,
- SMS_VEGA,
- SMS_NUM_OF_DEVICE_TYPES
-};
-
-struct smscore_device_t;
-struct smscore_client_t;
-struct smscore_buffer_t;
-
-typedef int (*hotplug_t)(struct smscore_device_t *coredev,
- struct device *device, int arrival);
-
-typedef int (*setmode_t)(void *context, int mode);
-typedef void (*detectmode_t)(void *context, int *mode);
-typedef int (*sendrequest_t)(void *context, void *buffer, size_t size);
-typedef int (*loadfirmware_t)(void *context, void *buffer, size_t size);
-typedef int (*preload_t)(void *context);
-typedef int (*postload_t)(void *context);
-
-typedef int (*onresponse_t)(void *context, struct smscore_buffer_t *cb);
-typedef void (*onremove_t)(void *context);
-
-struct smscore_buffer_t {
- /* public members, once passed to clients can be changed freely */
- struct list_head entry;
- int size;
- int offset;
-
- /* private members, read-only for clients */
- void *p;
- dma_addr_t phys;
- unsigned long offset_in_common;
-};
-
-struct smsdevice_params_t {
- struct device *device;
-
- int buffer_size;
- int num_buffers;
-
- char devpath[32];
- unsigned long flags;
-
- setmode_t setmode_handler;
- detectmode_t detectmode_handler;
- sendrequest_t sendrequest_handler;
- preload_t preload_handler;
- postload_t postload_handler;
-
- void *context;
- enum sms_device_type_st device_type;
-};
-
-struct smsclient_params_t {
- int initial_id;
- int data_type;
- onresponse_t onresponse_handler;
- onremove_t onremove_handler;
-
- void *context;
-};
-
-/* GPIO definitions for antenna frequency domain control (SMS8021) */
-#define SMS_ANTENNA_GPIO_0 1
-#define SMS_ANTENNA_GPIO_1 0
-
-#define BW_8_MHZ 0
-#define BW_7_MHZ 1
-#define BW_6_MHZ 2
-#define BW_5_MHZ 3
-#define BW_ISDBT_1SEG 4
-#define BW_ISDBT_3SEG 5
-
-#define MSG_HDR_FLAG_SPLIT_MSG 4
-
-#define MAX_GPIO_PIN_NUMBER 31
-
-#define HIF_TASK 11
-#define SMS_HOST_LIB 150
-#define DVBT_BDA_CONTROL_MSG_ID 201
-
-#define SMS_MAX_PAYLOAD_SIZE 240
-#define SMS_TUNE_TIMEOUT 500
-
-#define MSG_SMS_GPIO_CONFIG_REQ 507
-#define MSG_SMS_GPIO_CONFIG_RES 508
-#define MSG_SMS_GPIO_SET_LEVEL_REQ 509
-#define MSG_SMS_GPIO_SET_LEVEL_RES 510
-#define MSG_SMS_GPIO_GET_LEVEL_REQ 511
-#define MSG_SMS_GPIO_GET_LEVEL_RES 512
-#define MSG_SMS_RF_TUNE_REQ 561
-#define MSG_SMS_RF_TUNE_RES 562
-#define MSG_SMS_INIT_DEVICE_REQ 578
-#define MSG_SMS_INIT_DEVICE_RES 579
-#define MSG_SMS_ADD_PID_FILTER_REQ 601
-#define MSG_SMS_ADD_PID_FILTER_RES 602
-#define MSG_SMS_REMOVE_PID_FILTER_REQ 603
-#define MSG_SMS_REMOVE_PID_FILTER_RES 604
-#define MSG_SMS_DAB_CHANNEL 607
-#define MSG_SMS_GET_PID_FILTER_LIST_REQ 608
-#define MSG_SMS_GET_PID_FILTER_LIST_RES 609
-#define MSG_SMS_GET_STATISTICS_REQ 615
-#define MSG_SMS_GET_STATISTICS_RES 616
-#define MSG_SMS_SET_ANTENNA_CONFIG_REQ 651
-#define MSG_SMS_SET_ANTENNA_CONFIG_RES 652
-#define MSG_SMS_GET_STATISTICS_EX_REQ 653
-#define MSG_SMS_GET_STATISTICS_EX_RES 654
-#define MSG_SMS_SLEEP_RESUME_COMP_IND 655
-#define MSG_SMS_DATA_DOWNLOAD_REQ 660
-#define MSG_SMS_DATA_DOWNLOAD_RES 661
-#define MSG_SMS_SWDOWNLOAD_TRIGGER_REQ 664
-#define MSG_SMS_SWDOWNLOAD_TRIGGER_RES 665
-#define MSG_SMS_SWDOWNLOAD_BACKDOOR_REQ 666
-#define MSG_SMS_SWDOWNLOAD_BACKDOOR_RES 667
-#define MSG_SMS_GET_VERSION_EX_REQ 668
-#define MSG_SMS_GET_VERSION_EX_RES 669
-#define MSG_SMS_SET_CLOCK_OUTPUT_REQ 670
-#define MSG_SMS_I2C_SET_FREQ_REQ 685
-#define MSG_SMS_GENERIC_I2C_REQ 687
-#define MSG_SMS_GENERIC_I2C_RES 688
-#define MSG_SMS_DVBT_BDA_DATA 693
-#define MSG_SW_RELOAD_REQ 697
-#define MSG_SMS_DATA_MSG 699
-#define MSG_SW_RELOAD_START_REQ 702
-#define MSG_SW_RELOAD_START_RES 703
-#define MSG_SW_RELOAD_EXEC_REQ 704
-#define MSG_SW_RELOAD_EXEC_RES 705
-#define MSG_SMS_SPI_INT_LINE_SET_REQ 710
-#define MSG_SMS_GPIO_CONFIG_EX_REQ 712
-#define MSG_SMS_GPIO_CONFIG_EX_RES 713
-#define MSG_SMS_ISDBT_TUNE_REQ 776
-#define MSG_SMS_ISDBT_TUNE_RES 777
-
-#define SMS_INIT_MSG_EX(ptr, type, src, dst, len) do { \
- (ptr)->msgType = type; (ptr)->msgSrcId = src; (ptr)->msgDstId = dst; \
- (ptr)->msgLength = len; (ptr)->msgFlags = 0; \
-} while (0)
-#define SMS_INIT_MSG(ptr, type, len) \
- SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len)
-
-enum SMS_DEVICE_MODE {
- DEVICE_MODE_NONE = -1,
- DEVICE_MODE_DVBT = 0,
- DEVICE_MODE_DVBH,
- DEVICE_MODE_DAB_TDMB,
- DEVICE_MODE_DAB_TDMB_DABIP,
- DEVICE_MODE_DVBT_BDA,
- DEVICE_MODE_ISDBT,
- DEVICE_MODE_ISDBT_BDA,
- DEVICE_MODE_CMMB,
- DEVICE_MODE_RAW_TUNER,
- DEVICE_MODE_MAX,
-};
-
-struct SmsMsgHdr_ST {
- u16 msgType;
- u8 msgSrcId;
- u8 msgDstId;
- u16 msgLength; /* Length of entire message, including header */
- u16 msgFlags;
-};
-
-struct SmsMsgData_ST {
- struct SmsMsgHdr_ST xMsgHeader;
- u32 msgData[1];
-};
-
-struct SmsDataDownload_ST {
- struct SmsMsgHdr_ST xMsgHeader;
- u32 MemAddr;
- u8 Payload[SMS_MAX_PAYLOAD_SIZE];
-};
-
-struct SmsVersionRes_ST {
- struct SmsMsgHdr_ST xMsgHeader;
-
- u16 ChipModel; /* e.g. 0x1102 for SMS-1102 "Nova" */
- u8 Step; /* 0 - Step A */
- u8 MetalFix; /* 0 - Metal 0 */
-
- u8 FirmwareId; /* 0xFF � ROM, otherwise the
- * value indicated by
- * SMSHOSTLIB_DEVICE_MODES_E */
- u8 SupportedProtocols; /* Bitwise OR combination of
- * supported protocols */
-
- u8 VersionMajor;
- u8 VersionMinor;
- u8 VersionPatch;
- u8 VersionFieldPatch;
-
- u8 RomVersionMajor;
- u8 RomVersionMinor;
- u8 RomVersionPatch;
- u8 RomVersionFieldPatch;
-
- u8 TextLabel[34];
-};
-
-struct SmsFirmware_ST {
- u32 CheckSum;
- u32 Length;
- u32 StartAddress;
- u8 Payload[1];
-};
-
-struct SMSHOSTLIB_STATISTICS_ST {
- u32 Reserved; /* Reserved */
-
- /* Common parameters */
- u32 IsRfLocked; /* 0 - not locked, 1 - locked */
- u32 IsDemodLocked; /* 0 - not locked, 1 - locked */
- u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */
-
- /* Reception quality */
- s32 SNR; /* dB */
- u32 BER; /* Post Viterbi BER [1E-5] */
- u32 FIB_CRC; /* CRC errors percentage, valid only for DAB */
- u32 TS_PER; /* Transport stream PER, 0xFFFFFFFF indicate N/A,
- * valid only for DVB-T/H */
- u32 MFER; /* DVB-H frame error rate in percentage,
- * 0xFFFFFFFF indicate N/A, valid only for DVB-H */
- s32 RSSI; /* dBm */
- s32 InBandPwr; /* In band power in dBM */
- s32 CarrierOffset; /* Carrier Offset in bin/1024 */
-
- /* Transmission parameters, valid only for DVB-T/H */
- u32 Frequency; /* Frequency in Hz */
- u32 Bandwidth; /* Bandwidth in MHz */
- u32 TransmissionMode; /* Transmission Mode, for DAB modes 1-4,
- * for DVB-T/H FFT mode carriers in Kilos */
- u32 ModemState; /* from SMS_DvbModemState_ET */
- u32 GuardInterval; /* Guard Interval, 1 divided by value */
- u32 CodeRate; /* Code Rate from SMS_DvbModemState_ET */
- u32 LPCodeRate; /* Low Priority Code Rate from SMS_DvbModemState_ET */
- u32 Hierarchy; /* Hierarchy from SMS_Hierarchy_ET */
- u32 Constellation; /* Constellation from SMS_Constellation_ET */
-
- /* Burst parameters, valid only for DVB-H */
- u32 BurstSize; /* Current burst size in bytes */
- u32 BurstDuration; /* Current burst duration in mSec */
- u32 BurstCycleTime; /* Current burst cycle time in mSec */
- u32 CalculatedBurstCycleTime; /* Current burst cycle time in mSec,
- * as calculated by demodulator */
- u32 NumOfRows; /* Number of rows in MPE table */
- u32 NumOfPaddCols; /* Number of padding columns in MPE table */
- u32 NumOfPunctCols; /* Number of puncturing columns in MPE table */
- /* Burst parameters */
- u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */
- u32 TotalTSPackets; /* Total number of transport-stream packets */
- u32 NumOfValidMpeTlbs; /* Number of MPE tables which do not include
- * errors after MPE RS decoding */
- u32 NumOfInvalidMpeTlbs; /* Number of MPE tables which include errors
- * after MPE RS decoding */
- u32 NumOfCorrectedMpeTlbs; /* Number of MPE tables which were corrected
- * by MPE RS decoding */
-
- /* Common params */
- u32 BERErrorCount; /* Number of errornous SYNC bits. */
- u32 BERBitCount; /* Total number of SYNC bits. */
-
- /* Interface information */
- u32 SmsToHostTxErrors; /* Total number of transmission errors. */
-
- /* DAB/T-DMB */
- u32 PreBER; /* DAB/T-DMB only: Pre Viterbi BER [1E-5] */
-
- /* DVB-H TPS parameters */
- u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero;
- * if set to 0xFFFFFFFF cell_id not yet recovered */
-
-};
-
-struct SmsMsgStatisticsInfo_ST {
- u32 RequestResult;
-
- struct SMSHOSTLIB_STATISTICS_ST Stat;
-
- /* Split the calc of the SNR in DAB */
- u32 Signal; /* dB */
- u32 Noise; /* dB */
-
-};
-
-
-struct smscore_gpio_config {
-#define SMS_GPIO_DIRECTION_INPUT 0
-#define SMS_GPIO_DIRECTION_OUTPUT 1
- u8 direction;
-
-#define SMS_GPIO_PULLUPDOWN_NONE 0
-#define SMS_GPIO_PULLUPDOWN_PULLDOWN 1
-#define SMS_GPIO_PULLUPDOWN_PULLUP 2
-#define SMS_GPIO_PULLUPDOWN_KEEPER 3
- u8 pullupdown;
-
-#define SMS_GPIO_INPUTCHARACTERISTICS_NORMAL 0
-#define SMS_GPIO_INPUTCHARACTERISTICS_SCHMITT 1
- u8 inputcharacteristics;
-
-#define SMS_GPIO_OUTPUTSLEWRATE_FAST 0
-#define SMS_GPIO_OUTPUTSLEWRATE_SLOW 1
- u8 outputslewrate;
-
-#define SMS_GPIO_OUTPUTDRIVING_4mA 0
-#define SMS_GPIO_OUTPUTDRIVING_8mA 1
-#define SMS_GPIO_OUTPUTDRIVING_12mA 2
-#define SMS_GPIO_OUTPUTDRIVING_16mA 3
- u8 outputdriving;
-};
-
-struct smsdvb_client_t {
- struct list_head entry;
-
- struct smscore_device_t *coredev;
- struct smscore_client_t *smsclient;
-
- struct dvb_adapter adapter;
- struct dvb_demux demux;
- struct dmxdev dmxdev;
- struct dvb_frontend frontend;
-
- fe_status_t fe_status;
- int fe_ber, fe_snr, fe_unc, fe_signal_strength;
-
- struct completion tune_done, stat_done;
-
- /* todo: save freq/band instead whole struct */
- struct dvb_frontend_parameters fe_params;
-
-};
-
-extern void smscore_registry_setmode(char *devpath, int mode);
-extern int smscore_registry_getmode(char *devpath);
-
-extern int smscore_register_hotplug(hotplug_t hotplug);
-extern void smscore_unregister_hotplug(hotplug_t hotplug);
-
-extern int smscore_register_device(struct smsdevice_params_t *params,
- struct smscore_device_t **coredev);
-extern void smscore_unregister_device(struct smscore_device_t *coredev);
-
-extern int smscore_start_device(struct smscore_device_t *coredev);
-extern int smscore_load_firmware(struct smscore_device_t *coredev,
- char *filename,
- loadfirmware_t loadfirmware_handler);
-
-extern int smscore_set_device_mode(struct smscore_device_t *coredev, int mode);
-extern int smscore_get_device_mode(struct smscore_device_t *coredev);
-
-extern int smscore_register_client(struct smscore_device_t *coredev,
- struct smsclient_params_t *params,
- struct smscore_client_t **client);
-extern void smscore_unregister_client(struct smscore_client_t *client);
-
-extern int smsclient_sendrequest(struct smscore_client_t *client,
- void *buffer, size_t size);
-extern void smscore_onresponse(struct smscore_device_t *coredev,
- struct smscore_buffer_t *cb);
-
-
-extern
-struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev);
-extern void smscore_putbuffer(struct smscore_device_t *coredev,
- struct smscore_buffer_t *cb);
-
-int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin,
- struct smscore_gpio_config *pinconfig);
-int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level);
-
-void smscore_set_board_id(struct smscore_device_t *core, int id);
-int smscore_get_board_id(struct smscore_device_t *core);
-
-int smscore_led_state(struct smscore_device_t *core, int led);
-
-/* smsdvb.c */
-int smsdvb_register(void);
-void smsdvb_unregister(void);
-
-/* smsusb.c */
-int smsusb_register(void);
-void smsusb_unregister(void);
-
-/* ------------------------------------------------------------------------ */
-
-extern int sms_debug;
-
-#define DBG_INFO 1
-#define DBG_ADV 2
-
-#define sms_printk(kern, fmt, arg...) \
- printk(kern "%s: " fmt "\n", __func__, ##arg)
-
-#define dprintk(kern, lvl, fmt, arg...) do {\
- if (sms_debug & lvl) \
- sms_printk(kern, fmt, ##arg); } while (0)
-
-#define sms_log(fmt, arg...) sms_printk(KERN_INFO, fmt, ##arg)
-#define sms_err(fmt, arg...) \
- sms_printk(KERN_ERR, "line: %d: " fmt, __LINE__, ##arg)
-#define sms_warn(fmt, arg...) sms_printk(KERN_WARNING, fmt, ##arg)
-#define sms_info(fmt, arg...) \
- dprintk(KERN_INFO, DBG_INFO, fmt, ##arg)
-#define sms_debug(fmt, arg...) \
- dprintk(KERN_DEBUG, DBG_ADV, fmt, ##arg)
-
-
-#endif /* __smscoreapi_h__ */
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c
deleted file mode 100644
index 2da953a4f4f..00000000000
--- a/drivers/media/dvb/siano/smsdvb.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Driver for the Siano SMS1xxx USB dongle
- *
- * author: Anatoly Greenblat
- *
- * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include "smscoreapi.h"
-#include "sms-cards.h"
-
-DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
-
-static struct list_head g_smsdvb_clients;
-static struct mutex g_smsdvb_clientslock;
-
-static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
-{
- struct smsdvb_client_t *client = (struct smsdvb_client_t *) context;
- struct SmsMsgHdr_ST *phdr =
- (struct SmsMsgHdr_ST *)(((u8 *) cb->p) + cb->offset);
-
- switch (phdr->msgType) {
- case MSG_SMS_DVBT_BDA_DATA:
- dvb_dmx_swfilter(&client->demux, (u8 *)(phdr + 1),
- cb->size - sizeof(struct SmsMsgHdr_ST));
- break;
-
- case MSG_SMS_RF_TUNE_RES:
- complete(&client->tune_done);
- break;
-
- case MSG_SMS_GET_STATISTICS_RES:
- {
- struct SmsMsgStatisticsInfo_ST *p =
- (struct SmsMsgStatisticsInfo_ST *)(phdr + 1);
-
- if (p->Stat.IsDemodLocked) {
- client->fe_status = FE_HAS_SIGNAL |
- FE_HAS_CARRIER |
- FE_HAS_VITERBI |
- FE_HAS_SYNC |
- FE_HAS_LOCK;
-
- client->fe_snr = p->Stat.SNR;
- client->fe_ber = p->Stat.BER;
- client->fe_unc = p->Stat.BERErrorCount;
-
- if (p->Stat.InBandPwr < -95)
- client->fe_signal_strength = 0;
- else if (p->Stat.InBandPwr > -29)
- client->fe_signal_strength = 100;
- else
- client->fe_signal_strength =
- (p->Stat.InBandPwr + 95) * 3 / 2;
- } else {
- client->fe_status = 0;
- client->fe_snr =
- client->fe_ber =
- client->fe_unc =
- client->fe_signal_strength = 0;
- }
-
- complete(&client->stat_done);
- break;
- } }
-
- smscore_putbuffer(client->coredev, cb);
-
- return 0;
-}
-
-static void smsdvb_unregister_client(struct smsdvb_client_t *client)
-{
- /* must be called under clientslock */
-
- list_del(&client->entry);
-
- smscore_unregister_client(client->smsclient);
- dvb_unregister_frontend(&client->frontend);
- dvb_dmxdev_release(&client->dmxdev);
- dvb_dmx_release(&client->demux);
- dvb_unregister_adapter(&client->adapter);
- kfree(client);
-}
-
-static void smsdvb_onremove(void *context)
-{
- kmutex_lock(&g_smsdvb_clientslock);
-
- smsdvb_unregister_client((struct smsdvb_client_t *) context);
-
- kmutex_unlock(&g_smsdvb_clientslock);
-}
-
-static int smsdvb_start_feed(struct dvb_demux_feed *feed)
-{
- struct smsdvb_client_t *client =
- container_of(feed->demux, struct smsdvb_client_t, demux);
- struct SmsMsgData_ST PidMsg;
-
- sms_debug("add pid %d(%x)",
- feed->pid, feed->pid);
-
- PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
- PidMsg.xMsgHeader.msgDstId = HIF_TASK;
- PidMsg.xMsgHeader.msgFlags = 0;
- PidMsg.xMsgHeader.msgType = MSG_SMS_ADD_PID_FILTER_REQ;
- PidMsg.xMsgHeader.msgLength = sizeof(PidMsg);
- PidMsg.msgData[0] = feed->pid;
-
- return smsclient_sendrequest(client->smsclient,
- &PidMsg, sizeof(PidMsg));
-}
-
-static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
-{
- struct smsdvb_client_t *client =
- container_of(feed->demux, struct smsdvb_client_t, demux);
- struct SmsMsgData_ST PidMsg;
-
- sms_debug("remove pid %d(%x)",
- feed->pid, feed->pid);
-
- PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
- PidMsg.xMsgHeader.msgDstId = HIF_TASK;
- PidMsg.xMsgHeader.msgFlags = 0;
- PidMsg.xMsgHeader.msgType = MSG_SMS_REMOVE_PID_FILTER_REQ;
- PidMsg.xMsgHeader.msgLength = sizeof(PidMsg);
- PidMsg.msgData[0] = feed->pid;
-
- return smsclient_sendrequest(client->smsclient,
- &PidMsg, sizeof(PidMsg));
-}
-
-static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client,
- void *buffer, size_t size,
- struct completion *completion)
-{
- int rc = smsclient_sendrequest(client->smsclient, buffer, size);
- if (rc < 0)
- return rc;
-
- return wait_for_completion_timeout(completion,
- msecs_to_jiffies(2000)) ?
- 0 : -ETIME;
-}
-
-static int smsdvb_send_statistics_request(struct smsdvb_client_t *client)
-{
- struct SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ,
- DVBT_BDA_CONTROL_MSG_ID,
- HIF_TASK, sizeof(struct SmsMsgHdr_ST), 0 };
- int ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
- &client->stat_done);
- if (ret < 0)
- return ret;
-
- if (client->fe_status & FE_HAS_LOCK)
- sms_board_led_feedback(client->coredev,
- (client->fe_unc == 0) ?
- SMS_LED_HI : SMS_LED_LO);
- else
- sms_board_led_feedback(client->coredev, SMS_LED_OFF);
- return ret;
-}
-
-static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
- int rc = smsdvb_send_statistics_request(client);
-
- if (!rc)
- *stat = client->fe_status;
-
- return rc;
-}
-
-static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
- int rc = smsdvb_send_statistics_request(client);
-
- if (!rc)
- *ber = client->fe_ber;
-
- return rc;
-}
-
-static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
- int rc = smsdvb_send_statistics_request(client);
-
- if (!rc)
- *strength = client->fe_signal_strength;
-
- return rc;
-}
-
-static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
- int rc = smsdvb_send_statistics_request(client);
-
- if (!rc)
- *snr = client->fe_snr;
-
- return rc;
-}
-
-static int smsdvb_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
- int rc = smsdvb_send_statistics_request(client);
-
- if (!rc)
- *ucblocks = client->fe_unc;
-
- return rc;
-}
-
-static int smsdvb_get_tune_settings(struct dvb_frontend *fe,
- struct dvb_frontend_tune_settings *tune)
-{
- sms_debug("");
-
- tune->min_delay_ms = 400;
- tune->step_size = 250000;
- tune->max_drift = 0;
- return 0;
-}
-
-static int smsdvb_set_frontend(struct dvb_frontend *fe,
- struct dvb_frontend_parameters *fep)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
-
- struct {
- struct SmsMsgHdr_ST Msg;
- u32 Data[3];
- } Msg;
-
- Msg.Msg.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
- Msg.Msg.msgDstId = HIF_TASK;
- Msg.Msg.msgFlags = 0;
- Msg.Msg.msgType = MSG_SMS_RF_TUNE_REQ;
- Msg.Msg.msgLength = sizeof(Msg);
- Msg.Data[0] = fep->frequency;
- Msg.Data[2] = 12000000;
-
- sms_debug("freq %d band %d",
- fep->frequency, fep->u.ofdm.bandwidth);
-
- switch (fep->u.ofdm.bandwidth) {
- case BANDWIDTH_8_MHZ: Msg.Data[1] = BW_8_MHZ; break;
- case BANDWIDTH_7_MHZ: Msg.Data[1] = BW_7_MHZ; break;
- case BANDWIDTH_6_MHZ: Msg.Data[1] = BW_6_MHZ; break;
- case BANDWIDTH_AUTO: return -EOPNOTSUPP;
- default: return -EINVAL;
- }
-
- return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
- &client->tune_done);
-}
-
-static int smsdvb_get_frontend(struct dvb_frontend *fe,
- struct dvb_frontend_parameters *fep)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
-
- sms_debug("");
-
- /* todo: */
- memcpy(fep, &client->fe_params,
- sizeof(struct dvb_frontend_parameters));
-
- return 0;
-}
-
-static int smsdvb_init(struct dvb_frontend *fe)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
-
- sms_board_power(client->coredev, 1);
-
- return 0;
-}
-
-static int smsdvb_sleep(struct dvb_frontend *fe)
-{
- struct smsdvb_client_t *client =
- container_of(fe, struct smsdvb_client_t, frontend);
-
- sms_board_led_feedback(client->coredev, SMS_LED_OFF);
- sms_board_power(client->coredev, 0);
-
- return 0;
-}
-
-static void smsdvb_release(struct dvb_frontend *fe)
-{
- /* do nothing */
-}
-
-static struct dvb_frontend_ops smsdvb_fe_ops = {
- .info = {
- .name = "Siano Mobile Digital SMS1xxx",
- .type = FE_OFDM,
- .frequency_min = 44250000,
- .frequency_max = 867250000,
- .frequency_stepsize = 250000,
- .caps = FE_CAN_INVERSION_AUTO |
- FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
- FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
- FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO |
- FE_CAN_GUARD_INTERVAL_AUTO |
- FE_CAN_RECOVER |
- FE_CAN_HIERARCHY_AUTO,
- },
-
- .release = smsdvb_release,
-
- .set_frontend = smsdvb_set_frontend,
- .get_frontend = smsdvb_get_frontend,
- .get_tune_settings = smsdvb_get_tune_settings,
-
- .read_status = smsdvb_read_status,
- .read_ber = smsdvb_read_ber,
- .read_signal_strength = smsdvb_read_signal_strength,
- .read_snr = smsdvb_read_snr,
- .read_ucblocks = smsdvb_read_ucblocks,
-
- .init = smsdvb_init,
- .sleep = smsdvb_sleep,
-};
-
-static int smsdvb_hotplug(struct smscore_device_t *coredev,
- struct device *device, int arrival)
-{
- struct smsclient_params_t params;
- struct smsdvb_client_t *client;
- int rc;
-
- /* device removal handled by onremove callback */
- if (!arrival)
- return 0;
-
- if (smscore_get_device_mode(coredev) != 4) {
- sms_err("SMS Device mode is not set for "
- "DVB operation.");
- return 0;
- }
-
- client = kzalloc(sizeof(struct smsdvb_client_t), GFP_KERNEL);
- if (!client) {
- sms_err("kmalloc() failed");
- return -ENOMEM;
- }
-
- /* register dvb adapter */
- rc = dvb_register_adapter(&client->adapter,
- sms_get_board(
- smscore_get_board_id(coredev))->name,
- THIS_MODULE, device, adapter_nr);
- if (rc < 0) {
- sms_err("dvb_register_adapter() failed %d", rc);
- goto adapter_error;
- }
-
- /* init dvb demux */
- client->demux.dmx.capabilities = DMX_TS_FILTERING;
- client->demux.filternum = 32; /* todo: nova ??? */
- client->demux.feednum = 32;
- client->demux.start_feed = smsdvb_start_feed;
- client->demux.stop_feed = smsdvb_stop_feed;
-
- rc = dvb_dmx_init(&client->demux);
- if (rc < 0) {
- sms_err("dvb_dmx_init failed %d", rc);
- goto dvbdmx_error;
- }
-
- /* init dmxdev */
- client->dmxdev.filternum = 32;
- client->dmxdev.demux = &client->demux.dmx;
- client->dmxdev.capabilities = 0;
-
- rc = dvb_dmxdev_init(&client->dmxdev, &client->adapter);
- if (rc < 0) {
- sms_err("dvb_dmxdev_init failed %d", rc);
- goto dmxdev_error;
- }
-
- /* init and register frontend */
- memcpy(&client->frontend.ops, &smsdvb_fe_ops,
- sizeof(struct dvb_frontend_ops));
-
- rc = dvb_register_frontend(&client->adapter, &client->frontend);
- if (rc < 0) {
- sms_err("frontend registration failed %d", rc);
- goto frontend_error;
- }
-
- params.initial_id = 1;
- params.data_type = MSG_SMS_DVBT_BDA_DATA;
- params.onresponse_handler = smsdvb_onresponse;
- params.onremove_handler = smsdvb_onremove;
- params.context = client;
-
- rc = smscore_register_client(coredev, &params, &client->smsclient);
- if (rc < 0) {
- sms_err("smscore_register_client() failed %d", rc);
- goto client_error;
- }
-
- client->coredev = coredev;
-
- init_completion(&client->tune_done);
- init_completion(&client->stat_done);
-
- kmutex_lock(&g_smsdvb_clientslock);
-
- list_add(&client->entry, &g_smsdvb_clients);
-
- kmutex_unlock(&g_smsdvb_clientslock);
-
- sms_info("success");
-
- sms_board_setup(coredev);
-
- return 0;
-
-client_error:
- dvb_unregister_frontend(&client->frontend);
-
-frontend_error:
- dvb_dmxdev_release(&client->dmxdev);
-
-dmxdev_error:
- dvb_dmx_release(&client->demux);
-
-dvbdmx_error:
- dvb_unregister_adapter(&client->adapter);
-
-adapter_error:
- kfree(client);
- return rc;
-}
-
-int smsdvb_register(void)
-{
- int rc;
-
- INIT_LIST_HEAD(&g_smsdvb_clients);
- kmutex_init(&g_smsdvb_clientslock);
-
- rc = smscore_register_hotplug(smsdvb_hotplug);
-
- sms_debug("");
-
- return rc;
-}
-
-void smsdvb_unregister(void)
-{
- smscore_unregister_hotplug(smsdvb_hotplug);
-
- kmutex_lock(&g_smsdvb_clientslock);
-
- while (!list_empty(&g_smsdvb_clients))
- smsdvb_unregister_client(
- (struct smsdvb_client_t *) g_smsdvb_clients.next);
-
- kmutex_unlock(&g_smsdvb_clientslock);
-}
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c
deleted file mode 100644
index 5d7ca341771..00000000000
--- a/drivers/media/dvb/siano/smsusb.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * Driver for the Siano SMS1xxx USB dongle
- *
- * author: Anatoly Greenblat
- *
- * Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
- *
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/usb.h>
-#include <linux/firmware.h>
-
-#include "smscoreapi.h"
-#include "sms-cards.h"
-
-#define USB1_BUFFER_SIZE 0x1000
-#define USB2_BUFFER_SIZE 0x4000
-
-#define MAX_BUFFERS 50
-#define MAX_URBS 10
-
-struct smsusb_device_t;
-
-struct smsusb_urb_t {
- struct smscore_buffer_t *cb;
- struct smsusb_device_t *dev;
-
- struct urb urb;
-};
-
-struct smsusb_device_t {
- struct usb_device *udev;
- struct smscore_device_t *coredev;
-
- struct smsusb_urb_t surbs[MAX_URBS];
-
- int response_alignment;
- int buffer_size;
-};
-
-static int smsusb_submit_urb(struct smsusb_device_t *dev,
- struct smsusb_urb_t *surb);
-
-static void smsusb_onresponse(struct urb *urb)
-{
- struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
- struct smsusb_device_t *dev = surb->dev;
-
- if (urb->status < 0) {
- sms_err("error, urb status %d, %d bytes",
- urb->status, urb->actual_length);
- return;
- }
-
- if (urb->actual_length > 0) {
- struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) surb->cb->p;
-
- if (urb->actual_length >= phdr->msgLength) {
- surb->cb->size = phdr->msgLength;
-
- 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) {
- sms_err("invalid response "
- "msglen %d offset %d "
- "size %d",
- phdr->msgLength,
- surb->cb->offset,
- urb->actual_length);
- goto exit_and_resubmit;
- }
-
- /* move buffer pointer and
- * copy header to its new location */
- memcpy((char *) phdr + surb->cb->offset,
- phdr, sizeof(struct SmsMsgHdr_ST));
- } else
- surb->cb->offset = 0;
-
- smscore_onresponse(dev->coredev, surb->cb);
- surb->cb = NULL;
- } else {
- sms_err("invalid response "
- "msglen %d actual %d",
- phdr->msgLength, urb->actual_length);
- }
- }
-
-exit_and_resubmit:
- smsusb_submit_urb(dev, surb);
-}
-
-static int smsusb_submit_urb(struct smsusb_device_t *dev,
- struct smsusb_urb_t *surb)
-{
- if (!surb->cb) {
- surb->cb = smscore_getbuffer(dev->coredev);
- if (!surb->cb) {
- sms_err("smscore_getbuffer(...) returned NULL");
- return -ENOMEM;
- }
- }
-
- usb_fill_bulk_urb(
- &surb->urb,
- dev->udev,
- usb_rcvbulkpipe(dev->udev, 0x81),
- 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);
-}
-
-static void smsusb_stop_streaming(struct smsusb_device_t *dev)
-{
- int i;
-
- for (i = 0; i < MAX_URBS; i++) {
- usb_kill_urb(&dev->surbs[i].urb);
-
- if (dev->surbs[i].cb) {
- smscore_putbuffer(dev->coredev, dev->surbs[i].cb);
- dev->surbs[i].cb = NULL;
- }
- }
-}
-
-static int smsusb_start_streaming(struct smsusb_device_t *dev)
-{
- int i, rc;
-
- for (i = 0; i < MAX_URBS; i++) {
- rc = smsusb_submit_urb(dev, &dev->surbs[i]);
- if (rc < 0) {
- sms_err("smsusb_submit_urb(...) failed");
- smsusb_stop_streaming(dev);
- break;
- }
- }
-
- return rc;
-}
-
-static int smsusb_sendrequest(void *context, void *buffer, size_t size)
-{
- struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
- int dummy;
-
- return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
- buffer, size, &dummy, 1000);
-}
-
-static char *smsusb1_fw_lkup[] = {
- "dvbt_stellar_usb.inp",
- "dvbh_stellar_usb.inp",
- "tdmb_stellar_usb.inp",
- "none",
- "dvbt_bda_stellar_usb.inp",
-};
-
-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)
-{
- const struct firmware *fw;
- u8 *fw_buffer;
- int rc, dummy;
- char *fw_filename;
-
- if (id < DEVICE_MODE_DVBT || id > DEVICE_MODE_DVBT_BDA) {
- sms_err("invalid firmware id specified %d", id);
- return -EINVAL;
- }
-
- fw_filename = sms_get_fw_name(id, board_id);
-
- rc = request_firmware(&fw, fw_filename, &udev->dev);
- if (rc < 0) {
- 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;
- }
- }
-
- fw_buffer = kmalloc(fw->size, GFP_KERNEL);
- if (fw_buffer) {
- memcpy(fw_buffer, fw->data, fw->size);
-
- rc = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 2),
- fw_buffer, fw->size, &dummy, 1000);
-
- sms_info("sent %zd(%d) bytes, rc %d", fw->size, dummy, rc);
-
- kfree(fw_buffer);
- } else {
- sms_err("failed to allocate firmware buffer");
- rc = -ENOMEM;
- }
- sms_info("read FW %s, size=%zd", fw_filename, fw->size);
-
- release_firmware(fw);
-
- return rc;
-}
-
-static void smsusb1_detectmode(void *context, int *mode)
-{
- char *product_string =
- ((struct smsusb_device_t *) context)->udev->product;
-
- *mode = DEVICE_MODE_NONE;
-
- if (!product_string) {
- product_string = "none";
- sms_err("product string not found");
- } 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;
-
- sms_info("%d \"%s\"", *mode, product_string);
-}
-
-static int smsusb1_setmode(void *context, int mode)
-{
- struct SmsMsgHdr_ST Msg = { MSG_SW_RELOAD_REQ, 0, HIF_TASK,
- sizeof(struct SmsMsgHdr_ST), 0 };
-
- if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
- sms_err("invalid firmware id specified %d", mode);
- return -EINVAL;
- }
-
- return smsusb_sendrequest(context, &Msg, sizeof(Msg));
-}
-
-static void smsusb_term_device(struct usb_interface *intf)
-{
- struct smsusb_device_t *dev =
- (struct smsusb_device_t *) usb_get_intfdata(intf);
-
- if (dev) {
- smsusb_stop_streaming(dev);
-
- /* unregister from smscore */
- if (dev->coredev)
- smscore_unregister_device(dev->coredev);
-
- kfree(dev);
-
- sms_info("device %p destroyed", dev);
- }
-
- usb_set_intfdata(intf, NULL);
-}
-
-static int smsusb_init_device(struct usb_interface *intf, int board_id)
-{
- struct smsdevice_params_t params;
- struct smsusb_device_t *dev;
- int i, rc;
-
- /* create device object */
- dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
- if (!dev) {
- sms_err("kzalloc(sizeof(struct smsusb_device_t) failed");
- return -ENOMEM;
- }
-
- memset(&params, 0, sizeof(params));
- usb_set_intfdata(intf, dev);
- dev->udev = interface_to_usbdev(intf);
-
- params.device_type = sms_get_board(board_id)->type;
-
- switch (params.device_type) {
- case SMS_STELLAR:
- dev->buffer_size = USB1_BUFFER_SIZE;
-
- params.setmode_handler = smsusb1_setmode;
- params.detectmode_handler = smsusb1_detectmode;
- break;
- default:
- sms_err("Unspecified sms device type!");
- /* fall-thru */
- case SMS_NOVA_A0:
- case SMS_NOVA_B0:
- case SMS_VEGA:
- dev->buffer_size = USB2_BUFFER_SIZE;
- dev->response_alignment =
- dev->udev->ep_in[1]->desc.wMaxPacketSize -
- sizeof(struct SmsMsgHdr_ST);
-
- params.flags |= SMS_DEVICE_FAMILY2;
- break;
- }
-
- params.device = &dev->udev->dev;
- params.buffer_size = dev->buffer_size;
- params.num_buffers = MAX_BUFFERS;
- params.sendrequest_handler = smsusb_sendrequest;
- params.context = dev;
- snprintf(params.devpath, sizeof(params.devpath),
- "usb\\%d-%s", dev->udev->bus->busnum, dev->udev->devpath);
-
- /* register in smscore */
- rc = smscore_register_device(&params, &dev->coredev);
- if (rc < 0) {
- sms_err("smscore_register_device(...) failed, rc %d", rc);
- smsusb_term_device(intf);
- return rc;
- }
-
- smscore_set_board_id(dev->coredev, board_id);
-
- /* initialize urbs */
- for (i = 0; i < MAX_URBS; i++) {
- dev->surbs[i].dev = dev;
- usb_init_urb(&dev->surbs[i].urb);
- }
-
- sms_info("smsusb_start_streaming(...).");
- rc = smsusb_start_streaming(dev);
- if (rc < 0) {
- sms_err("smsusb_start_streaming(...) failed");
- smsusb_term_device(intf);
- return rc;
- }
-
- rc = smscore_start_device(dev->coredev);
- if (rc < 0) {
- sms_err("smscore_start_device(...) failed");
- smsusb_term_device(intf);
- return rc;
- }
-
- sms_info("device %p created", dev);
-
- return rc;
-}
-
-static int smsusb_probe(struct usb_interface *intf,
- const struct usb_device_id *id)
-{
- struct usb_device *udev = interface_to_usbdev(intf);
- char devpath[32];
- int i, rc;
-
- rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
- rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
-
- if (intf->num_altsetting > 0) {
- rc = usb_set_interface(
- udev, intf->cur_altsetting->desc.bInterfaceNumber, 0);
- if (rc < 0) {
- sms_err("usb_set_interface failed, rc %d", rc);
- return rc;
- }
- }
-
- sms_info("smsusb_probe %d",
- intf->cur_altsetting->desc.bInterfaceNumber);
- for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
- sms_info("endpoint %d %02x %02x %d", i,
- intf->cur_altsetting->endpoint[i].desc.bEndpointAddress,
- intf->cur_altsetting->endpoint[i].desc.bmAttributes,
- intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
-
- if ((udev->actconfig->desc.bNumInterfaces == 2) &&
- (intf->cur_altsetting->desc.bInterfaceNumber == 0)) {
- sms_err("rom interface 0 is not used");
- return -ENODEV;
- }
-
- if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
- 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);
- }
-
- rc = smsusb_init_device(intf, id->driver_info);
- sms_info("rc %d", rc);
- return rc;
-}
-
-static void smsusb_disconnect(struct usb_interface *intf)
-{
- smsusb_term_device(intf);
-}
-
-static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
-{
- struct smsusb_device_t *dev =
- (struct smsusb_device_t *)usb_get_intfdata(intf);
- printk(KERN_INFO "%s Entering status %d.\n", __func__, msg.event);
- smsusb_stop_streaming(dev);
- return 0;
-}
-
-static int smsusb_resume(struct usb_interface *intf)
-{
- int rc, i;
- struct smsusb_device_t *dev =
- (struct smsusb_device_t *)usb_get_intfdata(intf);
- struct usb_device *udev = interface_to_usbdev(intf);
-
- printk(KERN_INFO "%s Entering.\n", __func__);
- usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
- usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
-
- 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) {
- printk(KERN_INFO
- "%s usb_set_interface failed, rc %d\n",
- __func__, rc);
- return rc;
- }
- }
-
- smsusb_start_streaming(dev);
- return 0;
-}
-
-static struct usb_driver smsusb_driver = {
- .name = "sms1xxx",
- .probe = smsusb_probe,
- .disconnect = smsusb_disconnect,
- .id_table = smsusb_id_table,
-
- .suspend = smsusb_suspend,
- .resume = smsusb_resume,
-};
-
-int smsusb_register(void)
-{
- int rc = usb_register(&smsusb_driver);
- if (rc)
- sms_err("usb_register failed. Error number %d", rc);
-
- sms_debug("");
-
- return rc;
-}
-
-void smsusb_unregister(void)
-{
- sms_debug("");
- /* Regular USB Cleanup */
- usb_deregister(&smsusb_driver);
-}
-