Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b879a9c2 authored by Andrey Smirnov's avatar Andrey Smirnov Committed by Mauro Carvalho Chehab
Browse files

[media] v4l2: Add a V4L2 driver for SI476X MFD



This commit adds a driver that exposes all the radio related
functionality of the Si476x series of chips via the V4L2 subsystem.

[mchehab@redhat.com: change it to depends on MFD_SI476X_CORE instead of
 selecting it; vidioc_s_register now uses const struct]
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 6695be68
Loading
Loading
Loading
Loading
+187 −0
Original line number Original line Diff line number Diff line
SI476x Driver Readme
------------------------------------------------
	Copyright (C) 2013 Andrey Smirnov <andrew.smirnov@gmail.com>

TODO for the driver
------------------------------

- According to the SiLabs' datasheet it is possible to update the
  firmware of the radio chip in the run-time, thus bringing it to the
  most recent version. Unfortunately I couldn't find any mentioning of
  the said firmware update for the old chips that I tested the driver
  against, so for chips like that the driver only exposes the old
  functionality.


Parameters exposed over debugfs
-------------------------------
SI476x allow user to get multiple characteristics that can be very
useful for EoL testing/RF performance estimation, parameters that have
very little to do with V4L2 subsystem. Such parameters are exposed via
debugfs and can be accessed via regular file I/O operations.

The drivers exposes following files:

* /sys/kernel/debug/<device-name>/acf
  This file contains ACF(Automatically Controlled Features) status
  information. The contents of the file is binary data of the
  following layout:

  Offset	| Name		| Description
  ====================================================================
  0x00		| blend_int	| Flag, set when stereo separation has
  		|  		| crossed below the blend threshold
  --------------------------------------------------------------------
  0x01		| hblend_int	| Flag, set when HiBlend cutoff
  		| 		| frequency is lower than threshold
  --------------------------------------------------------------------
  0x02		| hicut_int	| Flag, set when HiCut cutoff
  		| 		| frequency is lower than threshold
  --------------------------------------------------------------------
  0x03		| chbw_int	| Flag, set when channel filter
  		| 		| bandwidth is less than threshold
  --------------------------------------------------------------------
  0x04		| softmute_int	| Flag indicating that softmute
  		| 		| attenuation has increased above
		|		| softmute threshold
  --------------------------------------------------------------------
  0x05		| smute		| 0 - Audio is not soft muted
  		| 		| 1 - Audio is soft muted
  --------------------------------------------------------------------
  0x06		| smattn	| Soft mute attenuation level in dB
  --------------------------------------------------------------------
  0x07		| chbw		| Channel filter bandwidth in kHz
  --------------------------------------------------------------------
  0x08		| hicut		| HiCut cutoff frequency in units of
  		| 		| 100Hz
  --------------------------------------------------------------------
  0x09		| hiblend	| HiBlend cutoff frequency in units
  		| 		| of 100 Hz
  --------------------------------------------------------------------
  0x10		| pilot		| 0 - Stereo pilot is not present
  		| 		| 1 - Stereo pilot is present
  --------------------------------------------------------------------
  0x11		| stblend	| Stereo blend in %
  --------------------------------------------------------------------


* /sys/kernel/debug/<device-name>/rds_blckcnt
  This file contains statistics about RDS receptions. It's binary data
  has the following layout:

  Offset	| Name		| Description
  ====================================================================
  0x00		| expected	| Number of expected RDS blocks
  --------------------------------------------------------------------
  0x02		| received	| Number of received RDS blocks
  --------------------------------------------------------------------
  0x04		| uncorrectable	| Number of uncorrectable RDS blocks
  --------------------------------------------------------------------

* /sys/kernel/debug/<device-name>/agc
  This file contains information about parameters pertaining to
  AGC(Automatic Gain Control)

  The layout is:
  Offset	| Name		| Description
  ====================================================================
  0x00		| mxhi		| 0 - FM Mixer PD high threshold is
  		| 		| not tripped
		|		| 1 - FM Mixer PD high threshold is
		|		| tripped
  --------------------------------------------------------------------
  0x01		| mxlo		| ditto for FM Mixer PD low
  --------------------------------------------------------------------
  0x02		| lnahi		| ditto for FM LNA PD high
  --------------------------------------------------------------------
  0x03		| lnalo		| ditto for FM LNA PD low
  --------------------------------------------------------------------
  0x04		| fmagc1	| FMAGC1 attenuator resistance
  		| 		| (see datasheet for more detail)
  --------------------------------------------------------------------
  0x05		| fmagc2	| ditto for FMAGC2
  --------------------------------------------------------------------
  0x06		| pgagain	| PGA gain in dB
  --------------------------------------------------------------------
  0x07		| fmwblang	| FM/WB LNA Gain in dB
  --------------------------------------------------------------------

* /sys/kernel/debug/<device-name>/rsq
  This file contains information about parameters pertaining to
  RSQ(Received Signal Quality)

  The layout is:
  Offset	| Name		| Description
  ====================================================================
  0x00		| multhint	| 0 - multipath value has not crossed
  		| 		| the Multipath high threshold
		|		| 1 - multipath value has crossed
  		| 		| the Multipath high threshold
  --------------------------------------------------------------------
  0x01		| multlint	| ditto for Multipath low threshold
  --------------------------------------------------------------------
  0x02		| snrhint	| 0 - received signal's SNR has not
  		| 		| crossed high threshold
		|		| 1 - received signal's SNR has
  		| 		| crossed high threshold
  --------------------------------------------------------------------
  0x03		| snrlint	| ditto for low threshold
  --------------------------------------------------------------------
  0x04		| rssihint	| ditto for RSSI high threshold
  --------------------------------------------------------------------
  0x05		| rssilint	| ditto for RSSI low threshold
  --------------------------------------------------------------------
  0x06		| bltf		| Flag indicating if seek command
  		| 		| reached/wrapped seek band limit
  --------------------------------------------------------------------
  0x07		| snr_ready	| Indicates that SNR metrics is ready
  --------------------------------------------------------------------
  0x08		| rssiready	| ditto for RSSI metrics
  --------------------------------------------------------------------
  0x09		| injside	| 0 - Low-side injection is being used
  		| 		| 1 - High-side injection is used
  --------------------------------------------------------------------
  0x10		| afcrl		| Flag indicating if AFC rails
  --------------------------------------------------------------------
  0x11		| valid		| Flag indicating if channel is valid
  --------------------------------------------------------------------
  0x12		| readfreq	| Current tuned frequency
  --------------------------------------------------------------------
  0x14		| freqoff	| Singed frequency offset in units of
  		| 		| 2ppm
  --------------------------------------------------------------------
  0x15		| rssi		| Signed value of RSSI in dBuV
  --------------------------------------------------------------------
  0x16		| snr		| Signed RF SNR in dB
  --------------------------------------------------------------------
  0x17		| issi		| Signed Image Strength Signal
  		| 		| indicator
  --------------------------------------------------------------------
  0x18		| lassi		| Signed Low side adjacent Channel
  		| 		| Strength indicator
  --------------------------------------------------------------------
  0x19		| hassi		| ditto fpr High side
  --------------------------------------------------------------------
  0x20		| mult		| Multipath indicator
  --------------------------------------------------------------------
  0x21		| dev		| Frequency deviation
  --------------------------------------------------------------------
  0x24		| assi		| Adjascent channel SSI
  --------------------------------------------------------------------
  0x25		| usn		| Ultrasonic noise indicator
  --------------------------------------------------------------------
  0x26		| pilotdev	| Pilot deviation in units of 100 Hz
  --------------------------------------------------------------------
  0x27		| rdsdev	| ditto for RDS
  --------------------------------------------------------------------
  0x28		| assidev	| ditto for ASSI
  --------------------------------------------------------------------
  0x29		| strongdev	| Frequency deviation
  --------------------------------------------------------------------
  0x30		| rdspi		| RDS PI code
  --------------------------------------------------------------------

* /sys/kernel/debug/<device-name>/rsq_primary
  This file contains information about parameters pertaining to
  RSQ(Received Signal Quality) for primary tuner only. Layout is as
  the one above.
+16 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,22 @@ config RADIO_SI470X


source "drivers/media/radio/si470x/Kconfig"
source "drivers/media/radio/si470x/Kconfig"


config RADIO_SI476X
	tristate "Silicon Laboratories Si476x I2C FM Radio"
	depends on I2C && VIDEO_V4L2
	depends on MFD_SI476X_CORE
	select SND_SOC_SI476X
	---help---
	  Choose Y here if you have this FM radio chip.

	  In order to control your radio card, you will need to use programs
	  that are compatible with the Video For Linux 2 API.  Information on
	  this API and pointers to "v4l2" programs may be found at
	  <file:Documentation/video4linux/API.html>.

	  To compile this driver as a module, choose M here: the
	  module will be called radio-si476x.

config USB_MR800
config USB_MR800
	tristate "AverMedia MR 800 USB FM radio support"
	tristate "AverMedia MR 800 USB FM radio support"
	depends on USB && VIDEO_V4L2
	depends on USB && VIDEO_V4L2
+1 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o
obj-$(CONFIG_RADIO_TRUST) += radio-trust.o
obj-$(CONFIG_RADIO_TRUST) += radio-trust.o
obj-$(CONFIG_I2C_SI4713) += si4713-i2c.o
obj-$(CONFIG_I2C_SI4713) += si4713-i2c.o
obj-$(CONFIG_RADIO_SI4713) += radio-si4713.o
obj-$(CONFIG_RADIO_SI4713) += radio-si4713.o
obj-$(CONFIG_RADIO_SI476X) += radio-si476x.o
obj-$(CONFIG_RADIO_MIROPCM20) += radio-miropcm20.o
obj-$(CONFIG_RADIO_MIROPCM20) += radio-miropcm20.o
obj-$(CONFIG_USB_DSBR) += dsbr100.o
obj-$(CONFIG_USB_DSBR) += dsbr100.o
obj-$(CONFIG_RADIO_SI470X) += si470x/
obj-$(CONFIG_RADIO_SI470X) += si470x/
+1599 −0

File added.

Preview size limit exceeded, changes collapsed.

include/media/si476x.h

0 → 100644
+37 −0
Original line number Original line Diff line number Diff line
/*
 * include/media/si476x.h -- Common definitions for si476x driver
 *
 * Copyright (C) 2012 Innovative Converged Devices(ICD)
 * Copyright (C) 2013 Andrey Smirnov
 *
 * Author: Andrey Smirnov <andrew.smirnov@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 */

#ifndef SI476X_H
#define SI476X_H

#include <linux/types.h>
#include <linux/videodev2.h>

#include <linux/mfd/si476x-reports.h>

enum si476x_ctrl_id {
	V4L2_CID_SI476X_RSSI_THRESHOLD	= (V4L2_CID_USER_SI476X_BASE + 1),
	V4L2_CID_SI476X_SNR_THRESHOLD	= (V4L2_CID_USER_SI476X_BASE + 2),
	V4L2_CID_SI476X_MAX_TUNE_ERROR	= (V4L2_CID_USER_SI476X_BASE + 3),
	V4L2_CID_SI476X_HARMONICS_COUNT	= (V4L2_CID_USER_SI476X_BASE + 4),
	V4L2_CID_SI476X_DIVERSITY_MODE	= (V4L2_CID_USER_SI476X_BASE + 5),
	V4L2_CID_SI476X_INTERCHIP_LINK	= (V4L2_CID_USER_SI476X_BASE + 6),
};

#endif /* SI476X_H*/