Commit a82200fb authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (6605): Add a modprobe option to manually select audio standard



While there's no public API to define audio standard, adds a hack option for
select them. This is needed only for NICAM and A2 firmwares, since AM, BTSC and
EAIJ are already properly handled, on firmware version 2.7.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent d6964aa8
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -28,6 +28,20 @@ static int debug;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "enable verbose debug messages");

static char audio_std[8];
module_param_string(audio_std, audio_std, sizeof(audio_std), 0);
MODULE_PARM_DESC(audio_std,
	"Audio standard. XC3028 audio decoder explicitly "
	"needs to know what audio\n"
	"standard is needed for some video standards with audio A2 or NICAM.\n"
	"The valid values are:\n"
	"A2\n"
	"A2/A\n"
	"A2/B\n"
	"NICAM\n"
	"NICAM/A\n"
	"NICAM/B\n");

static LIST_HEAD(xc2028_list);
/* struct for storing firmware table */
struct firmware_description {
@@ -180,6 +194,24 @@ void dump_firm_type(unsigned int type)
		printk("SCODE ");
}

static v4l2_std_id parse_audio_std_option(void)
{
	if (strcasecmp(audio_std, "A2"))
		return V4L2_STD_A2;
	if (strcasecmp(audio_std, "A2/A"))
		return V4L2_STD_A2_A;
	if (strcasecmp(audio_std, "A2/B"))
		return V4L2_STD_A2_B;
	if (strcasecmp(audio_std, "NICAM"))
		return V4L2_STD_NICAM;
	if (strcasecmp(audio_std, "NICAM/A"))
		return V4L2_STD_NICAM_A;
	if (strcasecmp(audio_std, "NICAM/B"))
		return V4L2_STD_NICAM_B;

	return 0;
}

static void free_firmware(struct xc2028_data *priv)
{
	int i;
@@ -613,6 +645,9 @@ static int check_firmware(struct dvb_frontend *fe, enum tuner_mode new_mode,
		return 0;
	}

	/* Add audio hack to std mask */
	std |= parse_audio_std_option();

	rc = load_firmware(fe, type, &std);
	if (rc < 0)
		return rc;