[RFC PATCH 1/2] media: mxl692: Add configurable crystal and MPEG settings

Forest Crossman posted 2 patches 16 hours ago
[RFC PATCH 1/2] media: mxl692: Add configurable crystal and MPEG settings
Posted by Forest Crossman 16 hours ago
Other devices that use the MxL692 need to be able to adjust these
parameters, so add them to the mxl692_config struct to make them
configurable.

Signed-off-by: Forest Crossman <cyrozap@gmail.com>
---
 drivers/media/dvb-frontends/mxl692.c  | 38 ++++++++++++++++++---------
 drivers/media/dvb-frontends/mxl692.h  | 19 ++++++++++++++
 drivers/media/usb/em28xx/em28xx-dvb.c |  9 +++++++
 3 files changed, 54 insertions(+), 12 deletions(-)

diff --git a/drivers/media/dvb-frontends/mxl692.c b/drivers/media/dvb-frontends/mxl692.c
index bbc2bc778225..9ecef72263f3 100644
--- a/drivers/media/dvb-frontends/mxl692.c
+++ b/drivers/media/dvb-frontends/mxl692.c
@@ -29,6 +29,9 @@ struct mxl692_dev {
 	int device_type;
 	int seqnum;
 	int init_done;
+	u8 xtal_calibration_enable;
+	u8 xtal_sharing_enable;
+	struct MXL_EAGLE_MPEGOUT_PARAMS_T mpeg_params;
 };
 
 static int mxl692_i2c_write(struct mxl692_dev *dev, u8 *buffer, u16 buf_len)
@@ -879,8 +882,8 @@ static int mxl692_init(struct dvb_frontend *fe)
 	xtal_config.xtal_cap = 26;
 	xtal_config.clk_out_div_enable = 0;
 	xtal_config.clk_out_enable = 0;
-	xtal_config.xtal_calibration_enable = 0;
-	xtal_config.xtal_sharing_enable = 1;
+	xtal_config.xtal_calibration_enable = dev->xtal_calibration_enable;
+	xtal_config.xtal_sharing_enable = dev->xtal_sharing_enable;
 	status = mxl692_config_xtal(dev, &xtal_config);
 	if (status)
 		goto err;
@@ -949,7 +952,7 @@ static int mxl692_set_frontend(struct dvb_frontend *fe)
 
 	int status = 0;
 	enum MXL_EAGLE_DEMOD_TYPE_E demod_type;
-	struct MXL_EAGLE_MPEGOUT_PARAMS_T mpeg_params = {};
+	struct MXL_EAGLE_MPEGOUT_PARAMS_T mpeg_params = dev->mpeg_params;
 	enum MXL_EAGLE_QAM_DEMOD_ANNEX_TYPE_E qam_annex = MXL_EAGLE_QAM_DEMOD_ANNEX_B;
 	struct MXL_EAGLE_QAM_DEMOD_PARAMS_T qam_params = {};
 	struct MXL_EAGLE_TUNER_CHANNEL_PARAMS_T tuner_params = {};
@@ -994,15 +997,6 @@ static int mxl692_set_frontend(struct dvb_frontend *fe)
 
 	usleep_range(20 * 1000, 30 * 1000); /* was 500! */
 
-	mpeg_params.mpeg_parallel = 0;
-	mpeg_params.msb_first = MXL_EAGLE_DATA_SERIAL_MSB_1ST;
-	mpeg_params.mpeg_sync_pulse_width = MXL_EAGLE_DATA_SYNC_WIDTH_BIT;
-	mpeg_params.mpeg_valid_pol = MXL_EAGLE_CLOCK_POSITIVE;
-	mpeg_params.mpeg_sync_pol = MXL_EAGLE_CLOCK_POSITIVE;
-	mpeg_params.mpeg_clk_pol = MXL_EAGLE_CLOCK_NEGATIVE;
-	mpeg_params.mpeg3wire_mode_enable = 0;
-	mpeg_params.mpeg_clk_freq = MXL_EAGLE_MPEG_CLOCK_27MHZ;
-
 	switch (demod_type) {
 	case MXL_EAGLE_DEMOD_TYPE_ATSC:
 		status = mxl692_i2c_writeread(dev,
@@ -1321,6 +1315,26 @@ static int mxl692_probe(struct i2c_client *client)
 		goto err;
 	}
 
+	dev->xtal_calibration_enable = config->xtal_calibration_enable;
+	dev->xtal_sharing_enable = config->xtal_sharing_enable;
+
+	dev->mpeg_params.mpeg_parallel = config->mpeg_parallel;
+	dev->mpeg_params.msb_first = MXL_EAGLE_DATA_SERIAL_MSB_1ST;
+	dev->mpeg_params.mpeg_sync_pulse_width = config->mpeg_sync_pulse_width;
+	dev->mpeg_params.mpeg_valid_pol = MXL_EAGLE_CLOCK_POSITIVE;
+	dev->mpeg_params.mpeg_sync_pol = MXL_EAGLE_CLOCK_POSITIVE;
+	dev->mpeg_params.mpeg_clk_pol = MXL_EAGLE_CLOCK_NEGATIVE;
+	dev->mpeg_params.mpeg3wire_mode_enable = config->mpeg3wire_mode_enable;
+	dev->mpeg_params.mpeg_clk_freq = config->mpeg_clk_freq;
+	dev->mpeg_params.mpeg_pad_drv.pad_drv_mpeg_syn =
+		config->mpeg_pad_drv.pad_drv_mpeg_syn;
+	dev->mpeg_params.mpeg_pad_drv.pad_drv_mpeg_dat =
+		config->mpeg_pad_drv.pad_drv_mpeg_dat;
+	dev->mpeg_params.mpeg_pad_drv.pad_drv_mpeg_val =
+		config->mpeg_pad_drv.pad_drv_mpeg_val;
+	dev->mpeg_params.mpeg_pad_drv.pad_drv_mpeg_clk =
+		config->mpeg_pad_drv.pad_drv_mpeg_clk;
+
 	memcpy(&dev->fe.ops, &mxl692_ops, sizeof(struct dvb_frontend_ops));
 	dev->fe.demodulator_priv = dev;
 	dev->i2c_client = client;
diff --git a/drivers/media/dvb-frontends/mxl692.h b/drivers/media/dvb-frontends/mxl692.h
index 77764a047c07..5aee46480982 100644
--- a/drivers/media/dvb-frontends/mxl692.h
+++ b/drivers/media/dvb-frontends/mxl692.h
@@ -16,9 +16,28 @@
 
 #define MXL692_FIRMWARE "dvb-demod-mxl692.fw"
 
+struct mxl692_mpeg_pad_drv_config {
+	u8 pad_drv_mpeg_syn;
+	u8 pad_drv_mpeg_dat;
+	u8 pad_drv_mpeg_val;
+	u8 pad_drv_mpeg_clk;
+};
+
 struct mxl692_config {
 	unsigned char  id;
 	u8 i2c_addr;
+
+	/* xtal config */
+	u8 xtal_calibration_enable;
+	u8 xtal_sharing_enable;
+
+	/* mpeg config */
+	u8 mpeg_parallel;
+	u8 mpeg_sync_pulse_width;
+	u8 mpeg3wire_mode_enable;
+	u8 mpeg_clk_freq;
+	struct mxl692_mpeg_pad_drv_config mpeg_pad_drv;
+
 	/*
 	 * frontend
 	 * returned by driver
diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
index 9fce59979e3b..738fd8df475c 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -1471,6 +1471,15 @@ static int em2874_dvb_init_hauppauge_usb_quadhd(struct em28xx *dev)
 	/* attach demod/tuner combo */
 	mxl692_config.id = (dev->ts == PRIMARY_TS) ? 0 : 1;
 	mxl692_config.fe = &dvb->fe[0];
+
+	mxl692_config.xtal_calibration_enable = 0;
+	mxl692_config.xtal_sharing_enable = 1;
+
+	mxl692_config.mpeg_parallel = 0;
+	mxl692_config.mpeg_sync_pulse_width = 0; /* BIT */
+	mxl692_config.mpeg3wire_mode_enable = 0;
+	mxl692_config.mpeg_clk_freq = 2; /* 27MHZ */
+
 	addr = (dev->ts == PRIMARY_TS) ? 0x60 : 0x63;
 
 	dvb->i2c_client_demod = dvb_module_probe("mxl692", NULL,
-- 
2.51.0