Commit a0921af7 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab
Browse files

[media] dvb_usb_v2: use identify_state() to resolve firmware name



Merge get_firmware_name() to identify_state().

It is wise to resolve firmware name in that routine as it does
decision wether or not to load firmware at all. It is one very
rarely needed callback less.

Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent b905a2a1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ static struct i2c_algorithm af9015_i2c_algo = {
	.functionality = af9015_i2c_func,
};

static int af9015_identify_state(struct dvb_usb_device *d)
static int af9015_identify_state(struct dvb_usb_device *d, const char **name)
{
	int ret;
	u8 reply;
+1 −1
Original line number Diff line number Diff line
@@ -278,7 +278,7 @@ static struct i2c_algorithm af9035_i2c_algo = {
	.functionality = af9035_i2c_functionality,
};

static int af9035_identify_state(struct dvb_usb_device *d)
static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
{
	int ret;
	u8 wbuf[1] = { 1 };
+4 −7
Original line number Diff line number Diff line
@@ -197,11 +197,12 @@ struct dvb_usb_device_properties {
	struct module *owner;
	short *adapter_nr;
	u8 bInterfaceNumber;

	int size_of_priv;

#define WARM                  0
#define COLD                  1
	int (*identify_state) (struct dvb_usb_device *, const char **);
	const char *firmware;
	int (*get_firmware_name) (struct dvb_usb_device *, const char **);
#define RECONNECTS_USB        1
	int (*download_firmware) (struct dvb_usb_device *,
			const struct firmware *);
@@ -219,10 +220,6 @@ struct dvb_usb_device_properties {
	int (*streaming_ctrl) (struct dvb_usb_adapter *, int);
	int (*fe_ioctl_override) (struct dvb_frontend *,
			unsigned int, void *, unsigned int);

#define WARM                  0
#define COLD                  1
	int (*identify_state) (struct dvb_usb_device *);
	int (*init) (struct dvb_usb_device *);
	void (*disconnect) (struct dvb_usb_device *);
	int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *);
+34 −42
Original line number Diff line number Diff line
@@ -24,19 +24,10 @@ module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage,
MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a" \
		" PID filter, if any (default: 0).");

static int dvb_usbv2_download_firmware(struct dvb_usb_device *d)
static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *name)
{
	int ret;
	const struct firmware *fw = NULL;
	const char *name;

	/* resolve firmware name */
	name = d->props->firmware;
	if (d->props->get_firmware_name) {
		ret = d->props->get_firmware_name(d, &name);
		if (ret < 0)
			goto err;
	}
	const struct firmware *fw;

	if (!d->props->download_firmware) {
		ret = -EINVAL;
@@ -395,7 +386,6 @@ static void dvb_usbv2_init_work(struct work_struct *work)
	int ret;
	struct dvb_usb_device *d =
			container_of(work, struct dvb_usb_device, probe_work);
	bool cold = false;

	d->work_pid = current->pid;

@@ -411,42 +401,44 @@ static void dvb_usbv2_init_work(struct work_struct *work)
	}

	if (d->props->identify_state) {
		ret = d->props->identify_state(d);
		const char *name = NULL;
		ret = d->props->identify_state(d, &name);
		if (ret == 0) {
			;
		} else if (ret == COLD) {
			cold = true;
			ret = 0;
		} else {
			goto err_usb_driver_release_interface;
		}
	}

	if (cold) {
			pr_info("%s: found a '%s' in cold state\n",
					KBUILD_MODNAME, d->name);
		ret = dvb_usbv2_download_firmware(d);

			if (!name)
				name = d->props->firmware;

			ret = dvb_usbv2_download_firmware(d, name);
			if (ret == 0) {
				/* device is warm, continue initialization */
				;
			} else if (ret == RECONNECTS_USB) {
				/*
			 * USB core will call disconnect() and then probe()
			 * as device reconnects itself from the USB bus.
			 * disconnect() will release all driver resources
			 * and probe() is called for 'new' device. As 'new'
			 * device is warm we should never go here again.
				 * USB core will call disconnect() and then
				 * probe() as device reconnects itself from the
				 * USB bus. disconnect() will release all driver
				 * resources and probe() is called for 'new'
				 * device. As 'new' device is warm we should
				 * never go here again.
				 */
				return;
			} else {
			/* Unexpected fatal error. We must unregister driver
			 * manually from the device, because device is already
			 * register by returning from probe() with success.
			 * usb_driver_release_interface() finally calls
			 * disconnect() in order to free resources.
				/* Unexpected error. We must unregister driver
				 * manually from the device, because device is
				 * already register by returning from probe()
				 * with success. usb_driver_release_interface()
				 * finally calls disconnect() in order to free
				 * resources.
				 */
				goto err_usb_driver_release_interface;
			}
		} else {
			goto err_usb_driver_release_interface;
		}
	}

	pr_info("%s: found a '%s' in warm state\n", KBUILD_MODNAME, d->name);
+1 −1
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ static struct i2c_algorithm ec168_i2c_algo = {
};

/* Callbacks for DVB USB */
static int ec168_identify_state(struct dvb_usb_device *d)
static int ec168_identify_state(struct dvb_usb_device *d, const char **name)
{
	int ret;
	u8 reply;