diff options
Diffstat (limited to 'drivers/media/dvb-core/dvb_frontend.c')
-rw-r--r-- | drivers/media/dvb-core/dvb_frontend.c | 230 |
1 files changed, 123 insertions, 107 deletions
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index e33414975065..ce25aef39008 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -190,7 +190,7 @@ dtv_property_legacy_params_sync(struct dvb_frontend *fe, static bool has_get_frontend(struct dvb_frontend *fe) { - return fe->ops.get_frontend != NULL; + return fe->ops.get_frontend; } /* @@ -272,11 +272,23 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, mutex_unlock(&events->mtx); - wake_up_interruptible (&events->wait_queue); + wake_up_interruptible(&events->wait_queue); +} + +static int dvb_frontend_test_event(struct dvb_frontend_private *fepriv, + struct dvb_fe_events *events) +{ + int ret; + + up(&fepriv->sem); + ret = events->eventw != events->eventr; + down(&fepriv->sem); + + return ret; } static int dvb_frontend_get_event(struct dvb_frontend *fe, - struct dvb_frontend_event *event, int flags) + struct dvb_frontend_event *event, int flags) { struct dvb_frontend_private *fepriv = fe->frontend_priv; struct dvb_fe_events *events = &fepriv->events; @@ -294,13 +306,8 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe, if (flags & O_NONBLOCK) return -EWOULDBLOCK; - up(&fepriv->sem); - - ret = wait_event_interruptible (events->wait_queue, - events->eventw != events->eventr); - - if (down_interruptible (&fepriv->sem)) - return -ERESTARTSYS; + ret = wait_event_interruptible(events->wait_queue, + dvb_frontend_test_event(fepriv, events)); if (ret < 0) return ret; @@ -327,8 +334,8 @@ static void dvb_frontend_clear_events(struct dvb_frontend *fe) static void dvb_frontend_init(struct dvb_frontend *fe) { dev_dbg(fe->dvb->device, - "%s: initialising adapter %i frontend %i (%s)...\n", - __func__, fe->dvb->num, fe->id, fe->ops.info.name); + "%s: initialising adapter %i frontend %i (%s)...\n", + __func__, fe->dvb->num, fe->id, fe->ops.info.name); if (fe->ops.init) fe->ops.init(fe); @@ -358,14 +365,14 @@ static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepr dev_dbg(fe->dvb->device, "%s:\n", __func__); if (locked) - (fepriv->quality) = (fepriv->quality * 220 + 36*256) / 256; + (fepriv->quality) = (fepriv->quality * 220 + 36 * 256) / 256; else (fepriv->quality) = (fepriv->quality * 220 + 0) / 256; q2 = fepriv->quality - 128; q2 *= q2; - fepriv->delay = fepriv->min_delay + q2 * HZ / (128*128); + fepriv->delay = fepriv->min_delay + q2 * HZ / (128 * 128); } /** @@ -393,7 +400,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra (c->inversion == INVERSION_AUTO)); /* setup parameters correctly */ - while(!ready) { + while (!ready) { /* calculate the lnb_drift */ fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size; @@ -405,7 +412,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra } /* perform inversion and +/- zigzag */ - switch(fepriv->auto_sub_step) { + switch (fepriv->auto_sub_step) { case 0: /* try with the current inversion and current drift setting */ ready = 1; @@ -450,11 +457,11 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra return 1; } - dev_dbg(fe->dvb->device, "%s: drift:%i inversion:%i auto_step:%i " \ - "auto_sub_step:%i started_auto_step:%i\n", - __func__, fepriv->lnb_drift, fepriv->inversion, - fepriv->auto_step, fepriv->auto_sub_step, - fepriv->started_auto_step); + dev_dbg(fe->dvb->device, + "%s: drift:%i inversion:%i auto_step:%i auto_sub_step:%i started_auto_step:%i\n", + __func__, fepriv->lnb_drift, fepriv->inversion, + fepriv->auto_step, fepriv->auto_sub_step, + fepriv->started_auto_step); /* set the frontend itself */ c->frequency += fepriv->lnb_drift; @@ -485,7 +492,7 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) /* if we've got no parameters, just keep idling */ if (fepriv->state & FESTATE_IDLE) { - fepriv->delay = 3*HZ; + fepriv->delay = 3 * HZ; fepriv->quality = 0; return; } @@ -502,7 +509,7 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) else fepriv->state = FESTATE_TUNED; } - fepriv->delay = 3*HZ; + fepriv->delay = 3 * HZ; fepriv->quality = 0; return; } @@ -591,7 +598,7 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe) } fepriv->check_wrapped = 1; - /* if we've just retuned, enter the ZIGZAG_FAST state. + /* if we've just re-tuned, enter the ZIGZAG_FAST state. * This ensures we cannot return from an * FE_SET_FRONTEND ioctl before the first frontend tune * occurs */ @@ -658,7 +665,7 @@ static int dvb_frontend_thread(void *data) fepriv->check_wrapped = 0; fepriv->quality = 0; - fepriv->delay = 3*HZ; + fepriv->delay = 3 * HZ; fepriv->status = 0; fepriv->wakeup = 0; fepriv->reinitialise = 0; @@ -670,8 +677,9 @@ static int dvb_frontend_thread(void *data) up(&fepriv->sem); /* is locked when we enter the thread... */ restart: wait_event_interruptible_timeout(fepriv->wait_queue, - dvb_frontend_should_wakeup(fe) || kthread_should_stop() - || freezing(current), + dvb_frontend_should_wakeup(fe) || + kthread_should_stop() || + freezing(current), fepriv->delay); if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) { @@ -820,8 +828,8 @@ static void dvb_frontend_stop(struct dvb_frontend *fe) /* paranoia check in case a signal arrived */ if (fepriv->thread) dev_warn(fe->dvb->device, - "dvb_frontend_stop: warning: thread %p won't exit\n", - fepriv->thread); + "dvb_frontend_stop: warning: thread %p won't exit\n", + fepriv->thread); } /* @@ -858,12 +866,12 @@ static int dvb_frontend_start(struct dvb_frontend *fe) if (fe->exit == DVB_FE_NO_EXIT) return 0; else - dvb_frontend_stop (fe); + dvb_frontend_stop(fe); } if (signal_pending(current)) return -EINTR; - if (down_interruptible (&fepriv->sem)) + if (down_interruptible(&fepriv->sem)) return -EINTR; fepriv->state = FESTATE_IDLE; @@ -872,12 +880,12 @@ static int dvb_frontend_start(struct dvb_frontend *fe) mb(); fe_thread = kthread_run(dvb_frontend_thread, fe, - "kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id); + "kdvb-ad-%i-fe-%i", fe->dvb->num, fe->id); if (IS_ERR(fe_thread)) { ret = PTR_ERR(fe_thread); dev_warn(fe->dvb->device, - "dvb_frontend_start: failed to start kthread (%d)\n", - ret); + "dvb_frontend_start: failed to start kthread (%d)\n", + ret); up(&fepriv->sem); return ret; } @@ -886,7 +894,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe) } static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe, - u32 *freq_min, u32 *freq_max) + u32 *freq_min, u32 *freq_max) { *freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min); @@ -898,8 +906,9 @@ static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe, *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max); if (*freq_min == 0 || *freq_max == 0) - dev_warn(fe->dvb->device, "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n", - fe->dvb->num, fe->id); + dev_warn(fe->dvb->device, + "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n", + fe->dvb->num, fe->id); } static int dvb_frontend_check_parameters(struct dvb_frontend *fe) @@ -913,8 +922,8 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe) if ((freq_min && c->frequency < freq_min) || (freq_max && c->frequency > freq_max)) { dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n", - fe->dvb->num, fe->id, c->frequency, - freq_min, freq_max); + fe->dvb->num, fe->id, c->frequency, + freq_min, freq_max); return -EINVAL; } @@ -930,9 +939,9 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe) (fe->ops.info.symbol_rate_max && c->symbol_rate > fe->ops.info.symbol_rate_max)) { dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n", - fe->dvb->num, fe->id, c->symbol_rate, - fe->ops.info.symbol_rate_min, - fe->ops.info.symbol_rate_max); + fe->dvb->num, fe->id, c->symbol_rate, + fe->ops.info.symbol_rate_min, + fe->ops.info.symbol_rate_max); return -EINVAL; } default: @@ -953,7 +962,7 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe) c->delivery_system = delsys; dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n", - __func__, c->delivery_system); + __func__, c->delivery_system); c->transmission_mode = TRANSMISSION_MODE_AUTO; c->bandwidth_hz = 0; /* AUTO */ @@ -973,7 +982,7 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe) c->isdbt_sb_subchannel = 0; c->isdbt_sb_segment_idx = 0; c->isdbt_sb_segment_count = 0; - c->isdbt_layer_enabled = 0; + c->isdbt_layer_enabled = 7; /* All layers (A,B,C) */ for (i = 0; i < 3; i++) { c->layer[i].fec = FEC_AUTO; c->layer[i].modulation = QAM_AUTO; @@ -1178,8 +1187,8 @@ static int dtv_property_cache_sync(struct dvb_frontend *fe, break; case DVBV3_UNKNOWN: dev_err(fe->dvb->device, - "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", - __func__, c->delivery_system); + "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", + __func__, c->delivery_system); return -EINVAL; } @@ -1200,8 +1209,8 @@ dtv_property_legacy_params_sync(struct dvb_frontend *fe, switch (dvbv3_type(c->delivery_system)) { case DVBV3_UNKNOWN: dev_err(fe->dvb->device, - "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", - __func__, c->delivery_system); + "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", + __func__, c->delivery_system); return -EINVAL; case DVBV3_QPSK: dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__); @@ -1293,7 +1302,7 @@ static int dtv_property_process_get(struct dvb_frontend *fe, { int ncaps; - switch(tvp->cmd) { + switch (tvp->cmd) { case DTV_ENUM_DELSYS: ncaps = 0; while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) { @@ -1622,8 +1631,8 @@ static int dvbv5_set_delivery_system(struct dvb_frontend *fe, if (fe->ops.delsys[ncaps] == desired_system) { c->delivery_system = desired_system; dev_dbg(fe->dvb->device, - "%s: Changing delivery system to %d\n", - __func__, desired_system); + "%s: Changing delivery system to %d\n", + __func__, desired_system); return 0; } ncaps++; @@ -1715,8 +1724,8 @@ static int dvbv3_set_delivery_system(struct dvb_frontend *fe) */ if (is_dvbv3_delsys(c->delivery_system)) { dev_dbg(fe->dvb->device, - "%s: Using delivery system to %d\n", - __func__, c->delivery_system); + "%s: Using delivery system to %d\n", + __func__, c->delivery_system); return 0; } @@ -1756,8 +1765,8 @@ static int dvbv3_set_delivery_system(struct dvb_frontend *fe) * Zero on success, negative errno on failure. */ static int dtv_property_process_set(struct dvb_frontend *fe, - struct file *file, - u32 cmd, u32 data) + struct file *file, + u32 cmd, u32 data) { int r = 0; struct dtv_frontend_properties *c = &fe->dtv_property_cache; @@ -1765,11 +1774,11 @@ static int dtv_property_process_set(struct dvb_frontend *fe, /** Dump DTV command name and value*/ if (!cmd || cmd > DTV_MAX_COMMAND) dev_warn(fe->dvb->device, "%s: SET cmd 0x%08x undefined\n", - __func__, cmd); + __func__, cmd); else dev_dbg(fe->dvb->device, - "%s: SET cmd 0x%08x (%s) to 0x%08x\n", - __func__, cmd, dtv_cmds[cmd].name, data); + "%s: SET cmd 0x%08x (%s) to 0x%08x\n", + __func__, cmd, dtv_cmds[cmd].name, data); switch (cmd) { case DTV_CLEAR: /* @@ -1819,12 +1828,12 @@ static int dtv_property_process_set(struct dvb_frontend *fe, case DTV_VOLTAGE: c->voltage = data; r = dvb_frontend_handle_ioctl(file, FE_SET_VOLTAGE, - (void *)c->voltage); + (void *)c->voltage); break; case DTV_TONE: c->sectone = data; r = dvb_frontend_handle_ioctl(file, FE_SET_TONE, - (void *)c->sectone); + (void *)c->sectone); break; case DTV_CODE_RATE_HP: c->code_rate_HP = data; @@ -2045,8 +2054,8 @@ static int dvb_frontend_handle_compat_ioctl(struct file *file, unsigned int cmd, for (i = 0; i < tvps->num; i++) { err = dtv_property_process_set(fe, file, - (tvp + i)->cmd, - (tvp + i)->u.data); + (tvp + i)->cmd, + (tvp + i)->u.data); if (err < 0) { kfree(tvp); return err; @@ -2265,7 +2274,6 @@ static int dtv_set_frontend(struct dvb_frontend *fe) return 0; } - static int dvb_frontend_handle_ioctl(struct file *file, unsigned int cmd, void *parg) { @@ -2300,8 +2308,8 @@ static int dvb_frontend_handle_ioctl(struct file *file, for (i = 0; i < tvps->num; i++) { err = dtv_property_process_set(fe, file, - (tvp + i)->cmd, - (tvp + i)->u.data); + (tvp + i)->cmd, + (tvp + i)->u.data); if (err < 0) { kfree(tvp); return err; @@ -2365,7 +2373,7 @@ static int dvb_frontend_handle_ioctl(struct file *file, } case FE_GET_INFO: { - struct dvb_frontend_info* info = parg; + struct dvb_frontend_info *info = parg; memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info)); dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max); @@ -2396,12 +2404,12 @@ static int dvb_frontend_handle_ioctl(struct file *file, break; default: dev_err(fe->dvb->device, - "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", - __func__, c->delivery_system); + "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n", + __func__, c->delivery_system); fe->ops.info.type = FE_OFDM; } dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n", - __func__, c->delivery_system, fe->ops.info.type); + __func__, c->delivery_system, fe->ops.info.type); /* Set CAN_INVERSION_AUTO bit on in other than oneshot mode */ if (!(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) @@ -2417,7 +2425,7 @@ static int dvb_frontend_handle_ioctl(struct file *file, * that user get signal state from previous tuning */ if (fepriv->state == FESTATE_RETUNE || fepriv->state == FESTATE_ERROR) { - err=0; + err = 0; *status = 0; break; } @@ -2485,11 +2493,11 @@ static int dvb_frontend_handle_ioctl(struct file *file, case FE_ENABLE_HIGH_LNB_VOLTAGE: if (fe->ops.enable_high_lnb_voltage) - err = fe->ops.enable_high_lnb_voltage(fe, (long) parg); + err = fe->ops.enable_high_lnb_voltage(fe, (long)parg); break; case FE_SET_FRONTEND_TUNE_MODE: - fepriv->tune_mode_flags = (unsigned long) parg; + fepriv->tune_mode_flags = (unsigned long)parg; err = 0; break; @@ -2518,11 +2526,12 @@ static int dvb_frontend_handle_ioctl(struct file *file, * initialization, so parg is 8 bits and does not * include the initialization or start bit */ - unsigned long swcmd = ((unsigned long) parg) << 1; + unsigned long swcmd = ((unsigned long)parg) << 1; ktime_t nexttime; ktime_t tv[10]; int i; u8 last = 1; + if (dvb_frontend_debug) dprintk("%s switch command: 0x%04lx\n", __func__, swcmd); @@ -2537,7 +2546,7 @@ static int dvb_frontend_handle_ioctl(struct file *file, for (i = 0; i < 9; i++) { if (dvb_frontend_debug) - tv[i+1] = ktime_get_boottime(); + tv[i + 1] = ktime_get_boottime(); if ((swcmd & 0x01) != last) { /* set voltage to (last ? 13V : 18V) */ fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18); @@ -2552,7 +2561,7 @@ static int dvb_frontend_handle_ioctl(struct file *file, __func__, fe->dvb->num); for (i = 1; i < 10; i++) pr_info("%d: %d\n", i, - (int) ktime_us_delta(tv[i], tv[i-1])); + (int)ktime_us_delta(tv[i], tv[i - 1])); } err = 0; fepriv->state = FESTATE_DISEQC; @@ -2611,7 +2620,7 @@ static int dvb_frontend_handle_ioctl(struct file *file, err = dtv_set_frontend(fe); break; case FE_GET_EVENT: - err = dvb_frontend_get_event (fe, parg, file->f_flags); + err = dvb_frontend_get_event(fe, parg, file->f_flags); break; case FE_GET_FRONTEND: { @@ -2634,7 +2643,6 @@ static int dvb_frontend_handle_ioctl(struct file *file, return err; } - static __poll_t dvb_frontend_poll(struct file *file, struct poll_table_struct *wait) { struct dvb_device *dvbdev = file->private_data; @@ -2643,7 +2651,7 @@ static __poll_t dvb_frontend_poll(struct file *file, struct poll_table_struct *w dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__); - poll_wait (file, &fepriv->events.wait_queue, wait); + poll_wait(file, &fepriv->events.wait_queue, wait); if (fepriv->events.eventw != fepriv->events.eventr) return (EPOLLIN | EPOLLRDNORM | EPOLLPRI); @@ -2664,9 +2672,9 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) return -ENODEV; if (adapter->mfe_shared) { - mutex_lock (&adapter->mfe_lock); + mutex_lock(&adapter->mfe_lock); - if (adapter->mfe_dvbdev == NULL) + if (!adapter->mfe_dvbdev) adapter->mfe_dvbdev = dvbdev; else if (adapter->mfe_dvbdev != dvbdev) { @@ -2678,23 +2686,23 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) *mfepriv = mfe->frontend_priv; int mferetry = (dvb_mfe_wait_time << 1); - mutex_unlock (&adapter->mfe_lock); + mutex_unlock(&adapter->mfe_lock); while (mferetry-- && (mfedev->users != -1 || - mfepriv->thread != NULL)) { - if(msleep_interruptible(500)) { - if(signal_pending(current)) + mfepriv->thread)) { + if (msleep_interruptible(500)) { + if (signal_pending(current)) return -EINTR; } } - mutex_lock (&adapter->mfe_lock); - if(adapter->mfe_dvbdev != dvbdev) { + mutex_lock(&adapter->mfe_lock); + if (adapter->mfe_dvbdev != dvbdev) { mfedev = adapter->mfe_dvbdev; mfe = mfedev->priv; mfepriv = mfe->frontend_priv; if (mfedev->users != -1 || - mfepriv->thread != NULL) { - mutex_unlock (&adapter->mfe_lock); + mfepriv->thread) { + mutex_unlock(&adapter->mfe_lock); return -EBUSY; } adapter->mfe_dvbdev = dvbdev; @@ -2715,7 +2723,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) fepriv->reinitialise = 1; } - if ((ret = dvb_generic_open (inode, file)) < 0) + if ((ret = dvb_generic_open(inode, file)) < 0) goto err1; if ((file->f_flags & O_ACCMODE) != O_RDONLY) { @@ -2725,6 +2733,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) fepriv->voltage = -1; #ifdef CONFIG_MEDIA_CONTROLLER_DVB + mutex_lock(&fe->dvb->mdev_lock); if (fe->dvb->mdev) { mutex_lock(&fe->dvb->mdev->graph_mutex); if (fe->dvb->mdev->enable_source) @@ -2733,13 +2742,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) &fepriv->pipe); mutex_unlock(&fe->dvb->mdev->graph_mutex); if (ret) { + mutex_unlock(&fe->dvb->mdev_lock); dev_err(fe->dvb->device, "Tuner is busy. Error %d\n", ret); goto err2; } } + mutex_unlock(&fe->dvb->mdev_lock); #endif - ret = dvb_frontend_start (fe); + ret = dvb_frontend_start(fe); if (ret) goto err3; @@ -2750,17 +2761,19 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) dvb_frontend_get(fe); if (adapter->mfe_shared) - mutex_unlock (&adapter->mfe_lock); + mutex_unlock(&adapter->mfe_lock); return ret; err3: #ifdef CONFIG_MEDIA_CONTROLLER_DVB + mutex_lock(&fe->dvb->mdev_lock); if (fe->dvb->mdev) { mutex_lock(&fe->dvb->mdev->graph_mutex); if (fe->dvb->mdev->disable_source) fe->dvb->mdev->disable_source(dvbdev->entity); mutex_unlock(&fe->dvb->mdev->graph_mutex); } + mutex_unlock(&fe->dvb->mdev_lock); err2: #endif dvb_generic_release(inode, file); @@ -2769,7 +2782,7 @@ err1: fe->ops.ts_bus_ctrl(fe, 0); err0: if (adapter->mfe_shared) - mutex_unlock (&adapter->mfe_lock); + mutex_unlock(&adapter->mfe_lock); return ret; } @@ -2787,17 +2800,19 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) mb(); } - ret = dvb_generic_release (inode, file); + ret = dvb_generic_release(inode, file); if (dvbdev->users == -1) { wake_up(&fepriv->wait_queue); #ifdef CONFIG_MEDIA_CONTROLLER_DVB + mutex_lock(&fe->dvb->mdev_lock); if (fe->dvb->mdev) { mutex_lock(&fe->dvb->mdev->graph_mutex); if (fe->dvb->mdev->disable_source) fe->dvb->mdev->disable_source(dvbdev->entity); mutex_unlock(&fe->dvb->mdev->graph_mutex); } + mutex_unlock(&fe->dvb->mdev_lock); #endif if (fe->exit != DVB_FE_NO_EXIT) wake_up(&dvbdev->wait_queue); @@ -2827,7 +2842,7 @@ int dvb_frontend_suspend(struct dvb_frontend *fe) int ret = 0; dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num, - fe->id); + fe->id); if (fe->ops.tuner_ops.suspend) ret = fe->ops.tuner_ops.suspend(fe); @@ -2847,7 +2862,7 @@ int dvb_frontend_resume(struct dvb_frontend *fe) int ret = 0; dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num, - fe->id); + fe->id); fe->exit = DVB_FE_DEVICE_RESUME; if (fe->ops.init) @@ -2871,14 +2886,14 @@ int dvb_frontend_resume(struct dvb_frontend *fe) } EXPORT_SYMBOL(dvb_frontend_resume); -int dvb_register_frontend(struct dvb_adapter* dvb, - struct dvb_frontend* fe) +int dvb_register_frontend(struct dvb_adapter *dvb, + struct dvb_frontend *fe) { struct dvb_frontend_private *fepriv; const struct dvb_device dvbdev_template = { .users = ~0, .writers = 1, - .readers = (~0)-1, + .readers = (~0) - 1, .fops = &dvb_frontend_fops, #if defined(CONFIG_MEDIA_CONTROLLER_DVB) .name = fe->ops.info.name, @@ -2891,7 +2906,7 @@ int dvb_register_frontend(struct dvb_adapter* dvb, return -ERESTARTSYS; fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL); - if (fe->frontend_priv == NULL) { + if (!fe->frontend_priv) { mutex_unlock(&frontend_mutex); return -ENOMEM; } @@ -2907,18 +2922,18 @@ int dvb_register_frontend(struct dvb_adapter* dvb, dvb_frontend_get(fe); sema_init(&fepriv->sem, 1); - init_waitqueue_head (&fepriv->wait_queue); - init_waitqueue_head (&fepriv->events.wait_queue); + init_waitqueue_head(&fepriv->wait_queue); + init_waitqueue_head(&fepriv->events.wait_queue); mutex_init(&fepriv->events.mtx); fe->dvb = dvb; fepriv->inversion = INVERSION_OFF; dev_info(fe->dvb->device, - "DVB: registering adapter %i frontend %i (%s)...\n", - fe->dvb->num, fe->id, fe->ops.info.name); + "DVB: registering adapter %i frontend %i (%s)...\n", + fe->dvb->num, fe->id, fe->ops.info.name); - dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template, - fe, DVB_DEVICE_FRONTEND, 0); + dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template, + fe, DVB_DEVICE_FRONTEND, 0); /* * Initialize the cache to the proper values according with the @@ -2933,9 +2948,10 @@ int dvb_register_frontend(struct dvb_adapter* dvb, } EXPORT_SYMBOL(dvb_register_frontend); -int dvb_unregister_frontend(struct dvb_frontend* fe) +int dvb_unregister_frontend(struct dvb_frontend *fe) { struct dvb_frontend_private *fepriv = fe->frontend_priv; + dev_dbg(fe->dvb->device, "%s:\n", __func__); mutex_lock(&frontend_mutex); @@ -2960,7 +2976,7 @@ static void dvb_frontend_invoke_release(struct dvb_frontend *fe, } } -void dvb_frontend_detach(struct dvb_frontend* fe) +void dvb_frontend_detach(struct dvb_frontend *fe) { dvb_frontend_invoke_release(fe, fe->ops.release_sec); dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release); |