Re: Fw: [PATCH] v4 Add support to Avermedia Twinstar double tuner in af9035
Hello, Let this patch be pending. I have got dual AF9035 + FC0012 device, but for some reason I haven't got it working at all. Due to that I cannot test this just now. Biggest problem here is that it needs MxL5007T tuner changes first. This patch is currently useless as MxL5007T changes are not accepted nor commented. regards Antti On 10/06/2012 05:49 PM, Mauro Carvalho Chehab wrote: Antti, Please review. Thanks! Mauro Forwarded message: Date: Sun, 23 Sep 2012 21:48:47 +0200 From: Jose Alberto Reguero jaregu...@telefonica.net To: linux-media@vger.kernel.org Cc: Antti Palosaari cr...@iki.fi Subject: [PATCH] v4 Add support to Avermedia Twinstar double tuner in af9035 This patch add support to the Avermedia Twinstar double tuner in the af9035 driver. Version 4 of the patch. I split the patch as suggested by Antti. I send the changes to mxl5007 driver in another patch. Signed-off-by: Jose Alberto Reguero jaregu...@telefonica.net Jose Alberto diff -upr linux/drivers/media/dvb-frontends/af9033.c linux.new/drivers/media/dvb-frontends/af9033.c --- linux/drivers/media/dvb-frontends/af9033.c 2012-08-14 05:45:22.0 +0200 +++ linux.new/drivers/media/dvb-frontends/af9033.c 2012-09-13 22:22:29.012301231 +0200 @@ -326,6 +326,18 @@ static int af9033_init(struct dvb_fronte goto err; } + if (state-cfg.ts_mode == AF9033_TS_MODE_SERIAL) { + ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01); + if (ret 0) + goto err; + } + state-bandwidth_hz = 0; /* force to program all parameters */ return 0; diff -upr linux/drivers/media/usb/dvb-usb-v2/af9035.c linux.new/drivers/media/usb/dvb-usb-v2/af9035.c --- linux/drivers/media/usb/dvb-usb-v2/af9035.c 2012-08-16 05:45:24.0 +0200 +++ linux.new/drivers/media/usb/dvb-usb-v2/af9035.c 2012-09-23 21:32:10.313657063 +0200 @@ -209,10 +209,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40 || msg[1].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_rd_regs(d, reg, msg[1].buf[0], msg[1].len); } else { @@ -220,8 +224,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), buf, msg[1].len, msg[1].buf }; + req.mbox |= ((msg[0].addr 0x80)3); buf[0] = msg[1].len; - buf[1] = msg[0].addr 1; + buf[1] = (u8)(msg[0].addr 1); buf[2] = 0x00; /* reg addr len */ buf[3] = 0x00; /* reg addr MSB */ buf[4] = 0x00; /* reg addr LSB */ @@ -232,10 +237,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_wr_regs(d, reg, msg[0].buf[3], msg[0].len - 3); } else { @@ -243,8 +252,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, 0, NULL
Fw: [PATCH] v4 Add support to Avermedia Twinstar double tuner in af9035
Antti, Please review. Thanks! Mauro Forwarded message: Date: Sun, 23 Sep 2012 21:48:47 +0200 From: Jose Alberto Reguero jaregu...@telefonica.net To: linux-media@vger.kernel.org Cc: Antti Palosaari cr...@iki.fi Subject: [PATCH] v4 Add support to Avermedia Twinstar double tuner in af9035 This patch add support to the Avermedia Twinstar double tuner in the af9035 driver. Version 4 of the patch. I split the patch as suggested by Antti. I send the changes to mxl5007 driver in another patch. Signed-off-by: Jose Alberto Reguero jaregu...@telefonica.net Jose Alberto diff -upr linux/drivers/media/dvb-frontends/af9033.c linux.new/drivers/media/dvb-frontends/af9033.c --- linux/drivers/media/dvb-frontends/af9033.c 2012-08-14 05:45:22.0 +0200 +++ linux.new/drivers/media/dvb-frontends/af9033.c 2012-09-13 22:22:29.012301231 +0200 @@ -326,6 +326,18 @@ static int af9033_init(struct dvb_fronte goto err; } + if (state-cfg.ts_mode == AF9033_TS_MODE_SERIAL) { + ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01); + if (ret 0) + goto err; + } + state-bandwidth_hz = 0; /* force to program all parameters */ return 0; diff -upr linux/drivers/media/usb/dvb-usb-v2/af9035.c linux.new/drivers/media/usb/dvb-usb-v2/af9035.c --- linux/drivers/media/usb/dvb-usb-v2/af9035.c 2012-08-16 05:45:24.0 +0200 +++ linux.new/drivers/media/usb/dvb-usb-v2/af9035.c 2012-09-23 21:32:10.313657063 +0200 @@ -209,10 +209,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40 || msg[1].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_rd_regs(d, reg, msg[1].buf[0], msg[1].len); } else { @@ -220,8 +224,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), buf, msg[1].len, msg[1].buf }; + req.mbox |= ((msg[0].addr 0x80)3); buf[0] = msg[1].len; - buf[1] = msg[0].addr 1; + buf[1] = (u8)(msg[0].addr 1); buf[2] = 0x00; /* reg addr len */ buf[3] = 0x00; /* reg addr MSB */ buf[4] = 0x00; /* reg addr LSB */ @@ -232,10 +237,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_wr_regs(d, reg, msg[0].buf[3], msg[0].len - 3); } else { @@ -243,8 +252,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, 0, NULL }; + req.mbox |= ((msg[0].addr 0x80)3); buf[0] = msg[0].len; - buf[1] = msg[0].addr 1; + buf[1] = (u8)(msg[0].addr 1); buf[2] = 0x00; /* reg addr len */ buf[3] = 0x00; /* reg addr MSB */ buf[4] = 0x00; /* reg addr LSB */ @@ -283,9 +293,30
[PATCH] v4 Add support to Avermedia Twinstar double tuner in af9035
This patch add support to the Avermedia Twinstar double tuner in the af9035 driver. Version 4 of the patch. I split the patch as suggested by Antti. I send the changes to mxl5007 driver in another patch. Signed-off-by: Jose Alberto Reguero jaregu...@telefonica.net Jose Alberto diff -upr linux/drivers/media/dvb-frontends/af9033.c linux.new/drivers/media/dvb-frontends/af9033.c --- linux/drivers/media/dvb-frontends/af9033.c 2012-08-14 05:45:22.0 +0200 +++ linux.new/drivers/media/dvb-frontends/af9033.c 2012-09-13 22:22:29.012301231 +0200 @@ -326,6 +326,18 @@ static int af9033_init(struct dvb_fronte goto err; } + if (state-cfg.ts_mode == AF9033_TS_MODE_SERIAL) { + ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); + if (ret 0) + goto err; + ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01); + if (ret 0) + goto err; + } + state-bandwidth_hz = 0; /* force to program all parameters */ return 0; diff -upr linux/drivers/media/usb/dvb-usb-v2/af9035.c linux.new/drivers/media/usb/dvb-usb-v2/af9035.c --- linux/drivers/media/usb/dvb-usb-v2/af9035.c 2012-08-16 05:45:24.0 +0200 +++ linux.new/drivers/media/usb/dvb-usb-v2/af9035.c 2012-09-23 21:32:10.313657063 +0200 @@ -209,10 +209,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40 || msg[1].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_rd_regs(d, reg, msg[1].buf[0], msg[1].len); } else { @@ -220,8 +224,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), buf, msg[1].len, msg[1].buf }; + req.mbox |= ((msg[0].addr 0x80)3); buf[0] = msg[1].len; - buf[1] = msg[0].addr 1; + buf[1] = (u8)(msg[0].addr 1); buf[2] = 0x00; /* reg addr len */ buf[3] = 0x00; /* reg addr MSB */ buf[4] = 0x00; /* reg addr LSB */ @@ -232,10 +237,14 @@ static int af9035_i2c_master_xfer(struct if (msg[0].len 40) { /* TODO: correct limits 40 */ ret = -EOPNOTSUPP; - } else if (msg[0].addr == state-af9033_config[0].i2c_addr) { + } else if ((msg[0].addr == state-af9033_config[0].i2c_addr) || + (msg[0].addr == state-af9033_config[1].i2c_addr)) { /* integrated demod */ u32 reg = msg[0].buf[0] 16 | msg[0].buf[1] 8 | msg[0].buf[2]; + if (state-af9033_config[1].i2c_addr + (msg[0].addr == state-af9033_config[1].i2c_addr)) + reg |= 0x10; ret = af9035_wr_regs(d, reg, msg[0].buf[3], msg[0].len - 3); } else { @@ -243,8 +252,9 @@ static int af9035_i2c_master_xfer(struct u8 buf[5 + msg[0].len]; struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, 0, NULL }; + req.mbox |= ((msg[0].addr 0x80)3); buf[0] = msg[0].len; - buf[1] = msg[0].addr 1; + buf[1] = (u8)(msg[0].addr 1); buf[2] = 0x00; /* reg addr len */ buf[3] = 0x00; /* reg addr MSB */ buf[4] = 0x00; /* reg addr LSB */ @@ -283,9 +293,30 @@ static int af9035_identify_state(struct int ret; u8 wbuf[1] = { 1 }; u8 rbuf[4]; + u8 tmp; struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf, sizeof(rbuf), rbuf }; + /* check if there is dual tuners */ +