Commit 831511bd authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[media] dvb_usb_v2: multiple small tweaks around the code

Naming, small code changes, debug writings, etc.
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9f6f82ee
...@@ -1264,7 +1264,7 @@ static int anysee_init(struct dvb_usb_device *d) ...@@ -1264,7 +1264,7 @@ static int anysee_init(struct dvb_usb_device *d)
return 0; return 0;
} }
static void anysee_disconnect(struct dvb_usb_device *d) static void anysee_exit(struct dvb_usb_device *d)
{ {
return anysee_ci_release(d); return anysee_ci_release(d);
} }
...@@ -1287,7 +1287,7 @@ static struct dvb_usb_device_properties anysee_props = { ...@@ -1287,7 +1287,7 @@ static struct dvb_usb_device_properties anysee_props = {
.get_rc_config = anysee_get_rc_config, .get_rc_config = anysee_get_rc_config,
.frontend_ctrl = anysee_frontend_ctrl, .frontend_ctrl = anysee_frontend_ctrl,
.streaming_ctrl = anysee_streaming_ctrl, .streaming_ctrl = anysee_streaming_ctrl,
.disconnect = anysee_disconnect, .exit = anysee_exit,
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
......
...@@ -10,10 +10,8 @@ ...@@ -10,10 +10,8 @@
#ifndef DVB_USB_H #ifndef DVB_USB_H
#define DVB_USB_H #define DVB_USB_H
#include <linux/input.h> #include <linux/usb/input.h>
#include <linux/usb.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/mutex.h>
#include <media/rc-core.h> #include <media/rc-core.h>
#include "dvb_frontend.h" #include "dvb_frontend.h"
...@@ -65,15 +63,35 @@ ...@@ -65,15 +63,35 @@
.rc_map = (rc), \ .rc_map = (rc), \
}) })
struct dvb_usb_device;
struct dvb_usb_adapter;
struct dvb_usb_driver_info { struct dvb_usb_driver_info {
const char *name; const char *name;
const char *rc_map; const char *rc_map;
const struct dvb_usb_device_properties *props; const struct dvb_usb_device_properties *props;
}; };
struct dvb_usb_device; /**
struct dvb_usb_adapter; * struct dvb_rc properties of remote controller, using rc-core
struct usb_data_stream; * @rc_codes: name of rc codes table
* @protocol: type of protocol(s) currently used by the driver
* @allowed_protos: protocol(s) supported by the driver
* @driver_type: Used to point if a device supports raw mode
* @change_protocol: callback to change protocol
* @rc_query: called to query an event event.
* @rc_interval: time in ms between two queries.
* @bulk_mode: device supports bulk mode for RC (disable polling mode)
*/
struct dvb_usb_rc {
char *map_name;
u64 allowed_protos;
int (*change_protocol)(struct rc_dev *dev, u64 rc_type);
int (*query) (struct dvb_usb_device *d);
unsigned int interval;
const enum rc_driver_type driver_type;
bool bulk_mode;
};
/** /**
* Properties of USB streaming - TODO this structure should be somewhere else * Properties of USB streaming - TODO this structure should be somewhere else
...@@ -83,13 +101,13 @@ struct usb_data_stream; ...@@ -83,13 +101,13 @@ struct usb_data_stream;
struct usb_data_stream_properties { struct usb_data_stream_properties {
#define USB_BULK 1 #define USB_BULK 1
#define USB_ISOC 2 #define USB_ISOC 2
int type; u8 type;
int count; u8 count;
int endpoint; u8 endpoint;
union { union {
struct { struct {
int buffersize; /* per URB */ unsigned int buffersize; /* per URB */
} bulk; } bulk;
struct { struct {
int framesperurb; int framesperurb;
...@@ -124,37 +142,15 @@ struct dvb_usb_adapter_properties { ...@@ -124,37 +142,15 @@ struct dvb_usb_adapter_properties {
#define DVB_USB_ADAP_HAS_PID_FILTER 0x01 #define DVB_USB_ADAP_HAS_PID_FILTER 0x01
#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02 #define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02
#define DVB_USB_ADAP_NEED_PID_FILTERING 0x04 #define DVB_USB_ADAP_NEED_PID_FILTERING 0x04
int caps; u8 caps;
int size_of_priv;
int pid_filter_count; u8 pid_filter_count;
int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int); int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int);
int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int); int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int);
struct usb_data_stream_properties stream; struct usb_data_stream_properties stream;
}; };
/**
* struct dvb_rc properties of remote controller, using rc-core
* @rc_codes: name of rc codes table
* @protocol: type of protocol(s) currently used by the driver
* @allowed_protos: protocol(s) supported by the driver
* @driver_type: Used to point if a device supports raw mode
* @change_protocol: callback to change protocol
* @rc_query: called to query an event event.
* @rc_interval: time in ms between two queries.
* @bulk_mode: device supports bulk mode for RC (disable polling mode)
*/
struct dvb_usb_rc {
char *map_name;
u64 allowed_protos;
int (*change_protocol)(struct rc_dev *dev, u64 rc_type);
int (*query) (struct dvb_usb_device *d);
int interval;
const enum rc_driver_type driver_type;
bool bulk_mode;
};
/** /**
* struct dvb_usb_device_properties - properties of a dvb-usb-device * struct dvb_usb_device_properties - properties of a dvb-usb-device
* @owner: owner of the dvb_adapter * @owner: owner of the dvb_adapter
...@@ -196,8 +192,11 @@ struct dvb_usb_device_properties { ...@@ -196,8 +192,11 @@ struct dvb_usb_device_properties {
const char *driver_name; const char *driver_name;
struct module *owner; struct module *owner;
short *adapter_nr; short *adapter_nr;
u8 bInterfaceNumber; u8 bInterfaceNumber;
int size_of_priv; unsigned int size_of_priv;
u8 generic_bulk_ctrl_endpoint;
u8 generic_bulk_ctrl_endpoint_response;
#define WARM 0 #define WARM 0
#define COLD 1 #define COLD 1
...@@ -207,11 +206,12 @@ struct dvb_usb_device_properties { ...@@ -207,11 +206,12 @@ struct dvb_usb_device_properties {
int (*download_firmware) (struct dvb_usb_device *, int (*download_firmware) (struct dvb_usb_device *,
const struct firmware *); const struct firmware *);
int num_adapters; struct i2c_algorithm *i2c_algo;
int (*get_adapter_count) (struct dvb_usb_device *);
struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
int (*power_ctrl) (struct dvb_usb_device *, int); unsigned int num_adapters;
struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
int (*get_adapter_count) (struct dvb_usb_device *);
int (*power_ctrl) (struct dvb_usb_device *, int);
int (*read_config) (struct dvb_usb_device *d); int (*read_config) (struct dvb_usb_device *d);
int (*read_mac_address) (struct dvb_usb_adapter *, u8 []); int (*read_mac_address) (struct dvb_usb_adapter *, u8 []);
int (*frontend_attach) (struct dvb_usb_adapter *); int (*frontend_attach) (struct dvb_usb_adapter *);
...@@ -221,18 +221,13 @@ struct dvb_usb_device_properties { ...@@ -221,18 +221,13 @@ struct dvb_usb_device_properties {
int (*fe_ioctl_override) (struct dvb_frontend *, int (*fe_ioctl_override) (struct dvb_frontend *,
unsigned int, void *, unsigned int); unsigned int, void *, unsigned int);
int (*init) (struct dvb_usb_device *); int (*init) (struct dvb_usb_device *);
void (*disconnect) (struct dvb_usb_device *); void (*exit) (struct dvb_usb_device *);
int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *); int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *);
#define DVB_USB_FE_TS_TYPE_188 0 #define DVB_USB_FE_TS_TYPE_188 0
#define DVB_USB_FE_TS_TYPE_204 1 #define DVB_USB_FE_TS_TYPE_204 1
#define DVB_USB_FE_TS_TYPE_RAW 2 #define DVB_USB_FE_TS_TYPE_RAW 2
int (*get_stream_config) (struct dvb_frontend *, u8 *, int (*get_stream_config) (struct dvb_frontend *, u8 *,
struct usb_data_stream_properties *); struct usb_data_stream_properties *);
struct i2c_algorithm *i2c_algo;
int generic_bulk_ctrl_endpoint;
int generic_bulk_ctrl_endpoint_response;
}; };
/** /**
...@@ -247,12 +242,12 @@ struct dvb_usb_device_properties { ...@@ -247,12 +242,12 @@ struct dvb_usb_device_properties {
*/ */
#define MAX_NO_URBS_FOR_DATA_STREAM 10 #define MAX_NO_URBS_FOR_DATA_STREAM 10
struct usb_data_stream { struct usb_data_stream {
struct usb_device *udev; struct usb_device *udev;
struct usb_data_stream_properties props; struct usb_data_stream_properties props;
#define USB_STATE_INIT 0x00 #define USB_STATE_INIT 0x00
#define USB_STATE_URB_BUF 0x01 #define USB_STATE_URB_BUF 0x01
int state; u8 state;
void (*complete) (struct usb_data_stream *, u8 *, size_t); void (*complete) (struct usb_data_stream *, u8 *, size_t);
...@@ -297,26 +292,23 @@ struct usb_data_stream { ...@@ -297,26 +292,23 @@ struct usb_data_stream {
struct dvb_usb_adapter { struct dvb_usb_adapter {
const struct dvb_usb_adapter_properties *props; const struct dvb_usb_adapter_properties *props;
struct usb_data_stream stream; struct usb_data_stream stream;
u8 id; u8 id;
u8 ts_type; u8 ts_type;
int pid_filtering; bool pid_filtering;
int feed_count; u8 feed_count;
int max_feed_count; u8 max_feed_count;
s8 active_fe;
/* sync frontend and streaming as those are different tasks */
struct mutex sync_mutex;
/* dvb */ /* dvb */
struct dvb_adapter dvb_adap; struct dvb_adapter dvb_adap;
struct dmxdev dmxdev; struct dmxdev dmxdev;
struct dvb_demux demux; struct dvb_demux demux;
struct dvb_net dvb_net; struct dvb_net dvb_net;
struct mutex sync_mutex;
struct dvb_frontend *fe[MAX_NO_OF_FE_PER_ADAP]; struct dvb_frontend *fe[MAX_NO_OF_FE_PER_ADAP];
int (*fe_init[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *); int (*fe_init[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *);
int (*fe_sleep[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *); int (*fe_sleep[MAX_NO_OF_FE_PER_ADAP]) (struct dvb_frontend *);
int active_fe;
}; };
/** /**
...@@ -346,11 +338,12 @@ struct dvb_usb_device { ...@@ -346,11 +338,12 @@ struct dvb_usb_device {
const struct dvb_usb_device_properties *props; const struct dvb_usb_device_properties *props;
const char *name; const char *name;
const char *rc_map; const char *rc_map;
struct dvb_usb_rc rc;
struct usb_device *udev; struct usb_device *udev;
struct usb_interface *intf;
struct dvb_usb_rc rc;
struct work_struct probe_work; struct work_struct probe_work;
pid_t work_pid; pid_t work_pid;
struct usb_interface *intf;
int powered; int powered;
/* locking */ /* locking */
......
...@@ -12,22 +12,22 @@ ...@@ -12,22 +12,22 @@
* see Documentation/dvb/README.dvb-usb for more information * see Documentation/dvb/README.dvb-usb for more information
*/ */
#include "dvb_usb_common.h" #include "dvb_usb_common.h"
#include <linux/usb/input.h>
int dvb_usbv2_disable_rc_polling; int dvb_usbv2_disable_rc_polling;
module_param_named(disable_rc_polling, dvb_usbv2_disable_rc_polling, int, 0644); module_param_named(disable_rc_polling, dvb_usbv2_disable_rc_polling, int, 0644);
MODULE_PARM_DESC(disable_rc_polling, MODULE_PARM_DESC(disable_rc_polling,
"disable remote control polling (default: 0)."); "disable remote control polling (default: 0)");
static int dvb_usb_force_pid_filter_usage; static int dvb_usb_force_pid_filter_usage;
module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage,
int, 0444); int, 0444);
MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a" \ MODULE_PARM_DESC(force_pid_filter_usage, "force all DVB USB devices to use a " \
" PID filter, if any (default: 0)."); "PID filter, if any (default: 0)");
static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *name) static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *name)
{ {
int ret; int ret;
const struct firmware *fw; const struct firmware *fw;
pr_debug("%s:\n", __func__);
if (!d->props->download_firmware) { if (!d->props->download_firmware) {
ret = -EINVAL; ret = -EINVAL;
...@@ -36,10 +36,10 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam ...@@ -36,10 +36,10 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam
ret = request_firmware(&fw, name, &d->udev->dev); ret = request_firmware(&fw, name, &d->udev->dev);
if (ret < 0) { if (ret < 0) {
pr_err("%s: did not find the firmware file. (%s) " \ pr_err("%s: Did not find the firmware file '%s'. " \
"Please see linux/Documentation/dvb/ for " \ "Please see linux/Documentation/dvb/ for " \
"more details on firmware-problems. (%d)\n", "more details on firmware-problems. Status " \
KBUILD_MODNAME, name, ret); "%d\n", KBUILD_MODNAME, name, ret);
goto err; goto err;
} }
...@@ -47,9 +47,7 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam ...@@ -47,9 +47,7 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam
name); name);
ret = d->props->download_firmware(d, fw); ret = d->props->download_firmware(d, fw);
release_firmware(fw); release_firmware(fw);
if (ret < 0) if (ret < 0)
goto err; goto err;
...@@ -62,7 +60,6 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam ...@@ -62,7 +60,6 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *nam
static int dvb_usbv2_i2c_init(struct dvb_usb_device *d) static int dvb_usbv2_i2c_init(struct dvb_usb_device *d)
{ {
int ret; int ret;
pr_debug("%s:\n", __func__); pr_debug("%s:\n", __func__);
if (!d->props->i2c_algo) if (!d->props->i2c_algo)
...@@ -103,29 +100,27 @@ static void dvb_usb_read_remote_control(struct work_struct *work) ...@@ -103,29 +100,27 @@ static void dvb_usb_read_remote_control(struct work_struct *work)
struct dvb_usb_device, rc_query_work.work); struct dvb_usb_device, rc_query_work.work);
int ret; int ret;
/* TODO: need a lock here. We can simply skip checking for the remote /*
control if we're busy. */ * When the parameter has been set to 1 via sysfs while the
* driver was running, or when bulk mode is enabled after IR init.
/* when the parameter has been set to 1 via sysfs while the
* driver was running, or when bulk mode is enabled after IR init
*/ */
if (dvb_usbv2_disable_rc_polling || d->rc.bulk_mode) if (dvb_usbv2_disable_rc_polling || d->rc.bulk_mode)
return; return;
ret = d->rc.query(d); ret = d->rc.query(d);
if (ret < 0) if (ret < 0) {
pr_err("%s: error %d while querying for an remote control " \ pr_err("%s: rc.query() failed=%d\n", KBUILD_MODNAME, ret);
"event\n", KBUILD_MODNAME, ret); return; /* stop polling */
}
schedule_delayed_work(&d->rc_query_work, schedule_delayed_work(&d->rc_query_work,
msecs_to_jiffies(d->rc.interval)); msecs_to_jiffies(d->rc.interval));
} }
static int dvb_usbv2_remote_init(struct dvb_usb_device *d) static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
{ {
int ret; int ret;
struct rc_dev *dev; struct rc_dev *dev;
pr_debug("%s:\n", __func__); pr_debug("%s:\n", __func__);
if (dvb_usbv2_disable_rc_polling || !d->props->get_rc_config) if (dvb_usbv2_disable_rc_polling || !d->props->get_rc_config)
...@@ -142,7 +137,7 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d) ...@@ -142,7 +137,7 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
} }
dev->dev.parent = &d->udev->dev; dev->dev.parent = &d->udev->dev;
dev->input_name = "IR-receiver inside an USB DVB receiver"; dev->input_name = d->name;
usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys)); usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys)); strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
dev->input_phys = d->rc_phys; dev->input_phys = d->rc_phys;
...@@ -153,13 +148,10 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d) ...@@ -153,13 +148,10 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
dev->allowed_protos = d->rc.allowed_protos; dev->allowed_protos = d->rc.allowed_protos;
dev->change_protocol = d->rc.change_protocol; dev->change_protocol = d->rc.change_protocol;
dev->priv = d; dev->priv = d;
/* select used keymap */
if (d->rc.map_name) if (d->rc.map_name)
dev->map_name = d->rc.map_name; dev->map_name = d->rc.map_name;
else if (d->rc_map)
dev->map_name = d->rc_map;
else else
dev->map_name = RC_MAP_EMPTY; /* keep rc enabled */ dev->map_name = d->rc_map;
ret = rc_register_device(dev); ret = rc_register_device(dev);
if (ret < 0) { if (ret < 0) {
...@@ -235,9 +227,8 @@ int dvb_usbv2_adapter_stream_init(struct dvb_usb_adapter *adap) ...@@ -235,9 +227,8 @@ int dvb_usbv2_adapter_stream_init(struct dvb_usb_adapter *adap)
int dvb_usbv2_adapter_stream_exit(struct dvb_usb_adapter *adap) int dvb_usbv2_adapter_stream_exit(struct dvb_usb_adapter *adap)
{ {
pr_debug("%s: adap=%d\n", __func__, adap->id); pr_debug("%s: adap=%d\n", __func__, adap->id);
usb_urb_exitv2(&adap->stream);
return 0; return usb_urb_exitv2(&adap->stream);
} }
static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed,
...@@ -369,7 +360,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) ...@@ -369,7 +360,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
if (ret < 0) { if (ret < 0) {
pr_debug("%s: dvb_register_adapter() failed=%d\n", __func__, pr_debug("%s: dvb_register_adapter() failed=%d\n", __func__,
ret); ret);
goto err; goto err_dvb_register_adapter;
} }
adap->dvb_adap.priv = adap; adap->dvb_adap.priv = adap;
...@@ -378,7 +369,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) ...@@ -378,7 +369,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
ret = d->props->read_mac_address(adap, ret = d->props->read_mac_address(adap,
adap->dvb_adap.proposed_mac); adap->dvb_adap.proposed_mac);
if (ret < 0) if (ret < 0)
goto err_dmx; goto err_dvb_dmx_init;
pr_info("%s: MAC address: %pM\n", KBUILD_MODNAME, pr_info("%s: MAC address: %pM\n", KBUILD_MODNAME,
adap->dvb_adap.proposed_mac); adap->dvb_adap.proposed_mac);
...@@ -387,8 +378,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) ...@@ -387,8 +378,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
adap->demux.priv = adap; adap->demux.priv = adap;
adap->demux.filternum = 0; adap->demux.filternum = 0;
if (adap->demux.filternum < adap->max_feed_count) adap->demux.filternum = adap->max_feed_count;
adap->demux.filternum = adap->max_feed_count;
adap->demux.feednum = adap->demux.filternum; adap->demux.feednum = adap->demux.filternum;
adap->demux.start_feed = dvb_usb_start_feed; adap->demux.start_feed = dvb_usb_start_feed;
adap->demux.stop_feed = dvb_usb_stop_feed; adap->demux.stop_feed = dvb_usb_stop_feed;
...@@ -396,7 +386,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) ...@@ -396,7 +386,7 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
ret = dvb_dmx_init(&adap->demux); ret = dvb_dmx_init(&adap->demux);
if (ret < 0) { if (ret < 0) {
pr_err("%s: dvb_dmx_init() failed=%d\n", KBUILD_MODNAME, ret); pr_err("%s: dvb_dmx_init() failed=%d\n", KBUILD_MODNAME, ret);
goto err_dmx; goto err_dvb_dmx_init;
} }
adap->dmxdev.filternum = adap->demux.filternum; adap->dmxdev.filternum = adap->demux.filternum;
...@@ -406,25 +396,25 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap) ...@@ -406,25 +396,25 @@ int dvb_usbv2_adapter_dvb_init(struct dvb_usb_adapter *adap)
if (ret < 0) { if (ret < 0) {
pr_err("%s: dvb_dmxdev_init() failed=%d\n", KBUILD_MODNAME, pr_err("%s: dvb_dmxdev_init() failed=%d\n", KBUILD_MODNAME,
ret); ret);
goto err_dmx_dev; goto err_dvb_dmxdev_init;
} }
ret = dvb_net_init(&adap->dvb_adap, &adap->dvb_net, &adap->demux.dmx); ret = dvb_net_init(&adap->dvb_adap, &adap->dvb_net, &adap->demux.dmx);
if (ret < 0) { if (ret < 0) {
pr_err("%s: dvb_net_init() failed=%d\n", KBUILD_MODNAME, ret); pr_err("%s: dvb_net_init() failed=%d\n", KBUILD_MODNAME, ret);
goto err_net_init; goto err_dvb_net_init;
} }
mutex_init(&adap->sync_mutex); mutex_init(&adap->sync_mutex);
return 0; return 0;
err_net_init: err_dvb_net_init:
dvb_dmxdev_release(&adap->dmxdev); dvb_dmxdev_release(&adap->dmxdev);
err_dmx_dev: err_dvb_dmxdev_init:
dvb_dmx_release(&adap->demux); dvb_dmx_release(&adap->demux);
err_dmx: err_dvb_dmx_init:
dvb_unregister_adapter(&adap->dvb_adap); dvb_unregister_adapter(&adap->dvb_adap);
err: err_dvb_register_adapter:
adap->dvb_adap.priv = NULL; adap->dvb_adap.priv = NULL;
return ret; return ret;
} }
...@@ -468,7 +458,7 @@ int dvb_usbv2_device_power_ctrl(struct dvb_usb_device *d, int onoff) ...@@ -468,7 +458,7 @@ int dvb_usbv2_device_power_ctrl(struct dvb_usb_device *d, int onoff)
return ret; return ret;
} }
static int dvb_usb_fe_wakeup(struct dvb_frontend *fe) static int dvb_usb_fe_init(struct dvb_frontend *fe)
{ {
int ret; int ret;
struct dvb_usb_adapter *adap = fe->dvb->priv; struct dvb_usb_adapter *adap = fe->dvb->priv;
...@@ -560,10 +550,9 @@ int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap) ...@@ -560,10 +550,9 @@ int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap)
for (i = 0; i < MAX_NO_OF_FE_PER_ADAP && adap->fe[i]; i++) { for (i = 0; i < MAX_NO_OF_FE_PER_ADAP && adap->fe[i]; i++) {
adap->fe[i]->id = i; adap->fe[i]->id = i;
/* re-assign sleep and wakeup functions */ /* re-assign sleep and wakeup functions */
adap->fe_init[i] = adap->fe[i]->ops.init; adap->fe_init[i] = adap->fe[i]->ops.init;
adap->fe[i]->ops.init = dvb_usb_fe_wakeup; adap->fe[i]->ops.init = dvb_usb_fe_init;
adap->fe_sleep[i] = adap->fe[i]->ops.sleep; adap->fe_sleep[i] = adap->fe[i]->ops.sleep;
adap->fe[i]->ops.sleep = dvb_usb_fe_sleep; adap->fe[i]->ops.sleep = dvb_usb_fe_sleep;
...@@ -699,7 +688,6 @@ static int dvb_usbv2_adapter_init(struct dvb_usb_device *d) ...@@ -699,7 +688,6 @@ static int dvb_usbv2_adapter_init(struct dvb_usb_device *d)
static int dvb_usbv2_adapter_exit(struct dvb_usb_device *d) static int dvb_usbv2_adapter_exit(struct dvb_usb_device *d)
{ {
int i; int i;
pr_debug("%s:\n", __func__); pr_debug("%s:\n", __func__);
for (i = MAX_NO_OF_ADAPTER_PER_DEVICE - 1; i >= 0; i--) { for (i = MAX_NO_OF_ADAPTER_PER_DEVICE - 1; i >= 0; i--) {
...@@ -727,7 +715,8 @@ static int dvb_usbv2_exit(struct dvb_usb_device *d) ...@@ -727,7 +715,8 @@ static int dvb_usbv2_exit(struct dvb_usb_device *d)
static int dvb_usbv2_init(struct dvb_usb_device *d) static int dvb_usbv2_init(struct dvb_usb_device *d)
{ {
int ret = 0; int ret;
pr_debug("%s:\n", __func__);
dvb_usbv2_device_power_ctrl(d, 1); dvb_usbv2_device_power_ctrl(d, 1);
...@@ -770,7 +759,6 @@ static int dvb_usbv2_init(struct dvb_usb_device *d) ...@@ -770,7 +759,6 @@ static int dvb_usbv2_init(struct dvb_usb_device *d)
* is this routine. Due to that we delay actual operation using workqueue * is this routine. Due to that we delay actual operation using workqueue
* and return always success here. * and return always success here.
*/ */
static void dvb_usbv2_init_work(struct work_struct *work) static void dvb_usbv2_init_work(struct work_struct *work)
{ {
int ret; int ret;
...@@ -778,7 +766,6 @@ static void dvb_usbv2_init_work(struct work_struct *work) ...@@ -778,7 +766,6 @@ static void dvb_usbv2_init_work(struct work_struct *work)
container_of(work, struct dvb_usb_device, probe_work); container_of(work, struct dvb_usb_device, probe_work);
d->work_pid = current->pid; d->work_pid = current->pid;
pr_debug("%s: work_pid=%d\n", __func__, d->work_pid); pr_debug("%s: work_pid=%d\n", __func__, d->work_pid);
if (d->props->size_of_priv) { if (d->props->size_of_priv) {
...@@ -817,7 +804,8 @@ static void dvb_usbv2_init_work(struct work_struct *work) ...@@ -817,7 +804,8 @@ static void dvb_usbv2_init_work(struct work_struct *work)
*/ */
return; return;
} else { } else {
/* Unexpected error. We must unregister driver /*
* Unexpected error. We must unregister driver
* manually from the device, because device is * manually from the device, because device is
* already register by returning from probe() * already register by returning from probe()
* with success. usb_driver_release_interface() * with success. usb_driver_release_interface()
...@@ -844,7 +832,6 @@ static void dvb_usbv2_init_work(struct work_struct *work) ...@@ -844,7 +832,6 @@ static void dvb_usbv2_init_work(struct work_struct *work)
err_usb_driver_release_interface: err_usb_driver_release_interface:
pr_info("%s: '%s' error while loading driver (%d)\n", KBUILD_MODNAME, pr_info("%s: '%s' error while loading driver (%d)\n", KBUILD_MODNAME,
d->name, ret); d->name, ret);
/* it finally calls disconnect() which frees mem */
usb_driver_release_interface(to_usb_driver(d->intf->dev.driver), usb_driver_release_interface(to_usb_driver(d->intf->dev.driver),
d->intf); d->intf);
pr_debug("%s: failed=%d\n", __func__, ret); pr_debug("%s: failed=%d\n", __func__, ret);
...@@ -909,8 +896,7 @@ EXPORT_SYMBOL(dvb_usbv2_probe); ...@@ -909,8 +896,7 @@ EXPORT_SYMBOL(dvb_usbv2_probe);
void dvb_usbv2_disconnect(struct usb_interface *intf) void dvb_usbv2_disconnect(struct usb_interface *intf)
{ {
struct dvb_usb_device *d = usb_get_intfdata(intf); struct dvb_usb_device *d = usb_get_intfdata(intf);
const char *name; const char *name = d->name;
pr_debug("%s: pid=%d work_pid=%d\n", __func__, current->pid, pr_debug("%s: pid=%d work_pid=%d\n", __func__, current->pid,
d->work_pid); d->work_pid);
...@@ -918,10 +904,9 @@ void dvb_usbv2_disconnect(struct usb_interface *intf) ...@@ -918,10 +904,9 @@ void dvb_usbv2_disconnect(struct usb_interface *intf)
if (d->work_pid != current->pid) if (d->work_pid != current->pid)
cancel_work_sync(&d->probe_work); cancel_work_sync(&d->probe_work);
if (d->props->disconnect) if (d->props->exit)
d->props->disconnect(d); d->props->exit(d);
name = d->name;
dvb_usbv2_exit(d); dvb_usbv2_exit(d);
pr_info("%s: '%s' successfully deinitialized and disconnected\n", pr_info("%s: '%s' successfully deinitialized and disconnected\n",
...@@ -933,7 +918,6 @@ int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg) ...@@ -933,7 +918,6 @@ int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg)
{ {
struct dvb_usb_device *d = usb_get_intfdata(intf); struct dvb_usb_device *d = usb_get_intfdata(intf);
int i; int i;
pr_debug("%s:\n", __func__); pr_debug("%s:\n", __func__);
/* stop remote controller poll */ /* stop remote controller poll */
...@@ -955,7 +939,6 @@ int dvb_usbv2_resume(struct usb_interface *intf) ...@@ -955,7 +939,6 @@ int dvb_usbv2_resume(struct usb_interface *intf)
{ {
struct dvb_usb_device *d = usb_get_intfdata(intf); struct dvb_usb_device *d = usb_get_intfdata(intf);
int i; int i;
pr_debug("%s:\n", __func__); pr_debug("%s:\n", __func__);
/* start streaming */ /* start streaming */
......
...@@ -38,7 +38,7 @@ static void usb_urb_complete(struct urb *urb) ...@@ -38,7 +38,7 @@ static void usb_urb_complete(struct urb *urb)
case -ESHUTDOWN: case -ESHUTDOWN:
return; return;
default: /* error */ default: /* error */
pr_debug("%s: URB completition failed=%d\n", __func__, pr_debug("%s: urb completition failed=%d\n", __func__,
urb->status); urb->status);
break; break;
} }
...@@ -76,7 +76,7 @@ int usb_urb_killv2(struct usb_data_stream *stream) ...@@ -76,7 +76,7 @@ int usb_urb_killv2(struct usb_data_stream *stream)
{ {
int i; int i;
for (i = 0; i < stream->urbs_submitted; i++) { for (i = 0; i < stream->urbs_submitted; i++) {
pr_debug("%s: kill URB=%d\n", __func__, i); pr_debug("%s: kill urb=%d\n", __func__, i);
/* stop the URB */ /* stop the URB */
usb_kill_urb(stream->urb_list[i]); usb_kill_urb(stream->urb_list[i]);
} }
...@@ -96,10 +96,10 @@ int usb_urb_submitv2(struct usb_data_stream *stream, ...@@ -96,10 +96,10 @@ int usb_urb_submitv2(struct usb_data_stream *stream,
} }
for (i = 0; i < stream->urbs_initialized; i++) { for (i = 0; i < stream->urbs_initialized; i++) {
pr_debug("%s: submit URB=%d\n", __func__, i); pr_debug("%s: submit urb=%d\n", __func__, i);
ret = usb_submit_urb(stream->urb_list[i], GFP_ATOMIC); ret = usb_submit_urb(stream->urb_list[i], GFP_ATOMIC);
if (ret) { if (ret) {
pr_err("%s: could not submit URB no. %d - get them " \ pr_err("%s: could not submit urb no. %d - get them " \
"all back\n", KBUILD_MODNAME, i); "all back\n", KBUILD_MODNAME, i);
usb_urb_killv2(stream); usb_urb_killv2(stream);
return ret; return ret;
...@@ -115,9 +115,9 @@ int usb_urb_free_urbs(struct usb_data_stream *stream) ...@@ -115,9 +115,9 @@ int usb_urb_free_urbs(struct usb_data_stream *stream)
usb_urb_killv2(stream); usb_urb_killv2(stream);
for (i = 0; i < stream->urbs_initialized; i++) { for (i = stream->urbs_initialized - 1; i >= 0; i--) {
if (stream->urb_list[i] != NULL) { if (stream->urb_list[i]) {
pr_debug("%s: free URB=%d\n", __func__, i); pr_debug("%s: free urb=%d\n", __func__, i);
/* free the URBs */ /* free the URBs */
usb_free_urb(stream->urb_list[i]); usb_free_urb(stream->urb_list[i]);
} }
...@@ -133,7 +133,7 @@ static int usb_urb_alloc_bulk_urbs(struct usb_data_stream *stream) ...@@ -133,7 +133,7 @@ static int usb_urb_alloc_bulk_urbs(struct usb_data_stream *stream)
/* allocate the URBs */ /* allocate the URBs */
for (i = 0; i < stream->props.count; i++) { for (i = 0; i < stream->props.count; i++) {
pr_debug("%s: alloc URB=%d\n", __func__, i); pr_debug("%s: alloc urb=%d\n", __func__, i);
stream->urb_list[i] = usb_alloc_urb(0, GFP_ATOMIC); stream->urb_list[i] = usb_alloc_urb(0, GFP_ATOMIC);
if (!stream->urb_list[i]) { if (!stream->urb_list[i]) {
pr_debug("%s: failed\n", __func__); pr_debug("%s: failed\n", __func__);
...@@ -164,7 +164,7 @@ static int usb_urb_alloc_isoc_urbs(struct usb_data_stream *stream) ...@@ -164,7 +164,7 @@ static int usb_urb_alloc_isoc_urbs(struct usb_data_stream *stream)
for (i = 0; i < stream->props.count; i++) { for (i = 0; i < stream->props.count; i++) {
struct urb *urb; struct urb *urb;
int frame_offset = 0; int frame_offset = 0;
pr_debug("%s: alloc URB=%d\n", __func__, i); pr_debug("%s: alloc urb=%d\n", __func__, i);
stream->urb_list[i] = usb_alloc_urb( stream->urb_list[i] = usb_alloc_urb(
stream->props.u.isoc.framesperurb, GFP_ATOMIC); stream->props.u.isoc.framesperurb, GFP_ATOMIC);
if (!stream->urb_list[i]) { if (!stream->urb_list[i]) {
...@@ -229,17 +229,17 @@ int usb_alloc_stream_buffers(struct usb_data_stream *stream, int num, ...@@ -229,17 +229,17 @@ int usb_alloc_stream_buffers(struct usb_data_stream *stream, int num,
__func__, num * size); __func__, num * size);
for (stream->buf_num = 0; stream->buf_num < num; stream->buf_num++) { for (stream->buf_num = 0; stream->buf_num < num; stream->buf_num++) {
pr_debug("%s: alloc buf=%d\n", __func__, stream->buf_num);
stream->buf_list[stream->buf_num] = usb_alloc_coherent( stream->buf_list[stream->buf_num] = usb_alloc_coherent(
stream->udev, size, GFP_ATOMIC, stream->udev, size, GFP_ATOMIC,
&stream->dma_addr[stream->buf_num]); &stream->dma_addr[stream->buf_num]);
if (stream->buf_list[stream->buf_num] == NULL) { if (!stream->buf_list[stream->buf_num]) {
pr_debug("%s: failed\n", __func__); pr_debug("%s: alloc buf=%d failed\n", __func__,
stream->buf_num);
usb_free_stream_buffers(stream); usb_free_stream_buffers(stream);
return -ENOMEM; return -ENOMEM;
} }
pr_debug("%s: buf %d: %p (dma %llu)\n", __func__, pr_debug("%s: alloc buf=%d %p (dma %llu)\n", __func__,
stream->buf_num, stream->buf_num,
stream->buf_list[stream->buf_num], stream->buf_list[stream->buf_num],
(long long)stream->dma_addr[stream->buf_num]); (long long)stream->dma_addr[stream->buf_num]);
...@@ -255,7 +255,7 @@ int usb_urb_reconfig(struct usb_data_stream *stream, ...@@ -255,7 +255,7 @@ int usb_urb_reconfig(struct usb_data_stream *stream,
{ {
int buf_size; int buf_size;
if (props == NULL) if (!props)
return 0; return 0;
/* check allocated buffers are large enough for the request */ /* check allocated buffers are large enough for the request */
...@@ -293,7 +293,7 @@ int usb_urb_reconfig(struct usb_data_stream *stream, ...@@ -293,7 +293,7 @@ int usb_urb_reconfig(struct usb_data_stream *stream,
return 0; return 0;
} }
pr_debug("%s: re-alloc URBs\n", __func__); pr_debug("%s: re-alloc urbs\n", __func__);
usb_urb_free_urbs(stream); usb_urb_free_urbs(stream);
memcpy(&stream->props, props, sizeof(*props)); memcpy(&stream->props, props, sizeof(*props));
...@@ -310,7 +310,7 @@ int usb_urb_initv2(struct usb_data_stream *stream, ...@@ -310,7 +310,7 @@ int usb_urb_initv2(struct usb_data_stream *stream,
{ {
int ret; int ret;
if (stream == NULL || props == NULL) if (!stream || !props)
return -EINVAL; return -EINVAL;
memcpy(&stream->props, props, sizeof(*props)); memcpy(&stream->props, props, sizeof(*props));
...@@ -318,7 +318,7 @@ int usb_urb_initv2(struct usb_data_stream *stream, ...@@ -318,7 +318,7 @@ int usb_urb_initv2(struct usb_data_stream *stream,
usb_clear_halt(stream->udev, usb_rcvbulkpipe(stream->udev, usb_clear_halt(stream->udev, usb_rcvbulkpipe(stream->udev,
stream->props.endpoint)); stream->props.endpoint));
if (stream->complete == NULL) { if (!stream->complete) {
pr_err("%s: there is no data callback - this doesn't make " \ pr_err("%s: there is no data callback - this doesn't make " \
"sense\n", KBUILD_MODNAME); "sense\n", KBUILD_MODNAME);
return -EINVAL; return -EINVAL;
...@@ -341,7 +341,7 @@ int usb_urb_initv2(struct usb_data_stream *stream, ...@@ -341,7 +341,7 @@ int usb_urb_initv2(struct usb_data_stream *stream,
return usb_urb_alloc_isoc_urbs(stream); return usb_urb_alloc_isoc_urbs(stream);
default: default:
pr_err("%s: unknown URB-type for data transfer\n", pr_err("%s: unknown urb-type for data transfer\n",
KBUILD_MODNAME); KBUILD_MODNAME);
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment