/* si4713_ioctl - deal with private ioctls (only rnl for now) */ static long si4713_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { struct si4713_device *sdev = to_si4713_device(sd); struct si4713_rnl *rnl = arg; u16 frequency; int rval = 0; if (!arg) return -EINVAL; switch (cmd) { case SI4713_IOC_MEASURE_RNL: frequency = v4l2_to_si4713(rnl->frequency); if (sdev->power_state) { /* Set desired measurement frequency */ rval = si4713_tx_tune_measure(sdev, frequency, 0); if (rval < 0) return rval; /* get results from tune status */ rval = si4713_update_tune_status(sdev); if (rval < 0) return rval; } rnl->rnl = sdev->tune_rnl; break; default: /* nothing */ rval = -ENOIOCTLCMD; } return rval; }
/* si4713_s_frequency - set tuner or modulator radio frequency */ static int si4713_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f) { struct si4713_device *sdev = to_si4713_device(sd); int rval = 0; u16 frequency = v4l2_to_si4713(f->frequency); /* Check frequency range */ if (frequency < FREQ_RANGE_LOW || frequency > FREQ_RANGE_HIGH) return -EDOM; mutex_lock(&sdev->mutex); if (sdev->power_state) { rval = si4713_tx_tune_freq(sdev, frequency); if (rval < 0) goto unlock; frequency = rval; rval = 0; } sdev->frequency = frequency; f->frequency = si4713_to_v4l2(frequency); unlock: mutex_unlock(&sdev->mutex); return rval; }
/* si4713_s_frequency - set tuner or modulator radio frequency */ static int si4713_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequency *f) { struct si4713_device *sdev = to_si4713_device(sd); int rval = 0; u16 frequency = v4l2_to_si4713(f->frequency); if (f->tuner) return -EINVAL; /* Check frequency range */ frequency = clamp_t(u16, frequency, FREQ_RANGE_LOW, FREQ_RANGE_HIGH); if (sdev->power_state) { rval = si4713_tx_tune_freq(sdev, frequency); if (rval < 0) return rval; frequency = rval; rval = 0; } sdev->frequency = frequency; return rval; }