* [PATCH v4 0/5] support for rtl2832
[not found] <1>
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
` (5 more replies)
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
1 sibling, 6 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List
This is the new version of the patch series to add support for the
rtl2832 demodulator driver. Before applying the patches you need to
add the fc0012/fc0013 driver from Hans-Frider Vogt.
The changes from the privious version of the patches are manly in the
rtl2832 demod driver to fix code style issues, a nasty bug in the
frontends Makefile and the removal of the signal statistics functionality
which was badly broken in version 0.3 of the driver.
The one thing that I am not really confident with is the Kconfig file for
the dvb frontend driver. Are the changes I made right? And if not what
kind of changes need to be made?
Thanks Antti and poma for your comments!
Regards
Thomas
Thomas Mair (5):
rtl2832 ver. 0.4: removed signal statistics
rtl28xxu: support for the rtl2832 demod driver
rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
rtl28xxu: support Terratec Noxon DAB/DAB+ stick
drivers/media/dvb/dvb-usb/Kconfig | 3 +
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 3 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 513 ++++++++++++++++--
drivers/media/dvb/frontends/Kconfig | 7 +
drivers/media/dvb/frontends/Makefile | 1 +
drivers/media/dvb/frontends/rtl2832.c | 825 ++++++++++++++++++++++++++++
drivers/media/dvb/frontends/rtl2832.h | 74 +++
drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
8 files changed, 1636 insertions(+), 48 deletions(-)
create mode 100644 drivers/media/dvb/frontends/rtl2832.c
create mode 100644 drivers/media/dvb/frontends/rtl2832.h
create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
--
1.7.7.6
^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-17 3:36 ` poma
2012-05-17 14:19 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
` (4 subsequent siblings)
5 siblings, 2 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List
Changelog for ver. 0.3:
- removed statistics as their calculation was wrong
- fixed bug in Makefile
- indentation and code style improvements
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/frontends/Kconfig | 7 +
drivers/media/dvb/frontends/Makefile | 1 +
drivers/media/dvb/frontends/rtl2832.c | 825 ++++++++++++++++++++++++++++
drivers/media/dvb/frontends/rtl2832.h | 74 +++
drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
5 files changed, 1165 insertions(+), 0 deletions(-)
create mode 100644 drivers/media/dvb/frontends/rtl2832.c
create mode 100644 drivers/media/dvb/frontends/rtl2832.h
create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index f479834..f7d67d7 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -432,6 +432,13 @@ config DVB_RTL2830
help
Say Y when you want to support this frontend.
+config DVB_RTL2832
+ tristate "Realtek RTL2832 DVB-T"
+ depends on DVB_CORE && I2C
+ default m if DVB_FE_CUSTOMISE
+ help
+ Say Y when you want to support this frontend.
+
comment "DVB-C (cable) frontends"
depends on DVB_CORE
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index b0381dc..bbf2955 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
obj-$(CONFIG_DVB_A8293) += a8293.o
obj-$(CONFIG_DVB_TDA10071) += tda10071.o
obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
+obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
obj-$(CONFIG_DVB_AF9033) += af9033.o
diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
new file mode 100644
index 0000000..51c7927
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.c
@@ -0,0 +1,825 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "rtl2832_priv.h"
+
+
+int rtl2832_debug;
+module_param_named(debug, rtl2832_debug, int, 0644);
+MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
+
+
+static int reg_mask[32] = {
+ 0x00000001,
+ 0x00000003,
+ 0x00000007,
+ 0x0000000f,
+ 0x0000001f,
+ 0x0000003f,
+ 0x0000007f,
+ 0x000000ff,
+ 0x000001ff,
+ 0x000003ff,
+ 0x000007ff,
+ 0x00000fff,
+ 0x00001fff,
+ 0x00003fff,
+ 0x00007fff,
+ 0x0000ffff,
+ 0x0001ffff,
+ 0x0003ffff,
+ 0x0007ffff,
+ 0x000fffff,
+ 0x001fffff,
+ 0x003fffff,
+ 0x007fffff,
+ 0x00ffffff,
+ 0x01ffffff,
+ 0x03ffffff,
+ 0x07ffffff,
+ 0x0fffffff,
+ 0x1fffffff,
+ 0x3fffffff,
+ 0x7fffffff,
+ 0xffffffff
+};
+
+struct rtl2832_reg_entry registers[] = {
+ [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
+ [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
+ [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
+ [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
+ [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
+ [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
+ [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
+ [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
+ [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
+ [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
+ [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
+ [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
+ [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
+ [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
+ [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
+ [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
+ [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
+ [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
+ [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
+ [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
+ [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
+ [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
+ [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
+ [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
+ [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
+ [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
+ [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
+ [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
+ [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
+ [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
+ [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
+ [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
+ [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
+ [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
+ [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
+ [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
+ [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
+ [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
+ [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
+ [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
+ [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
+ [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
+ [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
+ [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
+ [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
+ [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
+ [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
+ [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
+ [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
+ [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
+ [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
+ [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
+ [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
+ [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
+ [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
+ [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
+ [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
+ [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
+ [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
+ [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
+ [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
+ [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
+ [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
+ [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
+ [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
+ [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
+ [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
+ [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
+ [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
+ [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
+ [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
+ [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
+ [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
+ [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
+ [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
+ [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
+ [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
+ [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
+ [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
+ [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
+ [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
+ [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
+ [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
+ [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
+ [DVBT_KRF2] = {0x1, 0x7, 7, 0},
+ [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
+ [DVBT_KRF4] = {0x1, 0xce, 7, 0},
+ [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
+ [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
+ [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
+ [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
+ [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
+ [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
+ [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
+ [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
+ [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
+ [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
+ [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
+ [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
+ [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
+ [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
+ [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
+ [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
+ [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
+ [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
+ [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
+ [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
+ [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
+ [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
+ [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
+ [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
+ [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
+ [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
+ [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
+ [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
+ [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
+ [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
+ [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
+ [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
+ [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
+ [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
+ [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
+ [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
+ [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
+ [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
+ [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
+ [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
+};
+
+/* write multiple hardware registers */
+static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+ int ret;
+ u8 buf[1+len];
+ struct i2c_msg msg[1] = {
+ {
+ .addr = priv->cfg.i2c_addr,
+ .flags = 0,
+ .len = 1+len,
+ .buf = buf,
+ }
+ };
+
+ buf[0] = reg;
+ memcpy(&buf[1], val, len);
+
+ ret = i2c_transfer(priv->i2c, msg, 1);
+ if (ret == 1) {
+ ret = 0;
+ } else {
+ warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
+ ret = -EREMOTEIO;
+ }
+ return ret;
+}
+
+/* read multiple hardware registers */
+static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+ int ret;
+ struct i2c_msg msg[2] = {
+ {
+ .addr = priv->cfg.i2c_addr,
+ .flags = 0,
+ .len = 1,
+ .buf = ®,
+ }, {
+ .addr = priv->cfg.i2c_addr,
+ .flags = I2C_M_RD,
+ .len = len,
+ .buf = val,
+ }
+ };
+
+ ret = i2c_transfer(priv->i2c, msg, 2);
+ if (ret == 2) {
+ ret = 0;
+ } else {
+ warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
+ ret = -EREMOTEIO;
+}
+return ret;
+}
+
+/* write multiple registers */
+static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+ int len)
+{
+ int ret;
+
+
+ /* switch bank if needed */
+ if (page != priv->page) {
+ ret = rtl2832_wr(priv, 0x00, &page, 1);
+ if (ret)
+ return ret;
+
+ priv->page = page;
+}
+
+return rtl2832_wr(priv, reg, val, len);
+}
+
+/* read multiple registers */
+static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+ int len)
+{
+ int ret;
+
+ /* switch bank if needed */
+ if (page != priv->page) {
+ ret = rtl2832_wr(priv, 0x00, &page, 1);
+ if (ret)
+ return ret;
+
+ priv->page = page;
+ }
+
+ return rtl2832_rd(priv, reg, val, len);
+}
+
+#if 0 /* currently not used */
+/* write single register */
+static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
+{
+ return rtl2832_wr_regs(priv, reg, page, &val, 1);
+}
+#endif
+
+/* read single register */
+static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
+{
+ return rtl2832_rd_regs(priv, reg, page, val, 1);
+}
+
+int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
+{
+ int ret;
+
+ u8 reg_start_addr;
+ u8 msb, lsb;
+ u8 page;
+ u8 reading[4];
+ u32 reading_tmp;
+ int i;
+
+ u8 len;
+ u32 mask;
+
+ reg_start_addr = registers[reg].start_address;
+ msb = registers[reg].msb;
+ lsb = registers[reg].lsb;
+ page = registers[reg].page;
+
+ len = (msb >> 3) + 1;
+ mask = reg_mask[msb-lsb];
+
+
+ ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+ if (ret)
+ goto err;
+
+ reading_tmp = 0;
+ for (i = 0; i < len; i++)
+ reading_tmp |= reading[i] << ((len-1-i)*8);
+
+ *val = (reading_tmp >> lsb) & mask;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+
+}
+
+int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
+{
+ int ret, i;
+ u8 len;
+ u8 reg_start_addr;
+ u8 msb, lsb;
+ u8 page;
+ u32 mask;
+
+
+ u8 reading[4];
+ u8 writing[4];
+ u32 reading_tmp;
+ u32 writing_tmp;
+
+
+ reg_start_addr = registers[reg].start_address;
+ msb = registers[reg].msb;
+ lsb = registers[reg].lsb;
+ page = registers[reg].page;
+
+ len = (msb >> 3) + 1;
+ mask = reg_mask[msb-lsb];
+
+
+ ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+ if (ret)
+ goto err;
+
+ reading_tmp = 0;
+ for (i = 0; i < len; i++)
+ reading_tmp |= reading[i] << ((len-1-i)*8);
+
+ writing_tmp = reading_tmp & ~(mask << lsb);
+ writing_tmp |= ((val & mask) << lsb);
+
+
+ for (i = 0; i < len; i++)
+ writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+
+ ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
+ if (ret)
+ goto err;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+
+}
+
+
+static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+ int ret;
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s: enable=%d", __func__, enable);
+
+ /* gate already open or close */
+ if (priv->i2c_gate_state == enable)
+ return 0;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
+
+ if (ret)
+ goto err;
+
+ priv->i2c_gate_state = enable;
+
+ return ret;
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+
+
+static int rtl2832_init(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ int i, ret;
+
+ u8 en_bbin;
+ u64 pset_iffreq;
+
+ /* initialization values for the demodulator registers */
+ struct rtl2832_reg_value rtl2832_initial_regs[] = {
+ {DVBT_AD_EN_REG, 0x1},
+ {DVBT_AD_EN_REG1, 0x1},
+ {DVBT_RSD_BER_FAIL_VAL, 0x2800},
+ {DVBT_MGD_THD0, 0x10},
+ {DVBT_MGD_THD1, 0x20},
+ {DVBT_MGD_THD2, 0x20},
+ {DVBT_MGD_THD3, 0x40},
+ {DVBT_MGD_THD4, 0x22},
+ {DVBT_MGD_THD5, 0x32},
+ {DVBT_MGD_THD6, 0x37},
+ {DVBT_MGD_THD7, 0x39},
+ {DVBT_EN_BK_TRK, 0x0},
+ {DVBT_EN_CACQ_NOTCH, 0x0},
+ {DVBT_AD_AV_REF, 0x2a},
+ {DVBT_REG_PI, 0x6},
+ {DVBT_PIP_ON, 0x0},
+ {DVBT_CDIV_PH0, 0x8},
+ {DVBT_CDIV_PH1, 0x8},
+ {DVBT_SCALE1_B92, 0x4},
+ {DVBT_SCALE1_B93, 0xb0},
+ {DVBT_SCALE1_BA7, 0x78},
+ {DVBT_SCALE1_BA9, 0x28},
+ {DVBT_SCALE1_BAA, 0x59},
+ {DVBT_SCALE1_BAB, 0x83},
+ {DVBT_SCALE1_BAC, 0xd4},
+ {DVBT_SCALE1_BB0, 0x65},
+ {DVBT_SCALE1_BB1, 0x43},
+ {DVBT_KB_P1, 0x1},
+ {DVBT_KB_P2, 0x4},
+ {DVBT_KB_P3, 0x7},
+ {DVBT_K1_CR_STEP12, 0xa},
+ {DVBT_REG_GPE, 0x1},
+ {DVBT_SERIAL, 0x0},
+ {DVBT_CDIV_PH0, 0x9},
+ {DVBT_CDIV_PH1, 0x9},
+ {DVBT_MPEG_IO_OPT_2_2, 0x0},
+ {DVBT_MPEG_IO_OPT_1_0, 0x0},
+ {DVBT_TRK_KS_P2, 0x4},
+ {DVBT_TRK_KS_I2, 0x7},
+ {DVBT_TR_THD_SET2, 0x6},
+ {DVBT_TRK_KC_I2, 0x5},
+ {DVBT_CR_THD_SET2, 0x1},
+ {DVBT_SPEC_INV, 0x0},
+ {DVBT_DAGC_TRG_VAL, 0x5a},
+ {DVBT_AGC_TARG_VAL_0, 0x0},
+ {DVBT_AGC_TARG_VAL_8_1, 0x5a},
+ {DVBT_AAGC_LOOP_GAIN, 0x16},
+ {DVBT_LOOP_GAIN2_3_0, 0x6},
+ {DVBT_LOOP_GAIN2_4, 0x1},
+ {DVBT_LOOP_GAIN3, 0x16},
+ {DVBT_VTOP1, 0x35},
+ {DVBT_VTOP2, 0x21},
+ {DVBT_VTOP3, 0x21},
+ {DVBT_KRF1, 0x0},
+ {DVBT_KRF2, 0x40},
+ {DVBT_KRF3, 0x10},
+ {DVBT_KRF4, 0x10},
+ {DVBT_IF_AGC_MIN, 0x80},
+ {DVBT_IF_AGC_MAX, 0x7f},
+ {DVBT_RF_AGC_MIN, 0x80},
+ {DVBT_RF_AGC_MAX, 0x7f},
+ {DVBT_POLAR_RF_AGC, 0x0},
+ {DVBT_POLAR_IF_AGC, 0x0},
+ {DVBT_AD7_SETTING, 0xe9bf},
+ {DVBT_EN_GI_PGA, 0x0},
+ {DVBT_THD_LOCK_UP, 0x0},
+ {DVBT_THD_LOCK_DW, 0x0},
+ {DVBT_THD_UP1, 0x11},
+ {DVBT_THD_DW1, 0xef},
+ {DVBT_INTER_CNT_LEN, 0xc},
+ {DVBT_GI_PGA_STATE, 0x0},
+ {DVBT_EN_AGC_PGA, 0x1},
+ {DVBT_IF_AGC_MAN, 0x0},
+ };
+
+
+ dbg("%s", __func__);
+
+ en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
+
+ /*
+ * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
+ * / CrystalFreqHz)
+ */
+ pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
+ pset_iffreq *= 0x400000;
+ pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
+ pset_iffreq = pset_iffreq & 0x3fffff;
+
+
+
+ for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
+ ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
+ rtl2832_initial_regs[i].value);
+ if (ret)
+ goto err;
+ }
+
+ /* if frequency settings */
+ ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
+ if (ret)
+ goto err;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
+ if (ret)
+ goto err;
+
+ priv->sleeping = false;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_sleep(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s", __func__);
+ priv->sleeping = true;
+ return 0;
+}
+
+int rtl2832_get_tune_settings(struct dvb_frontend *fe,
+ struct dvb_frontend_tune_settings *s)
+{
+ dbg("%s", __func__);
+ s->min_delay_ms = 1000;
+ s->step_size = fe->ops.info.frequency_stepsize * 2;
+ s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
+ return 0;
+}
+
+static int rtl2832_set_frontend(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ int ret, i, j;
+ u64 bw_mode, num, num2;
+ u32 resamp_ratio, cfreq_off_ratio;
+
+
+ static u8 bw_params[3][32] = {
+ /* 6 MHz bandwidth */
+ {
+ 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
+ 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
+ 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
+ 0x19, 0xe0,
+ },
+
+ /* 7 MHz bandwidth */
+ {
+ 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
+ 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
+ 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
+ 0x19, 0x10,
+ },
+
+ /* 8 MHz bandwidth */
+ {
+ 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
+ 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
+ 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
+ 0x19, 0xe0,
+ },
+ };
+
+
+ dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
+ c->frequency, c->bandwidth_hz, c->inversion);
+
+
+ /* program tuner */
+ if (fe->ops.tuner_ops.set_params)
+ fe->ops.tuner_ops.set_params(fe);
+
+
+ switch (c->bandwidth_hz) {
+ case 6000000:
+ i = 0;
+ bw_mode = 48000000;
+ break;
+ case 7000000:
+ i = 1;
+ bw_mode = 56000000;
+ break;
+ case 8000000:
+ i = 2;
+ bw_mode = 64000000;
+ break;
+ default:
+ dbg("invalid bandwidth");
+ return -EINVAL;
+ }
+
+ for (j = 0; j < sizeof(bw_params[j]); j++) {
+ ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
+ if (ret)
+ goto err;
+ }
+
+ /* calculate and set resample ratio
+ * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
+ * / ConstWithBandwidthMode)
+ */
+ num = priv->cfg.xtal * 7;
+ num *= 0x400000;
+ num = div_u64(num, bw_mode);
+ resamp_ratio = num & 0x3ffffff;
+ ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
+ if (ret)
+ goto err;
+
+ /* calculate and set cfreq off ratio
+ * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
+ * / (CrystalFreqHz * 7))
+ */
+ num = bw_mode << 20;
+ num2 = priv->cfg.xtal * 7;
+ num = div_u64(num, num2);
+ num = -num;
+ cfreq_off_ratio = num & 0xfffff;
+ ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
+ if (ret)
+ goto err;
+
+
+ /* soft reset */
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
+ if (ret)
+ goto err;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
+ if (ret)
+ goto err;
+
+ return ret;
+err:
+ info("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ int ret;
+ u32 tmp;
+ *status = 0;
+
+
+ dbg("%s", __func__);
+ if (priv->sleeping)
+ return 0;
+
+ ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
+ if (ret)
+ goto err;
+
+ if (tmp == 11) {
+ *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+ FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+ }
+ /* TODO find out if this is also true for rtl2832? */
+ /*else if (tmp == 10) {
+ *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+ FE_HAS_VITERBI;
+ }*/
+
+ return ret;
+err:
+ info("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
+{
+ *snr = 0;
+ return 0;
+}
+
+static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
+{
+ *ber = 0;
+ return 0;
+}
+
+static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+{
+ *ucblocks = 0;
+ return 0;
+}
+
+
+static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+{
+ *strength = 0;
+ return 0;
+}
+
+static struct dvb_frontend_ops rtl2832_ops;
+
+static void rtl2832_release(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s", __func__);
+ kfree(priv);
+}
+
+struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
+ struct i2c_adapter *i2c)
+{
+ struct rtl2832_priv *priv = NULL;
+ int ret = 0;
+ u8 tmp;
+
+ dbg("%s", __func__);
+
+ /* allocate memory for the internal state */
+ priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
+ if (priv == NULL)
+ goto err;
+
+ /* setup the priv */
+ priv->i2c = i2c;
+ priv->tuner = cfg->tuner;
+ memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
+
+ /* check if the demod is there */
+ ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
+ if (ret)
+ goto err;
+
+ /* create dvb_frontend */
+ memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
+ priv->fe.demodulator_priv = priv;
+
+ /* TODO implement sleep mode */
+ priv->sleeping = true;
+
+ return &priv->fe;
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ kfree(priv);
+ return NULL;
+}
+EXPORT_SYMBOL(rtl2832_attach);
+
+static struct dvb_frontend_ops rtl2832_ops = {
+ .delsys = { SYS_DVBT },
+ .info = {
+ .name = "Realtek RTL2832 (DVB-T)",
+ .frequency_min = 174000000,
+ .frequency_max = 862000000,
+ .frequency_stepsize = 166667,
+ .caps = FE_CAN_FEC_1_2 |
+ FE_CAN_FEC_2_3 |
+ FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_5_6 |
+ FE_CAN_FEC_7_8 |
+ FE_CAN_FEC_AUTO |
+ FE_CAN_QPSK |
+ FE_CAN_QAM_16 |
+ FE_CAN_QAM_64 |
+ FE_CAN_QAM_AUTO |
+ FE_CAN_TRANSMISSION_MODE_AUTO |
+ FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO |
+ FE_CAN_RECOVER |
+ FE_CAN_MUTE_TS
+ },
+
+ .release = rtl2832_release,
+
+ .init = rtl2832_init,
+ .sleep = rtl2832_sleep,
+
+ .get_tune_settings = rtl2832_get_tune_settings,
+
+ .set_frontend = rtl2832_set_frontend,
+
+ .read_status = rtl2832_read_status,
+ .read_snr = rtl2832_read_snr,
+ .read_ber = rtl2832_read_ber,
+ .read_ucblocks = rtl2832_read_ucblocks,
+ .read_signal_strength = rtl2832_read_signal_strength,
+ .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
+};
+
+MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
+MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.4");
diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
new file mode 100644
index 0000000..d94dc9a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.h
@@ -0,0 +1,74 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_H
+#define RTL2832_H
+
+#include <linux/dvb/frontend.h>
+
+struct rtl2832_config {
+ /*
+ * Demodulator I2C address.
+ */
+ u8 i2c_addr;
+
+ /*
+ * Xtal frequency.
+ * Hz
+ * 4000000, 16000000, 25000000, 28800000
+ */
+ u32 xtal;
+
+ /*
+ * IFs for all used modes.
+ * Hz
+ * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
+ */
+ u32 if_dvbt;
+
+ /*
+ */
+ u8 tuner;
+};
+
+
+#if defined(CONFIG_DVB_RTL2832) || \
+ (defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
+extern struct dvb_frontend *rtl2832_attach(
+ const struct rtl2832_config *cfg,
+ struct i2c_adapter *i2c
+);
+
+extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
+ struct dvb_frontend *fe
+);
+#else
+static inline struct dvb_frontend *rtl2832_attach(
+ const struct rtl2832_config *config,
+ struct i2c_adapter *i2c
+)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+ return NULL;
+}
+#endif
+
+
+#endif /* RTL2832_H */
diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
new file mode 100644
index 0000000..3e52674
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832_priv.h
@@ -0,0 +1,258 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_PRIV_H
+#define RTL2832_PRIV_H
+
+#include "dvb_frontend.h"
+#include "rtl2832.h"
+
+#define LOG_PREFIX "rtl2832"
+
+#undef dbg
+#define dbg(f, arg...) \
+ if (rtl2832_debug) \
+ printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#undef err
+#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
+#undef info
+#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#undef warn
+#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+
+struct rtl2832_priv {
+ struct i2c_adapter *i2c;
+ struct dvb_frontend fe;
+ struct rtl2832_config cfg;
+
+ bool i2c_gate_state;
+ bool sleeping;
+
+ u8 tuner;
+ u8 page; /* active register page */
+};
+
+struct rtl2832_reg_entry {
+ u8 page;
+ u8 start_address;
+ u8 msb;
+ u8 lsb;
+};
+
+struct rtl2832_reg_value {
+ int reg;
+ u32 value;
+};
+
+
+/* Demod register bit names */
+enum DVBT_REG_BIT_NAME {
+ DVBT_SOFT_RST,
+ DVBT_IIC_REPEAT,
+ DVBT_TR_WAIT_MIN_8K,
+ DVBT_RSD_BER_FAIL_VAL,
+ DVBT_EN_BK_TRK,
+ DVBT_REG_PI,
+ DVBT_REG_PFREQ_1_0,
+ DVBT_PD_DA8,
+ DVBT_LOCK_TH,
+ DVBT_BER_PASS_SCAL,
+ DVBT_CE_FFSM_BYPASS,
+ DVBT_ALPHAIIR_N,
+ DVBT_ALPHAIIR_DIF,
+ DVBT_EN_TRK_SPAN,
+ DVBT_LOCK_TH_LEN,
+ DVBT_CCI_THRE,
+ DVBT_CCI_MON_SCAL,
+ DVBT_CCI_M0,
+ DVBT_CCI_M1,
+ DVBT_CCI_M2,
+ DVBT_CCI_M3,
+ DVBT_SPEC_INIT_0,
+ DVBT_SPEC_INIT_1,
+ DVBT_SPEC_INIT_2,
+ DVBT_AD_EN_REG,
+ DVBT_AD_EN_REG1,
+ DVBT_EN_BBIN,
+ DVBT_MGD_THD0,
+ DVBT_MGD_THD1,
+ DVBT_MGD_THD2,
+ DVBT_MGD_THD3,
+ DVBT_MGD_THD4,
+ DVBT_MGD_THD5,
+ DVBT_MGD_THD6,
+ DVBT_MGD_THD7,
+ DVBT_EN_CACQ_NOTCH,
+ DVBT_AD_AV_REF,
+ DVBT_PIP_ON,
+ DVBT_SCALE1_B92,
+ DVBT_SCALE1_B93,
+ DVBT_SCALE1_BA7,
+ DVBT_SCALE1_BA9,
+ DVBT_SCALE1_BAA,
+ DVBT_SCALE1_BAB,
+ DVBT_SCALE1_BAC,
+ DVBT_SCALE1_BB0,
+ DVBT_SCALE1_BB1,
+ DVBT_KB_P1,
+ DVBT_KB_P2,
+ DVBT_KB_P3,
+ DVBT_OPT_ADC_IQ,
+ DVBT_AD_AVI,
+ DVBT_AD_AVQ,
+ DVBT_K1_CR_STEP12,
+ DVBT_TRK_KS_P2,
+ DVBT_TRK_KS_I2,
+ DVBT_TR_THD_SET2,
+ DVBT_TRK_KC_P2,
+ DVBT_TRK_KC_I2,
+ DVBT_CR_THD_SET2,
+ DVBT_PSET_IFFREQ,
+ DVBT_SPEC_INV,
+ DVBT_BW_INDEX,
+ DVBT_RSAMP_RATIO,
+ DVBT_CFREQ_OFF_RATIO,
+ DVBT_FSM_STAGE,
+ DVBT_RX_CONSTEL,
+ DVBT_RX_HIER,
+ DVBT_RX_C_RATE_LP,
+ DVBT_RX_C_RATE_HP,
+ DVBT_GI_IDX,
+ DVBT_FFT_MODE_IDX,
+ DVBT_RSD_BER_EST,
+ DVBT_CE_EST_EVM,
+ DVBT_RF_AGC_VAL,
+ DVBT_IF_AGC_VAL,
+ DVBT_DAGC_VAL,
+ DVBT_SFREQ_OFF,
+ DVBT_CFREQ_OFF,
+ DVBT_POLAR_RF_AGC,
+ DVBT_POLAR_IF_AGC,
+ DVBT_AAGC_HOLD,
+ DVBT_EN_RF_AGC,
+ DVBT_EN_IF_AGC,
+ DVBT_IF_AGC_MIN,
+ DVBT_IF_AGC_MAX,
+ DVBT_RF_AGC_MIN,
+ DVBT_RF_AGC_MAX,
+ DVBT_IF_AGC_MAN,
+ DVBT_IF_AGC_MAN_VAL,
+ DVBT_RF_AGC_MAN,
+ DVBT_RF_AGC_MAN_VAL,
+ DVBT_DAGC_TRG_VAL,
+ DVBT_AGC_TARG_VAL,
+ DVBT_LOOP_GAIN_3_0,
+ DVBT_LOOP_GAIN_4,
+ DVBT_VTOP,
+ DVBT_KRF,
+ DVBT_AGC_TARG_VAL_0,
+ DVBT_AGC_TARG_VAL_8_1,
+ DVBT_AAGC_LOOP_GAIN,
+ DVBT_LOOP_GAIN2_3_0,
+ DVBT_LOOP_GAIN2_4,
+ DVBT_LOOP_GAIN3,
+ DVBT_VTOP1,
+ DVBT_VTOP2,
+ DVBT_VTOP3,
+ DVBT_KRF1,
+ DVBT_KRF2,
+ DVBT_KRF3,
+ DVBT_KRF4,
+ DVBT_EN_GI_PGA,
+ DVBT_THD_LOCK_UP,
+ DVBT_THD_LOCK_DW,
+ DVBT_THD_UP1,
+ DVBT_THD_DW1,
+ DVBT_INTER_CNT_LEN,
+ DVBT_GI_PGA_STATE,
+ DVBT_EN_AGC_PGA,
+ DVBT_CKOUTPAR,
+ DVBT_CKOUT_PWR,
+ DVBT_SYNC_DUR,
+ DVBT_ERR_DUR,
+ DVBT_SYNC_LVL,
+ DVBT_ERR_LVL,
+ DVBT_VAL_LVL,
+ DVBT_SERIAL,
+ DVBT_SER_LSB,
+ DVBT_CDIV_PH0,
+ DVBT_CDIV_PH1,
+ DVBT_MPEG_IO_OPT_2_2,
+ DVBT_MPEG_IO_OPT_1_0,
+ DVBT_CKOUTPAR_PIP,
+ DVBT_CKOUT_PWR_PIP,
+ DVBT_SYNC_LVL_PIP,
+ DVBT_ERR_LVL_PIP,
+ DVBT_VAL_LVL_PIP,
+ DVBT_CKOUTPAR_PID,
+ DVBT_CKOUT_PWR_PID,
+ DVBT_SYNC_LVL_PID,
+ DVBT_ERR_LVL_PID,
+ DVBT_VAL_LVL_PID,
+ DVBT_SM_PASS,
+ DVBT_UPDATE_REG_2,
+ DVBT_BTHD_P3,
+ DVBT_BTHD_D3,
+ DVBT_FUNC4_REG0,
+ DVBT_FUNC4_REG1,
+ DVBT_FUNC4_REG2,
+ DVBT_FUNC4_REG3,
+ DVBT_FUNC4_REG4,
+ DVBT_FUNC4_REG5,
+ DVBT_FUNC4_REG6,
+ DVBT_FUNC4_REG7,
+ DVBT_FUNC4_REG8,
+ DVBT_FUNC4_REG9,
+ DVBT_FUNC4_REG10,
+ DVBT_FUNC5_REG0,
+ DVBT_FUNC5_REG1,
+ DVBT_FUNC5_REG2,
+ DVBT_FUNC5_REG3,
+ DVBT_FUNC5_REG4,
+ DVBT_FUNC5_REG5,
+ DVBT_FUNC5_REG6,
+ DVBT_FUNC5_REG7,
+ DVBT_FUNC5_REG8,
+ DVBT_FUNC5_REG9,
+ DVBT_FUNC5_REG10,
+ DVBT_FUNC5_REG11,
+ DVBT_FUNC5_REG12,
+ DVBT_FUNC5_REG13,
+ DVBT_FUNC5_REG14,
+ DVBT_FUNC5_REG15,
+ DVBT_FUNC5_REG16,
+ DVBT_FUNC5_REG17,
+ DVBT_FUNC5_REG18,
+ DVBT_AD7_SETTING,
+ DVBT_RSSI_R,
+ DVBT_ACI_DET_IND,
+ DVBT_REG_MON,
+ DVBT_REG_MONSEL,
+ DVBT_REG_GPE,
+ DVBT_REG_GPO,
+ DVBT_REG_4MSEL,
+ DVBT_TEST_REG_1,
+ DVBT_TEST_REG_2,
+ DVBT_TEST_REG_3,
+ DVBT_TEST_REG_4,
+ DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
+};
+
+#endif /* RTL2832_PRIV_H */
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-17 14:41 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
` (3 subsequent siblings)
5 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List
This only adds support for the Terratec Cinergy T Stick Black device.
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/Kconfig | 3 +
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 431 +++++++++++++++++++++++++++++--
3 files changed, 411 insertions(+), 24 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index be1db75..98dd0d8 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
tristate "Realtek RTL28xxU DVB USB support"
depends on DVB_USB && EXPERIMENTAL
select DVB_RTL2830
+ select DVB_RTL2832
select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
help
Say Y here to support the Realtek RTL28xxU DVB USB receiver.
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 2418e41..fd37be0 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -157,6 +157,7 @@
#define USB_PID_TERRATEC_CINERGY_T_STICK 0x0093
#define USB_PID_TERRATEC_CINERGY_T_STICK_RC 0x0097
#define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC 0x0099
+#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1 0x00a9
#define USB_PID_TWINHAN_VP7041_COLD 0x3201
#define USB_PID_TWINHAN_VP7041_WARM 0x3202
#define USB_PID_TWINHAN_VP7020_COLD 0x3203
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 8f4736a..bb66771 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
* Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.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
@@ -22,10 +23,12 @@
#include "rtl28xxu.h"
#include "rtl2830.h"
+#include "rtl2832.h"
#include "qt1010.h"
#include "mt2060.h"
#include "mxl5005s.h"
+#include "fc0012.h"
/* debug */
static int dvb_usb_rtl28xxu_debug;
@@ -378,34 +381,153 @@ err:
return ret;
}
+static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
+ .i2c_addr = 0x10, /* 0x20 */
+ .xtal = 28800000,
+ .if_dvbt = 0,
+ .tuner = TUNER_RTL2832_FC0012
+};
+
+
+static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
+ int cmd, int arg)
+{
+ int ret;
+ u8 val;
+
+ deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
+ switch (cmd) {
+ case FC_FE_CALLBACK_VHF_ENABLE:
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ if (arg)
+ val &= 0xbf; /* set GPIO6 low */
+ else
+ val |= 0x40; /* set GPIO6 high */
+
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+ break;
+ default:
+ ret = -EINVAL;
+ goto err;
+ }
+ return 0;
+
+err:
+ err("%s: failed=%d\n", __func__, ret);
+
+ return ret;
+}
+
+
+static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
+ int cmd, int arg)
+{
+ /* TODO implement*/
+ return 0;
+}
+
+static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
+{
+ struct rtl28xxu_priv *priv = d->priv;
+
+ switch (priv->tuner) {
+ case TUNER_RTL2832_FC0012:
+ return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
+
+ case TUNER_RTL2832_FC0013:
+ return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
+ default:
+ break;
+ }
+
+ return -ENODEV;
+}
+
+static int rtl2832u_frontend_callback(void *adapter_priv, int component,
+ int cmd, int arg)
+{
+ struct i2c_adapter *adap = adapter_priv;
+ struct dvb_usb_device *d = i2c_get_adapdata(adap);
+
+ switch (component) {
+ case DVB_FRONTEND_COMPONENT_TUNER:
+ return rtl2832u_tuner_callback(d, cmd, arg);
+ default:
+ break;
+ }
+
+ return -EINVAL;
+}
+
+
+
+
static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
{
int ret;
struct rtl28xxu_priv *priv = adap->dev->priv;
- u8 buf[1];
+ struct rtl2832_config *rtl2832_config;
+
+ u8 buf[2], val;
/* open RTL2832U/RTL2832 I2C gate */
struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
/* close RTL2832U/RTL2832 I2C gate */
struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
+ /* for FC0012 tuner probe */
+ struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
+ /* for FC0013 tuner probe */
+ struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
+ /* for MT2266 tuner probe */
+ struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
/* for FC2580 tuner probe */
struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
+ /* for MT2063 tuner probe */
+ struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
+ /* for MAX3543 tuner probe */
+ struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
+ /* for TUA9001 tuner probe */
+ struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
+ /* for MXL5007T tuner probe */
+ struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
+ /* for E4000 tuner probe */
+ struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
+ /* for TDA18272 tuner probe */
+ struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
deb_info("%s:\n", __func__);
- /* GPIO direction */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+
+ ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
if (ret)
goto err;
- /* enable as output GPIO0, GPIO2, GPIO4 */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+ val &= 0xbf;
+
+ ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
if (ret)
goto err;
- ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
+
+ /* enable as output GPIO3 and GPIO6*/
+ ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
if (ret)
goto err;
+ val |= 0x48;
+
+ ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+ if (ret)
+ goto err;
+
+
+
/*
* Probe used tuner. We need to know used tuner before demod attach
* since there is some demod params needed to set according to tuner.
@@ -416,15 +538,95 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
if (ret)
goto err;
+ priv->tuner = TUNER_NONE;
+
+ /* check FC0012 ID register; reg=00 val=a1 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0012);
+ if (ret == 0 && buf[0] == 0xa1) {
+ priv->tuner = TUNER_RTL2832_FC0012;
+ rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
+ info("%s: FC0012 tuner found", __func__);
+ goto found;
+ }
+
+ /* check FC0013 ID register; reg=00 val=a3 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
+ if (ret == 0 && buf[0] == 0xa3) {
+ priv->tuner = TUNER_RTL2832_FC0013;
+ info("%s: FC0013 tuner found", __func__);
+ goto found;
+ }
+
+ /* check MT2266 ID register; reg=00 val=85 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2266);
+ if (ret == 0 && buf[0] == 0x85) {
+ priv->tuner = TUNER_RTL2832_MT2266;
+ /* TODO implement tuner */
+ info("%s: MT2266 tuner found", __func__);
+ goto found;
+ }
+
/* check FC2580 ID register; reg=01 val=56 */
ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc2580);
if (ret == 0 && buf[0] == 0x56) {
priv->tuner = TUNER_RTL2832_FC2580;
- deb_info("%s: FC2580\n", __func__);
+ /* TODO implement tuner */
+ info("%s: FC2580 tuner found", __func__);
+ goto found;
+ }
+
+ /* check MT2063 ID register; reg=00 val=9e || 9c */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2063);
+ if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
+ priv->tuner = TUNER_RTL2832_MT2063;
+ /* TODO implement tuner */
+ info("%s: MT2063 tuner found", __func__);
+ goto found;
+ }
+
+ /* check MAX3543 ID register; reg=00 val=38 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_max3543);
+ if (ret == 0 && buf[0] == 0x38) {
+ priv->tuner = TUNER_RTL2832_MAX3543;
+ /* TODO implement tuner */
+ info("%s: MAX3534 tuner found", __func__);
+ goto found;
+ }
+
+ /* check TUA9001 ID register; reg=7e val=2328 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_tua9001);
+ if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
+ priv->tuner = TUNER_RTL2832_TUA9001;
+ /* TODO implement tuner */
+ info("%s: TUA9001 tuner found", __func__);
+ goto found;
+ }
+
+ /* check MXL5007R ID register; reg=d9 val=14 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mxl5007t);
+ if (ret == 0 && buf[0] == 0x14) {
+ priv->tuner = TUNER_RTL2832_MXL5007T;
+ /* TODO implement tuner */
+ info("%s: MXL5007T tuner found", __func__);
+ goto found;
+ }
+
+ /* check E4000 ID register; reg=02 val=40 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_e4000);
+ if (ret == 0 && buf[0] == 0x40) {
+ priv->tuner = TUNER_RTL2832_E4000;
+ /* TODO implement tuner */
+ info("%s: E4000 tuner found", __func__);
+ goto found;
+ }
+
+ /* check TDA18272 ID register; reg=00 val=c760 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_tda18272);
+ if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
+ priv->tuner = TUNER_RTL2832_TDA18272;
+ /* TODO implement tuner */
+ info("%s: TDA18272 tuner found", __func__);
goto found;
- } else {
- deb_info("%s: FC2580 probe failed=%d - %02x\n",
- __func__, ret, buf[0]);
}
/* close demod I2C gate */
@@ -433,8 +635,9 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
goto err;
/* tuner not found */
+ deb_info("No compatible tuner found");
ret = -ENODEV;
- goto err;
+ return ret;
found:
/* close demod I2C gate */
@@ -443,9 +646,18 @@ found:
goto err;
/* attach demodulator */
- /* TODO: */
+ adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
+ &adap->dev->i2c_adap);
+ if (adap->fe_adap[0].fe == NULL) {
+ ret = -ENODEV;
+ goto err;
+ }
+
+ /* set fe callbacks */
+ adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
return ret;
+
err:
deb_info("%s: failed=%d\n", __func__, ret);
return ret;
@@ -528,9 +740,15 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
deb_info("%s:\n", __func__);
switch (priv->tuner) {
- case TUNER_RTL2832_FC2580:
- /* TODO: */
- fe = NULL;
+ case TUNER_RTL2832_FC0012:
+ fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
+ &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+ /* since fc0012 includs reading the signal strength delegate
+ * that to the tuner driver */
+ adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
+ fe->ops.tuner_ops.get_rf_strength;
+ return 0;
break;
default:
fe = NULL;
@@ -548,7 +766,7 @@ err:
return ret;
}
-static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
{
int ret;
u8 buf[2], gpio;
@@ -583,7 +801,33 @@ err:
return ret;
}
-static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
+static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+{
+ int ret;
+ u8 buf[2];
+
+ deb_info("%s: onoff=%d\n", __func__, onoff);
+
+
+ if (onoff) {
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ } else {
+ buf[0] = 0x10; /* stall EPA */
+ buf[1] = 0x02; /* reset EPA */
+ }
+
+ ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ if (ret)
+ goto err;
+
+ return ret;
+err:
+ deb_info("%s: failed=%d\n", __func__, ret);
+ return ret;
+}
+
+static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
{
int ret;
u8 gpio, sys0;
@@ -631,6 +875,128 @@ err:
return ret;
}
+static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+ int ret;
+ u8 val;
+
+ deb_info("%s: onoff=%d\n", __func__, onoff);
+
+ if (onoff) {
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x08;
+ val &= 0xef;
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+
+ /* demod_ctl_1 */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ if (ret)
+ goto err;
+
+ val &= 0xef;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ if (ret)
+ goto err;
+
+ /* demod control */
+ /* PLL enable */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ /* bit 7 to 1 */
+ val |= 0x80;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ /* demod HW reset */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+ /* bit 5 to 0 */
+ val &= 0xdf;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x20;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ mdelay(5);
+
+ /*enable ADC_Q and ADC_I */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x48;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+
+ } else {
+ /* demod_ctl_1 */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x0c;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ if (ret)
+ goto err;
+
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x10;
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+
+ /* demod control */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val &= 0x37;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ }
+
+ return ret;
+err:
+ deb_info("%s: failed=%d\n", __func__, ret);
+ return ret;
+}
+
+
static int rtl2831u_rc_query(struct dvb_usb_device *d)
{
int ret, i;
@@ -768,6 +1134,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_0BDA_2831,
RTL2831U_14AA_0160,
RTL2831U_14AA_0161,
+ RTL2832U_0CCD_00A9,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -780,6 +1147,8 @@ static struct usb_device_id rtl28xxu_table[] = {
USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
/* RTL2832U */
+ [RTL2832U_0CCD_00A9] = {
+ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
{} /* terminating entry */
};
@@ -802,7 +1171,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
{
.frontend_attach = rtl2831u_frontend_attach,
.tuner_attach = rtl2831u_tuner_attach,
- .streaming_ctrl = rtl28xxu_streaming_ctrl,
+ .streaming_ctrl = rtl2831u_streaming_ctrl,
.stream = {
.type = USB_BULK,
.count = 6,
@@ -818,7 +1187,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
}
},
- .power_ctrl = rtl28xxu_power_ctrl,
+ .power_ctrl = rtl2831u_power_ctrl,
.rc.core = {
.protocol = RC_TYPE_NEC,
@@ -864,7 +1233,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
{
.frontend_attach = rtl2832u_frontend_attach,
.tuner_attach = rtl2832u_tuner_attach,
- .streaming_ctrl = rtl28xxu_streaming_ctrl,
+ .streaming_ctrl = rtl2832u_streaming_ctrl,
.stream = {
.type = USB_BULK,
.count = 6,
@@ -880,7 +1249,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
}
},
- .power_ctrl = rtl28xxu_power_ctrl,
+ .power_ctrl = rtl2832u_power_ctrl,
.rc.core = {
.protocol = RC_TYPE_NEC,
@@ -893,10 +1262,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 0, /* disabled as no support for RTL2832 */
+ .num_device_descs = 1,
.devices = {
{
- .name = "Realtek RTL2832U reference design",
+ .name = "Terratec Cinergy T Stick Black",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_0CCD_00A9],
+ },
},
}
},
@@ -907,6 +1279,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
int ret, i;
+ u8 val;
int properties_count = ARRAY_SIZE(rtl28xxu_properties);
struct dvb_usb_device *d;
@@ -926,15 +1299,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
if (ret)
goto err;
+
/* init USB endpoints */
- ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
+ ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+ if (ret)
+ goto err;
+
+ /* enable DMA and Full Packet Mode*/
+ val |= 0x09;
+ ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
if (ret)
goto err;
+ /* set EPA maximum packet size to 0x0200 */
ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
if (ret)
goto err;
+ /* change EPA FIFO length */
ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
if (ret)
goto err;
@@ -979,4 +1361,5 @@ module_exit(rtl28xxu_module_exit);
MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
+MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
MODULE_LICENSE("GPL");
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
2012-05-16 22:13 ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-17 14:43 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
` (2 subsequent siblings)
5 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/rtl28xxu.c | 102 +++++++++++++++++-----------------
1 files changed, 51 insertions(+), 51 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index bb66771..6817ef7 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -83,7 +83,7 @@ err:
return ret;
}
-static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
+static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
{
struct rtl28xxu_req req;
@@ -119,12 +119,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
return rtl28xxu_ctrl_msg(d, &req);
}
-static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
+static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
{
- return rtl2831_wr_regs(d, reg, &val, 1);
+ return rtl28xx_wr_regs(d, reg, &val, 1);
}
-static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
+static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
{
return rtl2831_rd_regs(d, reg, val, 1);
}
@@ -311,12 +311,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
*/
/* GPIO direction */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
if (ret)
goto err;
/* enable as output GPIO0, GPIO2, GPIO4 */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
if (ret)
goto err;
@@ -399,7 +399,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
switch (cmd) {
case FC_FE_CALLBACK_VHF_ENABLE:
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
@@ -409,7 +409,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
val |= 0x40; /* set GPIO6 high */
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
break;
@@ -504,25 +504,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
deb_info("%s:\n", __func__);
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
if (ret)
goto err;
val &= 0xbf;
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
if (ret)
goto err;
/* enable as output GPIO3 and GPIO6*/
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
if (ret)
goto err;
val |= 0x48;
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
if (ret)
goto err;
@@ -773,7 +773,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
deb_info("%s: onoff=%d\n", __func__, onoff);
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
if (ret)
goto err;
@@ -787,11 +787,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
gpio &= (~0x04); /* LED off */
}
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
if (ret)
goto err;
- ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
if (ret)
goto err;
@@ -817,7 +817,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
buf[1] = 0x02; /* reset EPA */
}
- ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
if (ret)
goto err;
@@ -835,12 +835,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
deb_info("%s: onoff=%d\n", __func__, onoff);
/* demod adc */
- ret = rtl2831_rd_reg(d, SYS_SYS0, &sys0);
+ ret = rtl28xx_rd_reg(d, SYS_SYS0, &sys0);
if (ret)
goto err;
/* tuner power, read GPIOs */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
if (ret)
goto err;
@@ -860,12 +860,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
/* demod adc */
- ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
+ ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
if (ret)
goto err;
/* tuner power, write GPIOs */
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
if (ret)
goto err;
@@ -884,107 +884,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
if (onoff) {
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
val |= 0x08;
val &= 0xef;
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
/* demod_ctl_1 */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
if (ret)
goto err;
val &= 0xef;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
if (ret)
goto err;
/* demod control */
/* PLL enable */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
/* bit 7 to 1 */
val |= 0x80;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
/* demod HW reset */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
/* bit 5 to 0 */
val &= 0xdf;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val |= 0x20;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
mdelay(5);
/*enable ADC_Q and ADC_I */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val |= 0x48;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
} else {
/* demod_ctl_1 */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
if (ret)
goto err;
val |= 0x0c;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
if (ret)
goto err;
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
val |= 0x10;
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
/* demod control */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val &= 0x37;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
@@ -1023,7 +1023,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
/* init remote controller */
if (!priv->rc_active) {
for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
- ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+ ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
rc_nec_tab[i].val);
if (ret)
goto err;
@@ -1053,12 +1053,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
rc_keydown(d->rc_dev, rc_code, 0);
- ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+ ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
if (ret)
goto err;
/* repeated intentionally to avoid extra keypress */
- ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+ ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
if (ret)
goto err;
}
@@ -1095,7 +1095,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
/* init remote controller */
if (!priv->rc_active) {
for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
- ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+ ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
rc_nec_tab[i].val);
if (ret)
goto err;
@@ -1103,14 +1103,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
priv->rc_active = true;
}
- ret = rtl2831_rd_reg(d, IR_RX_IF, &buf[0]);
+ ret = rtl28xx_rd_reg(d, IR_RX_IF, &buf[0]);
if (ret)
goto err;
if (buf[0] != 0x83)
goto exit;
- ret = rtl2831_rd_reg(d, IR_RX_BC, &buf[0]);
+ ret = rtl28xx_rd_reg(d, IR_RX_BC, &buf[0]);
if (ret)
goto err;
@@ -1119,9 +1119,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
/* TODO: pass raw IR to Kernel IR decoder */
- ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
- ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
- ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
+ ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
+ ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
+ ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
exit:
return ret;
@@ -1301,23 +1301,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
/* init USB endpoints */
- ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+ ret = rtl28xx_rd_reg(d, USB_SYSCTL_0, &val);
if (ret)
goto err;
/* enable DMA and Full Packet Mode*/
val |= 0x09;
- ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
+ ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
if (ret)
goto err;
/* set EPA maximum packet size to 0x0200 */
- ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
+ ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
if (ret)
goto err;
/* change EPA FIFO length */
- ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
+ ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
if (ret)
goto err;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
` (2 preceding siblings ...)
2012-05-16 22:13 ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-17 14:47 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
2012-05-17 14:53 ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
5 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 11 ++++++++++-
2 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index fd37be0..b0a86e9 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -135,6 +135,7 @@
#define USB_PID_GENIUS_TVGO_DVB_T03 0x4012
#define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
#define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
+#define USB_PID_GTEK 0xb803
#define USB_PID_INTEL_CE9500 0x9500
#define USB_PID_ITETECH_IT9135 0x9135
#define USB_PID_ITETECH_IT9135_9005 0x9005
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 6817ef7..9056d28 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_14AA_0160,
RTL2831U_14AA_0161,
RTL2832U_0CCD_00A9,
+ RTL2832U_1F4D_B803,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
/* RTL2832U */
[RTL2832U_0CCD_00A9] = {
USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
+ [RTL2832U_1F4D_B803] = {
+ USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
{} /* terminating entry */
};
@@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 1,
+ .num_device_descs = 2,
.devices = {
{
.name = "Terratec Cinergy T Stick Black",
@@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
&rtl28xxu_table[RTL2832U_0CCD_00A9],
},
},
+ {
+ .name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T [RTL2832U]",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_1F4D_B803],
+ },
+ },
}
},
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
` (3 preceding siblings ...)
2012-05-16 22:13 ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
@ 2012-05-16 22:13 ` Thomas Mair
2012-05-17 14:50 ` Antti Palosaari
2012-05-17 14:53 ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
5 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
To: linus-media
Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List,
Hans-Frieder Vogt
Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net>
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 27 ++++++++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index b0a86e9..95c9c14 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -244,6 +244,7 @@
#define USB_PID_TERRATEC_H7_2 0x10a3
#define USB_PID_TERRATEC_T3 0x10a0
#define USB_PID_TERRATEC_T5 0x10a1
+#define USB_PID_NOXON_DAB_STICK 0x00b3
#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
#define USB_PID_PINNACLE_PCTV2000E 0x022c
#define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 9056d28..f10cac2 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -29,6 +29,7 @@
#include "mt2060.h"
#include "mxl5005s.h"
#include "fc0012.h"
+#include "fc0013.h"
/* debug */
static int dvb_usb_rtl28xxu_debug;
@@ -388,6 +389,12 @@ static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
.tuner = TUNER_RTL2832_FC0012
};
+static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
+ .i2c_addr = 0x10, /* 0x20 */
+ .xtal = 28800000,
+ .if_dvbt = 0,
+ .tuner = TUNER_RTL2832_FC0013
+};
static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
int cmd, int arg)
@@ -553,6 +560,7 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
if (ret == 0 && buf[0] == 0xa3) {
priv->tuner = TUNER_RTL2832_FC0013;
+ rtl2832_config = &rtl28xxu_rtl2832_fc0013_config;
info("%s: FC0013 tuner found", __func__);
goto found;
}
@@ -750,6 +758,14 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
fe->ops.tuner_ops.get_rf_strength;
return 0;
break;
+ case TUNER_RTL2832_FC0013:
+ fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
+ &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+ /* fc0013 also supports signal strength reading */
+ adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
+ .fe->ops.tuner_ops.get_rf_strength;
+ return 0;
default:
fe = NULL;
err("unknown tuner=%d", priv->tuner);
@@ -1136,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_14AA_0161,
RTL2832U_0CCD_00A9,
RTL2832U_1F4D_B803,
+ RTL2832U_0CCD_00B3,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -1152,6 +1169,8 @@ static struct usb_device_id rtl28xxu_table[] = {
USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
[RTL2832U_1F4D_B803] = {
USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
+ [RTL2832U_0CCD_00B3] = {
+ USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
{} /* terminating entry */
};
@@ -1265,7 +1284,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 2,
+ .num_device_descs = 3,
.devices = {
{
.name = "Terratec Cinergy T Stick Black",
@@ -1279,6 +1298,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
&rtl28xxu_table[RTL2832U_1F4D_B803],
},
},
+ {
+ .name = "NOXON DAB/DAB+ USB dongle",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_0CCD_00B3],
+ },
+ },
}
},
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
@ 2012-05-17 3:36 ` poma
2012-05-17 3:40 ` poma
2012-05-17 14:19 ` Antti Palosaari
1 sibling, 1 reply; 53+ messages in thread
From: poma @ 2012-05-17 3:36 UTC (permalink / raw)
To: Thomas Mair, linux-media
On 05/17/2012 12:13 AM, Thomas Mair wrote:
> Changelog for ver. 0.3:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
> ---
> drivers/media/dvb/frontends/Kconfig | 7 +
> drivers/media/dvb/frontends/Makefile | 1 +
> drivers/media/dvb/frontends/rtl2832.c | 825 ++++++++++++++++++++++++++++
> drivers/media/dvb/frontends/rtl2832.h | 74 +++
> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
> 5 files changed, 1165 insertions(+), 0 deletions(-)
> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
> help
> Say Y when you want to support this frontend.
>
> +config DVB_RTL2832
> + tristate "Realtek RTL2832 DVB-T"
> + depends on DVB_CORE && I2C
> + default m if DVB_FE_CUSTOMISE
> + help
> + Say Y when you want to support this frontend.
> +
> comment "DVB-C (cable) frontends"
> depends on DVB_CORE
>
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..bbf2955 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
> obj-$(CONFIG_DVB_A8293) += a8293.o
> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
> obj-$(CONFIG_DVB_AF9033) += af9033.o
>
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..51c7927
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,825 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static int reg_mask[32] = {
> + 0x00000001,
> + 0x00000003,
> + 0x00000007,
> + 0x0000000f,
> + 0x0000001f,
> + 0x0000003f,
> + 0x0000007f,
> + 0x000000ff,
> + 0x000001ff,
> + 0x000003ff,
> + 0x000007ff,
> + 0x00000fff,
> + 0x00001fff,
> + 0x00003fff,
> + 0x00007fff,
> + 0x0000ffff,
> + 0x0001ffff,
> + 0x0003ffff,
> + 0x0007ffff,
> + 0x000fffff,
> + 0x001fffff,
> + 0x003fffff,
> + 0x007fffff,
> + 0x00ffffff,
> + 0x01ffffff,
> + 0x03ffffff,
> + 0x07ffffff,
> + 0x0fffffff,
> + 0x1fffffff,
> + 0x3fffffff,
> + 0x7fffffff,
> + 0xffffffff
> +};
> +
> +struct rtl2832_reg_entry registers[] = {
> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + u8 buf[1+len];
> + struct i2c_msg msg[1] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1+len,
> + .buf = buf,
> + }
> + };
> +
> + buf[0] = reg;
> + memcpy(&buf[1], val, len);
> +
> + ret = i2c_transfer(priv->i2c, msg, 1);
> + if (ret == 1) {
> + ret = 0;
> + } else {
> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> + }
> + return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + struct i2c_msg msg[2] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1,
> + .buf = ®,
> + }, {
> + .addr = priv->cfg.i2c_addr,
> + .flags = I2C_M_RD,
> + .len = len,
> + .buf = val,
> + }
> + };
> +
> + ret = i2c_transfer(priv->i2c, msg, 2);
> + if (ret == 2) {
> + ret = 0;
> + } else {
> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00, &page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00, &page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> + }
> +
> + return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> + return rtl2832_wr_regs(priv, reg, page, &val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> + return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> + int ret;
> +
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u8 reading[4];
> + u32 reading_tmp;
> + int i;
> +
> + u8 len;
> + u32 mask;
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb >> 3) + 1;
> + mask = reg_mask[msb-lsb];
> +
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i < len; i++)
> + reading_tmp |= reading[i] << ((len-1-i)*8);
> +
> + *val = (reading_tmp >> lsb) & mask;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> + int ret, i;
> + u8 len;
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u32 mask;
> +
> +
> + u8 reading[4];
> + u8 writing[4];
> + u32 reading_tmp;
> + u32 writing_tmp;
> +
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb >> 3) + 1;
> + mask = reg_mask[msb-lsb];
> +
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i < len; i++)
> + reading_tmp |= reading[i] << ((len-1-i)*8);
> +
> + writing_tmp = reading_tmp & ~(mask << lsb);
> + writing_tmp |= ((val & mask) << lsb);
> +
> +
> + for (i = 0; i < len; i++)
> + writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
> +
> + ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
> + if (ret)
> + goto err;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> + int ret;
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s: enable=%d", __func__, enable);
> +
> + /* gate already open or close */
> + if (priv->i2c_gate_state == enable)
> + return 0;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> +
> + if (ret)
> + goto err;
> +
> + priv->i2c_gate_state = enable;
> +
> + return ret;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int i, ret;
> +
> + u8 en_bbin;
> + u64 pset_iffreq;
> +
> + /* initialization values for the demodulator registers */
> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
> + {DVBT_AD_EN_REG, 0x1},
> + {DVBT_AD_EN_REG1, 0x1},
> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
> + {DVBT_MGD_THD0, 0x10},
> + {DVBT_MGD_THD1, 0x20},
> + {DVBT_MGD_THD2, 0x20},
> + {DVBT_MGD_THD3, 0x40},
> + {DVBT_MGD_THD4, 0x22},
> + {DVBT_MGD_THD5, 0x32},
> + {DVBT_MGD_THD6, 0x37},
> + {DVBT_MGD_THD7, 0x39},
> + {DVBT_EN_BK_TRK, 0x0},
> + {DVBT_EN_CACQ_NOTCH, 0x0},
> + {DVBT_AD_AV_REF, 0x2a},
> + {DVBT_REG_PI, 0x6},
> + {DVBT_PIP_ON, 0x0},
> + {DVBT_CDIV_PH0, 0x8},
> + {DVBT_CDIV_PH1, 0x8},
> + {DVBT_SCALE1_B92, 0x4},
> + {DVBT_SCALE1_B93, 0xb0},
> + {DVBT_SCALE1_BA7, 0x78},
> + {DVBT_SCALE1_BA9, 0x28},
> + {DVBT_SCALE1_BAA, 0x59},
> + {DVBT_SCALE1_BAB, 0x83},
> + {DVBT_SCALE1_BAC, 0xd4},
> + {DVBT_SCALE1_BB0, 0x65},
> + {DVBT_SCALE1_BB1, 0x43},
> + {DVBT_KB_P1, 0x1},
> + {DVBT_KB_P2, 0x4},
> + {DVBT_KB_P3, 0x7},
> + {DVBT_K1_CR_STEP12, 0xa},
> + {DVBT_REG_GPE, 0x1},
> + {DVBT_SERIAL, 0x0},
> + {DVBT_CDIV_PH0, 0x9},
> + {DVBT_CDIV_PH1, 0x9},
> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
> + {DVBT_TRK_KS_P2, 0x4},
> + {DVBT_TRK_KS_I2, 0x7},
> + {DVBT_TR_THD_SET2, 0x6},
> + {DVBT_TRK_KC_I2, 0x5},
> + {DVBT_CR_THD_SET2, 0x1},
> + {DVBT_SPEC_INV, 0x0},
> + {DVBT_DAGC_TRG_VAL, 0x5a},
> + {DVBT_AGC_TARG_VAL_0, 0x0},
> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
> + {DVBT_AAGC_LOOP_GAIN, 0x16},
> + {DVBT_LOOP_GAIN2_3_0, 0x6},
> + {DVBT_LOOP_GAIN2_4, 0x1},
> + {DVBT_LOOP_GAIN3, 0x16},
> + {DVBT_VTOP1, 0x35},
> + {DVBT_VTOP2, 0x21},
> + {DVBT_VTOP3, 0x21},
> + {DVBT_KRF1, 0x0},
> + {DVBT_KRF2, 0x40},
> + {DVBT_KRF3, 0x10},
> + {DVBT_KRF4, 0x10},
> + {DVBT_IF_AGC_MIN, 0x80},
> + {DVBT_IF_AGC_MAX, 0x7f},
> + {DVBT_RF_AGC_MIN, 0x80},
> + {DVBT_RF_AGC_MAX, 0x7f},
> + {DVBT_POLAR_RF_AGC, 0x0},
> + {DVBT_POLAR_IF_AGC, 0x0},
> + {DVBT_AD7_SETTING, 0xe9bf},
> + {DVBT_EN_GI_PGA, 0x0},
> + {DVBT_THD_LOCK_UP, 0x0},
> + {DVBT_THD_LOCK_DW, 0x0},
> + {DVBT_THD_UP1, 0x11},
> + {DVBT_THD_DW1, 0xef},
> + {DVBT_INTER_CNT_LEN, 0xc},
> + {DVBT_GI_PGA_STATE, 0x0},
> + {DVBT_EN_AGC_PGA, 0x1},
> + {DVBT_IF_AGC_MAN, 0x0},
> + };
> +
> +
> + dbg("%s", __func__);
> +
> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> + /*
> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> + * / CrystalFreqHz)
> + */
> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> + pset_iffreq *= 0x400000;
> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> + pset_iffreq = pset_iffreq & 0x3fffff;
> +
> +
> +
> + for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> + rtl2832_initial_regs[i].value);
> + if (ret)
> + goto err;
> + }
> +
> + /* if frequency settings */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> + if (ret)
> + goto err;
> +
> + priv->sleeping = false;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + priv->sleeping = true;
> + return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> + struct dvb_frontend_tune_settings *s)
> +{
> + dbg("%s", __func__);
> + s->min_delay_ms = 1000;
> + s->step_size = fe->ops.info.frequency_stepsize * 2;
> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> + return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + struct dtv_frontend_properties *c = &fe->dtv_property_cache;
> + int ret, i, j;
> + u64 bw_mode, num, num2;
> + u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> + static u8 bw_params[3][32] = {
> + /* 6 MHz bandwidth */
> + {
> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> + 0x19, 0xe0,
> + },
> +
> + /* 7 MHz bandwidth */
> + {
> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> + 0x19, 0x10,
> + },
> +
> + /* 8 MHz bandwidth */
> + {
> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> + 0x19, 0xe0,
> + },
> + };
> +
> +
> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> + c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> + /* program tuner */
> + if (fe->ops.tuner_ops.set_params)
> + fe->ops.tuner_ops.set_params(fe);
> +
> +
> + switch (c->bandwidth_hz) {
> + case 6000000:
> + i = 0;
> + bw_mode = 48000000;
> + break;
> + case 7000000:
> + i = 1;
> + bw_mode = 56000000;
> + break;
> + case 8000000:
> + i = 2;
> + bw_mode = 64000000;
> + break;
> + default:
> + dbg("invalid bandwidth");
> + return -EINVAL;
> + }
> +
> + for (j = 0; j < sizeof(bw_params[j]); j++) {
> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
> + if (ret)
> + goto err;
> + }
> +
> + /* calculate and set resample ratio
> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> + * / ConstWithBandwidthMode)
> + */
> + num = priv->cfg.xtal * 7;
> + num *= 0x400000;
> + num = div_u64(num, bw_mode);
> + resamp_ratio = num & 0x3ffffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> + if (ret)
> + goto err;
> +
> + /* calculate and set cfreq off ratio
> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> + * / (CrystalFreqHz * 7))
> + */
> + num = bw_mode << 20;
> + num2 = priv->cfg.xtal * 7;
> + num = div_u64(num, num2);
> + num = -num;
> + cfreq_off_ratio = num & 0xfffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> + if (ret)
> + goto err;
> +
> +
> + /* soft reset */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> + if (ret)
> + goto err;
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int ret;
> + u32 tmp;
> + *status = 0;
> +
> +
> + dbg("%s", __func__);
> + if (priv->sleeping)
> + return 0;
> +
> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
> + if (ret)
> + goto err;
> +
> + if (tmp == 11) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> + }
> + /* TODO find out if this is also true for rtl2832? */
> + /*else if (tmp == 10) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI;
> + }*/
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> + *snr = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> + *ber = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> + *ucblocks = 0;
> + return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> + *strength = 0;
> + return 0;
> +}
> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c)
> +{
> + struct rtl2832_priv *priv = NULL;
> + int ret = 0;
> + u8 tmp;
> +
> + dbg("%s", __func__);
> +
> + /* allocate memory for the internal state */
> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> + if (priv == NULL)
> + goto err;
> +
> + /* setup the priv */
> + priv->i2c = i2c;
> + priv->tuner = cfg->tuner;
> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> + /* check if the demod is there */
> + ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
> + if (ret)
> + goto err;
> +
> + /* create dvb_frontend */
> + memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
> + priv->fe.demodulator_priv = priv;
> +
> + /* TODO implement sleep mode */
> + priv->sleeping = true;
> +
> + return &priv->fe;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + kfree(priv);
> + return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);
> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> + .delsys = { SYS_DVBT },
> + .info = {
> + .name = "Realtek RTL2832 (DVB-T)",
> + .frequency_min = 174000000,
> + .frequency_max = 862000000,
> + .frequency_stepsize = 166667,
> + .caps = FE_CAN_FEC_1_2 |
> + FE_CAN_FEC_2_3 |
> + FE_CAN_FEC_3_4 |
> + FE_CAN_FEC_5_6 |
> + FE_CAN_FEC_7_8 |
> + FE_CAN_FEC_AUTO |
> + FE_CAN_QPSK |
> + FE_CAN_QAM_16 |
> + FE_CAN_QAM_64 |
> + FE_CAN_QAM_AUTO |
> + FE_CAN_TRANSMISSION_MODE_AUTO |
> + FE_CAN_GUARD_INTERVAL_AUTO |
> + FE_CAN_HIERARCHY_AUTO |
> + FE_CAN_RECOVER |
> + FE_CAN_MUTE_TS
> + },
> +
> + .release = rtl2832_release,
> +
> + .init = rtl2832_init,
> + .sleep = rtl2832_sleep,
> +
> + .get_tune_settings = rtl2832_get_tune_settings,
> +
> + .set_frontend = rtl2832_set_frontend,
> +
> + .read_status = rtl2832_read_status,
> + .read_snr = rtl2832_read_snr,
> + .read_ber = rtl2832_read_ber,
> + .read_ucblocks = rtl2832_read_ucblocks,
> + .read_signal_strength = rtl2832_read_signal_strength,
> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.4");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include <linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> + /*
> + * Demodulator I2C address.
> + */
> + u8 i2c_addr;
> +
> + /*
> + * Xtal frequency.
> + * Hz
> + * 4000000, 16000000, 25000000, 28800000
> + */
> + u32 xtal;
> +
> + /*
> + * IFs for all used modes.
> + * Hz
> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> + */
> + u32 if_dvbt;
> +
> + /*
> + */
> + u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> + (defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> + struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *config,
> + struct i2c_adapter *i2c
> +)
> +{
> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> + return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..3e52674
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,258 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> + if (rtl2832_debug) \
> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef err
> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> + struct i2c_adapter *i2c;
> + struct dvb_frontend fe;
> + struct rtl2832_config cfg;
> +
> + bool i2c_gate_state;
> + bool sleeping;
> +
> + u8 tuner;
> + u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> + u8 page;
> + u8 start_address;
> + u8 msb;
> + u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> + int reg;
> + u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> + DVBT_SOFT_RST,
> + DVBT_IIC_REPEAT,
> + DVBT_TR_WAIT_MIN_8K,
> + DVBT_RSD_BER_FAIL_VAL,
> + DVBT_EN_BK_TRK,
> + DVBT_REG_PI,
> + DVBT_REG_PFREQ_1_0,
> + DVBT_PD_DA8,
> + DVBT_LOCK_TH,
> + DVBT_BER_PASS_SCAL,
> + DVBT_CE_FFSM_BYPASS,
> + DVBT_ALPHAIIR_N,
> + DVBT_ALPHAIIR_DIF,
> + DVBT_EN_TRK_SPAN,
> + DVBT_LOCK_TH_LEN,
> + DVBT_CCI_THRE,
> + DVBT_CCI_MON_SCAL,
> + DVBT_CCI_M0,
> + DVBT_CCI_M1,
> + DVBT_CCI_M2,
> + DVBT_CCI_M3,
> + DVBT_SPEC_INIT_0,
> + DVBT_SPEC_INIT_1,
> + DVBT_SPEC_INIT_2,
> + DVBT_AD_EN_REG,
> + DVBT_AD_EN_REG1,
> + DVBT_EN_BBIN,
> + DVBT_MGD_THD0,
> + DVBT_MGD_THD1,
> + DVBT_MGD_THD2,
> + DVBT_MGD_THD3,
> + DVBT_MGD_THD4,
> + DVBT_MGD_THD5,
> + DVBT_MGD_THD6,
> + DVBT_MGD_THD7,
> + DVBT_EN_CACQ_NOTCH,
> + DVBT_AD_AV_REF,
> + DVBT_PIP_ON,
> + DVBT_SCALE1_B92,
> + DVBT_SCALE1_B93,
> + DVBT_SCALE1_BA7,
> + DVBT_SCALE1_BA9,
> + DVBT_SCALE1_BAA,
> + DVBT_SCALE1_BAB,
> + DVBT_SCALE1_BAC,
> + DVBT_SCALE1_BB0,
> + DVBT_SCALE1_BB1,
> + DVBT_KB_P1,
> + DVBT_KB_P2,
> + DVBT_KB_P3,
> + DVBT_OPT_ADC_IQ,
> + DVBT_AD_AVI,
> + DVBT_AD_AVQ,
> + DVBT_K1_CR_STEP12,
> + DVBT_TRK_KS_P2,
> + DVBT_TRK_KS_I2,
> + DVBT_TR_THD_SET2,
> + DVBT_TRK_KC_P2,
> + DVBT_TRK_KC_I2,
> + DVBT_CR_THD_SET2,
> + DVBT_PSET_IFFREQ,
> + DVBT_SPEC_INV,
> + DVBT_BW_INDEX,
> + DVBT_RSAMP_RATIO,
> + DVBT_CFREQ_OFF_RATIO,
> + DVBT_FSM_STAGE,
> + DVBT_RX_CONSTEL,
> + DVBT_RX_HIER,
> + DVBT_RX_C_RATE_LP,
> + DVBT_RX_C_RATE_HP,
> + DVBT_GI_IDX,
> + DVBT_FFT_MODE_IDX,
> + DVBT_RSD_BER_EST,
> + DVBT_CE_EST_EVM,
> + DVBT_RF_AGC_VAL,
> + DVBT_IF_AGC_VAL,
> + DVBT_DAGC_VAL,
> + DVBT_SFREQ_OFF,
> + DVBT_CFREQ_OFF,
> + DVBT_POLAR_RF_AGC,
> + DVBT_POLAR_IF_AGC,
> + DVBT_AAGC_HOLD,
> + DVBT_EN_RF_AGC,
> + DVBT_EN_IF_AGC,
> + DVBT_IF_AGC_MIN,
> + DVBT_IF_AGC_MAX,
> + DVBT_RF_AGC_MIN,
> + DVBT_RF_AGC_MAX,
> + DVBT_IF_AGC_MAN,
> + DVBT_IF_AGC_MAN_VAL,
> + DVBT_RF_AGC_MAN,
> + DVBT_RF_AGC_MAN_VAL,
> + DVBT_DAGC_TRG_VAL,
> + DVBT_AGC_TARG_VAL,
> + DVBT_LOOP_GAIN_3_0,
> + DVBT_LOOP_GAIN_4,
> + DVBT_VTOP,
> + DVBT_KRF,
> + DVBT_AGC_TARG_VAL_0,
> + DVBT_AGC_TARG_VAL_8_1,
> + DVBT_AAGC_LOOP_GAIN,
> + DVBT_LOOP_GAIN2_3_0,
> + DVBT_LOOP_GAIN2_4,
> + DVBT_LOOP_GAIN3,
> + DVBT_VTOP1,
> + DVBT_VTOP2,
> + DVBT_VTOP3,
> + DVBT_KRF1,
> + DVBT_KRF2,
> + DVBT_KRF3,
> + DVBT_KRF4,
> + DVBT_EN_GI_PGA,
> + DVBT_THD_LOCK_UP,
> + DVBT_THD_LOCK_DW,
> + DVBT_THD_UP1,
> + DVBT_THD_DW1,
> + DVBT_INTER_CNT_LEN,
> + DVBT_GI_PGA_STATE,
> + DVBT_EN_AGC_PGA,
> + DVBT_CKOUTPAR,
> + DVBT_CKOUT_PWR,
> + DVBT_SYNC_DUR,
> + DVBT_ERR_DUR,
> + DVBT_SYNC_LVL,
> + DVBT_ERR_LVL,
> + DVBT_VAL_LVL,
> + DVBT_SERIAL,
> + DVBT_SER_LSB,
> + DVBT_CDIV_PH0,
> + DVBT_CDIV_PH1,
> + DVBT_MPEG_IO_OPT_2_2,
> + DVBT_MPEG_IO_OPT_1_0,
> + DVBT_CKOUTPAR_PIP,
> + DVBT_CKOUT_PWR_PIP,
> + DVBT_SYNC_LVL_PIP,
> + DVBT_ERR_LVL_PIP,
> + DVBT_VAL_LVL_PIP,
> + DVBT_CKOUTPAR_PID,
> + DVBT_CKOUT_PWR_PID,
> + DVBT_SYNC_LVL_PID,
> + DVBT_ERR_LVL_PID,
> + DVBT_VAL_LVL_PID,
> + DVBT_SM_PASS,
> + DVBT_UPDATE_REG_2,
> + DVBT_BTHD_P3,
> + DVBT_BTHD_D3,
> + DVBT_FUNC4_REG0,
> + DVBT_FUNC4_REG1,
> + DVBT_FUNC4_REG2,
> + DVBT_FUNC4_REG3,
> + DVBT_FUNC4_REG4,
> + DVBT_FUNC4_REG5,
> + DVBT_FUNC4_REG6,
> + DVBT_FUNC4_REG7,
> + DVBT_FUNC4_REG8,
> + DVBT_FUNC4_REG9,
> + DVBT_FUNC4_REG10,
> + DVBT_FUNC5_REG0,
> + DVBT_FUNC5_REG1,
> + DVBT_FUNC5_REG2,
> + DVBT_FUNC5_REG3,
> + DVBT_FUNC5_REG4,
> + DVBT_FUNC5_REG5,
> + DVBT_FUNC5_REG6,
> + DVBT_FUNC5_REG7,
> + DVBT_FUNC5_REG8,
> + DVBT_FUNC5_REG9,
> + DVBT_FUNC5_REG10,
> + DVBT_FUNC5_REG11,
> + DVBT_FUNC5_REG12,
> + DVBT_FUNC5_REG13,
> + DVBT_FUNC5_REG14,
> + DVBT_FUNC5_REG15,
> + DVBT_FUNC5_REG16,
> + DVBT_FUNC5_REG17,
> + DVBT_FUNC5_REG18,
> + DVBT_AD7_SETTING,
> + DVBT_RSSI_R,
> + DVBT_ACI_DET_IND,
> + DVBT_REG_MON,
> + DVBT_REG_MONSEL,
> + DVBT_REG_GPE,
> + DVBT_REG_GPO,
> + DVBT_REG_4MSEL,
> + DVBT_TEST_REG_1,
> + DVBT_TEST_REG_2,
> + DVBT_TEST_REG_3,
> + DVBT_TEST_REG_4,
> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */
modinfo dvb_usb_rtl28xxu
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/dvb/dvb-usb/dvb-usb-rtl28xxu.ko
license: GPL
author: Thomas Mair <thomas.mair86@googlemail.com>
author: Antti Palosaari <crope@iki.fi>
description: Realtek RTL28xxU DVB USB driver
alias: usb:v0CCDp00B3d*dc*dsc*dp*ic*isc*ip*
alias: usb:v1F4DpB803d*dc*dsc*dp*ic*isc*ip*
alias: usb:v0CCDp00A9d*dc*dsc*dp*ic*isc*ip*
alias: usb:v14AAp0161d*dc*dsc*dp*ic*isc*ip*
alias: usb:v14AAp0160d*dc*dsc*dp*ic*isc*ip*
alias: usb:v0BDAp2831d*dc*dsc*dp*ic*isc*ip*
depends: dvb-usb,rtl2830,rc-core
vermagic: 3.3.5-2.fc16.x86_64 SMP mod_unload
parm: debug:set debugging level (int)
parm: adapter_nr:DVB adapter numbers (array of short)
modinfo rtl2832
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/dvb/frontends/rtl2832.ko
version: 0.4
license: GPL
description: Realtek RTL2832 DVB-T demodulator driver
author: Thomas Mair <mair.thomas86@gmail.com>
srcversion: 533BB7E5866E52F63B9ACCB
depends: i2c-core
vermagic: 3.3.5-2.fc16.x86_64 SMP mod_unload
parm: debug:Turn on/off frontend debugging (default:off). (int)
modinfo fc0012
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/common/tuners/fc0012.ko
version: 0.6
license: GPL
author: Hans-Frieder Vogt <hfvogt@gmx.net>
description: Fitipower FC0012 silicon tuner driver
srcversion: 533BB7E5866E52F63B9ACCB
depends: i2c-core
vermagic: 3.3.5-2.fc16.x86_64 SMP mod_unload
femon -H -a 2 -c 5
FE: Realtek RTL2832 (DVB-T) (DVBT)
status SCVYL | signal 23% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal 23% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal 23% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal 23% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal 23% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK
mini flip-flop:
-v4-1-5-rtl2832-ver.-0.4-v2.diff
All in all nice play ;)
regards,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 3:36 ` poma
@ 2012-05-17 3:40 ` poma
2012-05-17 8:04 ` Thomas Mair
0 siblings, 1 reply; 53+ messages in thread
From: poma @ 2012-05-17 3:40 UTC (permalink / raw)
To: Thomas Mair, linux-media
[-- Attachment #1: Type: text/plain, Size: 39 bytes --]
[…]
v4-1-5-rtl2832-ver.-0.4-v2.diff
[-- Attachment #2: v4-1-5-rtl2832-ver.-0.4-v2.diff --]
[-- Type: text/x-patch, Size: 505 bytes --]
--- v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig 2012-05-17 05:17:16.732328539 +0200
+++ v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch 2012-05-17 05:17:35.999265106 +0200
@@ -24,7 +24,7 @@
obj-$(CONFIG_DVB_A8293) += a8293.o
obj-$(CONFIG_DVB_TDA10071) += tda10071.o
obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
-+obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
++obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
obj-$(CONFIG_DVB_AF9033) += af9033.o
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 3:40 ` poma
@ 2012-05-17 8:04 ` Thomas Mair
0 siblings, 0 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-17 8:04 UTC (permalink / raw)
To: poma; +Cc: linux-media
On 17.05.2012 05:40, poma wrote:
> […]
> v4-1-5-rtl2832-ver.-0.4-v2.diff
>
Oh thanks. That Makefile is haunting me badly ;)
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
2012-05-17 3:36 ` poma
@ 2012-05-17 14:19 ` Antti Palosaari
2012-05-17 20:27 ` poma
2012-05-18 0:55 ` poma
1 sibling, 2 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:19 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List
Moikka Thomas,
Here is the review. See comments below.
And conclusion is that it is ready for the Kernel merge. I did not see
any big functiuonality problems - only some small issues that are likely
considered as a coding style etc. Feel free to fix those and sent new
patc serie or just new patch top of that.
Reviewed-by: Antti Palosaari <crope@iki.fi>
On 17.05.2012 01:13, Thomas Mair wrote:
> Changelog for ver. 0.3:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
> ---
> drivers/media/dvb/frontends/Kconfig | 7 +
> drivers/media/dvb/frontends/Makefile | 1 +
> drivers/media/dvb/frontends/rtl2832.c | 825 ++++++++++++++++++++++++++++
> drivers/media/dvb/frontends/rtl2832.h | 74 +++
> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
> 5 files changed, 1165 insertions(+), 0 deletions(-)
> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
> help
> Say Y when you want to support this frontend.
>
> +config DVB_RTL2832
> + tristate "Realtek RTL2832 DVB-T"
> + depends on DVB_CORE&& I2C
> + default m if DVB_FE_CUSTOMISE
> + help
> + Say Y when you want to support this frontend.
> +
It is correct.
Just for the comment as you said in cover letter that you are unsure
about that.
> comment "DVB-C (cable) frontends"
> depends on DVB_CORE
>
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..bbf2955 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
> obj-$(CONFIG_DVB_A8293) += a8293.o
> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
> obj-$(CONFIG_DVB_AF9033) += af9033.o
>
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..51c7927
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,825 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static int reg_mask[32] = {
This should be static const.
> + 0x00000001,
> + 0x00000003,
> + 0x00000007,
> + 0x0000000f,
> + 0x0000001f,
> + 0x0000003f,
> + 0x0000007f,
> + 0x000000ff,
> + 0x000001ff,
> + 0x000003ff,
> + 0x000007ff,
> + 0x00000fff,
> + 0x00001fff,
> + 0x00003fff,
> + 0x00007fff,
> + 0x0000ffff,
> + 0x0001ffff,
> + 0x0003ffff,
> + 0x0007ffff,
> + 0x000fffff,
> + 0x001fffff,
> + 0x003fffff,
> + 0x007fffff,
> + 0x00ffffff,
> + 0x01ffffff,
> + 0x03ffffff,
> + 0x07ffffff,
> + 0x0fffffff,
> + 0x1fffffff,
> + 0x3fffffff,
> + 0x7fffffff,
> + 0xffffffff
> +};
> +
> +struct rtl2832_reg_entry registers[] = {
static const struct
> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + u8 buf[1+len];
> + struct i2c_msg msg[1] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1+len,
> + .buf = buf,
> + }
> + };
> +
> + buf[0] = reg;
> + memcpy(&buf[1], val, len);
> +
> + ret = i2c_transfer(priv->i2c, msg, 1);
> + if (ret == 1) {
> + ret = 0;
> + } else {
> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> + }
> + return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + struct i2c_msg msg[2] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1,
> + .buf =®,
> + }, {
> + .addr = priv->cfg.i2c_addr,
> + .flags = I2C_M_RD,
> + .len = len,
> + .buf = val,
> + }
> + };
> +
> + ret = i2c_transfer(priv->i2c, msg, 2);
> + if (ret == 2) {
> + ret = 0;
> + } else {
> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00,&page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00,&page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> + }
> +
> + return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> + return rtl2832_wr_regs(priv, reg, page,&val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> + return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> + int ret;
> +
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u8 reading[4];
> + u32 reading_tmp;
> + int i;
> +
> + u8 len;
> + u32 mask;
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb>> 3) + 1;
> + mask = reg_mask[msb-lsb];
You should use spaces here. See Documentation/CodingStyle line 206.
> +
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i< len; i++)
> + reading_tmp |= reading[i]<< ((len-1-i)*8);
You should use spaces here. See Documentation/CodingStyle line 206.
> +
> + *val = (reading_tmp>> lsb)& mask;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> + int ret, i;
> + u8 len;
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u32 mask;
> +
> +
> + u8 reading[4];
> + u8 writing[4];
> + u32 reading_tmp;
> + u32 writing_tmp;
> +
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb>> 3) + 1;
> + mask = reg_mask[msb-lsb];
You should use spaces here. See Documentation/CodingStyle line 206.
> +
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i< len; i++)
> + reading_tmp |= reading[i]<< ((len-1-i)*8);
You should use spaces here. See Documentation/CodingStyle line 206.
> +
> + writing_tmp = reading_tmp& ~(mask<< lsb);
> + writing_tmp |= ((val& mask)<< lsb);
> +
> +
> + for (i = 0; i< len; i++)
> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
You should use spaces here. See Documentation/CodingStyle line 206.
> +
> + ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
> + if (ret)
> + goto err;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> + int ret;
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s: enable=%d", __func__, enable);
> +
> + /* gate already open or close */
> + if (priv->i2c_gate_state == enable)
> + return 0;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> +
> + if (ret)
> + goto err;
Excessive newline between function call and error check.
> +
> + priv->i2c_gate_state = enable;
> +
> + return ret;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int i, ret;
> +
> + u8 en_bbin;
> + u64 pset_iffreq;
> +
> + /* initialization values for the demodulator registers */
> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
> + {DVBT_AD_EN_REG, 0x1},
> + {DVBT_AD_EN_REG1, 0x1},
> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
> + {DVBT_MGD_THD0, 0x10},
> + {DVBT_MGD_THD1, 0x20},
> + {DVBT_MGD_THD2, 0x20},
> + {DVBT_MGD_THD3, 0x40},
> + {DVBT_MGD_THD4, 0x22},
> + {DVBT_MGD_THD5, 0x32},
> + {DVBT_MGD_THD6, 0x37},
> + {DVBT_MGD_THD7, 0x39},
> + {DVBT_EN_BK_TRK, 0x0},
> + {DVBT_EN_CACQ_NOTCH, 0x0},
> + {DVBT_AD_AV_REF, 0x2a},
> + {DVBT_REG_PI, 0x6},
> + {DVBT_PIP_ON, 0x0},
> + {DVBT_CDIV_PH0, 0x8},
> + {DVBT_CDIV_PH1, 0x8},
> + {DVBT_SCALE1_B92, 0x4},
> + {DVBT_SCALE1_B93, 0xb0},
> + {DVBT_SCALE1_BA7, 0x78},
> + {DVBT_SCALE1_BA9, 0x28},
> + {DVBT_SCALE1_BAA, 0x59},
> + {DVBT_SCALE1_BAB, 0x83},
> + {DVBT_SCALE1_BAC, 0xd4},
> + {DVBT_SCALE1_BB0, 0x65},
> + {DVBT_SCALE1_BB1, 0x43},
> + {DVBT_KB_P1, 0x1},
> + {DVBT_KB_P2, 0x4},
> + {DVBT_KB_P3, 0x7},
> + {DVBT_K1_CR_STEP12, 0xa},
> + {DVBT_REG_GPE, 0x1},
> + {DVBT_SERIAL, 0x0},
> + {DVBT_CDIV_PH0, 0x9},
> + {DVBT_CDIV_PH1, 0x9},
> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
> + {DVBT_TRK_KS_P2, 0x4},
> + {DVBT_TRK_KS_I2, 0x7},
> + {DVBT_TR_THD_SET2, 0x6},
> + {DVBT_TRK_KC_I2, 0x5},
> + {DVBT_CR_THD_SET2, 0x1},
> + {DVBT_SPEC_INV, 0x0},
> + {DVBT_DAGC_TRG_VAL, 0x5a},
> + {DVBT_AGC_TARG_VAL_0, 0x0},
> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
> + {DVBT_AAGC_LOOP_GAIN, 0x16},
> + {DVBT_LOOP_GAIN2_3_0, 0x6},
> + {DVBT_LOOP_GAIN2_4, 0x1},
> + {DVBT_LOOP_GAIN3, 0x16},
> + {DVBT_VTOP1, 0x35},
> + {DVBT_VTOP2, 0x21},
> + {DVBT_VTOP3, 0x21},
> + {DVBT_KRF1, 0x0},
> + {DVBT_KRF2, 0x40},
> + {DVBT_KRF3, 0x10},
> + {DVBT_KRF4, 0x10},
> + {DVBT_IF_AGC_MIN, 0x80},
> + {DVBT_IF_AGC_MAX, 0x7f},
> + {DVBT_RF_AGC_MIN, 0x80},
> + {DVBT_RF_AGC_MAX, 0x7f},
> + {DVBT_POLAR_RF_AGC, 0x0},
> + {DVBT_POLAR_IF_AGC, 0x0},
> + {DVBT_AD7_SETTING, 0xe9bf},
> + {DVBT_EN_GI_PGA, 0x0},
> + {DVBT_THD_LOCK_UP, 0x0},
> + {DVBT_THD_LOCK_DW, 0x0},
> + {DVBT_THD_UP1, 0x11},
> + {DVBT_THD_DW1, 0xef},
> + {DVBT_INTER_CNT_LEN, 0xc},
> + {DVBT_GI_PGA_STATE, 0x0},
> + {DVBT_EN_AGC_PGA, 0x1},
> + {DVBT_IF_AGC_MAN, 0x0},
> + };
> +
> +
> + dbg("%s", __func__);
> +
> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> + /*
> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> + * / CrystalFreqHz)
> + */
> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> + pset_iffreq *= 0x400000;
> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> + pset_iffreq = pset_iffreq& 0x3fffff;
> +
> +
> +
> + for (i = 0; i< ARRAY_SIZE(rtl2832_initial_regs); i++) {
> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> + rtl2832_initial_regs[i].value);
> + if (ret)
> + goto err;
> + }
> +
> + /* if frequency settings */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> + if (ret)
> + goto err;
> +
> + priv->sleeping = false;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + priv->sleeping = true;
> + return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> + struct dvb_frontend_tune_settings *s)
> +{
> + dbg("%s", __func__);
> + s->min_delay_ms = 1000;
> + s->step_size = fe->ops.info.frequency_stepsize * 2;
> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> + return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + struct dtv_frontend_properties *c =&fe->dtv_property_cache;
> + int ret, i, j;
> + u64 bw_mode, num, num2;
> + u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> + static u8 bw_params[3][32] = {
> + /* 6 MHz bandwidth */
> + {
> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> + 0x19, 0xe0,
> + },
> +
> + /* 7 MHz bandwidth */
> + {
> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> + 0x19, 0x10,
> + },
> +
> + /* 8 MHz bandwidth */
> + {
> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> + 0x19, 0xe0,
> + },
> + };
> +
> +
> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> + c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> + /* program tuner */
> + if (fe->ops.tuner_ops.set_params)
> + fe->ops.tuner_ops.set_params(fe);
> +
> +
> + switch (c->bandwidth_hz) {
> + case 6000000:
> + i = 0;
> + bw_mode = 48000000;
> + break;
> + case 7000000:
> + i = 1;
> + bw_mode = 56000000;
> + break;
> + case 8000000:
> + i = 2;
> + bw_mode = 64000000;
> + break;
> + default:
> + dbg("invalid bandwidth");
> + return -EINVAL;
> + }
> +
> + for (j = 0; j< sizeof(bw_params[j]); j++) {
> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
> + if (ret)
> + goto err;
> + }
> +
> + /* calculate and set resample ratio
> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> + * / ConstWithBandwidthMode)
> + */
> + num = priv->cfg.xtal * 7;
> + num *= 0x400000;
> + num = div_u64(num, bw_mode);
> + resamp_ratio = num& 0x3ffffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> + if (ret)
> + goto err;
> +
> + /* calculate and set cfreq off ratio
> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> + * / (CrystalFreqHz * 7))
> + */
> + num = bw_mode<< 20;
> + num2 = priv->cfg.xtal * 7;
> + num = div_u64(num, num2);
> + num = -num;
> + cfreq_off_ratio = num& 0xfffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> + if (ret)
> + goto err;
> +
> +
> + /* soft reset */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> + if (ret)
> + goto err;
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int ret;
> + u32 tmp;
> + *status = 0;
> +
> +
> + dbg("%s", __func__);
> + if (priv->sleeping)
> + return 0;
> +
> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
> + if (ret)
> + goto err;
> +
> + if (tmp == 11) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> + }
> + /* TODO find out if this is also true for rtl2832? */
> + /*else if (tmp == 10) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI;
> + }*/
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> + *snr = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> + *ber = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> + *ucblocks = 0;
> + return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> + *strength = 0;
> + return 0;
> +}
> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c)
> +{
> + struct rtl2832_priv *priv = NULL;
> + int ret = 0;
> + u8 tmp;
> +
> + dbg("%s", __func__);
> +
> + /* allocate memory for the internal state */
> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> + if (priv == NULL)
> + goto err;
> +
> + /* setup the priv */
> + priv->i2c = i2c;
> + priv->tuner = cfg->tuner;
> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> + /* check if the demod is there */
> + ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
> + if (ret)
> + goto err;
> +
> + /* create dvb_frontend */
> + memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
> + priv->fe.demodulator_priv = priv;
> +
> + /* TODO implement sleep mode */
> + priv->sleeping = true;
> +
> + return&priv->fe;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + kfree(priv);
> + return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);
> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> + .delsys = { SYS_DVBT },
> + .info = {
> + .name = "Realtek RTL2832 (DVB-T)",
> + .frequency_min = 174000000,
> + .frequency_max = 862000000,
> + .frequency_stepsize = 166667,
> + .caps = FE_CAN_FEC_1_2 |
> + FE_CAN_FEC_2_3 |
> + FE_CAN_FEC_3_4 |
> + FE_CAN_FEC_5_6 |
> + FE_CAN_FEC_7_8 |
> + FE_CAN_FEC_AUTO |
> + FE_CAN_QPSK |
> + FE_CAN_QAM_16 |
> + FE_CAN_QAM_64 |
> + FE_CAN_QAM_AUTO |
> + FE_CAN_TRANSMISSION_MODE_AUTO |
> + FE_CAN_GUARD_INTERVAL_AUTO |
> + FE_CAN_HIERARCHY_AUTO |
> + FE_CAN_RECOVER |
> + FE_CAN_MUTE_TS
> + },
> +
> + .release = rtl2832_release,
> +
> + .init = rtl2832_init,
> + .sleep = rtl2832_sleep,
> +
> + .get_tune_settings = rtl2832_get_tune_settings,
> +
> + .set_frontend = rtl2832_set_frontend,
> +
> + .read_status = rtl2832_read_status,
> + .read_snr = rtl2832_read_snr,
> + .read_ber = rtl2832_read_ber,
> + .read_ucblocks = rtl2832_read_ucblocks,
> + .read_signal_strength = rtl2832_read_signal_strength,
> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.4");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include<linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> + /*
> + * Demodulator I2C address.
> + */
> + u8 i2c_addr;
> +
> + /*
> + * Xtal frequency.
> + * Hz
> + * 4000000, 16000000, 25000000, 28800000
> + */
> + u32 xtal;
> +
> + /*
> + * IFs for all used modes.
> + * Hz
> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> + */
> + u32 if_dvbt;
> +
> + /*
> + */
> + u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> + (defined(CONFIG_DVB_RTL2832_MODULE)&& defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> + struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *config,
> + struct i2c_adapter *i2c
> +)
> +{
> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> + return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..3e52674
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,258 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> + if (rtl2832_debug) \
> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+ if (rtl2832_debug) \
+ printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef err
> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> + struct i2c_adapter *i2c;
> + struct dvb_frontend fe;
> + struct rtl2832_config cfg;
> +
> + bool i2c_gate_state;
> + bool sleeping;
> +
> + u8 tuner;
> + u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> + u8 page;
> + u8 start_address;
> + u8 msb;
> + u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> + int reg;
As this reg is enum I wonder if it is possible to use enum as a type
(enum reg)? Still I am not sure about it and I dont like to test it :)
> + u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> + DVBT_SOFT_RST,
> + DVBT_IIC_REPEAT,
> + DVBT_TR_WAIT_MIN_8K,
> + DVBT_RSD_BER_FAIL_VAL,
> + DVBT_EN_BK_TRK,
> + DVBT_REG_PI,
> + DVBT_REG_PFREQ_1_0,
> + DVBT_PD_DA8,
> + DVBT_LOCK_TH,
> + DVBT_BER_PASS_SCAL,
> + DVBT_CE_FFSM_BYPASS,
> + DVBT_ALPHAIIR_N,
> + DVBT_ALPHAIIR_DIF,
> + DVBT_EN_TRK_SPAN,
> + DVBT_LOCK_TH_LEN,
> + DVBT_CCI_THRE,
> + DVBT_CCI_MON_SCAL,
> + DVBT_CCI_M0,
> + DVBT_CCI_M1,
> + DVBT_CCI_M2,
> + DVBT_CCI_M3,
> + DVBT_SPEC_INIT_0,
> + DVBT_SPEC_INIT_1,
> + DVBT_SPEC_INIT_2,
> + DVBT_AD_EN_REG,
> + DVBT_AD_EN_REG1,
> + DVBT_EN_BBIN,
> + DVBT_MGD_THD0,
> + DVBT_MGD_THD1,
> + DVBT_MGD_THD2,
> + DVBT_MGD_THD3,
> + DVBT_MGD_THD4,
> + DVBT_MGD_THD5,
> + DVBT_MGD_THD6,
> + DVBT_MGD_THD7,
> + DVBT_EN_CACQ_NOTCH,
> + DVBT_AD_AV_REF,
> + DVBT_PIP_ON,
> + DVBT_SCALE1_B92,
> + DVBT_SCALE1_B93,
> + DVBT_SCALE1_BA7,
> + DVBT_SCALE1_BA9,
> + DVBT_SCALE1_BAA,
> + DVBT_SCALE1_BAB,
> + DVBT_SCALE1_BAC,
> + DVBT_SCALE1_BB0,
> + DVBT_SCALE1_BB1,
> + DVBT_KB_P1,
> + DVBT_KB_P2,
> + DVBT_KB_P3,
> + DVBT_OPT_ADC_IQ,
> + DVBT_AD_AVI,
> + DVBT_AD_AVQ,
> + DVBT_K1_CR_STEP12,
> + DVBT_TRK_KS_P2,
> + DVBT_TRK_KS_I2,
> + DVBT_TR_THD_SET2,
> + DVBT_TRK_KC_P2,
> + DVBT_TRK_KC_I2,
> + DVBT_CR_THD_SET2,
> + DVBT_PSET_IFFREQ,
> + DVBT_SPEC_INV,
> + DVBT_BW_INDEX,
> + DVBT_RSAMP_RATIO,
> + DVBT_CFREQ_OFF_RATIO,
> + DVBT_FSM_STAGE,
> + DVBT_RX_CONSTEL,
> + DVBT_RX_HIER,
> + DVBT_RX_C_RATE_LP,
> + DVBT_RX_C_RATE_HP,
> + DVBT_GI_IDX,
> + DVBT_FFT_MODE_IDX,
> + DVBT_RSD_BER_EST,
> + DVBT_CE_EST_EVM,
> + DVBT_RF_AGC_VAL,
> + DVBT_IF_AGC_VAL,
> + DVBT_DAGC_VAL,
> + DVBT_SFREQ_OFF,
> + DVBT_CFREQ_OFF,
> + DVBT_POLAR_RF_AGC,
> + DVBT_POLAR_IF_AGC,
> + DVBT_AAGC_HOLD,
> + DVBT_EN_RF_AGC,
> + DVBT_EN_IF_AGC,
> + DVBT_IF_AGC_MIN,
> + DVBT_IF_AGC_MAX,
> + DVBT_RF_AGC_MIN,
> + DVBT_RF_AGC_MAX,
> + DVBT_IF_AGC_MAN,
> + DVBT_IF_AGC_MAN_VAL,
> + DVBT_RF_AGC_MAN,
> + DVBT_RF_AGC_MAN_VAL,
> + DVBT_DAGC_TRG_VAL,
> + DVBT_AGC_TARG_VAL,
> + DVBT_LOOP_GAIN_3_0,
> + DVBT_LOOP_GAIN_4,
> + DVBT_VTOP,
> + DVBT_KRF,
> + DVBT_AGC_TARG_VAL_0,
> + DVBT_AGC_TARG_VAL_8_1,
> + DVBT_AAGC_LOOP_GAIN,
> + DVBT_LOOP_GAIN2_3_0,
> + DVBT_LOOP_GAIN2_4,
> + DVBT_LOOP_GAIN3,
> + DVBT_VTOP1,
> + DVBT_VTOP2,
> + DVBT_VTOP3,
> + DVBT_KRF1,
> + DVBT_KRF2,
> + DVBT_KRF3,
> + DVBT_KRF4,
> + DVBT_EN_GI_PGA,
> + DVBT_THD_LOCK_UP,
> + DVBT_THD_LOCK_DW,
> + DVBT_THD_UP1,
> + DVBT_THD_DW1,
> + DVBT_INTER_CNT_LEN,
> + DVBT_GI_PGA_STATE,
> + DVBT_EN_AGC_PGA,
> + DVBT_CKOUTPAR,
> + DVBT_CKOUT_PWR,
> + DVBT_SYNC_DUR,
> + DVBT_ERR_DUR,
> + DVBT_SYNC_LVL,
> + DVBT_ERR_LVL,
> + DVBT_VAL_LVL,
> + DVBT_SERIAL,
> + DVBT_SER_LSB,
> + DVBT_CDIV_PH0,
> + DVBT_CDIV_PH1,
> + DVBT_MPEG_IO_OPT_2_2,
> + DVBT_MPEG_IO_OPT_1_0,
> + DVBT_CKOUTPAR_PIP,
> + DVBT_CKOUT_PWR_PIP,
> + DVBT_SYNC_LVL_PIP,
> + DVBT_ERR_LVL_PIP,
> + DVBT_VAL_LVL_PIP,
> + DVBT_CKOUTPAR_PID,
> + DVBT_CKOUT_PWR_PID,
> + DVBT_SYNC_LVL_PID,
> + DVBT_ERR_LVL_PID,
> + DVBT_VAL_LVL_PID,
> + DVBT_SM_PASS,
> + DVBT_UPDATE_REG_2,
> + DVBT_BTHD_P3,
> + DVBT_BTHD_D3,
> + DVBT_FUNC4_REG0,
> + DVBT_FUNC4_REG1,
> + DVBT_FUNC4_REG2,
> + DVBT_FUNC4_REG3,
> + DVBT_FUNC4_REG4,
> + DVBT_FUNC4_REG5,
> + DVBT_FUNC4_REG6,
> + DVBT_FUNC4_REG7,
> + DVBT_FUNC4_REG8,
> + DVBT_FUNC4_REG9,
> + DVBT_FUNC4_REG10,
> + DVBT_FUNC5_REG0,
> + DVBT_FUNC5_REG1,
> + DVBT_FUNC5_REG2,
> + DVBT_FUNC5_REG3,
> + DVBT_FUNC5_REG4,
> + DVBT_FUNC5_REG5,
> + DVBT_FUNC5_REG6,
> + DVBT_FUNC5_REG7,
> + DVBT_FUNC5_REG8,
> + DVBT_FUNC5_REG9,
> + DVBT_FUNC5_REG10,
> + DVBT_FUNC5_REG11,
> + DVBT_FUNC5_REG12,
> + DVBT_FUNC5_REG13,
> + DVBT_FUNC5_REG14,
> + DVBT_FUNC5_REG15,
> + DVBT_FUNC5_REG16,
> + DVBT_FUNC5_REG17,
> + DVBT_FUNC5_REG18,
> + DVBT_AD7_SETTING,
> + DVBT_RSSI_R,
> + DVBT_ACI_DET_IND,
> + DVBT_REG_MON,
> + DVBT_REG_MONSEL,
> + DVBT_REG_GPE,
> + DVBT_REG_GPO,
> + DVBT_REG_4MSEL,
> + DVBT_TEST_REG_1,
> + DVBT_TEST_REG_2,
> + DVBT_TEST_REG_3,
> + DVBT_TEST_REG_4,
> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver
2012-05-16 22:13 ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-17 14:41 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:41 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List
Moikka
Comments below.
Reviewed-by: Antti Palosaari <crope@iki.fi>
On 17.05.2012 01:13, Thomas Mair wrote:
> This only adds support for the Terratec Cinergy T Stick Black device.
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
> ---
> drivers/media/dvb/dvb-usb/Kconfig | 3 +
> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 431 +++++++++++++++++++++++++++++--
> 3 files changed, 411 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
> index be1db75..98dd0d8 100644
> --- a/drivers/media/dvb/dvb-usb/Kconfig
> +++ b/drivers/media/dvb/dvb-usb/Kconfig
> @@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
> tristate "Realtek RTL28xxU DVB USB support"
> depends on DVB_USB&& EXPERIMENTAL
> select DVB_RTL2830
> + select DVB_RTL2832
> select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
> select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
> select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
> + select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
> + select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
> help
> Say Y here to support the Realtek RTL28xxU DVB USB receiver.
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index 2418e41..fd37be0 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -157,6 +157,7 @@
> #define USB_PID_TERRATEC_CINERGY_T_STICK 0x0093
> #define USB_PID_TERRATEC_CINERGY_T_STICK_RC 0x0097
> #define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC 0x0099
> +#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1 0x00a9
> #define USB_PID_TWINHAN_VP7041_COLD 0x3201
> #define USB_PID_TWINHAN_VP7041_WARM 0x3202
> #define USB_PID_TWINHAN_VP7020_COLD 0x3203
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 8f4736a..bb66771 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -3,6 +3,7 @@
> *
> * Copyright (C) 2009 Antti Palosaari<crope@iki.fi>
> * Copyright (C) 2011 Antti Palosaari<crope@iki.fi>
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@googlemail.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
> @@ -22,10 +23,12 @@
> #include "rtl28xxu.h"
>
> #include "rtl2830.h"
> +#include "rtl2832.h"
>
> #include "qt1010.h"
> #include "mt2060.h"
> #include "mxl5005s.h"
> +#include "fc0012.h"
You have added both FC0012 and FC0013 as a Kconfig but only fc0012.h is
used here. It is wrong. Unless you are not using FC0013 tuner you should
not make Kconfig dependency for the driver.
>
> /* debug */
> static int dvb_usb_rtl28xxu_debug;
> @@ -378,34 +381,153 @@ err:
> return ret;
> }
>
> +static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
> + .i2c_addr = 0x10, /* 0x20 */
> + .xtal = 28800000,
> + .if_dvbt = 0,
> + .tuner = TUNER_RTL2832_FC0012
> +};
> +
> +
> +static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
> + int cmd, int arg)
> +{
> + int ret;
> + u8 val;
> +
> + deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
> + switch (cmd) {
> + case FC_FE_CALLBACK_VHF_ENABLE:
> + /* set output values */
> + ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + if (ret)
> + goto err;
> +
> + if (arg)
> + val&= 0xbf; /* set GPIO6 low */
> + else
> + val |= 0x40; /* set GPIO6 high */
> +
> +
> + ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + if (ret)
> + goto err;
> + break;
> + default:
> + ret = -EINVAL;
> + goto err;
> + }
> + return 0;
> +
> +err:
> + err("%s: failed=%d\n", __func__, ret);
> +
> + return ret;
> +}
> +
> +
> +static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
> + int cmd, int arg)
> +{
> + /* TODO implement*/
> + return 0;
> +}
> +
> +static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
> +{
> + struct rtl28xxu_priv *priv = d->priv;
> +
> + switch (priv->tuner) {
> + case TUNER_RTL2832_FC0012:
> + return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
> +
> + case TUNER_RTL2832_FC0013:
> + return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
> + default:
> + break;
> + }
> +
> + return -ENODEV;
> +}
> +
> +static int rtl2832u_frontend_callback(void *adapter_priv, int component,
> + int cmd, int arg)
> +{
> + struct i2c_adapter *adap = adapter_priv;
> + struct dvb_usb_device *d = i2c_get_adapdata(adap);
> +
> + switch (component) {
> + case DVB_FRONTEND_COMPONENT_TUNER:
> + return rtl2832u_tuner_callback(d, cmd, arg);
> + default:
> + break;
> + }
> +
> + return -EINVAL;
> +}
> +
> +
> +
> +
> static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
> {
> int ret;
> struct rtl28xxu_priv *priv = adap->dev->priv;
> - u8 buf[1];
> + struct rtl2832_config *rtl2832_config;
> +
> + u8 buf[2], val;
> /* open RTL2832U/RTL2832 I2C gate */
> struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
> /* close RTL2832U/RTL2832 I2C gate */
> struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
> + /* for FC0012 tuner probe */
> + struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
> + /* for FC0013 tuner probe */
> + struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
> + /* for MT2266 tuner probe */
> + struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
> /* for FC2580 tuner probe */
> struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
> + /* for MT2063 tuner probe */
> + struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
> + /* for MAX3543 tuner probe */
> + struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
> + /* for TUA9001 tuner probe */
> + struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
> + /* for MXL5007T tuner probe */
> + struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
> + /* for E4000 tuner probe */
> + struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
> + /* for TDA18272 tuner probe */
> + struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
>
> deb_info("%s:\n", __func__);
>
> - /* GPIO direction */
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
> +
> + ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
> if (ret)
> goto err;
>
> - /* enable as output GPIO0, GPIO2, GPIO4 */
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
> + val&= 0xbf;
> +
> + ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
> if (ret)
> goto err;
>
> - ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
> +
> + /* enable as output GPIO3 and GPIO6*/
> + ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
> if (ret)
> goto err;
>
> + val |= 0x48;
> +
> + ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
> + if (ret)
> + goto err;
> +
> +
> +
> /*
> * Probe used tuner. We need to know used tuner before demod attach
> * since there is some demod params needed to set according to tuner.
> @@ -416,15 +538,95 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
> if (ret)
> goto err;
>
> + priv->tuner = TUNER_NONE;
> +
> + /* check FC0012 ID register; reg=00 val=a1 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0012);
> + if (ret == 0&& buf[0] == 0xa1) {
> + priv->tuner = TUNER_RTL2832_FC0012;
> + rtl2832_config =&rtl28xxu_rtl2832_fc0012_config;
> + info("%s: FC0012 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check FC0013 ID register; reg=00 val=a3 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0013);
> + if (ret == 0&& buf[0] == 0xa3) {
> + priv->tuner = TUNER_RTL2832_FC0013;
> + info("%s: FC0013 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check MT2266 ID register; reg=00 val=85 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_mt2266);
> + if (ret == 0&& buf[0] == 0x85) {
> + priv->tuner = TUNER_RTL2832_MT2266;
> + /* TODO implement tuner */
> + info("%s: MT2266 tuner found", __func__);
> + goto found;
> + }
> +
> /* check FC2580 ID register; reg=01 val=56 */
> ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc2580);
> if (ret == 0&& buf[0] == 0x56) {
> priv->tuner = TUNER_RTL2832_FC2580;
> - deb_info("%s: FC2580\n", __func__);
> + /* TODO implement tuner */
> + info("%s: FC2580 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check MT2063 ID register; reg=00 val=9e || 9c */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_mt2063);
> + if (ret == 0&& (buf[0] == 0x9e || buf[0] == 0x9c)) {
> + priv->tuner = TUNER_RTL2832_MT2063;
> + /* TODO implement tuner */
> + info("%s: MT2063 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check MAX3543 ID register; reg=00 val=38 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_max3543);
> + if (ret == 0&& buf[0] == 0x38) {
> + priv->tuner = TUNER_RTL2832_MAX3543;
> + /* TODO implement tuner */
> + info("%s: MAX3534 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check TUA9001 ID register; reg=7e val=2328 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_tua9001);
> + if (ret == 0&& buf[0] == 0x23&& buf[1] == 0x28) {
> + priv->tuner = TUNER_RTL2832_TUA9001;
> + /* TODO implement tuner */
> + info("%s: TUA9001 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check MXL5007R ID register; reg=d9 val=14 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_mxl5007t);
> + if (ret == 0&& buf[0] == 0x14) {
> + priv->tuner = TUNER_RTL2832_MXL5007T;
> + /* TODO implement tuner */
> + info("%s: MXL5007T tuner found", __func__);
> + goto found;
> + }
> +
> + /* check E4000 ID register; reg=02 val=40 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_e4000);
> + if (ret == 0&& buf[0] == 0x40) {
> + priv->tuner = TUNER_RTL2832_E4000;
> + /* TODO implement tuner */
> + info("%s: E4000 tuner found", __func__);
> + goto found;
> + }
> +
> + /* check TDA18272 ID register; reg=00 val=c760 */
> + ret = rtl28xxu_ctrl_msg(adap->dev,&req_tda18272);
> + if (ret == 0&& (buf[0] == 0xc7 || buf[1] == 0x60)) {
> + priv->tuner = TUNER_RTL2832_TDA18272;
> + /* TODO implement tuner */
> + info("%s: TDA18272 tuner found", __func__);
> goto found;
> - } else {
> - deb_info("%s: FC2580 probe failed=%d - %02x\n",
> - __func__, ret, buf[0]);
> }
>
> /* close demod I2C gate */
> @@ -433,8 +635,9 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
> goto err;
>
> /* tuner not found */
> + deb_info("No compatible tuner found");
> ret = -ENODEV;
> - goto err;
> + return ret;
>
> found:
> /* close demod I2C gate */
> @@ -443,9 +646,18 @@ found:
> goto err;
>
> /* attach demodulator */
> - /* TODO: */
> + adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
> + &adap->dev->i2c_adap);
> + if (adap->fe_adap[0].fe == NULL) {
> + ret = -ENODEV;
> + goto err;
> + }
> +
> + /* set fe callbacks */
> + adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
>
> return ret;
> +
> err:
> deb_info("%s: failed=%d\n", __func__, ret);
> return ret;
> @@ -528,9 +740,15 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
> deb_info("%s:\n", __func__);
>
> switch (priv->tuner) {
> - case TUNER_RTL2832_FC2580:
> - /* TODO: */
> - fe = NULL;
> + case TUNER_RTL2832_FC0012:
> + fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
> + &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
> +
> + /* since fc0012 includs reading the signal strength delegate
> + * that to the tuner driver */
> + adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
> + fe->ops.tuner_ops.get_rf_strength;
> + return 0;
> break;
> default:
> fe = NULL;
> @@ -548,7 +766,7 @@ err:
> return ret;
> }
>
> -static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> +static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> {
> int ret;
> u8 buf[2], gpio;
> @@ -583,7 +801,33 @@ err:
> return ret;
> }
>
> -static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
> +static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> +{
> + int ret;
> + u8 buf[2];
> +
> + deb_info("%s: onoff=%d\n", __func__, onoff);
> +
> +
> + if (onoff) {
> + buf[0] = 0x00;
> + buf[1] = 0x00;
> + } else {
> + buf[0] = 0x10; /* stall EPA */
> + buf[1] = 0x02; /* reset EPA */
> + }
> +
> + ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> + if (ret)
> + goto err;
> +
> + return ret;
> +err:
> + deb_info("%s: failed=%d\n", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
> {
> int ret;
> u8 gpio, sys0;
> @@ -631,6 +875,128 @@ err:
> return ret;
> }
>
> +static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
> +{
> + int ret;
> + u8 val;
> +
> + deb_info("%s: onoff=%d\n", __func__, onoff);
> +
> + if (onoff) {
> + /* set output values */
> + ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + if (ret)
> + goto err;
> +
> + val |= 0x08;
> + val&= 0xef;
> +
> + ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + if (ret)
> + goto err;
> +
> + /* demod_ctl_1 */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> + if (ret)
> + goto err;
> +
> + val&= 0xef;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> + if (ret)
> + goto err;
> +
> + /* demod control */
> + /* PLL enable */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + if (ret)
> + goto err;
> +
> + /* bit 7 to 1 */
> + val |= 0x80;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + if (ret)
> + goto err;
> +
> + /* demod HW reset */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + if (ret)
> + goto err;
> + /* bit 5 to 0 */
> + val&= 0xdf;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + if (ret)
> + goto err;
> +
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + if (ret)
> + goto err;
> +
> + val |= 0x20;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + if (ret)
> + goto err;
> +
> + mdelay(5);
> +
> + /*enable ADC_Q and ADC_I */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + if (ret)
> + goto err;
> +
> + val |= 0x48;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + if (ret)
> + goto err;
> +
> +
> + } else {
> + /* demod_ctl_1 */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> + if (ret)
> + goto err;
> +
> + val |= 0x0c;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> + if (ret)
> + goto err;
> +
> + /* set output values */
> + ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + if (ret)
> + goto err;
> +
> + val |= 0x10;
> +
> + ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + if (ret)
> + goto err;
> +
> + /* demod control */
> + ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + if (ret)
> + goto err;
> +
> + val&= 0x37;
> +
> + ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + if (ret)
> + goto err;
> +
> + }
> +
> + return ret;
> +err:
> + deb_info("%s: failed=%d\n", __func__, ret);
> + return ret;
> +}
> +
> +
> static int rtl2831u_rc_query(struct dvb_usb_device *d)
> {
> int ret, i;
> @@ -768,6 +1134,7 @@ enum rtl28xxu_usb_table_entry {
> RTL2831U_0BDA_2831,
> RTL2831U_14AA_0160,
> RTL2831U_14AA_0161,
> + RTL2832U_0CCD_00A9,
> };
>
> static struct usb_device_id rtl28xxu_table[] = {
> @@ -780,6 +1147,8 @@ static struct usb_device_id rtl28xxu_table[] = {
> USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
>
> /* RTL2832U */
> + [RTL2832U_0CCD_00A9] = {
> + USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
> {} /* terminating entry */
> };
>
> @@ -802,7 +1171,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> {
> .frontend_attach = rtl2831u_frontend_attach,
> .tuner_attach = rtl2831u_tuner_attach,
> - .streaming_ctrl = rtl28xxu_streaming_ctrl,
> + .streaming_ctrl = rtl2831u_streaming_ctrl,
> .stream = {
> .type = USB_BULK,
> .count = 6,
> @@ -818,7 +1187,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> }
> },
>
> - .power_ctrl = rtl28xxu_power_ctrl,
> + .power_ctrl = rtl2831u_power_ctrl,
>
> .rc.core = {
> .protocol = RC_TYPE_NEC,
> @@ -864,7 +1233,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> {
> .frontend_attach = rtl2832u_frontend_attach,
> .tuner_attach = rtl2832u_tuner_attach,
> - .streaming_ctrl = rtl28xxu_streaming_ctrl,
> + .streaming_ctrl = rtl2832u_streaming_ctrl,
> .stream = {
> .type = USB_BULK,
> .count = 6,
> @@ -880,7 +1249,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> }
> },
>
> - .power_ctrl = rtl28xxu_power_ctrl,
> + .power_ctrl = rtl2832u_power_ctrl,
>
> .rc.core = {
> .protocol = RC_TYPE_NEC,
> @@ -893,10 +1262,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
> .i2c_algo =&rtl28xxu_i2c_algo,
>
> - .num_device_descs = 0, /* disabled as no support for RTL2832 */
> + .num_device_descs = 1,
> .devices = {
> {
> - .name = "Realtek RTL2832U reference design",
> + .name = "Terratec Cinergy T Stick Black",
> + .warm_ids = {
> + &rtl28xxu_table[RTL2832U_0CCD_00A9],
> + },
> },
> }
> },
> @@ -907,6 +1279,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
> const struct usb_device_id *id)
> {
> int ret, i;
> + u8 val;
> int properties_count = ARRAY_SIZE(rtl28xxu_properties);
> struct dvb_usb_device *d;
>
> @@ -926,15 +1299,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
> if (ret)
> goto err;
>
> +
> /* init USB endpoints */
> - ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
> + ret = rtl2831_rd_reg(d, USB_SYSCTL_0,&val);
> + if (ret)
> + goto err;
> +
> + /* enable DMA and Full Packet Mode*/
> + val |= 0x09;
> + ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
> if (ret)
> goto err;
>
> + /* set EPA maximum packet size to 0x0200 */
> ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
> if (ret)
> goto err;
>
> + /* change EPA FIFO length */
> ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
> if (ret)
> goto err;
> @@ -979,4 +1361,5 @@ module_exit(rtl28xxu_module_exit);
>
> MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
> MODULE_AUTHOR("Antti Palosaari<crope@iki.fi>");
> +MODULE_AUTHOR("Thomas Mair<thomas.mair86@googlemail.com>");
> MODULE_LICENSE("GPL");
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
2012-05-16 22:13 ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-17 14:43 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:43 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List
On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
> ---
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 102 +++++++++++++++++-----------------
> 1 files changed, 51 insertions(+), 51 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index bb66771..6817ef7 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -83,7 +83,7 @@ err:
> return ret;
> }
>
> -static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
> +static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
> {
> struct rtl28xxu_req req;
>
> @@ -119,12 +119,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
> return rtl28xxu_ctrl_msg(d,&req);
> }
>
> -static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
> +static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
> {
> - return rtl2831_wr_regs(d, reg,&val, 1);
> + return rtl28xx_wr_regs(d, reg,&val, 1);
> }
>
> -static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
> +static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
> {
> return rtl2831_rd_regs(d, reg, val, 1);
> }
> @@ -311,12 +311,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
> */
>
> /* GPIO direction */
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
> + ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
> if (ret)
> goto err;
>
> /* enable as output GPIO0, GPIO2, GPIO4 */
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
> + ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
> if (ret)
> goto err;
>
> @@ -399,7 +399,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
> switch (cmd) {
> case FC_FE_CALLBACK_VHF_ENABLE:
> /* set output values */
> - ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> if (ret)
> goto err;
>
> @@ -409,7 +409,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
> val |= 0x40; /* set GPIO6 high */
>
>
> - ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> if (ret)
> goto err;
> break;
> @@ -504,25 +504,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
> deb_info("%s:\n", __func__);
>
>
> - ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
> + ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
> if (ret)
> goto err;
>
> val&= 0xbf;
>
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
> + ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
> if (ret)
> goto err;
>
>
> /* enable as output GPIO3 and GPIO6*/
> - ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
> + ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
> if (ret)
> goto err;
>
> val |= 0x48;
>
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
> + ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
> if (ret)
> goto err;
>
> @@ -773,7 +773,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
>
> deb_info("%s: onoff=%d\n", __func__, onoff);
>
> - ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL,&gpio);
> + ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL,&gpio);
> if (ret)
> goto err;
>
> @@ -787,11 +787,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> gpio&= (~0x04); /* LED off */
> }
>
> - ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
> + ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
> if (ret)
> goto err;
>
> - ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> + ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> if (ret)
> goto err;
>
> @@ -817,7 +817,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> buf[1] = 0x02; /* reset EPA */
> }
>
> - ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> + ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> if (ret)
> goto err;
>
> @@ -835,12 +835,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
> deb_info("%s: onoff=%d\n", __func__, onoff);
>
> /* demod adc */
> - ret = rtl2831_rd_reg(d, SYS_SYS0,&sys0);
> + ret = rtl28xx_rd_reg(d, SYS_SYS0,&sys0);
> if (ret)
> goto err;
>
> /* tuner power, read GPIOs */
> - ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&gpio);
> + ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&gpio);
> if (ret)
> goto err;
>
> @@ -860,12 +860,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
> deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
>
> /* demod adc */
> - ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
> + ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
> if (ret)
> goto err;
>
> /* tuner power, write GPIOs */
> - ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
> + ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
> if (ret)
> goto err;
>
> @@ -884,107 +884,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
>
> if (onoff) {
> /* set output values */
> - ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> if (ret)
> goto err;
>
> val |= 0x08;
> val&= 0xef;
>
> - ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> if (ret)
> goto err;
>
> /* demod_ctl_1 */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1,&val);
> if (ret)
> goto err;
>
> val&= 0xef;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
> if (ret)
> goto err;
>
> /* demod control */
> /* PLL enable */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
> if (ret)
> goto err;
>
> /* bit 7 to 1 */
> val |= 0x80;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
> if (ret)
> goto err;
>
> /* demod HW reset */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
> if (ret)
> goto err;
> /* bit 5 to 0 */
> val&= 0xdf;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
> if (ret)
> goto err;
>
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
> if (ret)
> goto err;
>
> val |= 0x20;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
> if (ret)
> goto err;
>
> mdelay(5);
>
> /*enable ADC_Q and ADC_I */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
> if (ret)
> goto err;
>
> val |= 0x48;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
> if (ret)
> goto err;
>
>
> } else {
> /* demod_ctl_1 */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1,&val);
> if (ret)
> goto err;
>
> val |= 0x0c;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
> if (ret)
> goto err;
>
> /* set output values */
> - ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> if (ret)
> goto err;
>
> val |= 0x10;
>
> - ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> + ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> if (ret)
> goto err;
>
> /* demod control */
> - ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> + ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
> if (ret)
> goto err;
>
> val&= 0x37;
>
> - ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> + ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
> if (ret)
> goto err;
>
> @@ -1023,7 +1023,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
> /* init remote controller */
> if (!priv->rc_active) {
> for (i = 0; i< ARRAY_SIZE(rc_nec_tab); i++) {
> - ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
> + ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
> rc_nec_tab[i].val);
> if (ret)
> goto err;
> @@ -1053,12 +1053,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
>
> rc_keydown(d->rc_dev, rc_code, 0);
>
> - ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
> + ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
> if (ret)
> goto err;
>
> /* repeated intentionally to avoid extra keypress */
> - ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
> + ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
> if (ret)
> goto err;
> }
> @@ -1095,7 +1095,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
> /* init remote controller */
> if (!priv->rc_active) {
> for (i = 0; i< ARRAY_SIZE(rc_nec_tab); i++) {
> - ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
> + ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
> rc_nec_tab[i].val);
> if (ret)
> goto err;
> @@ -1103,14 +1103,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
> priv->rc_active = true;
> }
>
> - ret = rtl2831_rd_reg(d, IR_RX_IF,&buf[0]);
> + ret = rtl28xx_rd_reg(d, IR_RX_IF,&buf[0]);
> if (ret)
> goto err;
>
> if (buf[0] != 0x83)
> goto exit;
>
> - ret = rtl2831_rd_reg(d, IR_RX_BC,&buf[0]);
> + ret = rtl28xx_rd_reg(d, IR_RX_BC,&buf[0]);
> if (ret)
> goto err;
>
> @@ -1119,9 +1119,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
>
> /* TODO: pass raw IR to Kernel IR decoder */
>
> - ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
> - ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
> - ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
> + ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
> + ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
> + ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
>
> exit:
> return ret;
> @@ -1301,23 +1301,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
>
>
> /* init USB endpoints */
> - ret = rtl2831_rd_reg(d, USB_SYSCTL_0,&val);
> + ret = rtl28xx_rd_reg(d, USB_SYSCTL_0,&val);
> if (ret)
> goto err;
>
> /* enable DMA and Full Packet Mode*/
> val |= 0x09;
> - ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
> + ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
> if (ret)
> goto err;
>
> /* set EPA maximum packet size to 0x0200 */
> - ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
> + ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
> if (ret)
> goto err;
>
> /* change EPA FIFO length */
> - ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
> + ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
> if (ret)
> goto err;
>
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
2012-05-16 22:13 ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
@ 2012-05-17 14:47 ` Antti Palosaari
2012-05-17 20:43 ` poma
0 siblings, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:47 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List
On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Nacked.
Better PID definition is required.
> ---
> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 11 ++++++++++-
> 2 files changed, 11 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index fd37be0..b0a86e9 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -135,6 +135,7 @@
> #define USB_PID_GENIUS_TVGO_DVB_T03 0x4012
> #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
> #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
> +#define USB_PID_GTEK 0xb803
You must give better name for the device. Vendor name is not enough as
many vendors has surely more than one device model.
Correct PID is something like USB_PID_GTEK_LIFEVIEW_LV5TDLX
> #define USB_PID_INTEL_CE9500 0x9500
> #define USB_PID_ITETECH_IT9135 0x9135
> #define USB_PID_ITETECH_IT9135_9005 0x9005
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 6817ef7..9056d28 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
> RTL2831U_14AA_0160,
> RTL2831U_14AA_0161,
> RTL2832U_0CCD_00A9,
> + RTL2832U_1F4D_B803,
> };
>
> static struct usb_device_id rtl28xxu_table[] = {
> @@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
> /* RTL2832U */
> [RTL2832U_0CCD_00A9] = {
> USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
> + [RTL2832U_1F4D_B803] = {
> + USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
> {} /* terminating entry */
> };
>
> @@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
> .i2c_algo =&rtl28xxu_i2c_algo,
>
> - .num_device_descs = 1,
> + .num_device_descs = 2,
> .devices = {
> {
> .name = "Terratec Cinergy T Stick Black",
> @@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> &rtl28xxu_table[RTL2832U_0CCD_00A9],
> },
> },
> + {
> + .name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T [RTL2832U]",
> + .warm_ids = {
> + &rtl28xxu_table[RTL2832U_1F4D_B803],
> + },
> + },
> }
> },
>
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
2012-05-16 22:13 ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-17 14:50 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:50 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List, Hans-Frieder Vogt
On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
> ---
> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 27 ++++++++++++++++++++++++++-
> 2 files changed, 27 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index b0a86e9..95c9c14 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -244,6 +244,7 @@
> #define USB_PID_TERRATEC_H7_2 0x10a3
> #define USB_PID_TERRATEC_T3 0x10a0
> #define USB_PID_TERRATEC_T5 0x10a1
> +#define USB_PID_NOXON_DAB_STICK 0x00b3
> #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
> #define USB_PID_PINNACLE_PCTV2000E 0x022c
> #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 9056d28..f10cac2 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -29,6 +29,7 @@
> #include "mt2060.h"
> #include "mxl5005s.h"
> #include "fc0012.h"
> +#include "fc0013.h"
Aaah, it is coming here. You were introducing some FC0013 earlier which
I mentioned (that Kconfig dependency). Correct place for FC0013 stuff is
that patch.
>
> /* debug */
> static int dvb_usb_rtl28xxu_debug;
> @@ -388,6 +389,12 @@ static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
> .tuner = TUNER_RTL2832_FC0012
> };
>
> +static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
> + .i2c_addr = 0x10, /* 0x20 */
> + .xtal = 28800000,
> + .if_dvbt = 0,
> + .tuner = TUNER_RTL2832_FC0013
> +};
>
> static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
> int cmd, int arg)
> @@ -553,6 +560,7 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
> ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0013);
> if (ret == 0&& buf[0] == 0xa3) {
> priv->tuner = TUNER_RTL2832_FC0013;
> + rtl2832_config =&rtl28xxu_rtl2832_fc0013_config;
> info("%s: FC0013 tuner found", __func__);
> goto found;
> }
> @@ -750,6 +758,14 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
> fe->ops.tuner_ops.get_rf_strength;
> return 0;
> break;
> + case TUNER_RTL2832_FC0013:
> + fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
> + &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
> +
> + /* fc0013 also supports signal strength reading */
> + adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
> + .fe->ops.tuner_ops.get_rf_strength;
> + return 0;
> default:
> fe = NULL;
> err("unknown tuner=%d", priv->tuner);
> @@ -1136,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
> RTL2831U_14AA_0161,
> RTL2832U_0CCD_00A9,
> RTL2832U_1F4D_B803,
> + RTL2832U_0CCD_00B3,
> };
>
> static struct usb_device_id rtl28xxu_table[] = {
> @@ -1152,6 +1169,8 @@ static struct usb_device_id rtl28xxu_table[] = {
> USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
> [RTL2832U_1F4D_B803] = {
> USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
> + [RTL2832U_0CCD_00B3] = {
> + USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
> {} /* terminating entry */
> };
>
> @@ -1265,7 +1284,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
> .i2c_algo =&rtl28xxu_i2c_algo,
>
> - .num_device_descs = 2,
> + .num_device_descs = 3,
> .devices = {
> {
> .name = "Terratec Cinergy T Stick Black",
> @@ -1279,6 +1298,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
> &rtl28xxu_table[RTL2832U_1F4D_B803],
> },
> },
> + {
> + .name = "NOXON DAB/DAB+ USB dongle",
> + .warm_ids = {
> + &rtl28xxu_table[RTL2832U_0CCD_00B3],
> + },
> + },
> }
> },
>
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 0/5] support for rtl2832
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
` (4 preceding siblings ...)
2012-05-16 22:13 ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-17 14:53 ` Antti Palosaari
5 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:53 UTC (permalink / raw)
To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List
On 17.05.2012 01:13, Thomas Mair wrote:
> This is the new version of the patch series to add support for the
> rtl2832 demodulator driver. Before applying the patches you need to
> add the fc0012/fc0013 driver from Hans-Frider Vogt.
Who wants to review those tuner drivers?
> The changes from the privious version of the patches are manly in the
> rtl2832 demod driver to fix code style issues, a nasty bug in the
> frontends Makefile and the removal of the signal statistics functionality
> which was badly broken in version 0.3 of the driver.
>
> The one thing that I am not really confident with is the Kconfig file for
> the dvb frontend driver. Are the changes I made right? And if not what
> kind of changes need to be made?
>
> Thanks Antti and poma for your comments!
I have reviewed all patches and commented some issues. Those are after
all relative small issues you can sent just new patch top of that to fix
or rebase whole patch series and sent new. It is up to you.
regards
Antti
>
> Regards
> Thomas
>
> Thomas Mair (5):
> rtl2832 ver. 0.4: removed signal statistics
> rtl28xxu: support for the rtl2832 demod driver
> rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
> rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
> rtl28xxu: support Terratec Noxon DAB/DAB+ stick
>
> drivers/media/dvb/dvb-usb/Kconfig | 3 +
> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 3 +
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 513 ++++++++++++++++--
> drivers/media/dvb/frontends/Kconfig | 7 +
> drivers/media/dvb/frontends/Makefile | 1 +
> drivers/media/dvb/frontends/rtl2832.c | 825 ++++++++++++++++++++++++++++
> drivers/media/dvb/frontends/rtl2832.h | 74 +++
> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
> 8 files changed, 1636 insertions(+), 48 deletions(-)
> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 14:19 ` Antti Palosaari
@ 2012-05-17 20:27 ` poma
2012-05-17 20:41 ` Antti Palosaari
2012-05-18 0:55 ` poma
1 sibling, 1 reply; 53+ messages in thread
From: poma @ 2012-05-17 20:27 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
[-- Attachment #1: Type: text/plain, Size: 41479 bytes --]
On 05/17/2012 04:19 PM, Antti Palosaari wrote:
> Moikka Thomas,
>
> Here is the review. See comments below.
>
> And conclusion is that it is ready for the Kernel merge. I did not see
> any big functiuonality problems - only some small issues that are likely
> considered as a coding style etc. Feel free to fix those and sent new
> patc serie or just new patch top of that.
>
> Reviewed-by: Antti Palosaari <crope@iki.fi>
>
>
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Changelog for ver. 0.3:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>> ---
>> drivers/media/dvb/frontends/Kconfig | 7 +
>> drivers/media/dvb/frontends/Makefile | 1 +
>> drivers/media/dvb/frontends/rtl2832.c | 825
>> ++++++++++++++++++++++++++++
>> drivers/media/dvb/frontends/rtl2832.h | 74 +++
>> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
>> 5 files changed, 1165 insertions(+), 0 deletions(-)
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig
>> b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>> help
>> Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> + tristate "Realtek RTL2832 DVB-T"
>> + depends on DVB_CORE&& I2C
>> + default m if DVB_FE_CUSTOMISE
>> + help
>> + Say Y when you want to support this frontend.
>> +
>
> It is correct.
>
> Just for the comment as you said in cover letter that you are unsure
> about that.
>
>> comment "DVB-C (cable) frontends"
>> depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile
>> b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..bbf2955 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>> obj-$(CONFIG_DVB_A8293) += a8293.o
>> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>> obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>> b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..51c7927
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,825 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>> (default:off).");
>> +
>> +
>> +static int reg_mask[32] = {
>
> This should be static const.
>
>> + 0x00000001,
>> + 0x00000003,
>> + 0x00000007,
>> + 0x0000000f,
>> + 0x0000001f,
>> + 0x0000003f,
>> + 0x0000007f,
>> + 0x000000ff,
>> + 0x000001ff,
>> + 0x000003ff,
>> + 0x000007ff,
>> + 0x00000fff,
>> + 0x00001fff,
>> + 0x00003fff,
>> + 0x00007fff,
>> + 0x0000ffff,
>> + 0x0001ffff,
>> + 0x0003ffff,
>> + 0x0007ffff,
>> + 0x000fffff,
>> + 0x001fffff,
>> + 0x003fffff,
>> + 0x007fffff,
>> + 0x00ffffff,
>> + 0x01ffffff,
>> + 0x03ffffff,
>> + 0x07ffffff,
>> + 0x0fffffff,
>> + 0x1fffffff,
>> + 0x3fffffff,
>> + 0x7fffffff,
>> + 0xffffffff
>> +};
>> +
>> +struct rtl2832_reg_entry registers[] = {
>
> static const struct
>
>> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
>> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
>> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
>> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
>> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
>> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
>> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
>> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
>> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
>> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
>> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
>> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
>> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
>> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
>> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
>> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
>> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
>> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
>> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
>> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
>> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
>> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
>> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
>> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
>> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
>> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
>> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
>> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
>> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
>> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
>> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
>> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
>> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
>> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
>> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
>> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
>> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
>> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
>> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
>> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
>> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
>> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
>> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
>> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
>> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
>> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
>> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
>> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
>> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
>> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
>> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
>> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
>> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
>> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
>> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
>> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
>> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
>> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
>> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
>> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
>> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
>> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
>> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
>> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
>> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
>> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
>> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
>> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
>> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
>> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
>> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
>> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
>> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
>> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
>> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
>> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
>> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
>> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
>> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
>> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
>> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
>> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
>> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
>> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
>> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
>> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
>> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
>> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
>> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
>> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
>> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
>> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
>> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
>> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
>> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
>> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
>> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
>> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
>> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
>> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
>> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
>> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
>> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
>> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
>> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
>> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
>> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
>> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
>> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
>> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
>> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
>> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
>> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
>> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
>> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
>> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
>> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
>> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
>> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
>> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
>> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
>> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
>> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
>> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
>> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
>> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
>> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> + int ret;
>> + u8 buf[1+len];
>> + struct i2c_msg msg[1] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1+len,
>> + .buf = buf,
>> + }
>> + };
>> +
>> + buf[0] = reg;
>> + memcpy(&buf[1], val, len);
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 1);
>> + if (ret == 1) {
>> + ret = 0;
>> + } else {
>> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> + }
>> + return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> + int ret;
>> + struct i2c_msg msg[2] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1,
>> + .buf =®,
>> + }, {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = I2C_M_RD,
>> + .len = len,
>> + .buf = val,
>> + }
>> + };
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 2);
>> + if (ret == 2) {
>> + ret = 0;
>> + } else {
>> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> + }
>> +
>> + return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 val)
>> +{
>> + return rtl2832_wr_regs(priv, reg, page,&val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 *val)
>> +{
>> + return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> + int ret;
>> +
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u8 reading[4];
>> + u32 reading_tmp;
>> + int i;
>> +
>> + u8 len;
>> + u32 mask;
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb>> 3) + 1;
>> + mask = reg_mask[msb-lsb];
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i< len; i++)
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + *val = (reading_tmp>> lsb)& mask;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> + int ret, i;
>> + u8 len;
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u32 mask;
>> +
>> +
>> + u8 reading[4];
>> + u8 writing[4];
>> + u32 reading_tmp;
>> + u32 writing_tmp;
>> +
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb>> 3) + 1;
>> + mask = reg_mask[msb-lsb];
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i< len; i++)
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>> + writing_tmp |= ((val& mask)<< lsb);
>> +
>> +
>> + for (i = 0; i< len; i++)
>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> + int ret;
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s: enable=%d", __func__, enable);
>> +
>> + /* gate already open or close */
>> + if (priv->i2c_gate_state == enable)
>> + return 0;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>> 0x0));
>> +
>> + if (ret)
>> + goto err;
>
> Excessive newline between function call and error check.
>
>> +
>> + priv->i2c_gate_state = enable;
>> +
>> + return ret;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int i, ret;
>> +
>> + u8 en_bbin;
>> + u64 pset_iffreq;
>> +
>> + /* initialization values for the demodulator registers */
>> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
>> + {DVBT_AD_EN_REG, 0x1},
>> + {DVBT_AD_EN_REG1, 0x1},
>> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
>> + {DVBT_MGD_THD0, 0x10},
>> + {DVBT_MGD_THD1, 0x20},
>> + {DVBT_MGD_THD2, 0x20},
>> + {DVBT_MGD_THD3, 0x40},
>> + {DVBT_MGD_THD4, 0x22},
>> + {DVBT_MGD_THD5, 0x32},
>> + {DVBT_MGD_THD6, 0x37},
>> + {DVBT_MGD_THD7, 0x39},
>> + {DVBT_EN_BK_TRK, 0x0},
>> + {DVBT_EN_CACQ_NOTCH, 0x0},
>> + {DVBT_AD_AV_REF, 0x2a},
>> + {DVBT_REG_PI, 0x6},
>> + {DVBT_PIP_ON, 0x0},
>> + {DVBT_CDIV_PH0, 0x8},
>> + {DVBT_CDIV_PH1, 0x8},
>> + {DVBT_SCALE1_B92, 0x4},
>> + {DVBT_SCALE1_B93, 0xb0},
>> + {DVBT_SCALE1_BA7, 0x78},
>> + {DVBT_SCALE1_BA9, 0x28},
>> + {DVBT_SCALE1_BAA, 0x59},
>> + {DVBT_SCALE1_BAB, 0x83},
>> + {DVBT_SCALE1_BAC, 0xd4},
>> + {DVBT_SCALE1_BB0, 0x65},
>> + {DVBT_SCALE1_BB1, 0x43},
>> + {DVBT_KB_P1, 0x1},
>> + {DVBT_KB_P2, 0x4},
>> + {DVBT_KB_P3, 0x7},
>> + {DVBT_K1_CR_STEP12, 0xa},
>> + {DVBT_REG_GPE, 0x1},
>> + {DVBT_SERIAL, 0x0},
>> + {DVBT_CDIV_PH0, 0x9},
>> + {DVBT_CDIV_PH1, 0x9},
>> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
>> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
>> + {DVBT_TRK_KS_P2, 0x4},
>> + {DVBT_TRK_KS_I2, 0x7},
>> + {DVBT_TR_THD_SET2, 0x6},
>> + {DVBT_TRK_KC_I2, 0x5},
>> + {DVBT_CR_THD_SET2, 0x1},
>> + {DVBT_SPEC_INV, 0x0},
>> + {DVBT_DAGC_TRG_VAL, 0x5a},
>> + {DVBT_AGC_TARG_VAL_0, 0x0},
>> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
>> + {DVBT_AAGC_LOOP_GAIN, 0x16},
>> + {DVBT_LOOP_GAIN2_3_0, 0x6},
>> + {DVBT_LOOP_GAIN2_4, 0x1},
>> + {DVBT_LOOP_GAIN3, 0x16},
>> + {DVBT_VTOP1, 0x35},
>> + {DVBT_VTOP2, 0x21},
>> + {DVBT_VTOP3, 0x21},
>> + {DVBT_KRF1, 0x0},
>> + {DVBT_KRF2, 0x40},
>> + {DVBT_KRF3, 0x10},
>> + {DVBT_KRF4, 0x10},
>> + {DVBT_IF_AGC_MIN, 0x80},
>> + {DVBT_IF_AGC_MAX, 0x7f},
>> + {DVBT_RF_AGC_MIN, 0x80},
>> + {DVBT_RF_AGC_MAX, 0x7f},
>> + {DVBT_POLAR_RF_AGC, 0x0},
>> + {DVBT_POLAR_IF_AGC, 0x0},
>> + {DVBT_AD7_SETTING, 0xe9bf},
>> + {DVBT_EN_GI_PGA, 0x0},
>> + {DVBT_THD_LOCK_UP, 0x0},
>> + {DVBT_THD_LOCK_DW, 0x0},
>> + {DVBT_THD_UP1, 0x11},
>> + {DVBT_THD_DW1, 0xef},
>> + {DVBT_INTER_CNT_LEN, 0xc},
>> + {DVBT_GI_PGA_STATE, 0x0},
>> + {DVBT_EN_AGC_PGA, 0x1},
>> + {DVBT_IF_AGC_MAN, 0x0},
>> + };
>> +
>> +
>> + dbg("%s", __func__);
>> +
>> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> + /*
>> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> + * / CrystalFreqHz)
>> + */
>> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> + pset_iffreq *= 0x400000;
>> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> + pset_iffreq = pset_iffreq& 0x3fffff;
>> +
>> +
>> +
>> + for (i = 0; i< ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> + rtl2832_initial_regs[i].value);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* if frequency settings */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> + if (ret)
>> + goto err;
>> +
>> + priv->sleeping = false;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + priv->sleeping = true;
>> + return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> + struct dvb_frontend_tune_settings *s)
>> +{
>> + dbg("%s", __func__);
>> + s->min_delay_ms = 1000;
>> + s->step_size = fe->ops.info.frequency_stepsize * 2;
>> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>> + int ret, i, j;
>> + u64 bw_mode, num, num2;
>> + u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> + static u8 bw_params[3][32] = {
>> + /* 6 MHz bandwidth */
>> + {
>> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> + 0x19, 0xe0,
>> + },
>> +
>> + /* 7 MHz bandwidth */
>> + {
>> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> + 0x19, 0x10,
>> + },
>> +
>> + /* 8 MHz bandwidth */
>> + {
>> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> + 0x19, 0xe0,
>> + },
>> + };
>> +
>> +
>> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> + c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> + /* program tuner */
>> + if (fe->ops.tuner_ops.set_params)
>> + fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> + switch (c->bandwidth_hz) {
>> + case 6000000:
>> + i = 0;
>> + bw_mode = 48000000;
>> + break;
>> + case 7000000:
>> + i = 1;
>> + bw_mode = 56000000;
>> + break;
>> + case 8000000:
>> + i = 2;
>> + bw_mode = 64000000;
>> + break;
>> + default:
>> + dbg("invalid bandwidth");
>> + return -EINVAL;
>> + }
>> +
>> + for (j = 0; j< sizeof(bw_params[j]); j++) {
>> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* calculate and set resample ratio
>> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> + * / ConstWithBandwidthMode)
>> + */
>> + num = priv->cfg.xtal * 7;
>> + num *= 0x400000;
>> + num = div_u64(num, bw_mode);
>> + resamp_ratio = num& 0x3ffffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> + if (ret)
>> + goto err;
>> +
>> + /* calculate and set cfreq off ratio
>> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> + * / (CrystalFreqHz * 7))
>> + */
>> + num = bw_mode<< 20;
>> + num2 = priv->cfg.xtal * 7;
>> + num = div_u64(num, num2);
>> + num = -num;
>> + cfreq_off_ratio = num& 0xfffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>> cfreq_off_ratio);
>> + if (ret)
>> + goto err;
>> +
>> +
>> + /* soft reset */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>> *status)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int ret;
>> + u32 tmp;
>> + *status = 0;
>> +
>> +
>> + dbg("%s", __func__);
>> + if (priv->sleeping)
>> + return 0;
>> +
>> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>> + if (ret)
>> + goto err;
>> +
>> + if (tmp == 11) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> + }
>> + /* TODO find out if this is also true for rtl2832? */
>> + /*else if (tmp == 10) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI;
>> + }*/
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> + *snr = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> + *ber = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> + *ucblocks = 0;
>> + return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>> *strength)
>> +{
>> + *strength = 0;
>> + return 0;
>> +}
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c)
>> +{
>> + struct rtl2832_priv *priv = NULL;
>> + int ret = 0;
>> + u8 tmp;
>> +
>> + dbg("%s", __func__);
>> +
>> + /* allocate memory for the internal state */
>> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> + if (priv == NULL)
>> + goto err;
>> +
>> + /* setup the priv */
>> + priv->i2c = i2c;
>> + priv->tuner = cfg->tuner;
>> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> + /* check if the demod is there */
>> + ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>> + if (ret)
>> + goto err;
>> +
>> + /* create dvb_frontend */
>> + memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> + priv->fe.demodulator_priv = priv;
>> +
>> + /* TODO implement sleep mode */
>> + priv->sleeping = true;
>> +
>> + return&priv->fe;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + kfree(priv);
>> + return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> + .delsys = { SYS_DVBT },
>> + .info = {
>> + .name = "Realtek RTL2832 (DVB-T)",
>> + .frequency_min = 174000000,
>> + .frequency_max = 862000000,
>> + .frequency_stepsize = 166667,
>> + .caps = FE_CAN_FEC_1_2 |
>> + FE_CAN_FEC_2_3 |
>> + FE_CAN_FEC_3_4 |
>> + FE_CAN_FEC_5_6 |
>> + FE_CAN_FEC_7_8 |
>> + FE_CAN_FEC_AUTO |
>> + FE_CAN_QPSK |
>> + FE_CAN_QAM_16 |
>> + FE_CAN_QAM_64 |
>> + FE_CAN_QAM_AUTO |
>> + FE_CAN_TRANSMISSION_MODE_AUTO |
>> + FE_CAN_GUARD_INTERVAL_AUTO |
>> + FE_CAN_HIERARCHY_AUTO |
>> + FE_CAN_RECOVER |
>> + FE_CAN_MUTE_TS
>> + },
>> +
>> + .release = rtl2832_release,
>> +
>> + .init = rtl2832_init,
>> + .sleep = rtl2832_sleep,
>> +
>> + .get_tune_settings = rtl2832_get_tune_settings,
>> +
>> + .set_frontend = rtl2832_set_frontend,
>> +
>> + .read_status = rtl2832_read_status,
>> + .read_snr = rtl2832_read_snr,
>> + .read_ber = rtl2832_read_ber,
>> + .read_ucblocks = rtl2832_read_ucblocks,
>> + .read_signal_strength = rtl2832_read_signal_strength,
>> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.4");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>> b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include<linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> + /*
>> + * Demodulator I2C address.
>> + */
>> + u8 i2c_addr;
>> +
>> + /*
>> + * Xtal frequency.
>> + * Hz
>> + * 4000000, 16000000, 25000000, 28800000
>> + */
>> + u32 xtal;
>> +
>> + /*
>> + * IFs for all used modes.
>> + * Hz
>> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> + */
>> + u32 if_dvbt;
>> +
>> + /*
>> + */
>> + u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> + (defined(CONFIG_DVB_RTL2832_MODULE)&& defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> + struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *config,
>> + struct i2c_adapter *i2c
>> +)
>> +{
>> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> + return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..3e52674
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,258 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> + if (rtl2832_debug) \
>> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>
> ERROR: Macros with complex values should be enclosed in parenthesis
> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
> +#define dbg(f, arg...) \
> + if (rtl2832_debug) \
> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>
>> +#undef err
>> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ##
>> arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>> ## arg)
>> +
>> +struct rtl2832_priv {
>> + struct i2c_adapter *i2c;
>> + struct dvb_frontend fe;
>> + struct rtl2832_config cfg;
>> +
>> + bool i2c_gate_state;
>> + bool sleeping;
>> +
>> + u8 tuner;
>> + u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> + u8 page;
>> + u8 start_address;
>> + u8 msb;
>> + u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> + int reg;
>
> As this reg is enum I wonder if it is possible to use enum as a type
> (enum reg)? Still I am not sure about it and I dont like to test it :)
>
>> + u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> + DVBT_SOFT_RST,
>> + DVBT_IIC_REPEAT,
>> + DVBT_TR_WAIT_MIN_8K,
>> + DVBT_RSD_BER_FAIL_VAL,
>> + DVBT_EN_BK_TRK,
>> + DVBT_REG_PI,
>> + DVBT_REG_PFREQ_1_0,
>> + DVBT_PD_DA8,
>> + DVBT_LOCK_TH,
>> + DVBT_BER_PASS_SCAL,
>> + DVBT_CE_FFSM_BYPASS,
>> + DVBT_ALPHAIIR_N,
>> + DVBT_ALPHAIIR_DIF,
>> + DVBT_EN_TRK_SPAN,
>> + DVBT_LOCK_TH_LEN,
>> + DVBT_CCI_THRE,
>> + DVBT_CCI_MON_SCAL,
>> + DVBT_CCI_M0,
>> + DVBT_CCI_M1,
>> + DVBT_CCI_M2,
>> + DVBT_CCI_M3,
>> + DVBT_SPEC_INIT_0,
>> + DVBT_SPEC_INIT_1,
>> + DVBT_SPEC_INIT_2,
>> + DVBT_AD_EN_REG,
>> + DVBT_AD_EN_REG1,
>> + DVBT_EN_BBIN,
>> + DVBT_MGD_THD0,
>> + DVBT_MGD_THD1,
>> + DVBT_MGD_THD2,
>> + DVBT_MGD_THD3,
>> + DVBT_MGD_THD4,
>> + DVBT_MGD_THD5,
>> + DVBT_MGD_THD6,
>> + DVBT_MGD_THD7,
>> + DVBT_EN_CACQ_NOTCH,
>> + DVBT_AD_AV_REF,
>> + DVBT_PIP_ON,
>> + DVBT_SCALE1_B92,
>> + DVBT_SCALE1_B93,
>> + DVBT_SCALE1_BA7,
>> + DVBT_SCALE1_BA9,
>> + DVBT_SCALE1_BAA,
>> + DVBT_SCALE1_BAB,
>> + DVBT_SCALE1_BAC,
>> + DVBT_SCALE1_BB0,
>> + DVBT_SCALE1_BB1,
>> + DVBT_KB_P1,
>> + DVBT_KB_P2,
>> + DVBT_KB_P3,
>> + DVBT_OPT_ADC_IQ,
>> + DVBT_AD_AVI,
>> + DVBT_AD_AVQ,
>> + DVBT_K1_CR_STEP12,
>> + DVBT_TRK_KS_P2,
>> + DVBT_TRK_KS_I2,
>> + DVBT_TR_THD_SET2,
>> + DVBT_TRK_KC_P2,
>> + DVBT_TRK_KC_I2,
>> + DVBT_CR_THD_SET2,
>> + DVBT_PSET_IFFREQ,
>> + DVBT_SPEC_INV,
>> + DVBT_BW_INDEX,
>> + DVBT_RSAMP_RATIO,
>> + DVBT_CFREQ_OFF_RATIO,
>> + DVBT_FSM_STAGE,
>> + DVBT_RX_CONSTEL,
>> + DVBT_RX_HIER,
>> + DVBT_RX_C_RATE_LP,
>> + DVBT_RX_C_RATE_HP,
>> + DVBT_GI_IDX,
>> + DVBT_FFT_MODE_IDX,
>> + DVBT_RSD_BER_EST,
>> + DVBT_CE_EST_EVM,
>> + DVBT_RF_AGC_VAL,
>> + DVBT_IF_AGC_VAL,
>> + DVBT_DAGC_VAL,
>> + DVBT_SFREQ_OFF,
>> + DVBT_CFREQ_OFF,
>> + DVBT_POLAR_RF_AGC,
>> + DVBT_POLAR_IF_AGC,
>> + DVBT_AAGC_HOLD,
>> + DVBT_EN_RF_AGC,
>> + DVBT_EN_IF_AGC,
>> + DVBT_IF_AGC_MIN,
>> + DVBT_IF_AGC_MAX,
>> + DVBT_RF_AGC_MIN,
>> + DVBT_RF_AGC_MAX,
>> + DVBT_IF_AGC_MAN,
>> + DVBT_IF_AGC_MAN_VAL,
>> + DVBT_RF_AGC_MAN,
>> + DVBT_RF_AGC_MAN_VAL,
>> + DVBT_DAGC_TRG_VAL,
>> + DVBT_AGC_TARG_VAL,
>> + DVBT_LOOP_GAIN_3_0,
>> + DVBT_LOOP_GAIN_4,
>> + DVBT_VTOP,
>> + DVBT_KRF,
>> + DVBT_AGC_TARG_VAL_0,
>> + DVBT_AGC_TARG_VAL_8_1,
>> + DVBT_AAGC_LOOP_GAIN,
>> + DVBT_LOOP_GAIN2_3_0,
>> + DVBT_LOOP_GAIN2_4,
>> + DVBT_LOOP_GAIN3,
>> + DVBT_VTOP1,
>> + DVBT_VTOP2,
>> + DVBT_VTOP3,
>> + DVBT_KRF1,
>> + DVBT_KRF2,
>> + DVBT_KRF3,
>> + DVBT_KRF4,
>> + DVBT_EN_GI_PGA,
>> + DVBT_THD_LOCK_UP,
>> + DVBT_THD_LOCK_DW,
>> + DVBT_THD_UP1,
>> + DVBT_THD_DW1,
>> + DVBT_INTER_CNT_LEN,
>> + DVBT_GI_PGA_STATE,
>> + DVBT_EN_AGC_PGA,
>> + DVBT_CKOUTPAR,
>> + DVBT_CKOUT_PWR,
>> + DVBT_SYNC_DUR,
>> + DVBT_ERR_DUR,
>> + DVBT_SYNC_LVL,
>> + DVBT_ERR_LVL,
>> + DVBT_VAL_LVL,
>> + DVBT_SERIAL,
>> + DVBT_SER_LSB,
>> + DVBT_CDIV_PH0,
>> + DVBT_CDIV_PH1,
>> + DVBT_MPEG_IO_OPT_2_2,
>> + DVBT_MPEG_IO_OPT_1_0,
>> + DVBT_CKOUTPAR_PIP,
>> + DVBT_CKOUT_PWR_PIP,
>> + DVBT_SYNC_LVL_PIP,
>> + DVBT_ERR_LVL_PIP,
>> + DVBT_VAL_LVL_PIP,
>> + DVBT_CKOUTPAR_PID,
>> + DVBT_CKOUT_PWR_PID,
>> + DVBT_SYNC_LVL_PID,
>> + DVBT_ERR_LVL_PID,
>> + DVBT_VAL_LVL_PID,
>> + DVBT_SM_PASS,
>> + DVBT_UPDATE_REG_2,
>> + DVBT_BTHD_P3,
>> + DVBT_BTHD_D3,
>> + DVBT_FUNC4_REG0,
>> + DVBT_FUNC4_REG1,
>> + DVBT_FUNC4_REG2,
>> + DVBT_FUNC4_REG3,
>> + DVBT_FUNC4_REG4,
>> + DVBT_FUNC4_REG5,
>> + DVBT_FUNC4_REG6,
>> + DVBT_FUNC4_REG7,
>> + DVBT_FUNC4_REG8,
>> + DVBT_FUNC4_REG9,
>> + DVBT_FUNC4_REG10,
>> + DVBT_FUNC5_REG0,
>> + DVBT_FUNC5_REG1,
>> + DVBT_FUNC5_REG2,
>> + DVBT_FUNC5_REG3,
>> + DVBT_FUNC5_REG4,
>> + DVBT_FUNC5_REG5,
>> + DVBT_FUNC5_REG6,
>> + DVBT_FUNC5_REG7,
>> + DVBT_FUNC5_REG8,
>> + DVBT_FUNC5_REG9,
>> + DVBT_FUNC5_REG10,
>> + DVBT_FUNC5_REG11,
>> + DVBT_FUNC5_REG12,
>> + DVBT_FUNC5_REG13,
>> + DVBT_FUNC5_REG14,
>> + DVBT_FUNC5_REG15,
>> + DVBT_FUNC5_REG16,
>> + DVBT_FUNC5_REG17,
>> + DVBT_FUNC5_REG18,
>> + DVBT_AD7_SETTING,
>> + DVBT_RSSI_R,
>> + DVBT_ACI_DET_IND,
>> + DVBT_REG_MON,
>> + DVBT_REG_MONSEL,
>> + DVBT_REG_GPE,
>> + DVBT_REG_GPO,
>> + DVBT_REG_4MSEL,
>> + DVBT_TEST_REG_1,
>> + DVBT_TEST_REG_2,
>> + DVBT_TEST_REG_3,
>> + DVBT_TEST_REG_4,
>> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
>
>
rtl2832.c.diff:
- static int -> static const
- struct -> static const struct
- newline between function call and error check -> […]
- 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
(/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
[…]
Use one space around (on each side of) most binary and ternary operators,
such as any of these:
= + - < > * / % | & ^ <= >= == != ? :
[…]
grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
+ len = (msb >> 3) + 1;
+ reading_tmp |= reading[i] << ((len-1-i)*8);
+ *val = (reading_tmp >> lsb) & mask;
+ len = (msb >> 3) + 1;
+ reading_tmp |= reading[i] << ((len-1-i)*8);
+ writing_tmp = reading_tmp & ~(mask << lsb);
+ writing_tmp |= ((val & mask) << lsb);
+ writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+ num = bw_mode << 20;
Bitshift operators seems to be OK.
Something else?
- 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
Compared to 'rtl2830_priv.h' seems to be OK.
./checkpatch.pl --no-tree
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: Missing Signed-off-by: line(s)
total: 1 errors, 0 warnings, 1177 lines checked
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review. If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
How do you produce this error:
"ERROR: Macros with complex values should be enclosed in parenthesis…"?
regards,
poma
[-- Attachment #2: rtl2832.c.diff --]
[-- Type: text/x-patch, Size: 705 bytes --]
--- rtl2832.c.orig 2012-05-17 20:38:39.916496007 +0200
+++ rtl2832.c 2012-05-17 19:56:15.277706951 +0200
@@ -26,7 +26,7 @@
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
-static int reg_mask[32] = {
+static const reg_mask[32] = {
0x00000001,
0x00000003,
0x00000007,
@@ -61,7 +61,7 @@
0xffffffff
};
-struct rtl2832_reg_entry registers[] = {
+static const struct rtl2832_reg_entry registers[] = {
[DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
[DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
[DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
@@ -403,7 +403,6 @@
return 0;
ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
-
if (ret)
goto err;
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 20:27 ` poma
@ 2012-05-17 20:41 ` Antti Palosaari
2012-05-17 20:45 ` Thomas Mair
0 siblings, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 20:41 UTC (permalink / raw)
To: poma; +Cc: Thomas Mair, linux-media
On 17.05.2012 23:27, poma wrote:
> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>> Moikka Thomas,
>>
>> Here is the review. See comments below.
>>
>> And conclusion is that it is ready for the Kernel merge. I did not see
>> any big functiuonality problems - only some small issues that are likely
>> considered as a coding style etc. Feel free to fix those and sent new
>> patc serie or just new patch top of that.
>>
>> Reviewed-by: Antti Palosaari<crope@iki.fi>
[...]
> rtl2832.c.diff:
> - static int -> static const
> - struct -> static const struct
> - newline between function call and error check -> […]
> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
> […]
> Use one space around (on each side of) most binary and ternary operators,
> such as any of these:
>
> = + -< > * / % |& ^<=>= == != ? :
>
> […]
>
> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
> + len = (msb>> 3) + 1;
> + reading_tmp |= reading[i]<< ((len-1-i)*8);
> + *val = (reading_tmp>> lsb)& mask;
> + len = (msb>> 3) + 1;
> + reading_tmp |= reading[i]<< ((len-1-i)*8);
> + writing_tmp = reading_tmp& ~(mask<< lsb);
> + writing_tmp |= ((val& mask)<< lsb);
> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
> + num = bw_mode<< 20;
>
> Bitshift operators seems to be OK.
> Something else?
(len-1-i)*8
> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
> Compared to 'rtl2830_priv.h' seems to be OK.
>
> ./checkpatch.pl --no-tree
> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
> ERROR: Missing Signed-off-by: line(s)
>
> total: 1 errors, 0 warnings, 1177 lines checked
>
> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
> problems, please review. If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
>
> How do you produce this error:
> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
Just running checkpatch.pl --file foo
And it is ERROR which means it *must* be corrected.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
2012-05-17 14:47 ` Antti Palosaari
@ 2012-05-17 20:43 ` poma
0 siblings, 0 replies; 53+ messages in thread
From: poma @ 2012-05-17 20:43 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
On 05/17/2012 04:47 PM, Antti Palosaari wrote:
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>
> Nacked.
> Better PID definition is required.
>
>> ---
>> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
>> drivers/media/dvb/dvb-usb/rtl28xxu.c | 11 ++++++++++-
>> 2 files changed, 11 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> index fd37be0..b0a86e9 100644
>> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> @@ -135,6 +135,7 @@
>> #define USB_PID_GENIUS_TVGO_DVB_T03 0x4012
>> #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
>> #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
>> +#define USB_PID_GTEK 0xb803
>
> You must give better name for the device. Vendor name is not enough as
> many vendors has surely more than one device model.
>
> Correct PID is something like USB_PID_GTEK_LIFEVIEW_LV5TDLX
>
Precisely - USB_PID_DELOCK_USB2_DVBT according to the device:
http://www.delock.de/produkte/G_61744/merkmale.html
regardless of what's in '/usr/share/hwdata/usb.ids'
;)
>> #define USB_PID_INTEL_CE9500 0x9500
>> #define USB_PID_ITETECH_IT9135 0x9135
>> #define USB_PID_ITETECH_IT9135_9005 0x9005
>> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> b/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> index 6817ef7..9056d28 100644
>> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> @@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
>> RTL2831U_14AA_0160,
>> RTL2831U_14AA_0161,
>> RTL2832U_0CCD_00A9,
>> + RTL2832U_1F4D_B803,
>> };
>>
>> static struct usb_device_id rtl28xxu_table[] = {
>> @@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
>> /* RTL2832U */
>> [RTL2832U_0CCD_00A9] = {
>> USB_DEVICE(USB_VID_TERRATEC,
>> USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
>> + [RTL2832U_1F4D_B803] = {
>> + USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
>> {} /* terminating entry */
>> };
>>
>> @@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties
>> rtl28xxu_properties[] = {
>>
>> .i2c_algo =&rtl28xxu_i2c_algo,
>>
>> - .num_device_descs = 1,
>> + .num_device_descs = 2,
>> .devices = {
>> {
>> .name = "Terratec Cinergy T Stick Black",
>> @@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties
>> rtl28xxu_properties[] = {
>> &rtl28xxu_table[RTL2832U_0CCD_00A9],
>> },
>> },
>> + {
>> + .name = "G-Tek Electronics Group Lifeview LV5TDLX
>> DVB-T [RTL2832U]",
>> + .warm_ids = {
>> + &rtl28xxu_table[RTL2832U_1F4D_B803],
>> + },
>> + },
>> }
>> },
>>
>
>
regards,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 20:41 ` Antti Palosaari
@ 2012-05-17 20:45 ` Thomas Mair
2012-05-17 20:49 ` Antti Palosaari
2012-05-17 21:08 ` poma
0 siblings, 2 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-17 20:45 UTC (permalink / raw)
To: Antti Palosaari; +Cc: poma, linux-media
On 17.05.2012 22:41, Antti Palosaari wrote:
> On 17.05.2012 23:27, poma wrote:
>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>> Moikka Thomas,
>>>
>>> Here is the review. See comments below.
>>>
>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>> any big functiuonality problems - only some small issues that are likely
>>> considered as a coding style etc. Feel free to fix those and sent new
>>> patc serie or just new patch top of that.
>>>
>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>
> [...]
>
>> rtl2832.c.diff:
>> - static int -> static const
>> - struct -> static const struct
>> - newline between function call and error check -> […]
>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>> […]
>> Use one space around (on each side of) most binary and ternary operators,
>> such as any of these:
>>
>> = + -< > * / % |& ^<=>= == != ? :
>>
>> […]
>>
>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>> + len = (msb>> 3) + 1;
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>> + *val = (reading_tmp>> lsb)& mask;
>> + len = (msb>> 3) + 1;
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>> + writing_tmp |= ((val& mask)<< lsb);
>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>> + num = bw_mode<< 20;
>>
>> Bitshift operators seems to be OK.
>> Something else?
>
> (len-1-i)*8
I almost have a new corrected version of the patch series ready, fixing this issues and the
other ones you mentioned.
>
>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>> Compared to 'rtl2830_priv.h' seems to be OK.
>>
>> ./checkpatch.pl --no-tree
>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>> ERROR: Missing Signed-off-by: line(s)
>>
>> total: 1 errors, 0 warnings, 1177 lines checked
>>
>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>> problems, please review. If any of these errors
>> are false positives report them to the maintainer, see
>> CHECKPATCH in MAINTAINERS.
>>
>> How do you produce this error:
>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>
> Just running checkpatch.pl --file foo
>
For me checkpath.pl also does not report the error you reported. It does seem
strange to me, as the makros are the same as in rtl2830_priv.h
Regards
Thomas
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 20:45 ` Thomas Mair
@ 2012-05-17 20:49 ` Antti Palosaari
2012-05-17 21:03 ` poma
2012-05-17 21:08 ` poma
1 sibling, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-05-17 20:49 UTC (permalink / raw)
To: Thomas Mair; +Cc: poma, linux-media
On 17.05.2012 23:45, Thomas Mair wrote:
> On 17.05.2012 22:41, Antti Palosaari wrote:
>> On 17.05.2012 23:27, poma wrote:
>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>> Moikka Thomas,
>>>>
>>>> Here is the review. See comments below.
>>>>
>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>> any big functiuonality problems - only some small issues that are likely
>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>> patc serie or just new patch top of that.
>>>>
>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>
>> [...]
>>
>>> rtl2832.c.diff:
>>> - static int -> static const
>>> - struct -> static const struct
>>> - newline between function call and error check -> […]
>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>> […]
>>> Use one space around (on each side of) most binary and ternary operators,
>>> such as any of these:
>>>
>>> = + -< > * / % |& ^<=>= == != ? :
>>>
>>> […]
>>>
>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> + len = (msb>> 3) + 1;
>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>> + *val = (reading_tmp>> lsb)& mask;
>>> + len = (msb>> 3) + 1;
>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>> + writing_tmp |= ((val& mask)<< lsb);
>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>> + num = bw_mode<< 20;
>>>
>>> Bitshift operators seems to be OK.
>>> Something else?
>>
>> (len-1-i)*8
> I almost have a new corrected version of the patch series ready, fixing this issues and the
> other ones you mentioned.
>>
>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>
>>> ./checkpatch.pl --no-tree
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> ERROR: Missing Signed-off-by: line(s)
>>>
>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>> problems, please review. If any of these errors
>>> are false positives report them to the maintainer, see
>>> CHECKPATCH in MAINTAINERS.
>>>
>>> How do you produce this error:
>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>
>> Just running checkpatch.pl --file foo
>>
>
> For me checkpath.pl also does not report the error you reported. It does seem
> strange to me, as the makros are the same as in rtl2830_priv.h
Are you using some old version of checkpatch.pl ?
Mine is:
commit c06a9ebdb7a4f4823d4225fe789d8c20a1d534eb
Author: Joe Perches <joe@perches.com>
Date: Mon Apr 16 13:35:11 2012 -0600
If you are using older version then upgrade. checkpatch.pl is developed
very rapidly and there is all the time new checks.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 20:49 ` Antti Palosaari
@ 2012-05-17 21:03 ` poma
0 siblings, 0 replies; 53+ messages in thread
From: poma @ 2012-05-17 21:03 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
On 05/17/2012 10:49 PM, Antti Palosaari wrote:
> On 17.05.2012 23:45, Thomas Mair wrote:
>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>> On 17.05.2012 23:27, poma wrote:
>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>> Moikka Thomas,
>>>>>
>>>>> Here is the review. See comments below.
>>>>>
>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>> any big functiuonality problems - only some small issues that are
>>>>> likely
>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>> patc serie or just new patch top of that.
>>>>>
>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>
>>> [...]
>>>
>>>> rtl2832.c.diff:
>>>> - static int -> static const
>>>> - struct -> static const struct
>>>> - newline between function call and error check -> […]
>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>> […]
>>>> Use one space around (on each side of) most binary and ternary
>>>> operators,
>>>> such as any of these:
>>>>
>>>> = + -< > * / % |& ^<=>= == != ? :
>>>>
>>>> […]
>>>>
>>>> grep '>>\|<<'
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> + len = (msb>> 3) + 1;
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>> + *val = (reading_tmp>> lsb)& mask;
>>>> + len = (msb>> 3) + 1;
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>>> + writing_tmp |= ((val& mask)<< lsb);
>>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>>> + num = bw_mode<< 20;
>>>>
>>>> Bitshift operators seems to be OK.
>>>> Something else?
>>>
>>> (len-1-i)*8
>> I almost have a new corrected version of the patch series ready,
>> fixing this issues and the
>> other ones you mentioned.
>>>
>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>
>>>> ./checkpatch.pl --no-tree
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> ERROR: Missing Signed-off-by: line(s)
>>>>
>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>> problems, please review. If any of these errors
>>>> are false positives report them to the maintainer, see
>>>> CHECKPATCH in MAINTAINERS.
>>>>
>>>> How do you produce this error:
>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>
>>> Just running checkpatch.pl --file foo
>>>
>>
>> For me checkpath.pl also does not report the error you reported. It
>> does seem
>> strange to me, as the makros are the same as in rtl2830_priv.h
>
> Are you using some old version of checkpatch.pl ?
> Mine is:
> commit c06a9ebdb7a4f4823d4225fe789d8c20a1d534eb
> Author: Joe Perches <joe@perches.com>
> Date: Mon Apr 16 13:35:11 2012 -0600
>
> If you are using older version then upgrade. checkpatch.pl is developed
> very rapidly and there is all the time new checks.
>
> regards
> Antti
https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl
./checkpatch.pl --version
Usage: checkpatch.pl [OPTION]... [FILE]...
Version: 0.32
Options:
-q, --quiet quiet
--no-tree run without a kernel tree
--no-signoff do not check for 'Signed-off-by' line
--patch treat FILE as patchfile (default)
--emacs emacs compile window format
--terse one line per report
-f, --file treat FILE as regular source file
--subjective, --strict enable more subjective tests
--ignore TYPE(,TYPE2...) ignore various comma separated message types
--show-types show the message "types" in the output
--root=PATH PATH to the kernel tree root
--no-summary suppress the per-file summary
--mailback only produce a report in case of
warnings/errors
--summary-file include the filename in summary
--debug KEY=[0|1] turn on/off debugging of KEY, where KEY is
one of
'values', 'possible', 'type', and 'attr'
(default
is all off)
--test-only=WORD report only warnings/errors containing WORD
literally
-h, --help, --version display this help and exit
When FILE is - read standard input.
./checkpatch.pl --no-tree
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: Macros with complex values should be enclosed in parenthesis
#977: FILE: drivers/media/dvb/frontends/rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+ if (rtl2832_debug) \
+ printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
ERROR: Missing Signed-off-by: line(s)
total: 2 errors, 0 warnings, 1177 lines checked
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review.
If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
Bingo!
./checkpatch.pl --no-tree --file
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: trailing whitespace
#8: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:8:
+ $
ERROR: trailing whitespace
#18: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:18:
+ $
ERROR: trailing whitespace
#30: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:30:
+ $
total: 3 errors, 0 warnings, 1205 lines checked
NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
scripts/cleanfile
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review.
If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
regards,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 20:45 ` Thomas Mair
2012-05-17 20:49 ` Antti Palosaari
@ 2012-05-17 21:08 ` poma
2012-05-17 21:19 ` Thomas Mair
1 sibling, 1 reply; 53+ messages in thread
From: poma @ 2012-05-17 21:08 UTC (permalink / raw)
To: Thomas Mair, linux-media
On 05/17/2012 10:45 PM, Thomas Mair wrote:
> On 17.05.2012 22:41, Antti Palosaari wrote:
>> On 17.05.2012 23:27, poma wrote:
>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>> Moikka Thomas,
>>>>
>>>> Here is the review. See comments below.
>>>>
>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>> any big functiuonality problems - only some small issues that are likely
>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>> patc serie or just new patch top of that.
>>>>
>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>
>> [...]
>>
>>> rtl2832.c.diff:
>>> - static int -> static const
>>> - struct -> static const struct
>>> - newline between function call and error check -> […]
>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>> […]
>>> Use one space around (on each side of) most binary and ternary operators,
>>> such as any of these:
>>>
>>> = + -< > * / % |& ^<=>= == != ? :
>>>
>>> […]
>>>
>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> + len = (msb>> 3) + 1;
>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>> + *val = (reading_tmp>> lsb)& mask;
>>> + len = (msb>> 3) + 1;
>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>> + writing_tmp |= ((val& mask)<< lsb);
>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>> + num = bw_mode<< 20;
>>>
>>> Bitshift operators seems to be OK.
>>> Something else?
>>
>> (len-1-i)*8
> I almost have a new corrected version of the patch series ready, fixing this issues and the
> other ones you mentioned.
>>
>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>
>>> ./checkpatch.pl --no-tree
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> ERROR: Missing Signed-off-by: line(s)
>>>
>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>> problems, please review. If any of these errors
>>> are false positives report them to the maintainer, see
>>> CHECKPATCH in MAINTAINERS.
>>>
>>> How do you produce this error:
>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>
>> Just running checkpatch.pl --file foo
>>
>
> For me checkpath.pl also does not report the error you reported. It does seem
> strange to me, as the makros are the same as in rtl2830_priv.h
>
> Regards
> Thomas
Yeah, 'rtl2830_priv.h' is the same.
Fu… me, now I don't know too!
:)
cheers,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 21:08 ` poma
@ 2012-05-17 21:19 ` Thomas Mair
2012-05-17 21:30 ` poma
0 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-17 21:19 UTC (permalink / raw)
To: poma; +Cc: linux-media
On 17.05.2012 23:08, poma wrote:
> On 05/17/2012 10:45 PM, Thomas Mair wrote:
>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>> On 17.05.2012 23:27, poma wrote:
>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>> Moikka Thomas,
>>>>>
>>>>> Here is the review. See comments below.
>>>>>
>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>> any big functiuonality problems - only some small issues that are likely
>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>> patc serie or just new patch top of that.
>>>>>
>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>
>>> [...]
>>>
>>>> rtl2832.c.diff:
>>>> - static int -> static const
>>>> - struct -> static const struct
>>>> - newline between function call and error check -> […]
>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>> […]
>>>> Use one space around (on each side of) most binary and ternary operators,
>>>> such as any of these:
>>>>
>>>> = + -< > * / % |& ^<=>= == != ? :
>>>>
>>>> […]
>>>>
>>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> + len = (msb>> 3) + 1;
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>> + *val = (reading_tmp>> lsb)& mask;
>>>> + len = (msb>> 3) + 1;
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>>> + writing_tmp |= ((val& mask)<< lsb);
>>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>>> + num = bw_mode<< 20;
>>>>
>>>> Bitshift operators seems to be OK.
>>>> Something else?
>>>
>>> (len-1-i)*8
>> I almost have a new corrected version of the patch series ready, fixing this issues and the
>> other ones you mentioned.
>>>
>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>
>>>> ./checkpatch.pl --no-tree
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> ERROR: Missing Signed-off-by: line(s)
>>>>
>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>> problems, please review. If any of these errors
>>>> are false positives report them to the maintainer, see
>>>> CHECKPATCH in MAINTAINERS.
>>>>
>>>> How do you produce this error:
>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>
>>> Just running checkpatch.pl --file foo
>>>
>>
>> For me checkpath.pl also does not report the error you reported. It does seem
>> strange to me, as the makros are the same as in rtl2830_priv.h
>>
>> Regards
>> Thomas
>
> Yeah, 'rtl2830_priv.h' is the same.
> Fu… me, now I don't know too!
> :)
>
> cheers,
> poma
Ok. I will then check the patches with the new checkpatch version tomorrow as I need some
rest now ;) It should not be too difficult to remove the errors.
Regards
Thomas
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 21:19 ` Thomas Mair
@ 2012-05-17 21:30 ` poma
0 siblings, 0 replies; 53+ messages in thread
From: poma @ 2012-05-17 21:30 UTC (permalink / raw)
To: Thomas Mair, linux-media
On 05/17/2012 11:19 PM, Thomas Mair wrote:
> On 17.05.2012 23:08, poma wrote:
>> On 05/17/2012 10:45 PM, Thomas Mair wrote:
>>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>>> On 17.05.2012 23:27, poma wrote:
>>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>>> Moikka Thomas,
>>>>>>
>>>>>> Here is the review. See comments below.
>>>>>>
>>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>>> any big functiuonality problems - only some small issues that are likely
>>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>>> patc serie or just new patch top of that.
>>>>>>
>>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>>
>>>> [...]
>>>>
>>>>> rtl2832.c.diff:
>>>>> - static int -> static const
>>>>> - struct -> static const struct
>>>>> - newline between function call and error check -> […]
>>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>>> […]
>>>>> Use one space around (on each side of) most binary and ternary operators,
>>>>> such as any of these:
>>>>>
>>>>> = + -< > * / % |& ^<=>= == != ? :
>>>>>
>>>>> […]
>>>>>
>>>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>>> + len = (msb>> 3) + 1;
>>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>>> + *val = (reading_tmp>> lsb)& mask;
>>>>> + len = (msb>> 3) + 1;
>>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>>>> + writing_tmp |= ((val& mask)<< lsb);
>>>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>>>> + num = bw_mode<< 20;
>>>>>
>>>>> Bitshift operators seems to be OK.
>>>>> Something else?
>>>>
>>>> (len-1-i)*8
>>> I almost have a new corrected version of the patch series ready, fixing this issues and the
>>> other ones you mentioned.
>>>>
>>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>>
>>>>> ./checkpatch.pl --no-tree
>>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>>> ERROR: Missing Signed-off-by: line(s)
>>>>>
>>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>>
>>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>>> problems, please review. If any of these errors
>>>>> are false positives report them to the maintainer, see
>>>>> CHECKPATCH in MAINTAINERS.
>>>>>
>>>>> How do you produce this error:
>>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>>
>>>> Just running checkpatch.pl --file foo
>>>>
>>>
>>> For me checkpath.pl also does not report the error you reported. It does seem
>>> strange to me, as the makros are the same as in rtl2830_priv.h
>>>
>>> Regards
>>> Thomas
>>
>> Yeah, 'rtl2830_priv.h' is the same.
>> Fu… me, now I don't know too!
>> :)
>>
>> cheers,
>> poma
>
> Ok. I will then check the patches with the new checkpatch version tomorrow as I need some
> rest now ;) It should not be too difficult to remove the errors.
>
> Regards
> Thomas
Have a pleasant beauty sleep ;)
cheers,
poma
ps.
/usr/src/kernels/`uname -r`/scripts
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-17 14:19 ` Antti Palosaari
2012-05-17 20:27 ` poma
@ 2012-05-18 0:55 ` poma
[not found] ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
1 sibling, 1 reply; 53+ messages in thread
From: poma @ 2012-05-18 0:55 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
[-- Attachment #1: Type: text/plain, Size: 43454 bytes --]
On 05/17/2012 04:19 PM, Antti Palosaari wrote:
> Moikka Thomas,
>
> Here is the review. See comments below.
>
> And conclusion is that it is ready for the Kernel merge. I did not see
> any big functiuonality problems - only some small issues that are likely
> considered as a coding style etc. Feel free to fix those and sent new
> patc serie or just new patch top of that.
>
> Reviewed-by: Antti Palosaari <crope@iki.fi>
>
>
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Changelog for ver. 0.3:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>> ---
>> drivers/media/dvb/frontends/Kconfig | 7 +
>> drivers/media/dvb/frontends/Makefile | 1 +
>> drivers/media/dvb/frontends/rtl2832.c | 825
>> ++++++++++++++++++++++++++++
>> drivers/media/dvb/frontends/rtl2832.h | 74 +++
>> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
>> 5 files changed, 1165 insertions(+), 0 deletions(-)
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig
>> b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>> help
>> Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> + tristate "Realtek RTL2832 DVB-T"
>> + depends on DVB_CORE&& I2C
>> + default m if DVB_FE_CUSTOMISE
>> + help
>> + Say Y when you want to support this frontend.
>> +
>
> It is correct.
>
> Just for the comment as you said in cover letter that you are unsure
> about that.
>
>> comment "DVB-C (cable) frontends"
>> depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile
>> b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..bbf2955 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>> obj-$(CONFIG_DVB_A8293) += a8293.o
>> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>> obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>> b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..51c7927
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,825 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>> (default:off).");
>> +
>> +
>> +static int reg_mask[32] = {
>
> This should be static const.
>
>> + 0x00000001,
>> + 0x00000003,
>> + 0x00000007,
>> + 0x0000000f,
>> + 0x0000001f,
>> + 0x0000003f,
>> + 0x0000007f,
>> + 0x000000ff,
>> + 0x000001ff,
>> + 0x000003ff,
>> + 0x000007ff,
>> + 0x00000fff,
>> + 0x00001fff,
>> + 0x00003fff,
>> + 0x00007fff,
>> + 0x0000ffff,
>> + 0x0001ffff,
>> + 0x0003ffff,
>> + 0x0007ffff,
>> + 0x000fffff,
>> + 0x001fffff,
>> + 0x003fffff,
>> + 0x007fffff,
>> + 0x00ffffff,
>> + 0x01ffffff,
>> + 0x03ffffff,
>> + 0x07ffffff,
>> + 0x0fffffff,
>> + 0x1fffffff,
>> + 0x3fffffff,
>> + 0x7fffffff,
>> + 0xffffffff
>> +};
>> +
>> +struct rtl2832_reg_entry registers[] = {
>
> static const struct
>
>> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
>> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
>> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
>> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
>> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
>> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
>> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
>> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
>> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
>> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
>> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
>> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
>> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
>> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
>> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
>> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
>> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
>> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
>> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
>> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
>> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
>> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
>> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
>> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
>> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
>> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
>> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
>> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
>> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
>> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
>> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
>> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
>> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
>> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
>> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
>> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
>> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
>> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
>> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
>> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
>> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
>> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
>> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
>> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
>> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
>> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
>> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
>> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
>> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
>> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
>> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
>> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
>> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
>> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
>> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
>> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
>> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
>> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
>> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
>> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
>> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
>> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
>> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
>> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
>> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
>> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
>> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
>> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
>> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
>> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
>> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
>> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
>> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
>> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
>> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
>> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
>> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
>> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
>> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
>> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
>> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
>> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
>> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
>> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
>> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
>> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
>> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
>> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
>> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
>> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
>> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
>> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
>> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
>> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
>> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
>> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
>> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
>> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
>> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
>> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
>> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
>> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
>> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
>> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
>> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
>> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
>> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
>> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
>> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
>> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
>> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
>> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
>> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
>> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
>> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
>> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
>> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
>> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
>> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
>> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
>> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
>> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
>> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
>> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
>> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
>> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
>> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> + int ret;
>> + u8 buf[1+len];
>> + struct i2c_msg msg[1] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1+len,
>> + .buf = buf,
>> + }
>> + };
>> +
>> + buf[0] = reg;
>> + memcpy(&buf[1], val, len);
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 1);
>> + if (ret == 1) {
>> + ret = 0;
>> + } else {
>> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> + }
>> + return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> + int ret;
>> + struct i2c_msg msg[2] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1,
>> + .buf =®,
>> + }, {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = I2C_M_RD,
>> + .len = len,
>> + .buf = val,
>> + }
>> + };
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 2);
>> + if (ret == 2) {
>> + ret = 0;
>> + } else {
>> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> + }
>> +
>> + return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 val)
>> +{
>> + return rtl2832_wr_regs(priv, reg, page,&val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 *val)
>> +{
>> + return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> + int ret;
>> +
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u8 reading[4];
>> + u32 reading_tmp;
>> + int i;
>> +
>> + u8 len;
>> + u32 mask;
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb>> 3) + 1;
>> + mask = reg_mask[msb-lsb];
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i< len; i++)
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + *val = (reading_tmp>> lsb)& mask;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> + int ret, i;
>> + u8 len;
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u32 mask;
>> +
>> +
>> + u8 reading[4];
>> + u8 writing[4];
>> + u32 reading_tmp;
>> + u32 writing_tmp;
>> +
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb>> 3) + 1;
>> + mask = reg_mask[msb-lsb];
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i< len; i++)
>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>> + writing_tmp |= ((val& mask)<< lsb);
>> +
>> +
>> + for (i = 0; i< len; i++)
>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>
> You should use spaces here. See Documentation/CodingStyle line 206.
>
>> +
>> + ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> + int ret;
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s: enable=%d", __func__, enable);
>> +
>> + /* gate already open or close */
>> + if (priv->i2c_gate_state == enable)
>> + return 0;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>> 0x0));
>> +
>> + if (ret)
>> + goto err;
>
> Excessive newline between function call and error check.
>
>> +
>> + priv->i2c_gate_state = enable;
>> +
>> + return ret;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int i, ret;
>> +
>> + u8 en_bbin;
>> + u64 pset_iffreq;
>> +
>> + /* initialization values for the demodulator registers */
>> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
>> + {DVBT_AD_EN_REG, 0x1},
>> + {DVBT_AD_EN_REG1, 0x1},
>> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
>> + {DVBT_MGD_THD0, 0x10},
>> + {DVBT_MGD_THD1, 0x20},
>> + {DVBT_MGD_THD2, 0x20},
>> + {DVBT_MGD_THD3, 0x40},
>> + {DVBT_MGD_THD4, 0x22},
>> + {DVBT_MGD_THD5, 0x32},
>> + {DVBT_MGD_THD6, 0x37},
>> + {DVBT_MGD_THD7, 0x39},
>> + {DVBT_EN_BK_TRK, 0x0},
>> + {DVBT_EN_CACQ_NOTCH, 0x0},
>> + {DVBT_AD_AV_REF, 0x2a},
>> + {DVBT_REG_PI, 0x6},
>> + {DVBT_PIP_ON, 0x0},
>> + {DVBT_CDIV_PH0, 0x8},
>> + {DVBT_CDIV_PH1, 0x8},
>> + {DVBT_SCALE1_B92, 0x4},
>> + {DVBT_SCALE1_B93, 0xb0},
>> + {DVBT_SCALE1_BA7, 0x78},
>> + {DVBT_SCALE1_BA9, 0x28},
>> + {DVBT_SCALE1_BAA, 0x59},
>> + {DVBT_SCALE1_BAB, 0x83},
>> + {DVBT_SCALE1_BAC, 0xd4},
>> + {DVBT_SCALE1_BB0, 0x65},
>> + {DVBT_SCALE1_BB1, 0x43},
>> + {DVBT_KB_P1, 0x1},
>> + {DVBT_KB_P2, 0x4},
>> + {DVBT_KB_P3, 0x7},
>> + {DVBT_K1_CR_STEP12, 0xa},
>> + {DVBT_REG_GPE, 0x1},
>> + {DVBT_SERIAL, 0x0},
>> + {DVBT_CDIV_PH0, 0x9},
>> + {DVBT_CDIV_PH1, 0x9},
>> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
>> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
>> + {DVBT_TRK_KS_P2, 0x4},
>> + {DVBT_TRK_KS_I2, 0x7},
>> + {DVBT_TR_THD_SET2, 0x6},
>> + {DVBT_TRK_KC_I2, 0x5},
>> + {DVBT_CR_THD_SET2, 0x1},
>> + {DVBT_SPEC_INV, 0x0},
>> + {DVBT_DAGC_TRG_VAL, 0x5a},
>> + {DVBT_AGC_TARG_VAL_0, 0x0},
>> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
>> + {DVBT_AAGC_LOOP_GAIN, 0x16},
>> + {DVBT_LOOP_GAIN2_3_0, 0x6},
>> + {DVBT_LOOP_GAIN2_4, 0x1},
>> + {DVBT_LOOP_GAIN3, 0x16},
>> + {DVBT_VTOP1, 0x35},
>> + {DVBT_VTOP2, 0x21},
>> + {DVBT_VTOP3, 0x21},
>> + {DVBT_KRF1, 0x0},
>> + {DVBT_KRF2, 0x40},
>> + {DVBT_KRF3, 0x10},
>> + {DVBT_KRF4, 0x10},
>> + {DVBT_IF_AGC_MIN, 0x80},
>> + {DVBT_IF_AGC_MAX, 0x7f},
>> + {DVBT_RF_AGC_MIN, 0x80},
>> + {DVBT_RF_AGC_MAX, 0x7f},
>> + {DVBT_POLAR_RF_AGC, 0x0},
>> + {DVBT_POLAR_IF_AGC, 0x0},
>> + {DVBT_AD7_SETTING, 0xe9bf},
>> + {DVBT_EN_GI_PGA, 0x0},
>> + {DVBT_THD_LOCK_UP, 0x0},
>> + {DVBT_THD_LOCK_DW, 0x0},
>> + {DVBT_THD_UP1, 0x11},
>> + {DVBT_THD_DW1, 0xef},
>> + {DVBT_INTER_CNT_LEN, 0xc},
>> + {DVBT_GI_PGA_STATE, 0x0},
>> + {DVBT_EN_AGC_PGA, 0x1},
>> + {DVBT_IF_AGC_MAN, 0x0},
>> + };
>> +
>> +
>> + dbg("%s", __func__);
>> +
>> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> + /*
>> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> + * / CrystalFreqHz)
>> + */
>> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> + pset_iffreq *= 0x400000;
>> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> + pset_iffreq = pset_iffreq& 0x3fffff;
>> +
>> +
>> +
>> + for (i = 0; i< ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> + rtl2832_initial_regs[i].value);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* if frequency settings */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> + if (ret)
>> + goto err;
>> +
>> + priv->sleeping = false;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + priv->sleeping = true;
>> + return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> + struct dvb_frontend_tune_settings *s)
>> +{
>> + dbg("%s", __func__);
>> + s->min_delay_ms = 1000;
>> + s->step_size = fe->ops.info.frequency_stepsize * 2;
>> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>> + int ret, i, j;
>> + u64 bw_mode, num, num2;
>> + u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> + static u8 bw_params[3][32] = {
>> + /* 6 MHz bandwidth */
>> + {
>> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> + 0x19, 0xe0,
>> + },
>> +
>> + /* 7 MHz bandwidth */
>> + {
>> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> + 0x19, 0x10,
>> + },
>> +
>> + /* 8 MHz bandwidth */
>> + {
>> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> + 0x19, 0xe0,
>> + },
>> + };
>> +
>> +
>> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> + c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> + /* program tuner */
>> + if (fe->ops.tuner_ops.set_params)
>> + fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> + switch (c->bandwidth_hz) {
>> + case 6000000:
>> + i = 0;
>> + bw_mode = 48000000;
>> + break;
>> + case 7000000:
>> + i = 1;
>> + bw_mode = 56000000;
>> + break;
>> + case 8000000:
>> + i = 2;
>> + bw_mode = 64000000;
>> + break;
>> + default:
>> + dbg("invalid bandwidth");
>> + return -EINVAL;
>> + }
>> +
>> + for (j = 0; j< sizeof(bw_params[j]); j++) {
>> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* calculate and set resample ratio
>> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> + * / ConstWithBandwidthMode)
>> + */
>> + num = priv->cfg.xtal * 7;
>> + num *= 0x400000;
>> + num = div_u64(num, bw_mode);
>> + resamp_ratio = num& 0x3ffffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> + if (ret)
>> + goto err;
>> +
>> + /* calculate and set cfreq off ratio
>> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> + * / (CrystalFreqHz * 7))
>> + */
>> + num = bw_mode<< 20;
>> + num2 = priv->cfg.xtal * 7;
>> + num = div_u64(num, num2);
>> + num = -num;
>> + cfreq_off_ratio = num& 0xfffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>> cfreq_off_ratio);
>> + if (ret)
>> + goto err;
>> +
>> +
>> + /* soft reset */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>> *status)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int ret;
>> + u32 tmp;
>> + *status = 0;
>> +
>> +
>> + dbg("%s", __func__);
>> + if (priv->sleeping)
>> + return 0;
>> +
>> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>> + if (ret)
>> + goto err;
>> +
>> + if (tmp == 11) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> + }
>> + /* TODO find out if this is also true for rtl2832? */
>> + /*else if (tmp == 10) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI;
>> + }*/
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> + *snr = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> + *ber = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> + *ucblocks = 0;
>> + return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>> *strength)
>> +{
>> + *strength = 0;
>> + return 0;
>> +}
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c)
>> +{
>> + struct rtl2832_priv *priv = NULL;
>> + int ret = 0;
>> + u8 tmp;
>> +
>> + dbg("%s", __func__);
>> +
>> + /* allocate memory for the internal state */
>> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> + if (priv == NULL)
>> + goto err;
>> +
>> + /* setup the priv */
>> + priv->i2c = i2c;
>> + priv->tuner = cfg->tuner;
>> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> + /* check if the demod is there */
>> + ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>> + if (ret)
>> + goto err;
>> +
>> + /* create dvb_frontend */
>> + memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> + priv->fe.demodulator_priv = priv;
>> +
>> + /* TODO implement sleep mode */
>> + priv->sleeping = true;
>> +
>> + return&priv->fe;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + kfree(priv);
>> + return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> + .delsys = { SYS_DVBT },
>> + .info = {
>> + .name = "Realtek RTL2832 (DVB-T)",
>> + .frequency_min = 174000000,
>> + .frequency_max = 862000000,
>> + .frequency_stepsize = 166667,
>> + .caps = FE_CAN_FEC_1_2 |
>> + FE_CAN_FEC_2_3 |
>> + FE_CAN_FEC_3_4 |
>> + FE_CAN_FEC_5_6 |
>> + FE_CAN_FEC_7_8 |
>> + FE_CAN_FEC_AUTO |
>> + FE_CAN_QPSK |
>> + FE_CAN_QAM_16 |
>> + FE_CAN_QAM_64 |
>> + FE_CAN_QAM_AUTO |
>> + FE_CAN_TRANSMISSION_MODE_AUTO |
>> + FE_CAN_GUARD_INTERVAL_AUTO |
>> + FE_CAN_HIERARCHY_AUTO |
>> + FE_CAN_RECOVER |
>> + FE_CAN_MUTE_TS
>> + },
>> +
>> + .release = rtl2832_release,
>> +
>> + .init = rtl2832_init,
>> + .sleep = rtl2832_sleep,
>> +
>> + .get_tune_settings = rtl2832_get_tune_settings,
>> +
>> + .set_frontend = rtl2832_set_frontend,
>> +
>> + .read_status = rtl2832_read_status,
>> + .read_snr = rtl2832_read_snr,
>> + .read_ber = rtl2832_read_ber,
>> + .read_ucblocks = rtl2832_read_ucblocks,
>> + .read_signal_strength = rtl2832_read_signal_strength,
>> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.4");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>> b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include<linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> + /*
>> + * Demodulator I2C address.
>> + */
>> + u8 i2c_addr;
>> +
>> + /*
>> + * Xtal frequency.
>> + * Hz
>> + * 4000000, 16000000, 25000000, 28800000
>> + */
>> + u32 xtal;
>> +
>> + /*
>> + * IFs for all used modes.
>> + * Hz
>> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> + */
>> + u32 if_dvbt;
>> +
>> + /*
>> + */
>> + u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> + (defined(CONFIG_DVB_RTL2832_MODULE)&& defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> + struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *config,
>> + struct i2c_adapter *i2c
>> +)
>> +{
>> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> + return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..3e52674
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,258 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public
>> License along
>> + * with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> + if (rtl2832_debug) \
>> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>
> ERROR: Macros with complex values should be enclosed in parenthesis
> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
> +#define dbg(f, arg...) \
> + if (rtl2832_debug) \
> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>
>> +#undef err
>> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ##
>> arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>> ## arg)
>> +
>> +struct rtl2832_priv {
>> + struct i2c_adapter *i2c;
>> + struct dvb_frontend fe;
>> + struct rtl2832_config cfg;
>> +
>> + bool i2c_gate_state;
>> + bool sleeping;
>> +
>> + u8 tuner;
>> + u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> + u8 page;
>> + u8 start_address;
>> + u8 msb;
>> + u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> + int reg;
>
> As this reg is enum I wonder if it is possible to use enum as a type
> (enum reg)? Still I am not sure about it and I dont like to test it :)
>
>> + u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> + DVBT_SOFT_RST,
>> + DVBT_IIC_REPEAT,
>> + DVBT_TR_WAIT_MIN_8K,
>> + DVBT_RSD_BER_FAIL_VAL,
>> + DVBT_EN_BK_TRK,
>> + DVBT_REG_PI,
>> + DVBT_REG_PFREQ_1_0,
>> + DVBT_PD_DA8,
>> + DVBT_LOCK_TH,
>> + DVBT_BER_PASS_SCAL,
>> + DVBT_CE_FFSM_BYPASS,
>> + DVBT_ALPHAIIR_N,
>> + DVBT_ALPHAIIR_DIF,
>> + DVBT_EN_TRK_SPAN,
>> + DVBT_LOCK_TH_LEN,
>> + DVBT_CCI_THRE,
>> + DVBT_CCI_MON_SCAL,
>> + DVBT_CCI_M0,
>> + DVBT_CCI_M1,
>> + DVBT_CCI_M2,
>> + DVBT_CCI_M3,
>> + DVBT_SPEC_INIT_0,
>> + DVBT_SPEC_INIT_1,
>> + DVBT_SPEC_INIT_2,
>> + DVBT_AD_EN_REG,
>> + DVBT_AD_EN_REG1,
>> + DVBT_EN_BBIN,
>> + DVBT_MGD_THD0,
>> + DVBT_MGD_THD1,
>> + DVBT_MGD_THD2,
>> + DVBT_MGD_THD3,
>> + DVBT_MGD_THD4,
>> + DVBT_MGD_THD5,
>> + DVBT_MGD_THD6,
>> + DVBT_MGD_THD7,
>> + DVBT_EN_CACQ_NOTCH,
>> + DVBT_AD_AV_REF,
>> + DVBT_PIP_ON,
>> + DVBT_SCALE1_B92,
>> + DVBT_SCALE1_B93,
>> + DVBT_SCALE1_BA7,
>> + DVBT_SCALE1_BA9,
>> + DVBT_SCALE1_BAA,
>> + DVBT_SCALE1_BAB,
>> + DVBT_SCALE1_BAC,
>> + DVBT_SCALE1_BB0,
>> + DVBT_SCALE1_BB1,
>> + DVBT_KB_P1,
>> + DVBT_KB_P2,
>> + DVBT_KB_P3,
>> + DVBT_OPT_ADC_IQ,
>> + DVBT_AD_AVI,
>> + DVBT_AD_AVQ,
>> + DVBT_K1_CR_STEP12,
>> + DVBT_TRK_KS_P2,
>> + DVBT_TRK_KS_I2,
>> + DVBT_TR_THD_SET2,
>> + DVBT_TRK_KC_P2,
>> + DVBT_TRK_KC_I2,
>> + DVBT_CR_THD_SET2,
>> + DVBT_PSET_IFFREQ,
>> + DVBT_SPEC_INV,
>> + DVBT_BW_INDEX,
>> + DVBT_RSAMP_RATIO,
>> + DVBT_CFREQ_OFF_RATIO,
>> + DVBT_FSM_STAGE,
>> + DVBT_RX_CONSTEL,
>> + DVBT_RX_HIER,
>> + DVBT_RX_C_RATE_LP,
>> + DVBT_RX_C_RATE_HP,
>> + DVBT_GI_IDX,
>> + DVBT_FFT_MODE_IDX,
>> + DVBT_RSD_BER_EST,
>> + DVBT_CE_EST_EVM,
>> + DVBT_RF_AGC_VAL,
>> + DVBT_IF_AGC_VAL,
>> + DVBT_DAGC_VAL,
>> + DVBT_SFREQ_OFF,
>> + DVBT_CFREQ_OFF,
>> + DVBT_POLAR_RF_AGC,
>> + DVBT_POLAR_IF_AGC,
>> + DVBT_AAGC_HOLD,
>> + DVBT_EN_RF_AGC,
>> + DVBT_EN_IF_AGC,
>> + DVBT_IF_AGC_MIN,
>> + DVBT_IF_AGC_MAX,
>> + DVBT_RF_AGC_MIN,
>> + DVBT_RF_AGC_MAX,
>> + DVBT_IF_AGC_MAN,
>> + DVBT_IF_AGC_MAN_VAL,
>> + DVBT_RF_AGC_MAN,
>> + DVBT_RF_AGC_MAN_VAL,
>> + DVBT_DAGC_TRG_VAL,
>> + DVBT_AGC_TARG_VAL,
>> + DVBT_LOOP_GAIN_3_0,
>> + DVBT_LOOP_GAIN_4,
>> + DVBT_VTOP,
>> + DVBT_KRF,
>> + DVBT_AGC_TARG_VAL_0,
>> + DVBT_AGC_TARG_VAL_8_1,
>> + DVBT_AAGC_LOOP_GAIN,
>> + DVBT_LOOP_GAIN2_3_0,
>> + DVBT_LOOP_GAIN2_4,
>> + DVBT_LOOP_GAIN3,
>> + DVBT_VTOP1,
>> + DVBT_VTOP2,
>> + DVBT_VTOP3,
>> + DVBT_KRF1,
>> + DVBT_KRF2,
>> + DVBT_KRF3,
>> + DVBT_KRF4,
>> + DVBT_EN_GI_PGA,
>> + DVBT_THD_LOCK_UP,
>> + DVBT_THD_LOCK_DW,
>> + DVBT_THD_UP1,
>> + DVBT_THD_DW1,
>> + DVBT_INTER_CNT_LEN,
>> + DVBT_GI_PGA_STATE,
>> + DVBT_EN_AGC_PGA,
>> + DVBT_CKOUTPAR,
>> + DVBT_CKOUT_PWR,
>> + DVBT_SYNC_DUR,
>> + DVBT_ERR_DUR,
>> + DVBT_SYNC_LVL,
>> + DVBT_ERR_LVL,
>> + DVBT_VAL_LVL,
>> + DVBT_SERIAL,
>> + DVBT_SER_LSB,
>> + DVBT_CDIV_PH0,
>> + DVBT_CDIV_PH1,
>> + DVBT_MPEG_IO_OPT_2_2,
>> + DVBT_MPEG_IO_OPT_1_0,
>> + DVBT_CKOUTPAR_PIP,
>> + DVBT_CKOUT_PWR_PIP,
>> + DVBT_SYNC_LVL_PIP,
>> + DVBT_ERR_LVL_PIP,
>> + DVBT_VAL_LVL_PIP,
>> + DVBT_CKOUTPAR_PID,
>> + DVBT_CKOUT_PWR_PID,
>> + DVBT_SYNC_LVL_PID,
>> + DVBT_ERR_LVL_PID,
>> + DVBT_VAL_LVL_PID,
>> + DVBT_SM_PASS,
>> + DVBT_UPDATE_REG_2,
>> + DVBT_BTHD_P3,
>> + DVBT_BTHD_D3,
>> + DVBT_FUNC4_REG0,
>> + DVBT_FUNC4_REG1,
>> + DVBT_FUNC4_REG2,
>> + DVBT_FUNC4_REG3,
>> + DVBT_FUNC4_REG4,
>> + DVBT_FUNC4_REG5,
>> + DVBT_FUNC4_REG6,
>> + DVBT_FUNC4_REG7,
>> + DVBT_FUNC4_REG8,
>> + DVBT_FUNC4_REG9,
>> + DVBT_FUNC4_REG10,
>> + DVBT_FUNC5_REG0,
>> + DVBT_FUNC5_REG1,
>> + DVBT_FUNC5_REG2,
>> + DVBT_FUNC5_REG3,
>> + DVBT_FUNC5_REG4,
>> + DVBT_FUNC5_REG5,
>> + DVBT_FUNC5_REG6,
>> + DVBT_FUNC5_REG7,
>> + DVBT_FUNC5_REG8,
>> + DVBT_FUNC5_REG9,
>> + DVBT_FUNC5_REG10,
>> + DVBT_FUNC5_REG11,
>> + DVBT_FUNC5_REG12,
>> + DVBT_FUNC5_REG13,
>> + DVBT_FUNC5_REG14,
>> + DVBT_FUNC5_REG15,
>> + DVBT_FUNC5_REG16,
>> + DVBT_FUNC5_REG17,
>> + DVBT_FUNC5_REG18,
>> + DVBT_AD7_SETTING,
>> + DVBT_RSSI_R,
>> + DVBT_ACI_DET_IND,
>> + DVBT_REG_MON,
>> + DVBT_REG_MONSEL,
>> + DVBT_REG_GPE,
>> + DVBT_REG_GPO,
>> + DVBT_REG_4MSEL,
>> + DVBT_TEST_REG_1,
>> + DVBT_TEST_REG_2,
>> + DVBT_TEST_REG_3,
>> + DVBT_TEST_REG_4,
>> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
>
>
checkpatch.pl:
author Joe Perches <joe@perches.com>
Fri, 11 May 2012 00:59:25 +0000 (10:59 +1000)
committer Stephen Rothwell <sfr@canb.auug.org.au>
Thu, 17 May 2012 07:18:17 +0000 (17:18 +1000)
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commit;h=2a7561d6bbf29c631ad05a8fabe313142ba3d7d0
./checkpatch.pl --no-tree --no-signoff rtl2832.c-v2.diff
total: 0 errors, 0 warnings, 63 lines checked
rtl2832.c-v2.diff has no obvious style problems and is ready for submission.
./checkpatch.pl --no-tree --no-signoff rtl2832.h.diff
total: 0 errors, 0 warnings, 8 lines checked
rtl2832.h.diff has no obvious style problems and is ready for submission.
./checkpatch.pl --no-tree --no-signoff rtl2832_priv.h.diff
total: 0 errors, 0 warnings, 17 lines checked
rtl2832_priv.h.diff has no obvious style problems and is ready for
submission.
./checkpatch.pl --no-tree --file rtl2832.c
total: 0 errors, 0 warnings, 824 lines checked
rtl2832.c has no obvious style problems and is ready for submission.
./checkpatch.pl --no-tree --file rtl2832.h
total: 0 errors, 0 warnings, 74 lines checked
rtl2832.h has no obvious style problems and is ready for submission.
./checkpatch.pl --no-tree --file rtl2832_priv.h
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+ if (rtl2832_debug) \
+ pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
total: 1 errors, 0 warnings, 258 lines checked
rtl2832_priv.h has style problems, please review.
If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
Regarding "ERROR: Macros with complex values should be enclosed in
parenthesis":
./checkpatch.pl --no-tree --file *_priv.h | grep -A 1 "ERROR: Macros
with complex values"
ERROR: Macros with complex values should be enclosed in parenthesis
#35: FILE: af9013_priv.h:35:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#241: FILE: bcm3510_priv.h:241:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#242: FILE: bcm3510_priv.h:242:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#243: FILE: bcm3510_priv.h:243:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#244: FILE: bcm3510_priv.h:244:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#245: FILE: bcm3510_priv.h:245:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#246: FILE: bcm3510_priv.h:246:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#247: FILE: bcm3510_priv.h:247:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#33: FILE: cxd2820r_priv.h:33:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#24: FILE: dib3000mb_priv.h:24:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#34: FILE: hd29l2_priv.h:34:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2830_priv.h:30:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2832_priv.h:30:
[…]
--
ERROR: Macros with complex values should be enclosed in parenthesis
#69: FILE: stb0899_priv.h:69:
[…]
--
ERROR: Macros with complex values should be enclosed in parenthesis
#31: FILE: tda10071_priv.h:31:
E voilà!
cheers,
poma
ps.
CHECKPATCH
M: Andy Whitcroft <apw@canonical.com>
S: Supported
F: scripts/checkpatch.pl
[-- Attachment #2: rtl2832.c-v2.diff --]
[-- Type: text/x-patch, Size: 1881 bytes --]
--- drivers/media/dvb/frontends/rtl2832.c.orig 2012-05-17 20:38:39.916496007 +0200
+++ drivers/media/dvb/frontends/rtl2832.c 2012-05-18 00:27:02.571804702 +0200
@@ -26,7 +26,7 @@
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
-static int reg_mask[32] = {
+static const reg_mask[32] = {
0x00000001,
0x00000003,
0x00000007,
@@ -61,7 +61,7 @@
0xffffffff
};
-struct rtl2832_reg_entry registers[] = {
+static const struct rtl2832_reg_entry registers[] = {
[DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
[DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
[DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
@@ -317,7 +317,7 @@
page = registers[reg].page;
len = (msb >> 3) + 1;
- mask = reg_mask[msb-lsb];
+ mask = reg_mask[msb - lsb];
ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
@@ -326,7 +326,7 @@
reading_tmp = 0;
for (i = 0; i < len; i++)
- reading_tmp |= reading[i] << ((len-1-i)*8);
+ reading_tmp |= reading[i] << ((len - 1 - i) * 8);
*val = (reading_tmp >> lsb) & mask;
@@ -360,7 +360,7 @@
page = registers[reg].page;
len = (msb >> 3) + 1;
- mask = reg_mask[msb-lsb];
+ mask = reg_mask[msb - lsb];
ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
@@ -369,14 +369,14 @@
reading_tmp = 0;
for (i = 0; i < len; i++)
- reading_tmp |= reading[i] << ((len-1-i)*8);
+ reading_tmp |= reading[i] << ((len - 1 - i) * 8);
writing_tmp = reading_tmp & ~(mask << lsb);
writing_tmp |= ((val & mask) << lsb);
for (i = 0; i < len; i++)
- writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+ writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
if (ret)
@@ -403,7 +403,6 @@
return 0;
ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
-
if (ret)
goto err;
[-- Attachment #3: rtl2832.h.diff --]
[-- Type: text/x-patch, Size: 376 bytes --]
--- drivers/media/dvb/frontends/rtl2832.h.orig 2012-05-18 02:03:57.137957914 +0200
+++ drivers/media/dvb/frontends/rtl2832.h 2012-05-18 02:01:59.724073740 +0200
@@ -65,7 +65,7 @@
struct i2c_adapter *i2c
)
{
- printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+ pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return NULL;
}
#endif
[-- Attachment #4: rtl2832_priv.h.diff --]
[-- Type: text/x-patch, Size: 896 bytes --]
--- drivers/media/dvb/frontends/rtl2832_priv.h.orig 2012-05-18 02:02:48.561114101 +0200
+++ drivers/media/dvb/frontends/rtl2832_priv.h 2012-05-18 01:59:41.200467665 +0200
@@ -29,13 +29,13 @@
#undef dbg
#define dbg(f, arg...) \
if (rtl2832_debug) \
- printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+ pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
#undef err
-#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
+#define err(f, arg...) pr_err(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
#undef info
-#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#define info(f, arg...) pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
#undef warn
-#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+#define warn(f, arg...) pr_warn(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
struct rtl2832_priv {
struct i2c_adapter *i2c;
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
[not found] ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
@ 2012-05-18 9:15 ` poma
2012-05-18 10:38 ` poma
0 siblings, 1 reply; 53+ messages in thread
From: poma @ 2012-05-18 9:15 UTC (permalink / raw)
To: Thomas Mair; +Cc: Antti Palosaari, linux-media
[-- Attachment #1: Type: text/plain, Size: 46894 bytes --]
On 05/18/2012 08:20 AM, Thomas Mair wrote:
> Am 18.05.2012 02:55 schrieb "poma" <pomidorabelisima@gmail.com>:
>>
>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>> Moikka Thomas,
>>>
>>> Here is the review. See comments below.
>>>
>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>> any big functiuonality problems - only some small issues that are likely
>>> considered as a coding style etc. Feel free to fix those and sent new
>>> patc serie or just new patch top of that.
>>>
>>> Reviewed-by: Antti Palosaari <crope@iki.fi>
>>>
>>>
>>> On 17.05.2012 01:13, Thomas Mair wrote:
>>>> Changelog for ver. 0.3:
>>>> - removed statistics as their calculation was wrong
>>>> - fixed bug in Makefile
>>>> - indentation and code style improvements
>>>>
>>>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>>>> ---
>>>> drivers/media/dvb/frontends/Kconfig | 7 +
>>>> drivers/media/dvb/frontends/Makefile | 1 +
>>>> drivers/media/dvb/frontends/rtl2832.c | 825
>>>> ++++++++++++++++++++++++++++
>>>> drivers/media/dvb/frontends/rtl2832.h | 74 +++
>>>> drivers/media/dvb/frontends/rtl2832_priv.h | 258 +++++++++
>>>> 5 files changed, 1165 insertions(+), 0 deletions(-)
>>>> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>>>> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>>>> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/Kconfig
>>>> b/drivers/media/dvb/frontends/Kconfig
>>>> index f479834..f7d67d7 100644
>>>> --- a/drivers/media/dvb/frontends/Kconfig
>>>> +++ b/drivers/media/dvb/frontends/Kconfig
>>>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>>>> help
>>>> Say Y when you want to support this frontend.
>>>>
>>>> +config DVB_RTL2832
>>>> + tristate "Realtek RTL2832 DVB-T"
>>>> + depends on DVB_CORE&& I2C
>>>> + default m if DVB_FE_CUSTOMISE
>>>> + help
>>>> + Say Y when you want to support this frontend.
>>>> +
>>>
>>> It is correct.
>>>
>>> Just for the comment as you said in cover letter that you are unsure
>>> about that.
>>>
>>>> comment "DVB-C (cable) frontends"
>>>> depends on DVB_CORE
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/Makefile
>>>> b/drivers/media/dvb/frontends/Makefile
>>>> index b0381dc..bbf2955 100644
>>>> --- a/drivers/media/dvb/frontends/Makefile
>>>> +++ b/drivers/media/dvb/frontends/Makefile
>>>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>>>> obj-$(CONFIG_DVB_A8293) += a8293.o
>>>> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>>>> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>>>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>>>> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>>>> obj-$(CONFIG_DVB_AF9033) += af9033.o
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>>>> b/drivers/media/dvb/frontends/rtl2832.c
>>>> new file mode 100644
>>>> index 0000000..51c7927
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>>>> @@ -0,0 +1,825 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License,
> or
>>>> + * (at your option) any later version.
>>>> + *
>>>> + * 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.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public
>>>> License along
>>>> + * with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#include "rtl2832_priv.h"
>>>> +
>>>> +
>>>> +int rtl2832_debug;
>>>> +module_param_named(debug, rtl2832_debug, int, 0644);
>>>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>>>> (default:off).");
>>>> +
>>>> +
>>>> +static int reg_mask[32] = {
>>>
>>> This should be static const.
>>>
>>>> + 0x00000001,
>>>> + 0x00000003,
>>>> + 0x00000007,
>>>> + 0x0000000f,
>>>> + 0x0000001f,
>>>> + 0x0000003f,
>>>> + 0x0000007f,
>>>> + 0x000000ff,
>>>> + 0x000001ff,
>>>> + 0x000003ff,
>>>> + 0x000007ff,
>>>> + 0x00000fff,
>>>> + 0x00001fff,
>>>> + 0x00003fff,
>>>> + 0x00007fff,
>>>> + 0x0000ffff,
>>>> + 0x0001ffff,
>>>> + 0x0003ffff,
>>>> + 0x0007ffff,
>>>> + 0x000fffff,
>>>> + 0x001fffff,
>>>> + 0x003fffff,
>>>> + 0x007fffff,
>>>> + 0x00ffffff,
>>>> + 0x01ffffff,
>>>> + 0x03ffffff,
>>>> + 0x07ffffff,
>>>> + 0x0fffffff,
>>>> + 0x1fffffff,
>>>> + 0x3fffffff,
>>>> + 0x7fffffff,
>>>> + 0xffffffff
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_entry registers[] = {
>>>
>>> static const struct
>>>
>>>> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
>>>> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
>>>> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
>>>> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
>>>> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
>>>> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
>>>> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
>>>> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
>>>> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
>>>> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
>>>> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
>>>> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
>>>> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
>>>> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
>>>> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
>>>> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
>>>> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
>>>> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
>>>> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
>>>> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
>>>> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
>>>> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
>>>> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
>>>> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
>>>> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
>>>> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
>>>> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
>>>> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
>>>> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
>>>> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
>>>> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
>>>> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
>>>> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
>>>> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
>>>> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
>>>> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
>>>> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
>>>> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
>>>> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
>>>> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
>>>> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
>>>> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
>>>> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
>>>> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
>>>> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
>>>> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
>>>> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
>>>> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
>>>> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
>>>> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
>>>> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
>>>> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
>>>> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
>>>> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
>>>> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
>>>> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
>>>> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
>>>> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
>>>> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
>>>> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
>>>> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
>>>> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
>>>> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
>>>> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
>>>> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
>>>> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
>>>> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
>>>> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
>>>> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
>>>> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
>>>> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
>>>> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
>>>> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
>>>> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
>>>> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
>>>> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
>>>> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
>>>> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
>>>> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
>>>> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
>>>> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
>>>> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
>>>> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
>>>> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
>>>> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
>>>> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
>>>> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
>>>> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
>>>> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
>>>> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
>>>> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
>>>> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
>>>> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
>>>> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
>>>> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
>>>> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
>>>> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
>>>> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
>>>> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
>>>> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
>>>> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
>>>> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
>>>> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
>>>> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
>>>> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
>>>> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
>>>> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
>>>> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
>>>> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
>>>> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
>>>> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
>>>> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
>>>> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
>>>> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
>>>> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
>>>> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
>>>> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
>>>> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
>>>> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
>>>> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
>>>> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
>>>> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
>>>> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
>>>> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
>>>> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
>>>> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
>>>> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
>>>> +};
>>>> +
>>>> +/* write multiple hardware registers */
>>>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>>>> len)
>>>> +{
>>>> + int ret;
>>>> + u8 buf[1+len];
>>>> + struct i2c_msg msg[1] = {
>>>> + {
>>>> + .addr = priv->cfg.i2c_addr,
>>>> + .flags = 0,
>>>> + .len = 1+len,
>>>> + .buf = buf,
>>>> + }
>>>> + };
>>>> +
>>>> + buf[0] = reg;
>>>> + memcpy(&buf[1], val, len);
>>>> +
>>>> + ret = i2c_transfer(priv->i2c, msg, 1);
>>>> + if (ret == 1) {
>>>> + ret = 0;
>>>> + } else {
>>>> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>>>> + ret = -EREMOTEIO;
>>>> + }
>>>> + return ret;
>>>> +}
>>>> +
>>>> +/* read multiple hardware registers */
>>>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>>>> len)
>>>> +{
>>>> + int ret;
>>>> + struct i2c_msg msg[2] = {
>>>> + {
>>>> + .addr = priv->cfg.i2c_addr,
>>>> + .flags = 0,
>>>> + .len = 1,
>>>> + .buf =®,
>>>> + }, {
>>>> + .addr = priv->cfg.i2c_addr,
>>>> + .flags = I2C_M_RD,
>>>> + .len = len,
>>>> + .buf = val,
>>>> + }
>>>> + };
>>>> +
>>>> + ret = i2c_transfer(priv->i2c, msg, 2);
>>>> + if (ret == 2) {
>>>> + ret = 0;
>>>> + } else {
>>>> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>>>> + ret = -EREMOTEIO;
>>>> +}
>>>> +return ret;
>>>> +}
>>>> +
>>>> +/* write multiple registers */
>>>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>>>> page, u8 *val,
>>>> + int len)
>>>> +{
>>>> + int ret;
>>>> +
>>>> +
>>>> + /* switch bank if needed */
>>>> + if (page != priv->page) {
>>>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>>>> + if (ret)
>>>> + return ret;
>>>> +
>>>> + priv->page = page;
>>>> +}
>>>> +
>>>> +return rtl2832_wr(priv, reg, val, len);
>>>> +}
>>>> +
>>>> +/* read multiple registers */
>>>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>>>> page, u8 *val,
>>>> + int len)
>>>> +{
>>>> + int ret;
>>>> +
>>>> + /* switch bank if needed */
>>>> + if (page != priv->page) {
>>>> + ret = rtl2832_wr(priv, 0x00,&page, 1);
>>>> + if (ret)
>>>> + return ret;
>>>> +
>>>> + priv->page = page;
>>>> + }
>>>> +
>>>> + return rtl2832_rd(priv, reg, val, len);
>>>> +}
>>>> +
>>>> +#if 0 /* currently not used */
>>>> +/* write single register */
>>>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>>>> u8 val)
>>>> +{
>>>> + return rtl2832_wr_regs(priv, reg, page,&val, 1);
>>>> +}
>>>> +#endif
>>>> +
>>>> +/* read single register */
>>>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>>>> u8 *val)
>>>> +{
>>>> + return rtl2832_rd_regs(priv, reg, page, val, 1);
>>>> +}
>>>> +
>>>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>>>> +{
>>>> + int ret;
>>>> +
>>>> + u8 reg_start_addr;
>>>> + u8 msb, lsb;
>>>> + u8 page;
>>>> + u8 reading[4];
>>>> + u32 reading_tmp;
>>>> + int i;
>>>> +
>>>> + u8 len;
>>>> + u32 mask;
>>>> +
>>>> + reg_start_addr = registers[reg].start_address;
>>>> + msb = registers[reg].msb;
>>>> + lsb = registers[reg].lsb;
>>>> + page = registers[reg].page;
>>>> +
>>>> + len = (msb>> 3) + 1;
>>>> + mask = reg_mask[msb-lsb];
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +
>>>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0],
> len);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + reading_tmp = 0;
>>>> + for (i = 0; i< len; i++)
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> + *val = (reading_tmp>> lsb)& mask;
>>>> +
>>>> + return ret;
>>>> +
>>>> +err:
>>>> + dbg("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +
>>>> +}
>>>> +
>>>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>>>> +{
>>>> + int ret, i;
>>>> + u8 len;
>>>> + u8 reg_start_addr;
>>>> + u8 msb, lsb;
>>>> + u8 page;
>>>> + u32 mask;
>>>> +
>>>> +
>>>> + u8 reading[4];
>>>> + u8 writing[4];
>>>> + u32 reading_tmp;
>>>> + u32 writing_tmp;
>>>> +
>>>> +
>>>> + reg_start_addr = registers[reg].start_address;
>>>> + msb = registers[reg].msb;
>>>> + lsb = registers[reg].lsb;
>>>> + page = registers[reg].page;
>>>> +
>>>> + len = (msb>> 3) + 1;
>>>> + mask = reg_mask[msb-lsb];
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +
>>>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0],
> len);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + reading_tmp = 0;
>>>> + for (i = 0; i< len; i++)
>>>> + reading_tmp |= reading[i]<< ((len-1-i)*8);
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> + writing_tmp = reading_tmp& ~(mask<< lsb);
>>>> + writing_tmp |= ((val& mask)<< lsb);
>>>> +
>>>> +
>>>> + for (i = 0; i< len; i++)
>>>> + writing[i] = (writing_tmp>> ((len-1-i)*8))& 0xff;
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> + ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0],
> len);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + return ret;
>>>> +
>>>> +err:
>>>> + dbg("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +
>>>> +}
>>>> +
>>>> +
>>>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>>>> +{
>>>> + int ret;
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> + dbg("%s: enable=%d", __func__, enable);
>>>> +
>>>> + /* gate already open or close */
>>>> + if (priv->i2c_gate_state == enable)
>>>> + return 0;
>>>> +
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>>>> 0x0));
>>>> +
>>>> + if (ret)
>>>> + goto err;
>>>
>>> Excessive newline between function call and error check.
>>>
>>>> +
>>>> + priv->i2c_gate_state = enable;
>>>> +
>>>> + return ret;
>>>> +err:
>>>> + dbg("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +}
>>>> +
>>>> +
>>>> +
>>>> +static int rtl2832_init(struct dvb_frontend *fe)
>>>> +{
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> + int i, ret;
>>>> +
>>>> + u8 en_bbin;
>>>> + u64 pset_iffreq;
>>>> +
>>>> + /* initialization values for the demodulator registers */
>>>> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
>>>> + {DVBT_AD_EN_REG, 0x1},
>>>> + {DVBT_AD_EN_REG1, 0x1},
>>>> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
>>>> + {DVBT_MGD_THD0, 0x10},
>>>> + {DVBT_MGD_THD1, 0x20},
>>>> + {DVBT_MGD_THD2, 0x20},
>>>> + {DVBT_MGD_THD3, 0x40},
>>>> + {DVBT_MGD_THD4, 0x22},
>>>> + {DVBT_MGD_THD5, 0x32},
>>>> + {DVBT_MGD_THD6, 0x37},
>>>> + {DVBT_MGD_THD7, 0x39},
>>>> + {DVBT_EN_BK_TRK, 0x0},
>>>> + {DVBT_EN_CACQ_NOTCH, 0x0},
>>>> + {DVBT_AD_AV_REF, 0x2a},
>>>> + {DVBT_REG_PI, 0x6},
>>>> + {DVBT_PIP_ON, 0x0},
>>>> + {DVBT_CDIV_PH0, 0x8},
>>>> + {DVBT_CDIV_PH1, 0x8},
>>>> + {DVBT_SCALE1_B92, 0x4},
>>>> + {DVBT_SCALE1_B93, 0xb0},
>>>> + {DVBT_SCALE1_BA7, 0x78},
>>>> + {DVBT_SCALE1_BA9, 0x28},
>>>> + {DVBT_SCALE1_BAA, 0x59},
>>>> + {DVBT_SCALE1_BAB, 0x83},
>>>> + {DVBT_SCALE1_BAC, 0xd4},
>>>> + {DVBT_SCALE1_BB0, 0x65},
>>>> + {DVBT_SCALE1_BB1, 0x43},
>>>> + {DVBT_KB_P1, 0x1},
>>>> + {DVBT_KB_P2, 0x4},
>>>> + {DVBT_KB_P3, 0x7},
>>>> + {DVBT_K1_CR_STEP12, 0xa},
>>>> + {DVBT_REG_GPE, 0x1},
>>>> + {DVBT_SERIAL, 0x0},
>>>> + {DVBT_CDIV_PH0, 0x9},
>>>> + {DVBT_CDIV_PH1, 0x9},
>>>> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
>>>> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
>>>> + {DVBT_TRK_KS_P2, 0x4},
>>>> + {DVBT_TRK_KS_I2, 0x7},
>>>> + {DVBT_TR_THD_SET2, 0x6},
>>>> + {DVBT_TRK_KC_I2, 0x5},
>>>> + {DVBT_CR_THD_SET2, 0x1},
>>>> + {DVBT_SPEC_INV, 0x0},
>>>> + {DVBT_DAGC_TRG_VAL, 0x5a},
>>>> + {DVBT_AGC_TARG_VAL_0, 0x0},
>>>> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
>>>> + {DVBT_AAGC_LOOP_GAIN, 0x16},
>>>> + {DVBT_LOOP_GAIN2_3_0, 0x6},
>>>> + {DVBT_LOOP_GAIN2_4, 0x1},
>>>> + {DVBT_LOOP_GAIN3, 0x16},
>>>> + {DVBT_VTOP1, 0x35},
>>>> + {DVBT_VTOP2, 0x21},
>>>> + {DVBT_VTOP3, 0x21},
>>>> + {DVBT_KRF1, 0x0},
>>>> + {DVBT_KRF2, 0x40},
>>>> + {DVBT_KRF3, 0x10},
>>>> + {DVBT_KRF4, 0x10},
>>>> + {DVBT_IF_AGC_MIN, 0x80},
>>>> + {DVBT_IF_AGC_MAX, 0x7f},
>>>> + {DVBT_RF_AGC_MIN, 0x80},
>>>> + {DVBT_RF_AGC_MAX, 0x7f},
>>>> + {DVBT_POLAR_RF_AGC, 0x0},
>>>> + {DVBT_POLAR_IF_AGC, 0x0},
>>>> + {DVBT_AD7_SETTING, 0xe9bf},
>>>> + {DVBT_EN_GI_PGA, 0x0},
>>>> + {DVBT_THD_LOCK_UP, 0x0},
>>>> + {DVBT_THD_LOCK_DW, 0x0},
>>>> + {DVBT_THD_UP1, 0x11},
>>>> + {DVBT_THD_DW1, 0xef},
>>>> + {DVBT_INTER_CNT_LEN, 0xc},
>>>> + {DVBT_GI_PGA_STATE, 0x0},
>>>> + {DVBT_EN_AGC_PGA, 0x1},
>>>> + {DVBT_IF_AGC_MAN, 0x0},
>>>> + };
>>>> +
>>>> +
>>>> + dbg("%s", __func__);
>>>> +
>>>> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>>>> +
>>>> + /*
>>>> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>>>> + * / CrystalFreqHz)
>>>> + */
>>>> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>>>> + pset_iffreq *= 0x400000;
>>>> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>>>> + pset_iffreq = pset_iffreq& 0x3fffff;
>>>> +
>>>> +
>>>> +
>>>> + for (i = 0; i< ARRAY_SIZE(rtl2832_initial_regs); i++) {
>>>> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>>>> + rtl2832_initial_regs[i].value);
>>>> + if (ret)
>>>> + goto err;
>>>> + }
>>>> +
>>>> + /* if frequency settings */
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + priv->sleeping = false;
>>>> +
>>>> + return ret;
>>>> +
>>>> +err:
>>>> + dbg("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>>>> +{
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> + dbg("%s", __func__);
>>>> + priv->sleeping = true;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>>>> + struct dvb_frontend_tune_settings *s)
>>>> +{
>>>> + dbg("%s", __func__);
>>>> + s->min_delay_ms = 1000;
>>>> + s->step_size = fe->ops.info.frequency_stepsize * 2;
>>>> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>>>> +{
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> + struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>>>> + int ret, i, j;
>>>> + u64 bw_mode, num, num2;
>>>> + u32 resamp_ratio, cfreq_off_ratio;
>>>> +
>>>> +
>>>> + static u8 bw_params[3][32] = {
>>>> + /* 6 MHz bandwidth */
>>>> + {
>>>> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>>>> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>>>> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>>>> + 0x19, 0xe0,
>>>> + },
>>>> +
>>>> + /* 7 MHz bandwidth */
>>>> + {
>>>> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>>>> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>>>> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>>>> + 0x19, 0x10,
>>>> + },
>>>> +
>>>> + /* 8 MHz bandwidth */
>>>> + {
>>>> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>>>> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>>>> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>>>> + 0x19, 0xe0,
>>>> + },
>>>> + };
>>>> +
>>>> +
>>>> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>>>> + c->frequency, c->bandwidth_hz, c->inversion);
>>>> +
>>>> +
>>>> + /* program tuner */
>>>> + if (fe->ops.tuner_ops.set_params)
>>>> + fe->ops.tuner_ops.set_params(fe);
>>>> +
>>>> +
>>>> + switch (c->bandwidth_hz) {
>>>> + case 6000000:
>>>> + i = 0;
>>>> + bw_mode = 48000000;
>>>> + break;
>>>> + case 7000000:
>>>> + i = 1;
>>>> + bw_mode = 56000000;
>>>> + break;
>>>> + case 8000000:
>>>> + i = 2;
>>>> + bw_mode = 64000000;
>>>> + break;
>>>> + default:
>>>> + dbg("invalid bandwidth");
>>>> + return -EINVAL;
>>>> + }
>>>> +
>>>> + for (j = 0; j< sizeof(bw_params[j]); j++) {
>>>> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>>>> + if (ret)
>>>> + goto err;
>>>> + }
>>>> +
>>>> + /* calculate and set resample ratio
>>>> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>>>> + * / ConstWithBandwidthMode)
>>>> + */
>>>> + num = priv->cfg.xtal * 7;
>>>> + num *= 0x400000;
>>>> + num = div_u64(num, bw_mode);
>>>> + resamp_ratio = num& 0x3ffffff;
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + /* calculate and set cfreq off ratio
>>>> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>>>> + * / (CrystalFreqHz * 7))
>>>> + */
>>>> + num = bw_mode<< 20;
>>>> + num2 = priv->cfg.xtal * 7;
>>>> + num = div_u64(num, num2);
>>>> + num = -num;
>>>> + cfreq_off_ratio = num& 0xfffff;
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>>>> cfreq_off_ratio);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> +
>>>> + /* soft reset */
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + return ret;
>>>> +err:
>>>> + info("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>>>> *status)
>>>> +{
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> + int ret;
>>>> + u32 tmp;
>>>> + *status = 0;
>>>> +
>>>> +
>>>> + dbg("%s", __func__);
>>>> + if (priv->sleeping)
>>>> + return 0;
>>>> +
>>>> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + if (tmp == 11) {
>>>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>>>> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>>>> + }
>>>> + /* TODO find out if this is also true for rtl2832? */
>>>> + /*else if (tmp == 10) {
>>>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>>>> + FE_HAS_VITERBI;
>>>> + }*/
>>>> +
>>>> + return ret;
>>>> +err:
>>>> + info("%s: failed=%d", __func__, ret);
>>>> + return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>>>> +{
>>>> + *snr = 0;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>>>> +{
>>>> + *ber = 0;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32
> *ucblocks)
>>>> +{
>>>> + *ucblocks = 0;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +
>>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>>>> *strength)
>>>> +{
>>>> + *strength = 0;
>>>> + return 0;
>>>> +}
>>>> +
>>>> +static struct dvb_frontend_ops rtl2832_ops;
>>>> +
>>>> +static void rtl2832_release(struct dvb_frontend *fe)
>>>> +{
>>>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> + dbg("%s", __func__);
>>>> + kfree(priv);
>>>> +}
>>>> +
>>>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>>>> + struct i2c_adapter *i2c)
>>>> +{
>>>> + struct rtl2832_priv *priv = NULL;
>>>> + int ret = 0;
>>>> + u8 tmp;
>>>> +
>>>> + dbg("%s", __func__);
>>>> +
>>>> + /* allocate memory for the internal state */
>>>> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>>>> + if (priv == NULL)
>>>> + goto err;
>>>> +
>>>> + /* setup the priv */
>>>> + priv->i2c = i2c;
>>>> + priv->tuner = cfg->tuner;
>>>> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>>>> +
>>>> + /* check if the demod is there */
>>>> + ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>>>> + if (ret)
>>>> + goto err;
>>>> +
>>>> + /* create dvb_frontend */
>>>> + memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct
> dvb_frontend_ops));
>>>> + priv->fe.demodulator_priv = priv;
>>>> +
>>>> + /* TODO implement sleep mode */
>>>> + priv->sleeping = true;
>>>> +
>>>> + return&priv->fe;
>>>> +err:
>>>> + dbg("%s: failed=%d", __func__, ret);
>>>> + kfree(priv);
>>>> + return NULL;
>>>> +}
>>>> +EXPORT_SYMBOL(rtl2832_attach);
>>>> +
>>>> +static struct dvb_frontend_ops rtl2832_ops = {
>>>> + .delsys = { SYS_DVBT },
>>>> + .info = {
>>>> + .name = "Realtek RTL2832 (DVB-T)",
>>>> + .frequency_min = 174000000,
>>>> + .frequency_max = 862000000,
>>>> + .frequency_stepsize = 166667,
>>>> + .caps = FE_CAN_FEC_1_2 |
>>>> + FE_CAN_FEC_2_3 |
>>>> + FE_CAN_FEC_3_4 |
>>>> + FE_CAN_FEC_5_6 |
>>>> + FE_CAN_FEC_7_8 |
>>>> + FE_CAN_FEC_AUTO |
>>>> + FE_CAN_QPSK |
>>>> + FE_CAN_QAM_16 |
>>>> + FE_CAN_QAM_64 |
>>>> + FE_CAN_QAM_AUTO |
>>>> + FE_CAN_TRANSMISSION_MODE_AUTO |
>>>> + FE_CAN_GUARD_INTERVAL_AUTO |
>>>> + FE_CAN_HIERARCHY_AUTO |
>>>> + FE_CAN_RECOVER |
>>>> + FE_CAN_MUTE_TS
>>>> + },
>>>> +
>>>> + .release = rtl2832_release,
>>>> +
>>>> + .init = rtl2832_init,
>>>> + .sleep = rtl2832_sleep,
>>>> +
>>>> + .get_tune_settings = rtl2832_get_tune_settings,
>>>> +
>>>> + .set_frontend = rtl2832_set_frontend,
>>>> +
>>>> + .read_status = rtl2832_read_status,
>>>> + .read_snr = rtl2832_read_snr,
>>>> + .read_ber = rtl2832_read_ber,
>>>> + .read_ucblocks = rtl2832_read_ucblocks,
>>>> + .read_signal_strength = rtl2832_read_signal_strength,
>>>> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>>>> +};
>>>> +
>>>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>>>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>>>> +MODULE_LICENSE("GPL");
>>>> +MODULE_VERSION("0.4");
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>>>> b/drivers/media/dvb/frontends/rtl2832.h
>>>> new file mode 100644
>>>> index 0000000..d94dc9a
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>>>> @@ -0,0 +1,74 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License,
> or
>>>> + * (at your option) any later version.
>>>> + *
>>>> + * 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.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public
>>>> License along
>>>> + * with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#ifndef RTL2832_H
>>>> +#define RTL2832_H
>>>> +
>>>> +#include<linux/dvb/frontend.h>
>>>> +
>>>> +struct rtl2832_config {
>>>> + /*
>>>> + * Demodulator I2C address.
>>>> + */
>>>> + u8 i2c_addr;
>>>> +
>>>> + /*
>>>> + * Xtal frequency.
>>>> + * Hz
>>>> + * 4000000, 16000000, 25000000, 28800000
>>>> + */
>>>> + u32 xtal;
>>>> +
>>>> + /*
>>>> + * IFs for all used modes.
>>>> + * Hz
>>>> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>>>> + */
>>>> + u32 if_dvbt;
>>>> +
>>>> + /*
>>>> + */
>>>> + u8 tuner;
>>>> +};
>>>> +
>>>> +
>>>> +#if defined(CONFIG_DVB_RTL2832) || \
>>>> + (defined(CONFIG_DVB_RTL2832_MODULE)&& defined(MODULE))
>>>> +extern struct dvb_frontend *rtl2832_attach(
>>>> + const struct rtl2832_config *cfg,
>>>> + struct i2c_adapter *i2c
>>>> +);
>>>> +
>>>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>>>> + struct dvb_frontend *fe
>>>> +);
>>>> +#else
>>>> +static inline struct dvb_frontend *rtl2832_attach(
>>>> + const struct rtl2832_config *config,
>>>> + struct i2c_adapter *i2c
>>>> +)
>>>> +{
>>>> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>>>> + return NULL;
>>>> +}
>>>> +#endif
>>>> +
>>>> +
>>>> +#endif /* RTL2832_H */
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> new file mode 100644
>>>> index 0000000..3e52674
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> @@ -0,0 +1,258 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@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; either version 2 of the License,
> or
>>>> + * (at your option) any later version.
>>>> + *
>>>> + * 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.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public
>>>> License along
>>>> + * with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#ifndef RTL2832_PRIV_H
>>>> +#define RTL2832_PRIV_H
>>>> +
>>>> +#include "dvb_frontend.h"
>>>> +#include "rtl2832.h"
>>>> +
>>>> +#define LOG_PREFIX "rtl2832"
>>>> +
>>>> +#undef dbg
>>>> +#define dbg(f, arg...) \
>>>> + if (rtl2832_debug) \
>>>> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> ERROR: Macros with complex values should be enclosed in parenthesis
>>> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
>>> +#define dbg(f, arg...) \
>>> + if (rtl2832_debug) \
>>> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>
>>>> +#undef err
>>>> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ##
>>>> arg)
>>>> +#undef info
>>>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ##
> arg)
>>>> +#undef warn
>>>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>>>> ## arg)
>>>> +
>>>> +struct rtl2832_priv {
>>>> + struct i2c_adapter *i2c;
>>>> + struct dvb_frontend fe;
>>>> + struct rtl2832_config cfg;
>>>> +
>>>> + bool i2c_gate_state;
>>>> + bool sleeping;
>>>> +
>>>> + u8 tuner;
>>>> + u8 page; /* active register page */
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_entry {
>>>> + u8 page;
>>>> + u8 start_address;
>>>> + u8 msb;
>>>> + u8 lsb;
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_value {
>>>> + int reg;
>>>
>>> As this reg is enum I wonder if it is possible to use enum as a type
>>> (enum reg)? Still I am not sure about it and I dont like to test it :)
>>>
>>>> + u32 value;
>>>> +};
>>>> +
>>>> +
>>>> +/* Demod register bit names */
>>>> +enum DVBT_REG_BIT_NAME {
>>>> + DVBT_SOFT_RST,
>>>> + DVBT_IIC_REPEAT,
>>>> + DVBT_TR_WAIT_MIN_8K,
>>>> + DVBT_RSD_BER_FAIL_VAL,
>>>> + DVBT_EN_BK_TRK,
>>>> + DVBT_REG_PI,
>>>> + DVBT_REG_PFREQ_1_0,
>>>> + DVBT_PD_DA8,
>>>> + DVBT_LOCK_TH,
>>>> + DVBT_BER_PASS_SCAL,
>>>> + DVBT_CE_FFSM_BYPASS,
>>>> + DVBT_ALPHAIIR_N,
>>>> + DVBT_ALPHAIIR_DIF,
>>>> + DVBT_EN_TRK_SPAN,
>>>> + DVBT_LOCK_TH_LEN,
>>>> + DVBT_CCI_THRE,
>>>> + DVBT_CCI_MON_SCAL,
>>>> + DVBT_CCI_M0,
>>>> + DVBT_CCI_M1,
>>>> + DVBT_CCI_M2,
>>>> + DVBT_CCI_M3,
>>>> + DVBT_SPEC_INIT_0,
>>>> + DVBT_SPEC_INIT_1,
>>>> + DVBT_SPEC_INIT_2,
>>>> + DVBT_AD_EN_REG,
>>>> + DVBT_AD_EN_REG1,
>>>> + DVBT_EN_BBIN,
>>>> + DVBT_MGD_THD0,
>>>> + DVBT_MGD_THD1,
>>>> + DVBT_MGD_THD2,
>>>> + DVBT_MGD_THD3,
>>>> + DVBT_MGD_THD4,
>>>> + DVBT_MGD_THD5,
>>>> + DVBT_MGD_THD6,
>>>> + DVBT_MGD_THD7,
>>>> + DVBT_EN_CACQ_NOTCH,
>>>> + DVBT_AD_AV_REF,
>>>> + DVBT_PIP_ON,
>>>> + DVBT_SCALE1_B92,
>>>> + DVBT_SCALE1_B93,
>>>> + DVBT_SCALE1_BA7,
>>>> + DVBT_SCALE1_BA9,
>>>> + DVBT_SCALE1_BAA,
>>>> + DVBT_SCALE1_BAB,
>>>> + DVBT_SCALE1_BAC,
>>>> + DVBT_SCALE1_BB0,
>>>> + DVBT_SCALE1_BB1,
>>>> + DVBT_KB_P1,
>>>> + DVBT_KB_P2,
>>>> + DVBT_KB_P3,
>>>> + DVBT_OPT_ADC_IQ,
>>>> + DVBT_AD_AVI,
>>>> + DVBT_AD_AVQ,
>>>> + DVBT_K1_CR_STEP12,
>>>> + DVBT_TRK_KS_P2,
>>>> + DVBT_TRK_KS_I2,
>>>> + DVBT_TR_THD_SET2,
>>>> + DVBT_TRK_KC_P2,
>>>> + DVBT_TRK_KC_I2,
>>>> + DVBT_CR_THD_SET2,
>>>> + DVBT_PSET_IFFREQ,
>>>> + DVBT_SPEC_INV,
>>>> + DVBT_BW_INDEX,
>>>> + DVBT_RSAMP_RATIO,
>>>> + DVBT_CFREQ_OFF_RATIO,
>>>> + DVBT_FSM_STAGE,
>>>> + DVBT_RX_CONSTEL,
>>>> + DVBT_RX_HIER,
>>>> + DVBT_RX_C_RATE_LP,
>>>> + DVBT_RX_C_RATE_HP,
>>>> + DVBT_GI_IDX,
>>>> + DVBT_FFT_MODE_IDX,
>>>> + DVBT_RSD_BER_EST,
>>>> + DVBT_CE_EST_EVM,
>>>> + DVBT_RF_AGC_VAL,
>>>> + DVBT_IF_AGC_VAL,
>>>> + DVBT_DAGC_VAL,
>>>> + DVBT_SFREQ_OFF,
>>>> + DVBT_CFREQ_OFF,
>>>> + DVBT_POLAR_RF_AGC,
>>>> + DVBT_POLAR_IF_AGC,
>>>> + DVBT_AAGC_HOLD,
>>>> + DVBT_EN_RF_AGC,
>>>> + DVBT_EN_IF_AGC,
>>>> + DVBT_IF_AGC_MIN,
>>>> + DVBT_IF_AGC_MAX,
>>>> + DVBT_RF_AGC_MIN,
>>>> + DVBT_RF_AGC_MAX,
>>>> + DVBT_IF_AGC_MAN,
>>>> + DVBT_IF_AGC_MAN_VAL,
>>>> + DVBT_RF_AGC_MAN,
>>>> + DVBT_RF_AGC_MAN_VAL,
>>>> + DVBT_DAGC_TRG_VAL,
>>>> + DVBT_AGC_TARG_VAL,
>>>> + DVBT_LOOP_GAIN_3_0,
>>>> + DVBT_LOOP_GAIN_4,
>>>> + DVBT_VTOP,
>>>> + DVBT_KRF,
>>>> + DVBT_AGC_TARG_VAL_0,
>>>> + DVBT_AGC_TARG_VAL_8_1,
>>>> + DVBT_AAGC_LOOP_GAIN,
>>>> + DVBT_LOOP_GAIN2_3_0,
>>>> + DVBT_LOOP_GAIN2_4,
>>>> + DVBT_LOOP_GAIN3,
>>>> + DVBT_VTOP1,
>>>> + DVBT_VTOP2,
>>>> + DVBT_VTOP3,
>>>> + DVBT_KRF1,
>>>> + DVBT_KRF2,
>>>> + DVBT_KRF3,
>>>> + DVBT_KRF4,
>>>> + DVBT_EN_GI_PGA,
>>>> + DVBT_THD_LOCK_UP,
>>>> + DVBT_THD_LOCK_DW,
>>>> + DVBT_THD_UP1,
>>>> + DVBT_THD_DW1,
>>>> + DVBT_INTER_CNT_LEN,
>>>> + DVBT_GI_PGA_STATE,
>>>> + DVBT_EN_AGC_PGA,
>>>> + DVBT_CKOUTPAR,
>>>> + DVBT_CKOUT_PWR,
>>>> + DVBT_SYNC_DUR,
>>>> + DVBT_ERR_DUR,
>>>> + DVBT_SYNC_LVL,
>>>> + DVBT_ERR_LVL,
>>>> + DVBT_VAL_LVL,
>>>> + DVBT_SERIAL,
>>>> + DVBT_SER_LSB,
>>>> + DVBT_CDIV_PH0,
>>>> + DVBT_CDIV_PH1,
>>>> + DVBT_MPEG_IO_OPT_2_2,
>>>> + DVBT_MPEG_IO_OPT_1_0,
>>>> + DVBT_CKOUTPAR_PIP,
>>>> + DVBT_CKOUT_PWR_PIP,
>>>> + DVBT_SYNC_LVL_PIP,
>>>> + DVBT_ERR_LVL_PIP,
>>>> + DVBT_VAL_LVL_PIP,
>>>> + DVBT_CKOUTPAR_PID,
>>>> + DVBT_CKOUT_PWR_PID,
>>>> + DVBT_SYNC_LVL_PID,
>>>> + DVBT_ERR_LVL_PID,
>>>> + DVBT_VAL_LVL_PID,
>>>> + DVBT_SM_PASS,
>>>> + DVBT_UPDATE_REG_2,
>>>> + DVBT_BTHD_P3,
>>>> + DVBT_BTHD_D3,
>>>> + DVBT_FUNC4_REG0,
>>>> + DVBT_FUNC4_REG1,
>>>> + DVBT_FUNC4_REG2,
>>>> + DVBT_FUNC4_REG3,
>>>> + DVBT_FUNC4_REG4,
>>>> + DVBT_FUNC4_REG5,
>>>> + DVBT_FUNC4_REG6,
>>>> + DVBT_FUNC4_REG7,
>>>> + DVBT_FUNC4_REG8,
>>>> + DVBT_FUNC4_REG9,
>>>> + DVBT_FUNC4_REG10,
>>>> + DVBT_FUNC5_REG0,
>>>> + DVBT_FUNC5_REG1,
>>>> + DVBT_FUNC5_REG2,
>>>> + DVBT_FUNC5_REG3,
>>>> + DVBT_FUNC5_REG4,
>>>> + DVBT_FUNC5_REG5,
>>>> + DVBT_FUNC5_REG6,
>>>> + DVBT_FUNC5_REG7,
>>>> + DVBT_FUNC5_REG8,
>>>> + DVBT_FUNC5_REG9,
>>>> + DVBT_FUNC5_REG10,
>>>> + DVBT_FUNC5_REG11,
>>>> + DVBT_FUNC5_REG12,
>>>> + DVBT_FUNC5_REG13,
>>>> + DVBT_FUNC5_REG14,
>>>> + DVBT_FUNC5_REG15,
>>>> + DVBT_FUNC5_REG16,
>>>> + DVBT_FUNC5_REG17,
>>>> + DVBT_FUNC5_REG18,
>>>> + DVBT_AD7_SETTING,
>>>> + DVBT_RSSI_R,
>>>> + DVBT_ACI_DET_IND,
>>>> + DVBT_REG_MON,
>>>> + DVBT_REG_MONSEL,
>>>> + DVBT_REG_GPE,
>>>> + DVBT_REG_GPO,
>>>> + DVBT_REG_4MSEL,
>>>> + DVBT_TEST_REG_1,
>>>> + DVBT_TEST_REG_2,
>>>> + DVBT_TEST_REG_3,
>>>> + DVBT_TEST_REG_4,
>>>> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>>>> +};
>>>> +
>>>> +#endif /* RTL2832_PRIV_H */
>>>
>>>
>>
>> checkpatch.pl:
>> author Joe Perches <joe@perches.com>
>> Fri, 11 May 2012 00:59:25 +0000 (10:59 +1000)
>> committer Stephen Rothwell <sfr@canb.auug.org.au>
>> Thu, 17 May 2012 07:18:17 +0000 (17:18 +1000)
>>
>>
> http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commit;h=2a7561d6bbf29c631ad05a8fabe313142ba3d7d0
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832.c-v2.diff
>> total: 0 errors, 0 warnings, 63 lines checked
>>
>> rtl2832.c-v2.diff has no obvious style problems and is ready for
> submission.
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832.h.diff
>> total: 0 errors, 0 warnings, 8 lines checked
>>
>> rtl2832.h.diff has no obvious style problems and is ready for submission.
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832_priv.h.diff
>> total: 0 errors, 0 warnings, 17 lines checked
>>
>> rtl2832_priv.h.diff has no obvious style problems and is ready for
>> submission.
>>
>> ./checkpatch.pl --no-tree --file rtl2832.c
>> total: 0 errors, 0 warnings, 824 lines checked
>>
>> rtl2832.c has no obvious style problems and is ready for submission.
>>
>> ./checkpatch.pl --no-tree --file rtl2832.h
>> total: 0 errors, 0 warnings, 74 lines checked
>>
>> rtl2832.h has no obvious style problems and is ready for submission.
>>
>> ./checkpatch.pl --no-tree --file rtl2832_priv.h
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2832_priv.h:30:
>> +#define dbg(f, arg...) \
>> + if (rtl2832_debug) \
>> + pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>
>> total: 1 errors, 0 warnings, 258 lines checked
>>
>> rtl2832_priv.h has style problems, please review.
>>
>> If any of these errors are false positives, please report
>> them to the maintainer, see CHECKPATCH in MAINTAINERS.
>>
>>
>> Regarding "ERROR: Macros with complex values should be enclosed in
>> parenthesis":
>>
>> ./checkpatch.pl --no-tree --file *_priv.h | grep -A 1 "ERROR: Macros
>> with complex values"
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #35: FILE: af9013_priv.h:35:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #241: FILE: bcm3510_priv.h:241:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #242: FILE: bcm3510_priv.h:242:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #243: FILE: bcm3510_priv.h:243:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #244: FILE: bcm3510_priv.h:244:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #245: FILE: bcm3510_priv.h:245:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #246: FILE: bcm3510_priv.h:246:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #247: FILE: bcm3510_priv.h:247:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #33: FILE: cxd2820r_priv.h:33:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #24: FILE: dib3000mb_priv.h:24:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #34: FILE: hd29l2_priv.h:34:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2830_priv.h:30:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2832_priv.h:30:
>> […]
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #69: FILE: stb0899_priv.h:69:
>> […]
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #31: FILE: tda10071_priv.h:31:
>>
>> E voilà!
>>
>> cheers,
>> poma
>>
>> ps.
>> CHECKPATCH
>> M: Andy Whitcroft <apw@canonical.com>
>> S: Supported
>> F: scripts/checkpatch.pl
> Thanks.
> What about your changes of printk to pr_*? Is that the right way to go for
> error messages and debuging?
>
> Regards
> Thomas
>
grep -R 'pr_info\|pr_warn\|pr_err' * > suggest-pr_level.txt
It's latest suggestion from 'checkpatch' and as you can see in
'suggest-pr_level.txt' already present. So far as I am concerned, give
it a go!
;)
cheers,
poma
[-- Attachment #2: suggest-pr_level.txt --]
[-- Type: text/plain, Size: 61968 bytes --]
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("No memory\n");
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("%s: Could not find a Twinhan DST\n", __func__);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("Frontend registration failed!\n");
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_register_adapter failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_dmxdev_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("dvb_net_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("Unknown bttv card type: %d\n", sub->core->type);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("no pci device for card %d\n", card->bttv_nr);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("unable to determine DMA core of card %d,\n", card->bttv_nr);
media/dvb/bt8xx/dvb-bt8xx.c: pr_err("if you have the ALSA bt87x audio driver installed, try removing it.\n");
media/dvb/ttpci/av7110_v4l.c: pr_info("DVB-C analog module @ card %d detected, initializing MSP3400\n",
media/dvb/ttpci/av7110_v4l.c: pr_info("DVB-C analog module @ card %d detected, initializing MSP3415\n",
media/dvb/ttpci/av7110_v4l.c: pr_info("saa7113 not accessible\n");
media/dvb/ttpci/budget-av.c: pr_info("cam ejected 1\n");
media/dvb/ttpci/budget-av.c: pr_info("cam ejected 2\n");
media/dvb/ttpci/budget-av.c: pr_info("cam ejected 3\n");
media/dvb/ttpci/budget-av.c: pr_info("cam ejected 5\n");
media/dvb/ttpci/budget-av.c: pr_info("cam inserted A\n");
media/dvb/ttpci/budget-av.c: pr_info("cam inserted B\n");
media/dvb/ttpci/budget-av.c: pr_info("cam ejected 5\n");
media/dvb/ttpci/budget-av.c: pr_err("ci initialisation failed\n");
media/dvb/ttpci/budget-av.c: pr_info("ci interface initialised\n");
media/dvb/ttpci/budget-av.c: pr_err("A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
media/dvb/ttpci/budget-av.c: pr_err("Frontend registration failed!\n");
media/dvb/ttpci/budget-av.c: pr_err("KNC1-%d: Could not read MAC from KNC1 card\n",
media/dvb/ttpci/budget-av.c: pr_info("KNC1-%d: MAC addr = %pM\n",
media/dvb/ttusb-dec/ttusbdecfe.c: pr_info("%s: returned unknown value: %d\n",
media/dvb/frontends/rtl2832.h: pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
media/dvb/frontends/rtl2830.h: pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
media/dvb/frontends/rtl2832_priv.h: pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define err(f, arg...) pr_err(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define info(f, arg...) pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define warn(f, arg...) pr_warn(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
media/rc/redrat3.c: pr_info("%s:\n", __func__);
media/rc/redrat3.c: pr_info(" * length: %u, transfer_type: 0x%02x\n",
media/rc/redrat3.c: pr_info(" * pause: %u, freq_count: %u, no_periods: %u\n",
media/rc/redrat3.c: pr_info(" * lengths: %u (max: %u)\n",
media/rc/redrat3.c: pr_info(" * sig_size: %u (max: %u)\n",
media/rc/redrat3.c: pr_info(" * repeats: %u\n", header->no_repeats);
media/rc/redrat3.c: pr_info("%s:", __func__);
media/rc/redrat3.c: pr_err("%s called with no context!\n", __func__);
media/rc/redrat3.c: pr_err("%s called with invalid context!\n", __func__);
media/rc/imon.c: pr_err("could not find interface for minor %d\n", subminor);
media/rc/imon.c: pr_err("no context found for minor %d\n", subminor);
media/rc/imon.c: pr_err("display not supported by device\n");
media/rc/imon.c: pr_err("display port is already open\n");
media/rc/imon.c: pr_err("no context for device\n");
media/rc/imon.c: pr_err("display not supported by device\n");
media/rc/imon.c: pr_err("display is not open\n");
media/rc/imon.c: pr_err_ratelimited("error submitting urb(%d)\n", retval);
media/rc/imon.c: pr_err_ratelimited("task interrupted\n");
media/rc/imon.c: pr_err_ratelimited("packet tx failed (%d)\n", retval);
media/rc/imon.c: pr_err("no context for device\n");
media/rc/imon.c: pr_err("no iMON device present\n");
media/rc/imon.c: pr_err("no context for device\n");
media/rc/imon.c: pr_err("send_packet failed for packet %d\n", i);
media/rc/imon.c: pr_err_ratelimited("no context for device\n");
media/rc/imon.c: pr_err_ratelimited("no iMON device present\n");
media/rc/imon.c: pr_err_ratelimited("invalid payload size\n");
media/rc/imon.c: pr_err_ratelimited("send packet #%d failed\n", seq / 2);
media/rc/imon.c: pr_err_ratelimited("send packet #%d failed\n", seq / 2);
media/rc/imon.c: pr_err_ratelimited("no context for device\n");
media/rc/imon.c: pr_err_ratelimited("no iMON display present\n");
media/rc/imon.c: pr_err_ratelimited("invalid payload size: %d (expected 8)\n",
media/rc/imon.c: pr_err_ratelimited("send packet failed!\n");
media/rc/imon.c: pr_err("no valid input (IR) endpoint found\n");
media/rc/imon.c: pr_err("usb_submit_urb failed for intf0 (%d)\n", ret);
media/rc/imon.c: pr_err("usb_alloc_urb failed for IR urb\n");
media/rc/imon.c: pr_err("usb_submit_urb failed for intf1 (%d)\n", ret);
media/rc/imon.c: pr_err("failed to initialize context!\n");
media/rc/imon.c: pr_err("failed to attach to context!\n");
media/rc/imon.c: pr_err("Could not create RF sysfs entries(%d)\n",
media/rc/winbond-cir.c: pr_err("Invalid power-on protocol\n");
media/rc/winbond-cir.c: pr_err("Unable to register driver\n");
media/rc/ene_ir.c: pr_warn("device seems to be disabled\n");
media/rc/ene_ir.c: pr_warn("send a mail to lirc-list@lists.sourceforge.net\n");
media/rc/ene_ir.c: pr_warn("please attach output of acpidump and dmidecode\n");
media/rc/ene_ir.c: pr_warn("chips 0x33xx aren't supported\n");
media/rc/ene_ir.c: pr_warn("Error validating extra buffers, device probably won't work\n");
media/rc/ene_ir.c: pr_warn("TX: transmitter cable isn't connected!\n");
media/rc/ene_ir.c: pr_warn("TX: BUG: attempt to transmit NULL buffer\n");
media/rc/ene_ir.c: pr_warn("Simulation of TX activated\n");
media/common/saa7146_i2c.c: pr_warn("%s %s [irq]: timed out waiting for end of xfer\n",
media/common/saa7146_i2c.c: pr_warn("%s %s: timed out waiting for MC2\n",
media/common/saa7146_i2c.c: pr_warn("%s %s [poll]: timed out waiting for end of xfer\n",
media/common/saa7146_i2c.c: pr_info("revision 0 error. this should never happen\n");
media/common/saa7146_fops.c: pr_info("%s: registered device %s [v4l2]\n",
media/common/tuners/tda18212.c: pr_info("%s: " fmt, __func__, ##arg); \
media/common/tuners/tda18212.c: pr_warn("i2c wr failed ret:%d reg:%02x len:%d\n",
media/common/tuners/tda18212.c: pr_warn("i2c rd failed ret:%d reg:%02x len:%d\n",
media/common/tuners/tda18212.c: pr_info("NXP TDA18212HN successfully identified\n");
media/common/tuners/tda18271-priv.h:#define tda_info(fmt, arg...) pr_info(fmt, ##arg)
media/common/saa7146_core.c: pr_info(" @ %li jiffies:\n", jiffies);
media/common/saa7146_core.c: pr_info("0x%03x: 0x%08x\n", i, saa7146_read(dev, i));
media/common/saa7146_core.c: pr_err("%s: %s timed out while waiting for registers getting programmed\n",
media/common/saa7146_core.c: pr_err("%s: %s timed out while waiting for registers getting programmed\n",
media/common/saa7146_core.c: pr_warn("%s: unexpected i2c irq: isr %08x psr %08x ssr %08x\n",
media/common/saa7146_core.c: pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n",
media/common/saa7146_core.c: pr_info("register extension '%s'\n", ext->name);
media/common/saa7146_core.c: pr_info("unregister extension '%s'\n", ext->name);
media/radio/radio-wl1273.c: pr_err("Cannot allocate memory for RDS buffer.\n");
media/radio/wl128x/fmdrv_rx.c: pr_info("Frequency is set to (%d) but "
media/radio/radio-keene.c: pr_err(KBUILD_MODNAME
media/video/usbvision/usbvision-video.c: pr_err("%s: usb_get_intfdata() failed\n", __func__);
media/video/v4l2-subdev.c: pr_info("%s: ================= START STATUS =================\n",
media/video/v4l2-subdev.c: pr_info("%s: ================== END STATUS ==================\n",
media/video/bt8xx/bttv-gpio.c: pr_info("%d: add subdevice \"%s\"\n", core->nr, dev_name(&sub->dev));
media/video/bt8xx/bttv-i2c.c: pr_info("%d: i2c: checking for %s @ 0x%02x... ",
media/video/bt8xx/bttv-i2c.c: pr_warn("%d: i2c read 0x%x: error\n",
media/video/bt8xx/bttv-i2c.c: pr_info("%s: i2c scan: found device @ 0x%x [%s]\n",
media/video/bt8xx/bttv-driver.c: pr_err("BUG! (btres)\n");
media/video/bt8xx/bttv-driver.c: pr_info("%d: PLL can sleep, using XTAL (%d)\n",
media/video/bt8xx/bttv-driver.c: pr_info("%d: Setting PLL: %d => %d (needs up to 100ms)\n",
media/video/bt8xx/bttv-driver.c: pr_info("PLL set ok\n");
media/video/bt8xx/bttv-driver.c: pr_info("Setting PLL failed\n");
media/video/bt8xx/bttv-driver.c: pr_info("%d: reset, reinitialize\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
media/video/bt8xx/bttv-driver.c: pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
media/video/bt8xx/bttv-driver.c: pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
media/video/bt8xx/bttv-driver.c: pr_info("%s: 0x%lx: ",
media/video/bt8xx/bttv-driver.c: pr_info("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
media/video/bt8xx/bttv-driver.c: pr_info(" main: %08llx\n", (unsigned long long)btv->main.dma);
media/video/bt8xx/bttv-driver.c: pr_info(" vbi : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c: pr_info(" cap : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c: pr_info(" scr : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c: pr_warn("%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
media/video/bt8xx/bttv-driver.c: pr_info("%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
media/video/bt8xx/bttv-driver.c: pr_info("%d: %s%s @ %08x,",
media/video/bt8xx/bttv-driver.c: pr_info("%d: FDSR @ %08x\n",
media/video/bt8xx/bttv-driver.c: pr_err("%d: IRQ lockup, cleared int mask [",
media/video/bt8xx/bttv-driver.c: pr_err("%d: IRQ lockup, clearing GPINT from int mask [",
media/video/bt8xx/bttv-driver.c: pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c: pr_err("%d: device_create_file 'card' failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c: pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c: pr_info("Bt8xx card found (%d)\n", bttv_num);
media/video/bt8xx/bttv-driver.c: pr_err("out of memory\n");
media/video/bt8xx/bttv-driver.c: pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_warn("%d: No suitable DMA available\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_warn("%d: can't request iomem (0x%llx)\n",
media/video/bt8xx/bttv-driver.c: pr_warn("%d: v4l2_device_register() failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_info("%d: Bt%d (rev %d) at %s, irq: %d, latency: %d, mmio: 0x%llx\n",
media/video/bt8xx/bttv-driver.c: pr_err("%d: ioremap() failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_err("%d: can't get IRQ %d\n",
media/video/bt8xx/bttv-driver.c: pr_info("%d: unloading\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c: pr_info("driver version %s loaded\n", BTTV_VERSION);
media/video/bt8xx/bttv-driver.c: pr_info("using %d buffers with %dk (%d pages) each for capture\n",
media/video/bt8xx/bttv-driver.c: pr_warn("bus_register error: %d\n", ret);
media/video/bt8xx/bttv-cards.c: pr_info("%d: detected: %s [card=%d], PCI subsystem ID is %04x:%04x\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: subsystem: %04x:%04x (UNKNOWN)\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: using: %s [card=%d,%s]\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: gpio config override: mask=0x%x, mux=",
media/video/bt8xx/bttv-cards.c: pr_info("%d: detected by eeprom: %s [card=%d]\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: FlyVideo_gpio: unknown tuner type\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: radio detected by subsystem id (CPH05x)\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: tuner absent\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: tuner type unset\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: the autoload option is obsolete\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n",
media/video/bt8xx/bttv-cards.c: pr_warn("%d: unknown audiodev value!\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Modtec: Unknown TunerString: %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Hauppauge eeprom indicates model#%d\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Switching board type from %s to %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Terratec Active Radio Upgrade found\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("%d: altera firmware upload %s\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: osprey eeprom: unknown card type 0x%04x\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: osprey eeprom: card=%d '%s' serial=%u\n",
media/video/bt8xx/bttv-cards.c: pr_warn("%d: osprey eeprom: Not overriding user specified card type\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: osprey eeprom: Changing card type from %d to %d\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Avermedia eeprom[0x%02x%02x]: tuner=",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Hauppauge/Voodoo msp34xx: reset line init [%d]\n",
media/video/bt8xx/bttv-cards.c: pr_info("Setting DAC reference voltage level ...\n");
media/video/bt8xx/bttv-cards.c: pr_info("Initialising 12C508 PIC chip ...\n");
media/video/bt8xx/bttv-cards.c: pr_info("I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n",
media/video/bt8xx/bttv-cards.c: pr_info("PXC200 Initialised\n");
media/video/bt8xx/bttv-cards.c: pr_info("%d: Adlink RTV-24 initialisation in progress ...\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: Adlink RTV-24 initialisation complete\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_warn("%d: tea5757: read timeout\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("Host bridge needs ETBF enabled\n");
media/video/bt8xx/bttv-cards.c: pr_info("Host bridge needs VSFX enabled\n");
media/video/bt8xx/bttv-cards.c: pr_info("bttv and your chipset may not work together\n");
media/video/bt8xx/bttv-cards.c: pr_info("overlay will be disabled\n");
media/video/bt8xx/bttv-cards.c: pr_info("overlay forced. Use this option at your own risk.\n");
media/video/bt8xx/bttv-cards.c: pr_info("pci latency fixup [%d]\n", latency);
media/video/bt8xx/bttv-cards.c: pr_info("Host bridge: 82441FX Natoma, bufcon=0x%02x\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: enabling ETBF (430FX/VP3 compatibility)\n",
media/video/bt8xx/bttv-cards.c: pr_info("%d: enabling VSFX\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c: pr_info("%d: setting pci timer to %d\n",
media/video/bt8xx/bttv-input.c: pr_info(fmt, ##__VA_ARGS__); \
media/video/bt8xx/bttv-input.c: pr_info(DEVNAME ":"
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_warn("%s(): Audio Received Overflow Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_warn("%s(): Audio Received Sync Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_warn("%s(): Audio Received OpCode Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_warn("EOF Channel Audio Framecount = %d\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("ERROR: %s() fifo is NOT turned on. Timeout!\n",
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s: can't get upstream IRQ %d\n", dev->name,
media/video/cx25821/cx25821-audio-upstream.c: pr_warn("Audio Channel is still running so return!\n");
media/video/cx25821/cx25821-audio-upstream.c: pr_err("%s: Failed to set up Audio upstream buffers!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("No video file is currently running so return!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s(): File has no READ operations registered! Returning\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("FAILED to allocate memory for Risc buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("FAILED to allocate memory for data buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("Failed creating Video Upstream Risc programs!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("EOF Channel 2 Framecount = %d\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s: can't get upstream IRQ %d\n",
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_info("Video Channel is still running so return!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("create_singlethread_workqueue() for Video FAILED!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c: pr_err("%s: Failed to set up Video upstream buffers!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_info("No video file is currently running so return!\n");
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): File has no READ operations registered! Returning\n",
media/video/cx25821/cx25821-video-upstream.c: pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("FAILED to allocate memory for Risc buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream.c: pr_err("FAILED to allocate memory for data buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream.c: pr_info("Failed creating Video Upstream Risc programs!\n");
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): Video Received Underflow Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): Video Received Sync Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s(): Video Received OpCode Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c: pr_err("EOF Channel 1 Framecount = %d\n", dev->_frame_count);
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s: can't get upstream IRQ %d\n",
media/video/cx25821/cx25821-video-upstream.c: pr_info("Video Channel is still running so return!\n");
media/video/cx25821/cx25821-video-upstream.c: pr_err("create_singlethread_workqueue() for Video FAILED!\n");
media/video/cx25821/cx25821-video-upstream.c: pr_err("%s: Failed to set up Video upstream buffers!\n",
media/video/cx25821/cx25821.h: pr_err("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821.h: pr_warn("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821.h: pr_info("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821-alsa.c: pr_info("%s/1: " fmt, chip->dev->name, ##arg); \
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG: Start audio DMA, %d B/line, cmds_start(0x%x)= %d lines/FIFO, %d periods, %d byte buffer\n",
media/video/cx25821/cx25821-alsa.c: pr_warn("WARNING %s/1: Audio risc op code error\n", dev->name);
media/video/cx25821/cx25821-alsa.c: pr_warn("WARNING %s: Downstream sync error!\n", dev->name);
media/video/cx25821/cx25821-alsa.c: pr_err("DEBUG: cx25821 can't find device struct. Can't proceed with open\n");
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG: ERROR after cx25821_risc_databuffer_audio()\n");
media/video/cx25821/cx25821-alsa.c: pr_info("ERROR: FAILED snd_pcm_new() in %s\n", __func__);
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG ERROR: devno >= SNDRV_CARDS %s\n", __func__);
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG ERROR: !enable[devno] %s\n", __func__);
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG ERROR: cannot create snd_card_new in %s\n",
media/video/cx25821/cx25821-alsa.c: pr_err("ERROR %s: can't get IRQ %d for ALSA\n", chip->dev->name,
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG ERROR: cannot create snd_cx25821_pcm %s\n",
media/video/cx25821/cx25821-alsa.c: pr_info("%s/%i: ALSA support for cx25821 boards\n", card->driver,
media/video/cx25821/cx25821-alsa.c: pr_info("DEBUG ERROR: cannot register sound card %s\n",
media/video/cx25821/cx25821-alsa.c: pr_info("ERROR ALSA: no cx25821 cards found\n");
media/video/cx25821/cx25821-medusa-video.c: pr_info("%s(): width %d > MAX_WIDTH %d ! resetting to MAX_WIDTH\n",
media/video/cx25821/cx25821-i2c.c: pr_err(" ERR: %d\n", retval);
media/video/cx25821/cx25821-i2c.c: pr_err(" ERR: %d\n", retval);
media/video/cx25821/cx25821-video.c: pr_err("%s(0x%08x) NOT FOUND\n", __func__, fourcc);
media/video/cx25821/cx25821-video.c: pr_err("%s: %d buffers handled (should be 1)\n", __func__, bc);
media/video/cx25821/cx25821-video.c: pr_warn("%s, %s: video risc op code error\n",
media/video/cx25821/cx25821-video.c: pr_warn("device %d released!\n", chan_num);
media/video/cx25821/cx25821-video.c: pr_info("%s/2: ============ START LOG STATUS ============\n",
media/video/cx25821/cx25821-video.c: pr_info("Video input 0 is %s\n",
media/video/cx25821/cx25821-video.c: pr_info("%s/2: ============= END LOG STATUS =============\n",
media/video/cx25821/cx25821-video.c: pr_err("Invalid fh pointer!\n");
media/video/cx25821/cx25821-video.c: pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c: pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c: pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c: pr_err("%s(): User data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-core.c: pr_warn("%s: %s - dma channel status dump\n", dev->name, ch->name);
media/video/cx25821/cx25821-core.c: pr_warn("cmds + 0x%2x: %-15s: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn("cmds + 0x%2x: risc%d: ", j + i * 4, i);
media/video/cx25821/cx25821-core.c: pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
media/video/cx25821/cx25821-core.c: pr_warn("ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : fifo: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ctrl: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ptr1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ptr2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : cnt1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : cnt2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_info("\n%s: %s - dma Audio channel status dump\n",
media/video/cx25821/cx25821-core.c: pr_info("%s: cmds + 0x%2x: %-15s: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn("cmds + 0x%2x: risc%d: ", j + i * 4, i);
media/video/cx25821/cx25821-core.c: pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
media/video/cx25821/cx25821-core.c: pr_warn("ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : fifo: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ctrl: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ptr1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : ptr2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : cnt1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn(" : cnt2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c: pr_warn("instruction %d = 0x%x\n", i, risc);
media/video/cx25821/cx25821-core.c: pr_warn("\nread cdt loc=0x%x\n", risc);
media/video/cx25821/cx25821-core.c: pr_err("%s: can't get MMIO memory @ 0x%llx\n",
media/video/cx25821/cx25821-core.c: pr_info("%s(): Hardware revision = 0x%02x\n",
media/video/cx25821/cx25821-core.c: pr_info("\n***********************************\n");
media/video/cx25821/cx25821-core.c: pr_info("cx25821 set up\n");
media/video/cx25821/cx25821-core.c: pr_info("***********************************\n\n");
media/video/cx25821/cx25821-core.c: pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
media/video/cx25821/cx25821-core.c: pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
media/video/cx25821/cx25821-core.c: pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
media/video/cx25821/cx25821-core.c: pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
media/video/cx25821/cx25821-core.c: pr_err("%s(): Failed to register video adapter for IOCTL, so unregistering videoioctl device\n",
media/video/cx25821/cx25821-core.c: pr_info("pci enable failed!\n");
media/video/cx25821/cx25821-core.c: pr_info("Athena pci enable !\n");
media/video/cx25821/cx25821-core.c: pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
media/video/cx25821/cx25821-core.c: pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
media/video/cx25821/cx25821-core.c: pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
media/video/cx25821/cx25821-core.c: pr_info("cx25821_initdev() can't get IRQ !\n");
media/video/cx25821/cx25821-core.c: pr_info("driver version %d.%d.%d loaded\n",
media/video/sh_vou.c: pr_warning("%s(): Invalid bus-format code %d, using default 8-bit\n",
media/video/v4l2-ioctl.c.orig: pr_info("%s: ================= START STATUS =================\n",
media/video/v4l2-ioctl.c.orig: pr_info("%s: ================== END STATUS ==================\n",
media/video/blackfin/ppi.c: pr_err("Unable to allocate DMA channel for PPI\n");
media/video/blackfin/ppi.c: pr_err("Unable to allocate IRQ for PPI\n");
media/video/blackfin/ppi.c: pr_err("request peripheral failed\n");
media/video/blackfin/ppi.c: pr_err("unable to allocate memory for ppi handle\n");
media/video/blackfin/ppi.c: pr_info("ppi probe success\n");
media/video/gspca/sn9c20x.c: pr_err("Read register %02x failed %d\n", reg, result);
media/video/gspca/sn9c20x.c: pr_err("Write register %02x failed %d\n", reg, result);
media/video/gspca/sn9c20x.c: pr_err("i2c_w error\n");
media/video/gspca/sn9c20x.c: pr_err("i2c_w reg %02x no response\n", buffer[2]);
media/video/gspca/sn9c20x.c: pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id);
media/video/gspca/sn9c20x.c: pr_err("OV9650 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("OV9655 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("SOI968 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("OV7660 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("OV7670 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("MT9V011 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_info("MT9V011 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_err("MT9V111 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_info("MT9V111 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_err("MT9V112 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_info("MT9V112 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_err("MT9M112 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("MT9M111 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_info("MT9M001 color sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("MT9M001 mono sensor detected\n");
media/video/gspca/sn9c20x.c: pr_err("No MT9M001 chip detected, ID = %x\n\n", id);
media/video/gspca/sn9c20x.c: pr_err("MT9M001 sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("HV7131R Sensor initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("Could not initialize controls\n");
media/video/gspca/sn9c20x.c: pr_err("Device initialization failed\n");
media/video/gspca/sn9c20x.c: pr_err("Device initialization failed\n");
media/video/gspca/sn9c20x.c: pr_info("OV9650 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("OV9655 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("SOI968 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("OV7660 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("OV7670 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("MT9VPRB sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("MT9M111 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("MT9M112 sensor detected\n");
media/video/gspca/sn9c20x.c: pr_info("HV7131R sensor detected\n");
media/video/gspca/sn9c20x.c: pr_err("Unsupported sensor\n");
media/video/gspca/sn9c20x.c: pr_warn("sn9c20x camera with unknown number of alt "
media/video/gspca/sn9c20x.c: pr_info("Set 1280x1024\n");
media/video/gspca/sn9c20x.c: pr_info("Set 640x480\n");
media/video/gspca/sn9c20x.c: pr_info("Set 320x240\n");
media/video/gspca/sn9c20x.c: pr_info("Set 160x120\n");
media/video/gspca/sq905.c: pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c: pr_err("%s: usb_control_msg failed 2 (%d)\n", __func__, ret);
media/video/gspca/sq905.c: pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c: pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c: pr_err("bulk read fail (%d) len %d/%d\n", ret, act_len, size);
media/video/gspca/sq905.c: pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/vicam.c: pr_err("control msg req %02X error %d\n", request, ret);
media/video/gspca/vicam.c: pr_err("bulk read fail (%d) len %d/%d\n",
media/video/gspca/vicam.c: pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/vicam.c: pr_err("Failed to load \"vicam/firmware.fw\": %d\n", ret);
media/video/gspca/sn9c2028.c: pr_err("command write [%02x] error %d\n",
media/video/gspca/sn9c2028.c: pr_err("read1 error %d\n", rc);
media/video/gspca/sn9c2028.c: pr_err("read4 error %d\n", rc);
media/video/gspca/sn9c2028.c: pr_err("long command status read error %d\n", status);
media/video/gspca/sn9c2028.c: pr_err("Starting unknown camera, please report this\n");
media/video/gspca/jl2005bcd.c: pr_err("command write [%02x] error %d\n",
media/video/gspca/jl2005bcd.c: pr_err("read command [0x%02x] error %d\n",
media/video/gspca/jl2005bcd.c: pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/jl2005bcd.c: pr_err("First block is not the first block\n");
media/video/gspca/jl2005bcd.c: pr_err("Unknown resolution specified\n");
media/video/gspca/spca508.c: pr_err("reg write: error %d\n", ret);
media/video/gspca/spca508.c: pr_err("reg_read err %d\n", ret);
media/video/gspca/ov519.c: pr_err("reg_w %02x failed %d\n", index, ret);
media/video/gspca/ov519.c: pr_err("reg_r %02x failed %d\n", index, ret);
media/video/gspca/ov519.c: pr_err("reg_r8 %02x failed %d\n", index, ret);
media/video/gspca/ov519.c: pr_err("reg_w32 %02x failed %d\n", index, ret);
media/video/gspca/ov519.c: pr_err("ovfx2_i2c_w %02x failed %d\n", reg, ret);
media/video/gspca/ov519.c: pr_err("ovfx2_i2c_r %02x failed %d\n", reg, ret);
media/video/gspca/ov519.c: pr_err("error hires sensors only supported with ovfx2\n");
media/video/gspca/ov519.c: pr_err("Error unknown sensor type: %02x%02x\n", high, low);
media/video/gspca/ov519.c: pr_err("Unknown image sensor version: %d\n", rc & 3);
media/video/gspca/ov519.c: pr_err("Error detecting sensor type\n");
media/video/gspca/ov519.c: pr_err("Error detecting camera chip PID\n");
media/video/gspca/ov519.c: pr_err("Error detecting camera chip VER\n");
media/video/gspca/ov519.c: pr_err("Sensor is an OV7630/OV7635\n");
media/video/gspca/ov519.c: pr_err("7630 is not supported by this driver\n");
media/video/gspca/ov519.c: pr_err("Unknown sensor: 0x76%02x\n", low);
media/video/gspca/ov519.c: pr_err("Unknown image sensor version: %d\n", rc & 3);
media/video/gspca/ov519.c: pr_err("Error detecting sensor type\n");
media/video/gspca/ov519.c: pr_warn("WARNING: Sensor is an OV66308. Your camera may have been misdetected in previous driver versions.\n");
media/video/gspca/ov519.c: pr_warn("WARNING: Sensor is an OV66307. Your camera may have been misdetected in previous driver versions.\n");
media/video/gspca/ov519.c: pr_err("FATAL: Unknown sensor version: 0x%02x\n", rc);
media/video/gspca/ov519.c: pr_err("Can't determine sensor slave IDs\n");
media/video/gspca/ov519.c: pr_err("Couldn't get altsetting\n");
media/video/gspca/ov519.c: pr_err("Couldn't get altsetting\n");
media/video/gspca/finepix.c: pr_err("init failed %d\n", ret);
media/video/gspca/finepix.c: pr_err("usb_bulk_msg failed %d\n", ret);
media/video/gspca/finepix.c: pr_err("frame request failed %d\n", ret);
media/video/gspca/sq905c.c: pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905c.c: pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905c.c: pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/spca501.c: pr_err("reg write: error %d\n", ret);
media/video/gspca/mr97310a.c: pr_err("reg write [%02x] error %d\n",
media/video/gspca/mr97310a.c: pr_err("reg read [%02x] error %d\n",
media/video/gspca/mr97310a.c: pr_err("Unknown CIF Sensor id : %02x\n",
media/video/gspca/mr97310a.c: pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
media/video/gspca/mr97310a.c: pr_err("Defaults assumed, may not work\n");
media/video/gspca/mr97310a.c: pr_err("Please report this\n");
media/video/gspca/mr97310a.c: pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
media/video/gspca/mr97310a.c: pr_err("Defaults assumed, may not work\n");
media/video/gspca/mr97310a.c: pr_err("Please report this\n");
media/video/gspca/conex.c: pr_err("reg_r: buffer overflow\n");
media/video/gspca/conex.c: pr_err("reg_w: buffer overflow\n");
media/video/gspca/t613.c: pr_err("Out of memory\n");
media/video/gspca/t613.c: pr_err("Out of memory\n");
media/video/gspca/t613.c: pr_err("Bad sensor reset %02x\n", byte);
media/video/gspca/t613.c: pr_err("unknown sensor %04x\n", sensor_id);
media/video/gspca/t613.c: pr_err("Bad sensor reset %02x\n", test_byte);
media/video/gspca/spca561.c: pr_err("reg write: error %d\n", ret);
media/video/gspca/gspca.c: pr_err("Resubmit URB failed with error %i\n", ret);
media/video/gspca/gspca.c: pr_err("Input device registration failed with error %i\n",
media/video/gspca/gspca.c: pr_err("ISOC data error: [%d] len=%d, status=%d\n",
media/video/gspca/gspca.c: pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/gspca.c: pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/gspca.c: pr_err("gspca_frame_add() image == NULL\n");
media/video/gspca/gspca.c: pr_err("frame alloc failed\n");
media/video/gspca/gspca.c: pr_err("set alt 0 err %d\n", ret);
media/video/gspca/gspca.c: pr_err("alt %d iso endp with 0 interval\n", j);
media/video/gspca/gspca.c: pr_err("usb_alloc_urb failed\n");
media/video/gspca/gspca.c: pr_err("usb_alloc_coherent failed\n");
media/video/gspca/gspca.c: pr_err("bad altsetting %d\n", gspca_dev->alt);
media/video/gspca/gspca.c: pr_err("no transfer endpoint found\n");
media/video/gspca/gspca.c: pr_err("set alt %d err %d\n", alt, ret);
media/video/gspca/gspca.c: pr_err("usb_submit_urb alt %d err %d\n",
media/video/gspca/gspca.c: pr_err("no transfer endpoint found\n");
media/video/gspca/gspca.c: pr_info("%s-" GSPCA_VERSION " probing %04x:%04x\n",
media/video/gspca/gspca.c: pr_err("couldn't kzalloc gspca struct\n");
media/video/gspca/gspca.c: pr_err("out of memory\n");
media/video/gspca/gspca.c: pr_err("video_register_device err %d\n", ret);
media/video/gspca/gspca.c: pr_err("%04x:%04x too many config\n",
media/video/gspca/gspca.c: pr_info("v" GSPCA_VERSION " registered\n");
media/video/gspca/spca505.c: pr_err("reg write: error %d\n", ret);
media/video/gspca/spca505.c: pr_err("After vector read returns 0x%04x should be 0x0101\n",
media/video/gspca/kinect.c: pr_err("send_cmd: Invalid command length (0x%x)\n", cmd_len);
media/video/gspca/kinect.c: pr_err("send_cmd: Output control transfer failed (%d)\n", res);
media/video/gspca/kinect.c: pr_err("send_cmd: Input control transfer failed (%d)\n", res);
media/video/gspca/kinect.c: pr_err("send_cmd: Bad magic %02x %02x\n",
media/video/gspca/kinect.c: pr_err("send_cmd: Bad cmd %02x != %02x\n",
media/video/gspca/kinect.c: pr_err("send_cmd: Bad tag %04x != %04x\n",
media/video/gspca/kinect.c: pr_err("send_cmd: Bad len %04x != %04x\n",
media/video/gspca/kinect.c: pr_warn("send_cmd: Data buffer is %d bytes long, but got %d bytes\n",
media/video/gspca/kinect.c: pr_warn("send_cmd returned %d [%04x %04x], 0000 expected\n",
media/video/gspca/kinect.c: pr_warn("[Stream %02x] Invalid magic %02x%02x\n",
media/video/gspca/kinect.c: pr_warn("Packet type not recognized...\n");
media/video/gspca/nw80x.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/nw80x.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/nw80x.c: pr_err("Bad webcam type %d for NW80%d\n",
media/video/gspca/konica.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/konica.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/konica.c: pr_err("Couldn't get altsetting\n");
media/video/gspca/konica.c: pr_err("usb_alloc_urb failed\n");
media/video/gspca/konica.c: pr_err("usb_buffer_alloc failed\n");
media/video/gspca/konica.c: pr_err("resubmit urb error %d\n", st);
media/video/gspca/konica.c: pr_err("usb_submit_urb(status_urb) ret %d\n", st);
media/video/gspca/ov534.c: pr_err("write failed %d\n", ret);
media/video/gspca/ov534.c: pr_err("read failed %d\n", ret);
media/video/gspca/ov534.c: pr_err("sccb_reg_write failed\n");
media/video/gspca/ov534.c: pr_err("sccb_reg_read failed 1\n");
media/video/gspca/ov534.c: pr_err("sccb_reg_read failed 2\n");
media/video/gspca/pac207.c: pr_err("Failed to write registers to index 0x%04X, error %d\n",
media/video/gspca/pac207.c: pr_err("Failed to write a register (index 0x%04X, value 0x%02X, error %d)\n",
media/video/gspca/pac207.c: pr_err("Failed to read a register (index 0x%04X, error %d)\n",
media/video/gspca/pac207.c: pr_err("Could not initialize controls\n");
media/video/gspca/pac7302.c: pr_err("reg_w_buf failed i: %02x error %d\n",
media/video/gspca/pac7302.c: pr_err("reg_w() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7302.c: pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7311.c.orig: pr_err("reg_w_buf() failed index 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig: pr_err("reg_w() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig: pr_err("reg_w_page() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig: pr_err("Could not initialize controls\n");
media/video/gspca/ov534_9.c: pr_err("reg_w failed %d\n", ret);
media/video/gspca/ov534_9.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/ov534_9.c: pr_err("sccb_write failed\n");
media/video/gspca/ov534_9.c: pr_err("sccb_read failed 1\n");
media/video/gspca/ov534_9.c: pr_err("sccb_read failed 2\n");
media/video/gspca/spca500.c: pr_err("reg write: error %d\n", ret);
media/video/gspca/spca500.c: pr_err("reg_r_12 err %d\n", ret);
media/video/gspca/jeilinj.c: pr_err("command write [%02x] error %d\n",
media/video/gspca/jeilinj.c: pr_err("read command [%02x] error %d\n",
media/video/gspca/cpia1.c: pr_err("usb_control_msg %02x, error %d\n", command[1], ret);
media/video/gspca/cpia1.c: pr_err("ReadVPRegs(30,4,9,8) - failed: %d\n", ret);
media/video/gspca/m5602/m5602_core.c: pr_info("ALi m5602 address 0x%x contains 0x%x\n", i, val);
media/video/gspca/m5602/m5602_core.c: pr_info("Warning: The ALi m5602 webcam probably won't work until it's power cycled\n");
media/video/gspca/m5602/m5602_core.c: pr_info("Failed to find a sensor\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("Forcing a %s sensor\n", po1030.name);
media/video/gspca/m5602/m5602_po1030.c: pr_info("Detected a po1030 sensor\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("Dumping the po1030 sensor core registers\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_po1030.c: pr_info("po1030 register state dump complete\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_po1030.c: pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_po1030.c: pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_ov7660.c: pr_info("Forcing an %s sensor\n", ov7660.name);
media/video/gspca/m5602/m5602_ov7660.c: pr_info("Sensor reported 0x%x%x\n", prod_id, ver_id);
media/video/gspca/m5602/m5602_ov7660.c: pr_info("Detected a ov7660 sensor\n");
media/video/gspca/m5602/m5602_ov7660.c: pr_info("Dumping the ov7660 register state\n");
media/video/gspca/m5602/m5602_ov7660.c: pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_ov7660.c: pr_info("ov7660 register state dump complete\n");
media/video/gspca/m5602/m5602_ov7660.c: pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_ov7660.c: pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_ov7660.c: pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Forcing a %s sensor\n", s5k4aa.name);
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Detected a s5k4aa sensor\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_err("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_err("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Dumping the s5k4aa register state for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("register 0x%x contains 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("s5k4aa register state dump complete\n");
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Probing for which registers that are read/write for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("register 0x%x is writeable\n",
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("register 0x%x is read only\n",
media/video/gspca/m5602/m5602_s5k4aa.c: pr_info("Read/write register probing complete\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Forcing a %s sensor\n", mt9m111.name);
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Detected a mt9m111 sensor\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Dumping the mt9m111 register state\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Dumping the mt9m111 sensor core registers\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Dumping the mt9m111 color pipeline registers\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("Dumping the mt9m111 camera control registers\n");
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c: pr_info("mt9m111 register state dump complete\n");
media/video/gspca/m5602/m5602_ov9650.c: pr_info("Forcing an %s sensor\n", ov9650.name);
media/video/gspca/m5602/m5602_ov9650.c: pr_info("Detected an ov9650 sensor\n");
media/video/gspca/m5602/m5602_ov9650.c: pr_info("Dumping the ov9650 register state\n");
media/video/gspca/m5602/m5602_ov9650.c: pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_ov9650.c: pr_info("ov9650 register state dump complete\n");
media/video/gspca/m5602/m5602_ov9650.c: pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_ov9650.c: pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_ov9650.c: pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Forcing a %s sensor\n", s5k83a.name);
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Detected a s5k83a sensor\n");
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Camera was flipped\n");
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Dumping the s5k83a register state for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("register 0x%x contains 0x%x\n", address, val);
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("s5k83a register state dump complete\n");
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Probing for which registers that are read/write for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("register 0x%x is writeable\n",
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("register 0x%x is read only\n",
media/video/gspca/m5602/m5602_s5k83a.c: pr_info("Read/write register probing complete\n");
media/video/gspca/pac7302.c.orig: pr_err("reg_w_buf failed i: %02x error %d\n",
media/video/gspca/pac7302.c.orig: pr_err("reg_w() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7302.c.orig: pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
media/video/gspca/vc032x.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/vc032x.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/vc032x.c: pr_err("I2c Bus Busy Wait %02x\n", gspca_dev->usb_buf[0]);
media/video/gspca/vc032x.c: pr_err("i2c_write timeout\n");
media/video/gspca/vc032x.c: pr_err("Unknown sensor...\n");
media/video/gspca/se401.c: pr_err("write req failed req %#04x val %#04x error %d\n",
media/video/gspca/se401.c: pr_err("USB_BUF_SZ too small!!\n");
media/video/gspca/se401.c: pr_err("read req failed req %#04x error %d\n",
media/video/gspca/se401.c: pr_err("set feature failed sel %#04x param %#04x error %d\n",
media/video/gspca/se401.c: pr_err("USB_BUF_SZ too small!!\n");
media/video/gspca/se401.c: pr_err("get feature failed sel %#04x error %d\n",
media/video/gspca/se401.c: pr_err("Wrong descriptor type\n");
media/video/gspca/se401.c: pr_err("Bayer format not supported!\n");
media/video/gspca/se401.c: pr_info("ExtraFeatures: %d\n", cd[3]);
media/video/gspca/se401.c: pr_err("Too many frame sizes\n");
media/video/gspca/se401.c: pr_info("Frame size: %dx%d bayer\n",
media/video/gspca/se401.c: pr_info("Frame size: %dx%d 1/%dth janggu\n",
media/video/gspca/se401.c: pr_err("invalid packet len %d restarting stream\n",
media/video/gspca/se401.c: pr_err("unknown frame info value restarting stream\n");
media/video/gspca/se401.c: pr_err("frame size %d expected %d\n",
media/video/gspca/etoms.c: pr_err("reg_r: buffer overflow\n");
media/video/gspca/etoms.c: pr_err("reg_w: buffer overflow\n");
media/video/gspca/spca1528.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/spca1528.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/spca1528.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/mars.c: pr_err("reg write [%02x] error %d\n",
media/video/gspca/mars.c: pr_err("Could not initialize controls\n");
media/video/gspca/gl860/gl860.c: pr_err("ctrl transfer failed %4d [p%02x r%d v%04x i%04x len%d]\n",
media/video/gspca/gspca.h: pr_info(fmt, ##__VA_ARGS__); \
media/video/gspca/benq.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/benq.c: pr_err("usb_alloc_urb failed\n");
media/video/gspca/benq.c: pr_err("usb_alloc_coherent failed\n");
media/video/gspca/benq.c: pr_err("urb status: %d\n", urb->status);
media/video/gspca/benq.c: pr_err("ISOC data error: [%d] status=%d\n",
media/video/gspca/benq.c: pr_err("usb_submit_urb(0) ret %d\n", st);
media/video/gspca/benq.c: pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/sq930x.c: pr_err("reg_r %04x failed %d\n", value, ret);
media/video/gspca/sq930x.c: pr_err("reg_w %04x %04x failed %d\n", value, index, ret);
media/video/gspca/sq930x.c: pr_err("reg_wb %04x %04x failed %d\n", value, index, ret);
media/video/gspca/sq930x.c: pr_err("i2c_write failed %d\n", ret);
media/video/gspca/sq930x.c: pr_err("Bug: usb_buf overflow\n");
media/video/gspca/sq930x.c: pr_err("ucbus_write failed %d\n", ret);
media/video/gspca/sq930x.c: pr_err("Unknown sensor\n");
media/video/gspca/sq930x.c: pr_err("Sensor %s not yet treated\n",
media/video/gspca/sq930x.c: pr_err("sd_dq_callback() err %d\n", ret);
media/video/gspca/zc3xx.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/zc3xx.c: pr_err("reg_w_i err %d\n", ret);
media/video/gspca/zc3xx.c: pr_err("i2c_r status error %02x\n", retbyte);
media/video/gspca/zc3xx.c: pr_err("i2c_w status error %02x\n", retbyte);
media/video/gspca/zc3xx.c: pr_err("Could not initialize controls\n");
media/video/gspca/zc3xx.c: pr_warn("Unknown sensor - set to TAS5130C\n");
media/video/gspca/zc3xx.c: pr_err("Unknown sensor %04x\n", sensor);
media/video/gspca/stv06xx/stv06xx_st6422.c: pr_info("st6422 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_pb0100.c: pr_info("Photobit pb0100 sensor detected\n");
media/video/gspca/stv06xx/stv06xx.c: pr_err("I2C: Read error writing address: %d\n", err);
media/video/gspca/stv06xx/stv06xx.c: pr_info("Dumping all stv06xx bridge registers\n");
media/video/gspca/stv06xx/stv06xx.c: pr_info("Read 0x%x from address 0x%x\n", data, i);
media/video/gspca/stv06xx/stv06xx.c: pr_info("Testing stv06xx bridge registers for writability\n");
media/video/gspca/stv06xx/stv06xx.c: pr_info("Register 0x%x is read/write\n", i);
media/video/gspca/stv06xx/stv06xx.c: pr_info("Register 0x%x is read/write, but only partially\n",
media/video/gspca/stv06xx/stv06xx.c: pr_info("Register 0x%x is read-only\n", i);
media/video/gspca/stv06xx/stv06xx_vv6410.c: pr_info("vv6410 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_vv6410.c: pr_info("Dumping all vv6410 sensor registers\n");
media/video/gspca/stv06xx/stv06xx_vv6410.c: pr_info("Register 0x%x contained 0x%x\n", i, data);
media/video/gspca/stv06xx/stv06xx_hdcs.c: pr_info("HDCS-1000/1100 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c: pr_info("HDCS-1020 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c: pr_info("Dumping sensor registers:\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c: pr_info("reg 0x%02x = 0x%02x\n", reg, val);
media/video/gspca/pac7311.c: pr_err("reg_w_buf() failed index 0x%02x, error %d\n",
media/video/gspca/pac7311.c: pr_err("reg_w() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c: pr_err("reg_w_page() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c: pr_err("Could not initialize controls\n");
media/video/gspca/stk014.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/stk014.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/stk014.c: pr_err("rcv_val err %d\n", ret);
media/video/gspca/stk014.c: pr_err("snd_val err %d\n", ret);
media/video/gspca/stk014.c: pr_err("init reg: 0x%02x\n", ret);
media/video/gspca/stk014.c: pr_err("set intf %d %d failed\n",
media/video/gspca/sonixj.c: pr_err("reg_r: buffer overflow\n");
media/video/gspca/sonixj.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/sonixj.c: pr_err("reg_w1 err %d\n", ret);
media/video/gspca/sonixj.c: pr_err("reg_w: buffer overflow\n");
media/video/gspca/sonixj.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/sonixj.c: pr_err("i2c_w1 err %d\n", ret);
media/video/gspca/sonixj.c: pr_err("i2c_w8 err %d\n", ret);
media/video/gspca/sonixj.c: pr_warn("Erroneous HV7131R ID 0x%02x 0x%02x 0x%02x\n",
media/video/gspca/sonixj.c: pr_err("Unknown sensor %04x\n", val);
media/video/gspca/sonixj.c: pr_err("Unknown sensor ID %04x\n", val);
media/video/gspca/xirlink_cit.c: pr_err("Failed to write a register (index 0x%04X, value 0x%02X, error %d)\n",
media/video/gspca/xirlink_cit.c: pr_err("Failed to read a register (index 0x%04X, error %d)\n",
media/video/gspca/xirlink_cit.c: pr_err("Couldn't get altsetting\n");
media/video/gspca/xirlink_cit.c: pr_err("set alt 1 err %d\n", ret);
media/video/gspca/w996Xcf.c: pr_err("Write FSB registers failed (%d)\n", ret);
media/video/gspca/w996Xcf.c: pr_err("Write SB reg [01] %04x failed\n", value);
media/video/gspca/w996Xcf.c: pr_err("Read SB reg [01] failed\n");
media/video/gspca/sunplus.c: pr_err("reg_r: buffer overflow\n");
media/video/gspca/sunplus.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/sunplus.c: pr_err("reg_w_1 err %d\n", ret);
media/video/gspca/sunplus.c: pr_err("reg_w_riv err %d\n", ret);
media/video/gspca/topro.c: pr_err("reg_w err %d\n", ret);
media/video/gspca/topro.c: pr_err("reg_r err %d\n", ret);
media/video/gspca/topro.c: pr_err("bulk write error %d tag=%02x\n",
media/video/gspca/topro.c: pr_warn("Unknown sensor %d - forced to soi763a\n",
media/video/gspca/topro.c: pr_info("Sensor soi763a\n");
media/video/gspca/topro.c: pr_info("Sensor cx0342\n");
media/video/gspca/topro.c: pr_err("bulk err %d\n", ret);
media/video/gspca/topro.c: pr_err("bulk err %d\n", ret);
media/video/gspca/stv0680.c: pr_err("usb_control_msg error %i, request = 0x%x, error = %i\n",
media/video/gspca/stv0680.c: pr_err("Could not get descriptor 0100\n");
media/video/hdpvr/hdpvr-video.c: pr_err("open failing with with ENODEV\n");
media/video/mx2_emmaprp.c: pr_err("Instance released before the end of transaction\n");
media/video/mx2_emmaprp.c: pr_err("PrP bus error ocurred, this transfer is probably corrupted\n");
media/video/mxb.c: pr_err("did not find all i2c devices. aborting\n");
media/video/mxb.c: pr_info("'sound arena module' detected\n");
media/video/mxb.c: pr_err("VIDIOC_S_INPUT: could not address saa7111a\n");
media/video/mxb.c: pr_info("found Multimedia eXtension Board #%d\n", mxb_num);
media/video/pvrusb2/pvrusb2-v4l2.c.orig: pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c.orig: pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev"
media/video/pvrusb2/pvrusb2-v4l2.c.orig: pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c: pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c: pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev"
media/video/pvrusb2/pvrusb2-v4l2.c: pr_err(KBUILD_MODNAME
media/video/v4l2-ioctl.c: pr_info("%s: ================= START STATUS =================\n",
media/video/v4l2-ioctl.c: pr_info("%s: ================== END STATUS ==================\n",
media/video/hexium_orion.c: pr_err("hexium_probe: not enough kernel memory\n");
media/video/hexium_orion.c: pr_info("device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs\n");
media/video/hexium_orion.c: pr_info("device is a Hexium Orion w/ 4 BNC inputs\n");
media/video/hexium_orion.c: pr_info("device is a Hexium HV-PCI6/Orion (old)\n");
media/video/hexium_orion.c: pr_err("failed for address 0x%02x\n", i);
media/video/hexium_orion.c: pr_err("cannot register capture v4l2 device. skipping.\n");
media/video/hexium_orion.c: pr_err("found 'hexium orion' frame grabber-%d\n", hexium_num);
media/video/mx3_camera.c: pr_err("Couldn't map %x@%x\n", resource_size(res), res->start);
media/video/videobuf-dma-contig.c: pr_err("magic mismatch: %x expected %x\n", (is), (should)); \
media/video/videobuf2-vmalloc.c: pr_err("Address of an unallocated plane requested "
media/video/videobuf2-vmalloc.c: pr_err("No memory to map\n");
media/video/videobuf2-vmalloc.c: pr_err("Remapping vmalloc memory, error: %d\n", ret);
media/video/hexium_gemini.c: pr_err("hexium_init_done() failed for address 0x%02x\n",
media/video/hexium_gemini.c: pr_err("hexium_init_done: hexium_set_standard() failed for address 0x%02x\n",
media/video/hexium_gemini.c: pr_err("not enough kernel memory in hexium_attach()\n");
media/video/hexium_gemini.c: pr_err("cannot register capture v4l2 device. skipping.\n");
media/video/hexium_gemini.c: pr_info("found 'hexium gemini' frame grabber-%d\n", hexium_num);
media/video/pms.c: pr_err("PMS: not enabled, use pms.enable=1 to probe\n");
media/video/s5p-jpeg/jpeg-core.c: pr_err("%s data will not fit into plane (%lu < %lu)\n",
media/video/s5p-jpeg/jpeg-core.c: pr_info("S5P JPEG V4L2 Driver, (c) 2011 Samsung Electronics\n");
media/video/s5p-jpeg/jpeg-core.c: pr_err("%s: failed to register jpeg driver\n", __func__);
media/video/sn9c102/sn9c102.h: pr_info("sn9c102: " fmt "\n", ## args); \
staging/media/as102/as102_drv.c: pr_info("Registered device %s", as102_dev->name);
staging/media/as102/as102_drv.c: pr_info("Unregistered device %s", as102_dev->name);
staging/media/as102/as102_usb_drv.c: pr_info("%s: device has been disconnected\n", DRIVER_NAME);
staging/media/as102/as102_usb_drv.c: pr_err("Device names table invalid size");
staging/media/as102/as102_usb_drv.c: pr_info("%s: device has been detected\n", DRIVER_NAME);
staging/media/as102/as102_usb_drv.c: pr_err("%s: can't find device for minor %d\n",
staging/media/as102/as102_fw.c: pr_err("invalid firmware file\n");
staging/media/as102/as102_fw.c: pr_err("%s: unable to locate firmware file: %s\n",
staging/media/as102/as102_fw.c: pr_err("%s: error during firmware upload part1\n",
staging/media/as102/as102_fw.c: pr_info("%s: firmware: %s loaded with success\n",
staging/media/as102/as102_fw.c: pr_err("%s: unable to locate firmware file: %s\n",
staging/media/as102/as102_fw.c: pr_err("%s: error during firmware upload part2\n",
staging/media/as102/as102_fw.c: pr_info("%s: firmware: %s loaded with success\n",
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-18 9:15 ` poma
@ 2012-05-18 10:38 ` poma
2012-05-18 12:38 ` Antti Palosaari
0 siblings, 1 reply; 53+ messages in thread
From: poma @ 2012-05-18 10:38 UTC (permalink / raw)
To: Antti Palosaari; +Cc: Thomas Mair, linux-media
[-- Attachment #1: Type: text/plain, Size: 372 bytes --]
[…]
printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
pr_err(LOG_PREFIX": " f "\n" , ## arg)
printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
pr_info(LOG_PREFIX": " f "\n" , ## arg)
printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
pr_warn(LOG_PREFIX": " f "\n" , ## arg)
Besides what 'checkpatch' suggest/output - Antti, is it a correct
conversions?
cheers,
poma
[-- Attachment #2: rtl2832_priv.h-v2.diff --]
[-- Type: text/x-patch, Size: 798 bytes --]
--- rtl2832_priv.h.orig 2012-05-18 02:02:48.561114101 +0200
+++ rtl2832_priv.h 2012-05-18 12:20:45.000000000 +0200
@@ -29,13 +29,13 @@
#undef dbg
#define dbg(f, arg...) \
if (rtl2832_debug) \
- printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+ pr_info(LOG_PREFIX": " f "\n" , ## arg)
#undef err
-#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
+#define err(f, arg...) pr_err(LOG_PREFIX": " f "\n" , ## arg)
#undef info
-#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#define info(f, arg...) pr_info(LOG_PREFIX": " f "\n" , ## arg)
#undef warn
-#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+#define warn(f, arg...) pr_warn(LOG_PREFIX": " f "\n" , ## arg)
struct rtl2832_priv {
struct i2c_adapter *i2c;
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-18 10:38 ` poma
@ 2012-05-18 12:38 ` Antti Palosaari
2012-05-18 13:26 ` poma
0 siblings, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 12:38 UTC (permalink / raw)
To: poma; +Cc: Thomas Mair, linux-media
On 18.05.2012 13:38, poma wrote:
> […]
>
> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>
> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>
> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>
> Besides what 'checkpatch' suggest/output - Antti, is it a correct
> conversions?
I haven't looked those pr_err/pr_info/pr_warn, but what I did for
af9035/af9033 was I used pr_debug as a debug writings since it seems to
be choice of today.
I still suspect those pr_* functions should be used instead own macros.
Currently documentation mentions only pr_debug and pr_info.
regards
Antit
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-18 12:38 ` Antti Palosaari
@ 2012-05-18 13:26 ` poma
2012-05-18 17:46 ` Thomas Mair
0 siblings, 1 reply; 53+ messages in thread
From: poma @ 2012-05-18 13:26 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
On 05/18/2012 02:38 PM, Antti Palosaari wrote:
> On 18.05.2012 13:38, poma wrote:
>> […]
>>
>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>
>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>
>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>
>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>> conversions?
>
>
> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
> af9035/af9033 was I used pr_debug as a debug writings since it seems to
> be choice of today.
>
> I still suspect those pr_* functions should be used instead own macros.
> Currently documentation mentions only pr_debug and pr_info.
>
> regards
> Antit
OK, thanks Antti!
Thomas, dropping 'rtl2832_priv.h.diff' & 'rtl2832_priv.h-v2.diff'
Please leave 'rtl2832_priv.h' as it is.
And there you go…
cheers,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-18 13:26 ` poma
@ 2012-05-18 17:46 ` Thomas Mair
2012-05-18 17:51 ` Antti Palosaari
0 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 17:46 UTC (permalink / raw)
To: poma; +Cc: Antti Palosaari, linux-media
On 18.05.2012 15:26, poma wrote:
> On 05/18/2012 02:38 PM, Antti Palosaari wrote:
>> On 18.05.2012 13:38, poma wrote:
>>> […]
>>>
>>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>>> conversions?
>>
>>
>> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
>> af9035/af9033 was I used pr_debug as a debug writings since it seems to
>> be choice of today.
>>
>> I still suspect those pr_* functions should be used instead own macros.
>> Currently documentation mentions only pr_debug and pr_info.
>>
>> regards
>> Antit
>
> OK, thanks Antti!
> Thomas, dropping 'rtl2832_priv.h.diff' & 'rtl2832_priv.h-v2.diff'
> Please leave 'rtl2832_priv.h' as it is.
> And there you go…
>
> cheers,
> poma
Alright. One last question though.
I seem incapable of removing the checkpatch error with the parentheses.
How should that be done properly? Should do something like do { ... } while(0)
or is there a more elegant solution?
Regrads
Thomas
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
2012-05-18 17:46 ` Thomas Mair
@ 2012-05-18 17:51 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 17:51 UTC (permalink / raw)
To: Thomas Mair; +Cc: poma, linux-media
On 18.05.2012 20:46, Thomas Mair wrote:
> On 18.05.2012 15:26, poma wrote:
>> On 05/18/2012 02:38 PM, Antti Palosaari wrote:
>>> On 18.05.2012 13:38, poma wrote:
>>>> […]
>>>>
>>>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>>>> conversions?
>>>
>>>
>>> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
>>> af9035/af9033 was I used pr_debug as a debug writings since it seems to
>>> be choice of today.
>>>
>>> I still suspect those pr_* functions should be used instead own macros.
>>> Currently documentation mentions only pr_debug and pr_info.
>>>
>>> regards
>>> Antit
>>
>> OK, thanks Antti!
>> Thomas, dropping 'rtl2832_priv.h.diff'& 'rtl2832_priv.h-v2.diff'
>> Please leave 'rtl2832_priv.h' as it is.
>> And there you go…
>>
>> cheers,
>> poma
>
> Alright. One last question though.
>
> I seem incapable of removing the checkpatch error with the parentheses.
> How should that be done properly? Should do something like do { ... } while(0)
> or is there a more elegant solution?
I have seen that do { ... } while(0) many times in Kernel sources so it
is likely the proper solution.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 0/5] support for rtl2832
[not found] <1>
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
` (6 more replies)
1 sibling, 7 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair
Good Evening!
This is the corrected version of the patch series to support the
RTL2832 demodulator. There where no major changes. The majority of
the changes consist in fixing style issues and adhering to proper
naming conventions.
The next question for me is how to proceed when including new
devices. Poma already sent an extensive list a little while
ago (http://patchwork.linuxtv.org/patch/10982/). Should they
all be included at once, or should I wait until somone confirms
they are working correctly and include them one by one?
Regards
Thomas
Thomas Mair (5):
rtl2832 ver. 0.5: support for RTL2832 demod
rtl28xxu: support for the rtl2832 demod driver
rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
rtl28xxu: support Delock USB 2.0 DVB-T
rtl28xxu: support Terratec Noxon DAB/DAB+ stick
drivers/media/dvb/dvb-usb/Kconfig | 3 +
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 3 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 516 ++++++++++++++++--
drivers/media/dvb/frontends/Kconfig | 7 +
drivers/media/dvb/frontends/Makefile | 1 +
drivers/media/dvb/frontends/rtl2832.c | 823 ++++++++++++++++++++++++++++
drivers/media/dvb/frontends/rtl2832.h | 74 +++
drivers/media/dvb/frontends/rtl2832_priv.h | 260 +++++++++
8 files changed, 1638 insertions(+), 49 deletions(-)
create mode 100644 drivers/media/dvb/frontends/rtl2832.c
create mode 100644 drivers/media/dvb/frontends/rtl2832.h
create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
--
1.7.7.6
^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 20:21 ` Antti Palosaari
2012-07-05 14:32 ` Mauro Carvalho Chehab
2012-05-18 18:47 ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
` (5 subsequent siblings)
6 siblings, 2 replies; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair
Changelog for ver. 0.5:
- fixed code style and naming errors
Changelog for ver. 0.4:
- removed statistics as their calculation was wrong
- fixed bug in Makefile
- indentation and code style improvements
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/frontends/Kconfig | 7 +
drivers/media/dvb/frontends/Makefile | 1 +
drivers/media/dvb/frontends/rtl2832.c | 823 ++++++++++++++++++++++++++++
drivers/media/dvb/frontends/rtl2832.h | 74 +++
drivers/media/dvb/frontends/rtl2832_priv.h | 260 +++++++++
5 files changed, 1165 insertions(+), 0 deletions(-)
create mode 100644 drivers/media/dvb/frontends/rtl2832.c
create mode 100644 drivers/media/dvb/frontends/rtl2832.h
create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index f479834..f7d67d7 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -432,6 +432,13 @@ config DVB_RTL2830
help
Say Y when you want to support this frontend.
+config DVB_RTL2832
+ tristate "Realtek RTL2832 DVB-T"
+ depends on DVB_CORE && I2C
+ default m if DVB_FE_CUSTOMISE
+ help
+ Say Y when you want to support this frontend.
+
comment "DVB-C (cable) frontends"
depends on DVB_CORE
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index b0381dc..2279c5d 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
obj-$(CONFIG_DVB_A8293) += a8293.o
obj-$(CONFIG_DVB_TDA10071) += tda10071.o
obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
+obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
obj-$(CONFIG_DVB_AF9033) += af9033.o
diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
new file mode 100644
index 0000000..d0cbe27
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.c
@@ -0,0 +1,823 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "rtl2832_priv.h"
+
+
+int rtl2832_debug;
+module_param_named(debug, rtl2832_debug, int, 0644);
+MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
+
+
+static const int reg_mask[32] = {
+ 0x00000001,
+ 0x00000003,
+ 0x00000007,
+ 0x0000000f,
+ 0x0000001f,
+ 0x0000003f,
+ 0x0000007f,
+ 0x000000ff,
+ 0x000001ff,
+ 0x000003ff,
+ 0x000007ff,
+ 0x00000fff,
+ 0x00001fff,
+ 0x00003fff,
+ 0x00007fff,
+ 0x0000ffff,
+ 0x0001ffff,
+ 0x0003ffff,
+ 0x0007ffff,
+ 0x000fffff,
+ 0x001fffff,
+ 0x003fffff,
+ 0x007fffff,
+ 0x00ffffff,
+ 0x01ffffff,
+ 0x03ffffff,
+ 0x07ffffff,
+ 0x0fffffff,
+ 0x1fffffff,
+ 0x3fffffff,
+ 0x7fffffff,
+ 0xffffffff
+};
+
+static const struct rtl2832_reg_entry registers[] = {
+ [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
+ [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
+ [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
+ [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
+ [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
+ [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
+ [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
+ [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
+ [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
+ [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
+ [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
+ [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
+ [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
+ [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
+ [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
+ [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
+ [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
+ [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
+ [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
+ [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
+ [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
+ [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
+ [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
+ [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
+ [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
+ [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
+ [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
+ [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
+ [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
+ [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
+ [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
+ [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
+ [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
+ [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
+ [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
+ [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
+ [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
+ [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
+ [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
+ [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
+ [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
+ [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
+ [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
+ [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
+ [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
+ [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
+ [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
+ [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
+ [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
+ [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
+ [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
+ [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
+ [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
+ [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
+ [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
+ [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
+ [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
+ [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
+ [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
+ [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
+ [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
+ [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
+ [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
+ [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
+ [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
+ [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
+ [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
+ [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
+ [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
+ [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
+ [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
+ [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
+ [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
+ [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
+ [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
+ [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
+ [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
+ [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
+ [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
+ [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
+ [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
+ [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
+ [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
+ [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
+ [DVBT_KRF2] = {0x1, 0x7, 7, 0},
+ [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
+ [DVBT_KRF4] = {0x1, 0xce, 7, 0},
+ [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
+ [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
+ [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
+ [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
+ [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
+ [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
+ [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
+ [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
+ [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
+ [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
+ [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
+ [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
+ [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
+ [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
+ [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
+ [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
+ [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
+ [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
+ [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
+ [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
+ [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
+ [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
+ [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
+ [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
+ [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
+ [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
+ [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
+ [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
+ [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
+ [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
+ [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
+ [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
+ [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
+ [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
+ [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
+ [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
+ [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
+ [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
+ [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
+ [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
+};
+
+/* write multiple hardware registers */
+static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+ int ret;
+ u8 buf[1+len];
+ struct i2c_msg msg[1] = {
+ {
+ .addr = priv->cfg.i2c_addr,
+ .flags = 0,
+ .len = 1+len,
+ .buf = buf,
+ }
+ };
+
+ buf[0] = reg;
+ memcpy(&buf[1], val, len);
+
+ ret = i2c_transfer(priv->i2c, msg, 1);
+ if (ret == 1) {
+ ret = 0;
+ } else {
+ warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
+ ret = -EREMOTEIO;
+ }
+ return ret;
+}
+
+/* read multiple hardware registers */
+static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+ int ret;
+ struct i2c_msg msg[2] = {
+ {
+ .addr = priv->cfg.i2c_addr,
+ .flags = 0,
+ .len = 1,
+ .buf = ®,
+ }, {
+ .addr = priv->cfg.i2c_addr,
+ .flags = I2C_M_RD,
+ .len = len,
+ .buf = val,
+ }
+ };
+
+ ret = i2c_transfer(priv->i2c, msg, 2);
+ if (ret == 2) {
+ ret = 0;
+ } else {
+ warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
+ ret = -EREMOTEIO;
+}
+return ret;
+}
+
+/* write multiple registers */
+static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+ int len)
+{
+ int ret;
+
+
+ /* switch bank if needed */
+ if (page != priv->page) {
+ ret = rtl2832_wr(priv, 0x00, &page, 1);
+ if (ret)
+ return ret;
+
+ priv->page = page;
+}
+
+return rtl2832_wr(priv, reg, val, len);
+}
+
+/* read multiple registers */
+static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+ int len)
+{
+ int ret;
+
+ /* switch bank if needed */
+ if (page != priv->page) {
+ ret = rtl2832_wr(priv, 0x00, &page, 1);
+ if (ret)
+ return ret;
+
+ priv->page = page;
+ }
+
+ return rtl2832_rd(priv, reg, val, len);
+}
+
+#if 0 /* currently not used */
+/* write single register */
+static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
+{
+ return rtl2832_wr_regs(priv, reg, page, &val, 1);
+}
+#endif
+
+/* read single register */
+static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
+{
+ return rtl2832_rd_regs(priv, reg, page, val, 1);
+}
+
+int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
+{
+ int ret;
+
+ u8 reg_start_addr;
+ u8 msb, lsb;
+ u8 page;
+ u8 reading[4];
+ u32 reading_tmp;
+ int i;
+
+ u8 len;
+ u32 mask;
+
+ reg_start_addr = registers[reg].start_address;
+ msb = registers[reg].msb;
+ lsb = registers[reg].lsb;
+ page = registers[reg].page;
+
+ len = (msb >> 3) + 1;
+ mask = reg_mask[msb - lsb];
+
+ ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+ if (ret)
+ goto err;
+
+ reading_tmp = 0;
+ for (i = 0; i < len; i++)
+ reading_tmp |= reading[i] << ((len - 1 - i) * 8);
+
+ *val = (reading_tmp >> lsb) & mask;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+
+}
+
+int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
+{
+ int ret, i;
+ u8 len;
+ u8 reg_start_addr;
+ u8 msb, lsb;
+ u8 page;
+ u32 mask;
+
+
+ u8 reading[4];
+ u8 writing[4];
+ u32 reading_tmp;
+ u32 writing_tmp;
+
+
+ reg_start_addr = registers[reg].start_address;
+ msb = registers[reg].msb;
+ lsb = registers[reg].lsb;
+ page = registers[reg].page;
+
+ len = (msb >> 3) + 1;
+ mask = reg_mask[msb - lsb];
+
+
+ ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+ if (ret)
+ goto err;
+
+ reading_tmp = 0;
+ for (i = 0; i < len; i++)
+ reading_tmp |= reading[i] << ((len - 1 - i) * 8);
+
+ writing_tmp = reading_tmp & ~(mask << lsb);
+ writing_tmp |= ((val & mask) << lsb);
+
+
+ for (i = 0; i < len; i++)
+ writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
+
+ ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
+ if (ret)
+ goto err;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+
+}
+
+
+static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+ int ret;
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s: enable=%d", __func__, enable);
+
+ /* gate already open or close */
+ if (priv->i2c_gate_state == enable)
+ return 0;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
+ if (ret)
+ goto err;
+
+ priv->i2c_gate_state = enable;
+
+ return ret;
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+
+
+static int rtl2832_init(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ int i, ret;
+
+ u8 en_bbin;
+ u64 pset_iffreq;
+
+ /* initialization values for the demodulator registers */
+ struct rtl2832_reg_value rtl2832_initial_regs[] = {
+ {DVBT_AD_EN_REG, 0x1},
+ {DVBT_AD_EN_REG1, 0x1},
+ {DVBT_RSD_BER_FAIL_VAL, 0x2800},
+ {DVBT_MGD_THD0, 0x10},
+ {DVBT_MGD_THD1, 0x20},
+ {DVBT_MGD_THD2, 0x20},
+ {DVBT_MGD_THD3, 0x40},
+ {DVBT_MGD_THD4, 0x22},
+ {DVBT_MGD_THD5, 0x32},
+ {DVBT_MGD_THD6, 0x37},
+ {DVBT_MGD_THD7, 0x39},
+ {DVBT_EN_BK_TRK, 0x0},
+ {DVBT_EN_CACQ_NOTCH, 0x0},
+ {DVBT_AD_AV_REF, 0x2a},
+ {DVBT_REG_PI, 0x6},
+ {DVBT_PIP_ON, 0x0},
+ {DVBT_CDIV_PH0, 0x8},
+ {DVBT_CDIV_PH1, 0x8},
+ {DVBT_SCALE1_B92, 0x4},
+ {DVBT_SCALE1_B93, 0xb0},
+ {DVBT_SCALE1_BA7, 0x78},
+ {DVBT_SCALE1_BA9, 0x28},
+ {DVBT_SCALE1_BAA, 0x59},
+ {DVBT_SCALE1_BAB, 0x83},
+ {DVBT_SCALE1_BAC, 0xd4},
+ {DVBT_SCALE1_BB0, 0x65},
+ {DVBT_SCALE1_BB1, 0x43},
+ {DVBT_KB_P1, 0x1},
+ {DVBT_KB_P2, 0x4},
+ {DVBT_KB_P3, 0x7},
+ {DVBT_K1_CR_STEP12, 0xa},
+ {DVBT_REG_GPE, 0x1},
+ {DVBT_SERIAL, 0x0},
+ {DVBT_CDIV_PH0, 0x9},
+ {DVBT_CDIV_PH1, 0x9},
+ {DVBT_MPEG_IO_OPT_2_2, 0x0},
+ {DVBT_MPEG_IO_OPT_1_0, 0x0},
+ {DVBT_TRK_KS_P2, 0x4},
+ {DVBT_TRK_KS_I2, 0x7},
+ {DVBT_TR_THD_SET2, 0x6},
+ {DVBT_TRK_KC_I2, 0x5},
+ {DVBT_CR_THD_SET2, 0x1},
+ {DVBT_SPEC_INV, 0x0},
+ {DVBT_DAGC_TRG_VAL, 0x5a},
+ {DVBT_AGC_TARG_VAL_0, 0x0},
+ {DVBT_AGC_TARG_VAL_8_1, 0x5a},
+ {DVBT_AAGC_LOOP_GAIN, 0x16},
+ {DVBT_LOOP_GAIN2_3_0, 0x6},
+ {DVBT_LOOP_GAIN2_4, 0x1},
+ {DVBT_LOOP_GAIN3, 0x16},
+ {DVBT_VTOP1, 0x35},
+ {DVBT_VTOP2, 0x21},
+ {DVBT_VTOP3, 0x21},
+ {DVBT_KRF1, 0x0},
+ {DVBT_KRF2, 0x40},
+ {DVBT_KRF3, 0x10},
+ {DVBT_KRF4, 0x10},
+ {DVBT_IF_AGC_MIN, 0x80},
+ {DVBT_IF_AGC_MAX, 0x7f},
+ {DVBT_RF_AGC_MIN, 0x80},
+ {DVBT_RF_AGC_MAX, 0x7f},
+ {DVBT_POLAR_RF_AGC, 0x0},
+ {DVBT_POLAR_IF_AGC, 0x0},
+ {DVBT_AD7_SETTING, 0xe9bf},
+ {DVBT_EN_GI_PGA, 0x0},
+ {DVBT_THD_LOCK_UP, 0x0},
+ {DVBT_THD_LOCK_DW, 0x0},
+ {DVBT_THD_UP1, 0x11},
+ {DVBT_THD_DW1, 0xef},
+ {DVBT_INTER_CNT_LEN, 0xc},
+ {DVBT_GI_PGA_STATE, 0x0},
+ {DVBT_EN_AGC_PGA, 0x1},
+ {DVBT_IF_AGC_MAN, 0x0},
+ };
+
+
+ dbg("%s", __func__);
+
+ en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
+
+ /*
+ * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
+ * / CrystalFreqHz)
+ */
+ pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
+ pset_iffreq *= 0x400000;
+ pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
+ pset_iffreq = pset_iffreq & 0x3fffff;
+
+
+
+ for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
+ ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
+ rtl2832_initial_regs[i].value);
+ if (ret)
+ goto err;
+ }
+
+ /* if frequency settings */
+ ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
+ if (ret)
+ goto err;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
+ if (ret)
+ goto err;
+
+ priv->sleeping = false;
+
+ return ret;
+
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_sleep(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s", __func__);
+ priv->sleeping = true;
+ return 0;
+}
+
+int rtl2832_get_tune_settings(struct dvb_frontend *fe,
+ struct dvb_frontend_tune_settings *s)
+{
+ dbg("%s", __func__);
+ s->min_delay_ms = 1000;
+ s->step_size = fe->ops.info.frequency_stepsize * 2;
+ s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
+ return 0;
+}
+
+static int rtl2832_set_frontend(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ int ret, i, j;
+ u64 bw_mode, num, num2;
+ u32 resamp_ratio, cfreq_off_ratio;
+
+
+ static u8 bw_params[3][32] = {
+ /* 6 MHz bandwidth */
+ {
+ 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
+ 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
+ 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
+ 0x19, 0xe0,
+ },
+
+ /* 7 MHz bandwidth */
+ {
+ 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
+ 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
+ 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
+ 0x19, 0x10,
+ },
+
+ /* 8 MHz bandwidth */
+ {
+ 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
+ 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
+ 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
+ 0x19, 0xe0,
+ },
+ };
+
+
+ dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
+ c->frequency, c->bandwidth_hz, c->inversion);
+
+
+ /* program tuner */
+ if (fe->ops.tuner_ops.set_params)
+ fe->ops.tuner_ops.set_params(fe);
+
+
+ switch (c->bandwidth_hz) {
+ case 6000000:
+ i = 0;
+ bw_mode = 48000000;
+ break;
+ case 7000000:
+ i = 1;
+ bw_mode = 56000000;
+ break;
+ case 8000000:
+ i = 2;
+ bw_mode = 64000000;
+ break;
+ default:
+ dbg("invalid bandwidth");
+ return -EINVAL;
+ }
+
+ for (j = 0; j < sizeof(bw_params[j]); j++) {
+ ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
+ if (ret)
+ goto err;
+ }
+
+ /* calculate and set resample ratio
+ * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
+ * / ConstWithBandwidthMode)
+ */
+ num = priv->cfg.xtal * 7;
+ num *= 0x400000;
+ num = div_u64(num, bw_mode);
+ resamp_ratio = num & 0x3ffffff;
+ ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
+ if (ret)
+ goto err;
+
+ /* calculate and set cfreq off ratio
+ * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
+ * / (CrystalFreqHz * 7))
+ */
+ num = bw_mode << 20;
+ num2 = priv->cfg.xtal * 7;
+ num = div_u64(num, num2);
+ num = -num;
+ cfreq_off_ratio = num & 0xfffff;
+ ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
+ if (ret)
+ goto err;
+
+
+ /* soft reset */
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
+ if (ret)
+ goto err;
+
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
+ if (ret)
+ goto err;
+
+ return ret;
+err:
+ info("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+ int ret;
+ u32 tmp;
+ *status = 0;
+
+
+ dbg("%s", __func__);
+ if (priv->sleeping)
+ return 0;
+
+ ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
+ if (ret)
+ goto err;
+
+ if (tmp == 11) {
+ *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+ FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+ }
+ /* TODO find out if this is also true for rtl2832? */
+ /*else if (tmp == 10) {
+ *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+ FE_HAS_VITERBI;
+ }*/
+
+ return ret;
+err:
+ info("%s: failed=%d", __func__, ret);
+ return ret;
+}
+
+static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
+{
+ *snr = 0;
+ return 0;
+}
+
+static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
+{
+ *ber = 0;
+ return 0;
+}
+
+static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+{
+ *ucblocks = 0;
+ return 0;
+}
+
+
+static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+{
+ *strength = 0;
+ return 0;
+}
+
+static struct dvb_frontend_ops rtl2832_ops;
+
+static void rtl2832_release(struct dvb_frontend *fe)
+{
+ struct rtl2832_priv *priv = fe->demodulator_priv;
+
+ dbg("%s", __func__);
+ kfree(priv);
+}
+
+struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
+ struct i2c_adapter *i2c)
+{
+ struct rtl2832_priv *priv = NULL;
+ int ret = 0;
+ u8 tmp;
+
+ dbg("%s", __func__);
+
+ /* allocate memory for the internal state */
+ priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
+ if (priv == NULL)
+ goto err;
+
+ /* setup the priv */
+ priv->i2c = i2c;
+ priv->tuner = cfg->tuner;
+ memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
+
+ /* check if the demod is there */
+ ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
+ if (ret)
+ goto err;
+
+ /* create dvb_frontend */
+ memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
+ priv->fe.demodulator_priv = priv;
+
+ /* TODO implement sleep mode */
+ priv->sleeping = true;
+
+ return &priv->fe;
+err:
+ dbg("%s: failed=%d", __func__, ret);
+ kfree(priv);
+ return NULL;
+}
+EXPORT_SYMBOL(rtl2832_attach);
+
+static struct dvb_frontend_ops rtl2832_ops = {
+ .delsys = { SYS_DVBT },
+ .info = {
+ .name = "Realtek RTL2832 (DVB-T)",
+ .frequency_min = 174000000,
+ .frequency_max = 862000000,
+ .frequency_stepsize = 166667,
+ .caps = FE_CAN_FEC_1_2 |
+ FE_CAN_FEC_2_3 |
+ FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_5_6 |
+ FE_CAN_FEC_7_8 |
+ FE_CAN_FEC_AUTO |
+ FE_CAN_QPSK |
+ FE_CAN_QAM_16 |
+ FE_CAN_QAM_64 |
+ FE_CAN_QAM_AUTO |
+ FE_CAN_TRANSMISSION_MODE_AUTO |
+ FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO |
+ FE_CAN_RECOVER |
+ FE_CAN_MUTE_TS
+ },
+
+ .release = rtl2832_release,
+
+ .init = rtl2832_init,
+ .sleep = rtl2832_sleep,
+
+ .get_tune_settings = rtl2832_get_tune_settings,
+
+ .set_frontend = rtl2832_set_frontend,
+
+ .read_status = rtl2832_read_status,
+ .read_snr = rtl2832_read_snr,
+ .read_ber = rtl2832_read_ber,
+ .read_ucblocks = rtl2832_read_ucblocks,
+ .read_signal_strength = rtl2832_read_signal_strength,
+ .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
+};
+
+MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
+MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.5");
diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
new file mode 100644
index 0000000..d94dc9a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.h
@@ -0,0 +1,74 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_H
+#define RTL2832_H
+
+#include <linux/dvb/frontend.h>
+
+struct rtl2832_config {
+ /*
+ * Demodulator I2C address.
+ */
+ u8 i2c_addr;
+
+ /*
+ * Xtal frequency.
+ * Hz
+ * 4000000, 16000000, 25000000, 28800000
+ */
+ u32 xtal;
+
+ /*
+ * IFs for all used modes.
+ * Hz
+ * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
+ */
+ u32 if_dvbt;
+
+ /*
+ */
+ u8 tuner;
+};
+
+
+#if defined(CONFIG_DVB_RTL2832) || \
+ (defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
+extern struct dvb_frontend *rtl2832_attach(
+ const struct rtl2832_config *cfg,
+ struct i2c_adapter *i2c
+);
+
+extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
+ struct dvb_frontend *fe
+);
+#else
+static inline struct dvb_frontend *rtl2832_attach(
+ const struct rtl2832_config *config,
+ struct i2c_adapter *i2c
+)
+{
+ printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+ return NULL;
+}
+#endif
+
+
+#endif /* RTL2832_H */
diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
new file mode 100644
index 0000000..cd01a8a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832_priv.h
@@ -0,0 +1,260 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_PRIV_H
+#define RTL2832_PRIV_H
+
+#include "dvb_frontend.h"
+#include "rtl2832.h"
+
+#define LOG_PREFIX "rtl2832"
+
+#undef dbg
+#define dbg(f, arg...) \
+do { \
+ if (rtl2832_debug) \
+ printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg); \
+} while (0)
+#undef err
+#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
+#undef info
+#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#undef warn
+#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+
+struct rtl2832_priv {
+ struct i2c_adapter *i2c;
+ struct dvb_frontend fe;
+ struct rtl2832_config cfg;
+
+ bool i2c_gate_state;
+ bool sleeping;
+
+ u8 tuner;
+ u8 page; /* active register page */
+};
+
+struct rtl2832_reg_entry {
+ u8 page;
+ u8 start_address;
+ u8 msb;
+ u8 lsb;
+};
+
+struct rtl2832_reg_value {
+ int reg;
+ u32 value;
+};
+
+
+/* Demod register bit names */
+enum DVBT_REG_BIT_NAME {
+ DVBT_SOFT_RST,
+ DVBT_IIC_REPEAT,
+ DVBT_TR_WAIT_MIN_8K,
+ DVBT_RSD_BER_FAIL_VAL,
+ DVBT_EN_BK_TRK,
+ DVBT_REG_PI,
+ DVBT_REG_PFREQ_1_0,
+ DVBT_PD_DA8,
+ DVBT_LOCK_TH,
+ DVBT_BER_PASS_SCAL,
+ DVBT_CE_FFSM_BYPASS,
+ DVBT_ALPHAIIR_N,
+ DVBT_ALPHAIIR_DIF,
+ DVBT_EN_TRK_SPAN,
+ DVBT_LOCK_TH_LEN,
+ DVBT_CCI_THRE,
+ DVBT_CCI_MON_SCAL,
+ DVBT_CCI_M0,
+ DVBT_CCI_M1,
+ DVBT_CCI_M2,
+ DVBT_CCI_M3,
+ DVBT_SPEC_INIT_0,
+ DVBT_SPEC_INIT_1,
+ DVBT_SPEC_INIT_2,
+ DVBT_AD_EN_REG,
+ DVBT_AD_EN_REG1,
+ DVBT_EN_BBIN,
+ DVBT_MGD_THD0,
+ DVBT_MGD_THD1,
+ DVBT_MGD_THD2,
+ DVBT_MGD_THD3,
+ DVBT_MGD_THD4,
+ DVBT_MGD_THD5,
+ DVBT_MGD_THD6,
+ DVBT_MGD_THD7,
+ DVBT_EN_CACQ_NOTCH,
+ DVBT_AD_AV_REF,
+ DVBT_PIP_ON,
+ DVBT_SCALE1_B92,
+ DVBT_SCALE1_B93,
+ DVBT_SCALE1_BA7,
+ DVBT_SCALE1_BA9,
+ DVBT_SCALE1_BAA,
+ DVBT_SCALE1_BAB,
+ DVBT_SCALE1_BAC,
+ DVBT_SCALE1_BB0,
+ DVBT_SCALE1_BB1,
+ DVBT_KB_P1,
+ DVBT_KB_P2,
+ DVBT_KB_P3,
+ DVBT_OPT_ADC_IQ,
+ DVBT_AD_AVI,
+ DVBT_AD_AVQ,
+ DVBT_K1_CR_STEP12,
+ DVBT_TRK_KS_P2,
+ DVBT_TRK_KS_I2,
+ DVBT_TR_THD_SET2,
+ DVBT_TRK_KC_P2,
+ DVBT_TRK_KC_I2,
+ DVBT_CR_THD_SET2,
+ DVBT_PSET_IFFREQ,
+ DVBT_SPEC_INV,
+ DVBT_BW_INDEX,
+ DVBT_RSAMP_RATIO,
+ DVBT_CFREQ_OFF_RATIO,
+ DVBT_FSM_STAGE,
+ DVBT_RX_CONSTEL,
+ DVBT_RX_HIER,
+ DVBT_RX_C_RATE_LP,
+ DVBT_RX_C_RATE_HP,
+ DVBT_GI_IDX,
+ DVBT_FFT_MODE_IDX,
+ DVBT_RSD_BER_EST,
+ DVBT_CE_EST_EVM,
+ DVBT_RF_AGC_VAL,
+ DVBT_IF_AGC_VAL,
+ DVBT_DAGC_VAL,
+ DVBT_SFREQ_OFF,
+ DVBT_CFREQ_OFF,
+ DVBT_POLAR_RF_AGC,
+ DVBT_POLAR_IF_AGC,
+ DVBT_AAGC_HOLD,
+ DVBT_EN_RF_AGC,
+ DVBT_EN_IF_AGC,
+ DVBT_IF_AGC_MIN,
+ DVBT_IF_AGC_MAX,
+ DVBT_RF_AGC_MIN,
+ DVBT_RF_AGC_MAX,
+ DVBT_IF_AGC_MAN,
+ DVBT_IF_AGC_MAN_VAL,
+ DVBT_RF_AGC_MAN,
+ DVBT_RF_AGC_MAN_VAL,
+ DVBT_DAGC_TRG_VAL,
+ DVBT_AGC_TARG_VAL,
+ DVBT_LOOP_GAIN_3_0,
+ DVBT_LOOP_GAIN_4,
+ DVBT_VTOP,
+ DVBT_KRF,
+ DVBT_AGC_TARG_VAL_0,
+ DVBT_AGC_TARG_VAL_8_1,
+ DVBT_AAGC_LOOP_GAIN,
+ DVBT_LOOP_GAIN2_3_0,
+ DVBT_LOOP_GAIN2_4,
+ DVBT_LOOP_GAIN3,
+ DVBT_VTOP1,
+ DVBT_VTOP2,
+ DVBT_VTOP3,
+ DVBT_KRF1,
+ DVBT_KRF2,
+ DVBT_KRF3,
+ DVBT_KRF4,
+ DVBT_EN_GI_PGA,
+ DVBT_THD_LOCK_UP,
+ DVBT_THD_LOCK_DW,
+ DVBT_THD_UP1,
+ DVBT_THD_DW1,
+ DVBT_INTER_CNT_LEN,
+ DVBT_GI_PGA_STATE,
+ DVBT_EN_AGC_PGA,
+ DVBT_CKOUTPAR,
+ DVBT_CKOUT_PWR,
+ DVBT_SYNC_DUR,
+ DVBT_ERR_DUR,
+ DVBT_SYNC_LVL,
+ DVBT_ERR_LVL,
+ DVBT_VAL_LVL,
+ DVBT_SERIAL,
+ DVBT_SER_LSB,
+ DVBT_CDIV_PH0,
+ DVBT_CDIV_PH1,
+ DVBT_MPEG_IO_OPT_2_2,
+ DVBT_MPEG_IO_OPT_1_0,
+ DVBT_CKOUTPAR_PIP,
+ DVBT_CKOUT_PWR_PIP,
+ DVBT_SYNC_LVL_PIP,
+ DVBT_ERR_LVL_PIP,
+ DVBT_VAL_LVL_PIP,
+ DVBT_CKOUTPAR_PID,
+ DVBT_CKOUT_PWR_PID,
+ DVBT_SYNC_LVL_PID,
+ DVBT_ERR_LVL_PID,
+ DVBT_VAL_LVL_PID,
+ DVBT_SM_PASS,
+ DVBT_UPDATE_REG_2,
+ DVBT_BTHD_P3,
+ DVBT_BTHD_D3,
+ DVBT_FUNC4_REG0,
+ DVBT_FUNC4_REG1,
+ DVBT_FUNC4_REG2,
+ DVBT_FUNC4_REG3,
+ DVBT_FUNC4_REG4,
+ DVBT_FUNC4_REG5,
+ DVBT_FUNC4_REG6,
+ DVBT_FUNC4_REG7,
+ DVBT_FUNC4_REG8,
+ DVBT_FUNC4_REG9,
+ DVBT_FUNC4_REG10,
+ DVBT_FUNC5_REG0,
+ DVBT_FUNC5_REG1,
+ DVBT_FUNC5_REG2,
+ DVBT_FUNC5_REG3,
+ DVBT_FUNC5_REG4,
+ DVBT_FUNC5_REG5,
+ DVBT_FUNC5_REG6,
+ DVBT_FUNC5_REG7,
+ DVBT_FUNC5_REG8,
+ DVBT_FUNC5_REG9,
+ DVBT_FUNC5_REG10,
+ DVBT_FUNC5_REG11,
+ DVBT_FUNC5_REG12,
+ DVBT_FUNC5_REG13,
+ DVBT_FUNC5_REG14,
+ DVBT_FUNC5_REG15,
+ DVBT_FUNC5_REG16,
+ DVBT_FUNC5_REG17,
+ DVBT_FUNC5_REG18,
+ DVBT_AD7_SETTING,
+ DVBT_RSSI_R,
+ DVBT_ACI_DET_IND,
+ DVBT_REG_MON,
+ DVBT_REG_MONSEL,
+ DVBT_REG_GPE,
+ DVBT_REG_GPO,
+ DVBT_REG_4MSEL,
+ DVBT_TEST_REG_1,
+ DVBT_TEST_REG_2,
+ DVBT_TEST_REG_3,
+ DVBT_TEST_REG_4,
+ DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
+};
+
+#endif /* RTL2832_PRIV_H */
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 20:28 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
` (4 subsequent siblings)
6 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair
This only adds support for the Terratec Cinergy T Stick Black device.
Changes from previous patches:
- fixed compiler warnings
- added fc0013 tuner handling to this patch
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/Kconfig | 3 +
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 450 +++++++++++++++++++++++++++++--
3 files changed, 429 insertions(+), 25 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index be1db75..98dd0d8 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
tristate "Realtek RTL28xxU DVB USB support"
depends on DVB_USB && EXPERIMENTAL
select DVB_RTL2830
+ select DVB_RTL2832
select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
+ select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
help
Say Y here to support the Realtek RTL28xxU DVB USB receiver.
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 7a6160b..cd9254c 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -160,6 +160,7 @@
#define USB_PID_TERRATEC_CINERGY_T_STICK 0x0093
#define USB_PID_TERRATEC_CINERGY_T_STICK_RC 0x0097
#define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC 0x0099
+#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1 0x00a9
#define USB_PID_TWINHAN_VP7041_COLD 0x3201
#define USB_PID_TWINHAN_VP7041_WARM 0x3202
#define USB_PID_TWINHAN_VP7020_COLD 0x3203
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 4e69e9d..5285f3d 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
* Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.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
@@ -22,10 +23,13 @@
#include "rtl28xxu.h"
#include "rtl2830.h"
+#include "rtl2832.h"
#include "qt1010.h"
#include "mt2060.h"
#include "mxl5005s.h"
+#include "fc0012.h"
+#include "fc0013.h"
/* debug */
static int dvb_usb_rtl28xxu_debug;
@@ -378,34 +382,159 @@ err:
return ret;
}
+static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
+ .i2c_addr = 0x10, /* 0x20 */
+ .xtal = 28800000,
+ .if_dvbt = 0,
+ .tuner = TUNER_RTL2832_FC0012
+};
+
+static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
+ .i2c_addr = 0x10, /* 0x20 */
+ .xtal = 28800000,
+ .if_dvbt = 0,
+ .tuner = TUNER_RTL2832_FC0013
+};
+
+static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
+ int cmd, int arg)
+{
+ int ret;
+ u8 val;
+
+ deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
+ switch (cmd) {
+ case FC_FE_CALLBACK_VHF_ENABLE:
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ if (arg)
+ val &= 0xbf; /* set GPIO6 low */
+ else
+ val |= 0x40; /* set GPIO6 high */
+
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+ break;
+ default:
+ ret = -EINVAL;
+ goto err;
+ }
+ return 0;
+
+err:
+ err("%s: failed=%d\n", __func__, ret);
+
+ return ret;
+}
+
+
+static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
+ int cmd, int arg)
+{
+ /* TODO implement*/
+ return 0;
+}
+
+static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
+{
+ struct rtl28xxu_priv *priv = d->priv;
+
+ switch (priv->tuner) {
+ case TUNER_RTL2832_FC0012:
+ return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
+
+ case TUNER_RTL2832_FC0013:
+ return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
+ default:
+ break;
+ }
+
+ return -ENODEV;
+}
+
+static int rtl2832u_frontend_callback(void *adapter_priv, int component,
+ int cmd, int arg)
+{
+ struct i2c_adapter *adap = adapter_priv;
+ struct dvb_usb_device *d = i2c_get_adapdata(adap);
+
+ switch (component) {
+ case DVB_FRONTEND_COMPONENT_TUNER:
+ return rtl2832u_tuner_callback(d, cmd, arg);
+ default:
+ break;
+ }
+
+ return -EINVAL;
+}
+
+
+
+
static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
{
int ret;
struct rtl28xxu_priv *priv = adap->dev->priv;
- u8 buf[1];
+ struct rtl2832_config *rtl2832_config;
+
+ u8 buf[2], val;
/* open RTL2832U/RTL2832 I2C gate */
struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
/* close RTL2832U/RTL2832 I2C gate */
struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
+ /* for FC0012 tuner probe */
+ struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
+ /* for FC0013 tuner probe */
+ struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
+ /* for MT2266 tuner probe */
+ struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
/* for FC2580 tuner probe */
struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
+ /* for MT2063 tuner probe */
+ struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
+ /* for MAX3543 tuner probe */
+ struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
+ /* for TUA9001 tuner probe */
+ struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
+ /* for MXL5007T tuner probe */
+ struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
+ /* for E4000 tuner probe */
+ struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
+ /* for TDA18272 tuner probe */
+ struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
deb_info("%s:\n", __func__);
- /* GPIO direction */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+
+ ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
if (ret)
goto err;
- /* enable as output GPIO0, GPIO2, GPIO4 */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+ val &= 0xbf;
+
+ ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
if (ret)
goto err;
- ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
+
+ /* enable as output GPIO3 and GPIO6*/
+ ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
if (ret)
goto err;
+ val |= 0x48;
+
+ ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+ if (ret)
+ goto err;
+
+
+
/*
* Probe used tuner. We need to know used tuner before demod attach
* since there is some demod params needed to set according to tuner.
@@ -416,25 +545,108 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
if (ret)
goto err;
+ priv->tuner = TUNER_NONE;
+
+ /* check FC0012 ID register; reg=00 val=a1 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0012);
+ if (ret == 0 && buf[0] == 0xa1) {
+ priv->tuner = TUNER_RTL2832_FC0012;
+ rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
+ info("%s: FC0012 tuner found", __func__);
+ goto found;
+ }
+
+ /* check FC0013 ID register; reg=00 val=a3 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
+ if (ret == 0 && buf[0] == 0xa3) {
+ priv->tuner = TUNER_RTL2832_FC0013;
+ rtl2832_config = &rtl28xxu_rtl2832_fc0013_config;
+ info("%s: FC0013 tuner found", __func__);
+ goto found;
+ }
+
+ /* check MT2266 ID register; reg=00 val=85 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2266);
+ if (ret == 0 && buf[0] == 0x85) {
+ priv->tuner = TUNER_RTL2832_MT2266;
+ /* TODO implement tuner */
+ info("%s: MT2266 tuner found", __func__);
+ goto unsupported;
+ }
+
/* check FC2580 ID register; reg=01 val=56 */
ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc2580);
if (ret == 0 && buf[0] == 0x56) {
priv->tuner = TUNER_RTL2832_FC2580;
- deb_info("%s: FC2580\n", __func__);
- goto found;
- } else {
- deb_info("%s: FC2580 probe failed=%d - %02x\n",
- __func__, ret, buf[0]);
+ /* TODO implement tuner */
+ info("%s: FC2580 tuner found", __func__);
+ goto unsupported;
+ }
+
+ /* check MT2063 ID register; reg=00 val=9e || 9c */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2063);
+ if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
+ priv->tuner = TUNER_RTL2832_MT2063;
+ /* TODO implement tuner */
+ info("%s: MT2063 tuner found", __func__);
+ goto unsupported;
+ }
+
+ /* check MAX3543 ID register; reg=00 val=38 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_max3543);
+ if (ret == 0 && buf[0] == 0x38) {
+ priv->tuner = TUNER_RTL2832_MAX3543;
+ /* TODO implement tuner */
+ info("%s: MAX3534 tuner found", __func__);
+ goto unsupported;
}
+ /* check TUA9001 ID register; reg=7e val=2328 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_tua9001);
+ if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
+ priv->tuner = TUNER_RTL2832_TUA9001;
+ /* TODO implement tuner */
+ info("%s: TUA9001 tuner found", __func__);
+ goto unsupported;
+ }
+
+ /* check MXL5007R ID register; reg=d9 val=14 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_mxl5007t);
+ if (ret == 0 && buf[0] == 0x14) {
+ priv->tuner = TUNER_RTL2832_MXL5007T;
+ /* TODO implement tuner */
+ info("%s: MXL5007T tuner found", __func__);
+ goto unsupported;
+ }
+
+ /* check E4000 ID register; reg=02 val=40 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_e4000);
+ if (ret == 0 && buf[0] == 0x40) {
+ priv->tuner = TUNER_RTL2832_E4000;
+ /* TODO implement tuner */
+ info("%s: E4000 tuner found", __func__);
+ goto unsupported;
+ }
+
+ /* check TDA18272 ID register; reg=00 val=c760 */
+ ret = rtl28xxu_ctrl_msg(adap->dev, &req_tda18272);
+ if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
+ priv->tuner = TUNER_RTL2832_TDA18272;
+ /* TODO implement tuner */
+ info("%s: TDA18272 tuner found", __func__);
+ goto unsupported;
+ }
+
+unsupported:
/* close demod I2C gate */
ret = rtl28xxu_ctrl_msg(adap->dev, &req_gate_close);
if (ret)
goto err;
/* tuner not found */
+ deb_info("No compatible tuner found");
ret = -ENODEV;
- goto err;
+ return ret;
found:
/* close demod I2C gate */
@@ -443,9 +655,18 @@ found:
goto err;
/* attach demodulator */
- /* TODO: */
+ adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
+ &adap->dev->i2c_adap);
+ if (adap->fe_adap[0].fe == NULL) {
+ ret = -ENODEV;
+ goto err;
+ }
+
+ /* set fe callbacks */
+ adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
return ret;
+
err:
deb_info("%s: failed=%d\n", __func__, ret);
return ret;
@@ -528,10 +749,24 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
deb_info("%s:\n", __func__);
switch (priv->tuner) {
- case TUNER_RTL2832_FC2580:
- /* TODO: */
- fe = NULL;
+ case TUNER_RTL2832_FC0012:
+ fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
+ &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+ /* since fc0012 includs reading the signal strength delegate
+ * that to the tuner driver */
+ adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
+ fe->ops.tuner_ops.get_rf_strength;
+ return 0;
break;
+ case TUNER_RTL2832_FC0013:
+ fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
+ &adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+ /* fc0013 also supports signal strength reading */
+ adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
+ .fe->ops.tuner_ops.get_rf_strength;
+ return 0;
default:
fe = NULL;
err("unknown tuner=%d", priv->tuner);
@@ -548,7 +783,7 @@ err:
return ret;
}
-static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
{
int ret;
u8 buf[2], gpio;
@@ -583,7 +818,33 @@ err:
return ret;
}
-static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
+static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+{
+ int ret;
+ u8 buf[2];
+
+ deb_info("%s: onoff=%d\n", __func__, onoff);
+
+
+ if (onoff) {
+ buf[0] = 0x00;
+ buf[1] = 0x00;
+ } else {
+ buf[0] = 0x10; /* stall EPA */
+ buf[1] = 0x02; /* reset EPA */
+ }
+
+ ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ if (ret)
+ goto err;
+
+ return ret;
+err:
+ deb_info("%s: failed=%d\n", __func__, ret);
+ return ret;
+}
+
+static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
{
int ret;
u8 gpio, sys0;
@@ -631,6 +892,128 @@ err:
return ret;
}
+static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+ int ret;
+ u8 val;
+
+ deb_info("%s: onoff=%d\n", __func__, onoff);
+
+ if (onoff) {
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x08;
+ val &= 0xef;
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+
+ /* demod_ctl_1 */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ if (ret)
+ goto err;
+
+ val &= 0xef;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ if (ret)
+ goto err;
+
+ /* demod control */
+ /* PLL enable */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ /* bit 7 to 1 */
+ val |= 0x80;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ /* demod HW reset */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+ /* bit 5 to 0 */
+ val &= 0xdf;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x20;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ mdelay(5);
+
+ /*enable ADC_Q and ADC_I */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x48;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+
+ } else {
+ /* demod_ctl_1 */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x0c;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ if (ret)
+ goto err;
+
+ /* set output values */
+ ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ if (ret)
+ goto err;
+
+ val |= 0x10;
+
+ ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ if (ret)
+ goto err;
+
+ /* demod control */
+ ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ if (ret)
+ goto err;
+
+ val &= 0x37;
+
+ ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ if (ret)
+ goto err;
+
+ }
+
+ return ret;
+err:
+ deb_info("%s: failed=%d\n", __func__, ret);
+ return ret;
+}
+
+
static int rtl2831u_rc_query(struct dvb_usb_device *d)
{
int ret, i;
@@ -768,6 +1151,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_0BDA_2831,
RTL2831U_14AA_0160,
RTL2831U_14AA_0161,
+ RTL2832U_0CCD_00A9,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -780,6 +1164,8 @@ static struct usb_device_id rtl28xxu_table[] = {
USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
/* RTL2832U */
+ [RTL2832U_0CCD_00A9] = {
+ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
{} /* terminating entry */
};
@@ -802,7 +1188,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
{
.frontend_attach = rtl2831u_frontend_attach,
.tuner_attach = rtl2831u_tuner_attach,
- .streaming_ctrl = rtl28xxu_streaming_ctrl,
+ .streaming_ctrl = rtl2831u_streaming_ctrl,
.stream = {
.type = USB_BULK,
.count = 6,
@@ -818,7 +1204,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
}
},
- .power_ctrl = rtl28xxu_power_ctrl,
+ .power_ctrl = rtl2831u_power_ctrl,
.rc.core = {
.protocol = RC_TYPE_NEC,
@@ -864,7 +1250,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
{
.frontend_attach = rtl2832u_frontend_attach,
.tuner_attach = rtl2832u_tuner_attach,
- .streaming_ctrl = rtl28xxu_streaming_ctrl,
+ .streaming_ctrl = rtl2832u_streaming_ctrl,
.stream = {
.type = USB_BULK,
.count = 6,
@@ -880,7 +1266,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
}
},
- .power_ctrl = rtl28xxu_power_ctrl,
+ .power_ctrl = rtl2832u_power_ctrl,
.rc.core = {
.protocol = RC_TYPE_NEC,
@@ -893,10 +1279,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 0, /* disabled as no support for RTL2832 */
+ .num_device_descs = 1,
.devices = {
{
- .name = "Realtek RTL2832U reference design",
+ .name = "Terratec Cinergy T Stick Black",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_0CCD_00A9],
+ },
},
}
},
@@ -907,6 +1296,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
int ret, i;
+ u8 val;
int properties_count = ARRAY_SIZE(rtl28xxu_properties);
struct dvb_usb_device *d;
struct usb_device *udev;
@@ -951,15 +1341,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
if (ret)
goto err;
+
/* init USB endpoints */
- ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
+ ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+ if (ret)
+ goto err;
+
+ /* enable DMA and Full Packet Mode*/
+ val |= 0x09;
+ ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
if (ret)
goto err;
+ /* set EPA maximum packet size to 0x0200 */
ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
if (ret)
goto err;
+ /* change EPA FIFO length */
ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
if (ret)
goto err;
@@ -1004,4 +1403,5 @@ module_exit(rtl28xxu_module_exit);
MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
+MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
MODULE_LICENSE("GPL");
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
2012-05-18 18:47 ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 20:30 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
` (3 subsequent siblings)
6 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/rtl28xxu.c | 102 +++++++++++++++++-----------------
1 files changed, 51 insertions(+), 51 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 5285f3d..5586715 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -84,7 +84,7 @@ err:
return ret;
}
-static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
+static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
{
struct rtl28xxu_req req;
@@ -120,12 +120,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
return rtl28xxu_ctrl_msg(d, &req);
}
-static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
+static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
{
- return rtl2831_wr_regs(d, reg, &val, 1);
+ return rtl28xx_wr_regs(d, reg, &val, 1);
}
-static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
+static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
{
return rtl2831_rd_regs(d, reg, val, 1);
}
@@ -312,12 +312,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
*/
/* GPIO direction */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
if (ret)
goto err;
/* enable as output GPIO0, GPIO2, GPIO4 */
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
if (ret)
goto err;
@@ -406,7 +406,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
switch (cmd) {
case FC_FE_CALLBACK_VHF_ENABLE:
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
@@ -416,7 +416,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
val |= 0x40; /* set GPIO6 high */
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
break;
@@ -511,25 +511,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
deb_info("%s:\n", __func__);
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
if (ret)
goto err;
val &= 0xbf;
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
if (ret)
goto err;
/* enable as output GPIO3 and GPIO6*/
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
if (ret)
goto err;
val |= 0x48;
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
if (ret)
goto err;
@@ -790,7 +790,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
deb_info("%s: onoff=%d\n", __func__, onoff);
- ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
+ ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
if (ret)
goto err;
@@ -804,11 +804,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
gpio &= (~0x04); /* LED off */
}
- ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
+ ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
if (ret)
goto err;
- ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
if (ret)
goto err;
@@ -834,7 +834,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
buf[1] = 0x02; /* reset EPA */
}
- ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+ ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
if (ret)
goto err;
@@ -852,12 +852,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
deb_info("%s: onoff=%d\n", __func__, onoff);
/* demod adc */
- ret = rtl2831_rd_reg(d, SYS_SYS0, &sys0);
+ ret = rtl28xx_rd_reg(d, SYS_SYS0, &sys0);
if (ret)
goto err;
/* tuner power, read GPIOs */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
if (ret)
goto err;
@@ -877,12 +877,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
/* demod adc */
- ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
+ ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
if (ret)
goto err;
/* tuner power, write GPIOs */
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
if (ret)
goto err;
@@ -901,107 +901,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
if (onoff) {
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
val |= 0x08;
val &= 0xef;
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
/* demod_ctl_1 */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
if (ret)
goto err;
val &= 0xef;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
if (ret)
goto err;
/* demod control */
/* PLL enable */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
/* bit 7 to 1 */
val |= 0x80;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
/* demod HW reset */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
/* bit 5 to 0 */
val &= 0xdf;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val |= 0x20;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
mdelay(5);
/*enable ADC_Q and ADC_I */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val |= 0x48;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
} else {
/* demod_ctl_1 */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
if (ret)
goto err;
val |= 0x0c;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
if (ret)
goto err;
/* set output values */
- ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
if (ret)
goto err;
val |= 0x10;
- ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+ ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
if (ret)
goto err;
/* demod control */
- ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+ ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
if (ret)
goto err;
val &= 0x37;
- ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+ ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
if (ret)
goto err;
@@ -1040,7 +1040,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
/* init remote controller */
if (!priv->rc_active) {
for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
- ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+ ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
rc_nec_tab[i].val);
if (ret)
goto err;
@@ -1070,12 +1070,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
rc_keydown(d->rc_dev, rc_code, 0);
- ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+ ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
if (ret)
goto err;
/* repeated intentionally to avoid extra keypress */
- ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+ ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
if (ret)
goto err;
}
@@ -1112,7 +1112,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
/* init remote controller */
if (!priv->rc_active) {
for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
- ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+ ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
rc_nec_tab[i].val);
if (ret)
goto err;
@@ -1120,14 +1120,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
priv->rc_active = true;
}
- ret = rtl2831_rd_reg(d, IR_RX_IF, &buf[0]);
+ ret = rtl28xx_rd_reg(d, IR_RX_IF, &buf[0]);
if (ret)
goto err;
if (buf[0] != 0x83)
goto exit;
- ret = rtl2831_rd_reg(d, IR_RX_BC, &buf[0]);
+ ret = rtl28xx_rd_reg(d, IR_RX_BC, &buf[0]);
if (ret)
goto err;
@@ -1136,9 +1136,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
/* TODO: pass raw IR to Kernel IR decoder */
- ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
- ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
- ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
+ ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
+ ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
+ ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
exit:
return ret;
@@ -1343,23 +1343,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
/* init USB endpoints */
- ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+ ret = rtl28xx_rd_reg(d, USB_SYSCTL_0, &val);
if (ret)
goto err;
/* enable DMA and Full Packet Mode*/
val |= 0x09;
- ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
+ ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
if (ret)
goto err;
/* set EPA maximum packet size to 0x0200 */
- ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
+ ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
if (ret)
goto err;
/* change EPA FIFO length */
- ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
+ ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
if (ret)
goto err;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
` (2 preceding siblings ...)
2012-05-18 18:47 ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 20:31 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
` (2 subsequent siblings)
6 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 11 ++++++++++-
2 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index cd9254c..360f6b7 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -100,6 +100,7 @@
#define USB_PID_CONCEPTRONIC_CTVDIGRCU 0xe397
#define USB_PID_CONEXANT_D680_DMB 0x86d6
#define USB_PID_CREATIX_CTX1921 0x1921
+#define USB_PID_DELOCK_USB2_DVBT 0xb803
#define USB_PID_DIBCOM_HOOK_DEFAULT 0x0064
#define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM 0x0065
#define USB_PID_DIBCOM_MOD3000_COLD 0x0bb8
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 5586715..b2c8f67 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1152,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_14AA_0160,
RTL2831U_14AA_0161,
RTL2832U_0CCD_00A9,
+ RTL2832U_1F4D_B803,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -1166,6 +1167,8 @@ static struct usb_device_id rtl28xxu_table[] = {
/* RTL2832U */
[RTL2832U_0CCD_00A9] = {
USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
+ [RTL2832U_1F4D_B803] = {
+ USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT)},
{} /* terminating entry */
};
@@ -1279,7 +1282,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 1,
+ .num_device_descs = 2,
.devices = {
{
.name = "Terratec Cinergy T Stick Black",
@@ -1287,6 +1290,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
&rtl28xxu_table[RTL2832U_0CCD_00A9],
},
},
+ {
+ .name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_1F4D_B803],
+ },
+ },
}
},
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
` (3 preceding siblings ...)
2012-05-18 18:47 ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
2012-05-18 20:32 ` Antti Palosaari
2012-05-18 20:47 ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
2012-05-18 23:39 ` poma
6 siblings, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair, Hans-Frieder Vogt
Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net>
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 1 +
drivers/media/dvb/dvb-usb/rtl28xxu.c | 11 ++++++++++-
2 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 360f6b7..26c4481 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -247,6 +247,7 @@
#define USB_PID_TERRATEC_H7_2 0x10a3
#define USB_PID_TERRATEC_T3 0x10a0
#define USB_PID_TERRATEC_T5 0x10a1
+#define USB_PID_NOXON_DAB_STICK 0x00b3
#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
#define USB_PID_PINNACLE_PCTV2000E 0x022c
#define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index b2c8f67..0cac6fb 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1153,6 +1153,7 @@ enum rtl28xxu_usb_table_entry {
RTL2831U_14AA_0161,
RTL2832U_0CCD_00A9,
RTL2832U_1F4D_B803,
+ RTL2832U_0CCD_00B3,
};
static struct usb_device_id rtl28xxu_table[] = {
@@ -1169,6 +1170,8 @@ static struct usb_device_id rtl28xxu_table[] = {
USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
[RTL2832U_1F4D_B803] = {
USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT)},
+ [RTL2832U_0CCD_00B3] = {
+ USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
{} /* terminating entry */
};
@@ -1282,7 +1285,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
.i2c_algo = &rtl28xxu_i2c_algo,
- .num_device_descs = 2,
+ .num_device_descs = 3,
.devices = {
{
.name = "Terratec Cinergy T Stick Black",
@@ -1296,6 +1299,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
&rtl28xxu_table[RTL2832U_1F4D_B803],
},
},
+ {
+ .name = "NOXON DAB/DAB+ USB dongle",
+ .warm_ids = {
+ &rtl28xxu_table[RTL2832U_0CCD_00B3],
+ },
+ },
}
},
--
1.7.7.6
^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
@ 2012-05-18 20:21 ` Antti Palosaari
2012-07-05 14:32 ` Mauro Carvalho Chehab
1 sibling, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:21 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
On 18.05.2012 21:47, Thomas Mair wrote:
> Changelog for ver. 0.5:
> - fixed code style and naming errors
>
> Changelog for ver. 0.4:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Seems to be correct!
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver
2012-05-18 18:47 ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-18 20:28 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:28 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
On 18.05.2012 21:47, Thomas Mair wrote:
> This only adds support for the Terratec Cinergy T Stick Black device.
>
> Changes from previous patches:
> - fixed compiler warnings
> - added fc0013 tuner handling to this patch
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
2012-05-18 18:47 ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-18 20:30 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:30 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T
2012-05-18 18:47 ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
@ 2012-05-18 20:31 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:31 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
2012-05-18 18:47 ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-18 20:32 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:32 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima, Hans-Frieder Vogt
On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] support for rtl2832
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
` (4 preceding siblings ...)
2012-05-18 18:47 ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-18 20:47 ` Antti Palosaari
2012-05-18 23:35 ` poma
2012-05-20 9:56 ` Thomas Mair
2012-05-18 23:39 ` poma
6 siblings, 2 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:47 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
Good evening!
On 18.05.2012 21:47, Thomas Mair wrote:
> Good Evening!
>
> This is the corrected version of the patch series to support the
> RTL2832 demodulator. There where no major changes. The majority of
> the changes consist in fixing style issues and adhering to proper
> naming conventions.
Review done and seems to be OK for my eyes.
> The next question for me is how to proceed when including new
> devices. Poma already sent an extensive list a little while
> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
> all be included at once, or should I wait until somone confirms
> they are working correctly and include them one by one?
It has been rule that device is added after known to work.
Unfortunately DVB USB do not support dynamic USB ID. In order to
workaround that I have done some small hackish solution for the
dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices,
but I see it could be easily extended for RTL2832U too by adding module
parameter.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] support for rtl2832
2012-05-18 20:47 ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
@ 2012-05-18 23:35 ` poma
2012-05-20 9:56 ` Thomas Mair
1 sibling, 0 replies; 53+ messages in thread
From: poma @ 2012-05-18 23:35 UTC (permalink / raw)
To: Antti Palosaari, Thomas Mair, linux-media
On 05/18/2012 10:47 PM, Antti Palosaari wrote:
> Good evening!
>
> On 18.05.2012 21:47, Thomas Mair wrote:
>> Good Evening!
>>
>> This is the corrected version of the patch series to support the
>> RTL2832 demodulator. There where no major changes. The majority of
>> the changes consist in fixing style issues and adhering to proper
>> naming conventions.
>
> Review done and seems to be OK for my eyes.
>
>> The next question for me is how to proceed when including new
>> devices. Poma already sent an extensive list a little while
>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>> all be included at once, or should I wait until somone confirms
>> they are working correctly and include them one by one?
>
> It has been rule that device is added after known to work.
>
I second that.
'rtl28xxu-v2-rtl2832-fc0012.patch' is reference&template.
> Unfortunately DVB USB do not support dynamic USB ID. In order to
> workaround that I have done some small hackish solution for the
> dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices,
> but I see it could be easily extended for RTL2832U too by adding module
> parameter.
>
> regards
> Antti
regards,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] support for rtl2832
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
` (5 preceding siblings ...)
2012-05-18 20:47 ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
@ 2012-05-18 23:39 ` poma
6 siblings, 0 replies; 53+ messages in thread
From: poma @ 2012-05-18 23:39 UTC (permalink / raw)
To: Thomas Mair, linux-media
On 05/18/2012 08:47 PM, Thomas Mair wrote:
> Good Evening!
>
> This is the corrected version of the patch series to support the
> RTL2832 demodulator. There where no major changes. The majority of
> the changes consist in fixing style issues and adhering to proper
> naming conventions.
>
> The next question for me is how to proceed when including new
> devices. Poma already sent an extensive list a little while
> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
> all be included at once, or should I wait until somone confirms
> they are working correctly and include them one by one?
>
> Regards
> Thomas
>
> Thomas Mair (5):
> rtl2832 ver. 0.5: support for RTL2832 demod
> rtl28xxu: support for the rtl2832 demod driver
> rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
> rtl28xxu: support Delock USB 2.0 DVB-T
> rtl28xxu: support Terratec Noxon DAB/DAB+ stick
>
> drivers/media/dvb/dvb-usb/Kconfig | 3 +
> drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 3 +
> drivers/media/dvb/dvb-usb/rtl28xxu.c | 516 ++++++++++++++++--
> drivers/media/dvb/frontends/Kconfig | 7 +
> drivers/media/dvb/frontends/Makefile | 1 +
> drivers/media/dvb/frontends/rtl2832.c | 823 ++++++++++++++++++++++++++++
> drivers/media/dvb/frontends/rtl2832.h | 74 +++
> drivers/media/dvb/frontends/rtl2832_priv.h | 260 +++++++++
> 8 files changed, 1638 insertions(+), 49 deletions(-)
> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
Compliment!
regards,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] support for rtl2832
2012-05-18 20:47 ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
2012-05-18 23:35 ` poma
@ 2012-05-20 9:56 ` Thomas Mair
2012-05-20 10:14 ` Antti Palosaari
1 sibling, 1 reply; 53+ messages in thread
From: Thomas Mair @ 2012-05-20 9:56 UTC (permalink / raw)
To: Antti Palosaari; +Cc: linux-media, pomidorabelisima
On 18.05.2012 22:47, Antti Palosaari wrote:
> Good evening!
>
> On 18.05.2012 21:47, Thomas Mair wrote:
>> Good Evening!
>>
>> This is the corrected version of the patch series to support the
>> RTL2832 demodulator. There where no major changes. The majority of
>> the changes consist in fixing style issues and adhering to proper
>> naming conventions.
>
> Review done and seems to be OK for my eyes.
Thanks Antti! You have been a big help for developing the driver.
What are the next steps? I think the fc0012 and fc0013 driver
need to be reviewed before the patch may be included in
staging. Is that the way it works?
>> The next question for me is how to proceed when including new
>> devices. Poma already sent an extensive list a little while
>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>> all be included at once, or should I wait until somone confirms
>> they are working correctly and include them one by one?
>
> It has been rule that device is added after known to work.
>
That sounds good to me. In the meantime I will try to set up a
page for the driver on the linuxtv.org wiki to keep information
about the driver and the devices in one place.
> Unfortunately DVB USB do not support dynamic USB ID. In order to workaround that I have done some small hackish solution for the dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices, but I see it could be easily extended for RTL2832U too by adding module parameter.
>
If I understand it right, the problem is that the tuner/demod
combination is also hard coded in the dvb_usb_rtl28xxu driver?
> regards
> Antti
Regards
Thomas
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] support for rtl2832
2012-05-20 9:56 ` Thomas Mair
@ 2012-05-20 10:14 ` Antti Palosaari
0 siblings, 0 replies; 53+ messages in thread
From: Antti Palosaari @ 2012-05-20 10:14 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, pomidorabelisima
On 20.05.2012 12:56, Thomas Mair wrote:
> On 18.05.2012 22:47, Antti Palosaari wrote:
>> Good evening!
>>
>> On 18.05.2012 21:47, Thomas Mair wrote:
>>> Good Evening!
>>>
>>> This is the corrected version of the patch series to support the
>>> RTL2832 demodulator. There where no major changes. The majority of
>>> the changes consist in fixing style issues and adhering to proper
>>> naming conventions.
>>
>> Review done and seems to be OK for my eyes.
>
> Thanks Antti! You have been a big help for developing the driver.
> What are the next steps? I think the fc0012 and fc0013 driver
> need to be reviewed before the patch may be included in
> staging. Is that the way it works?
Yes those should be reviewed. At least Mauro will review those when
merging drivers to master but it is always better if there is some other
reviewers before that as he has million patches to review.
>>> The next question for me is how to proceed when including new
>>> devices. Poma already sent an extensive list a little while
>>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>>> all be included at once, or should I wait until somone confirms
>>> they are working correctly and include them one by one?
>>
>> It has been rule that device is added after known to work.
>>
>
> That sounds good to me. In the meantime I will try to set up a
> page for the driver on the linuxtv.org wiki to keep information
> about the driver and the devices in one place.
>
>> Unfortunately DVB USB do not support dynamic USB ID. In order to workaround that I have done some small hackish solution for the dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices, but I see it could be easily extended for RTL2832U too by adding module parameter.
>>
>
> If I understand it right, the problem is that the tuner/demod
> combination is also hard coded in the dvb_usb_rtl28xxu driver?
Device USB IDs are hard coded to (static struct
dvb_usb_device_properties) and that structure is passed to the DVB USB
framework by calling dvb_usb_device_init(). DVB USB framework just
refuses to register device if USB ID is not found. So I added that
hackish solution to replace one USB ID by USB ID got as a dynamic USB
ID. Dynamic ID is USB core features. It will load and call some USB
driver even given USB ID is not advertised by the driver.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
2012-05-18 20:21 ` Antti Palosaari
@ 2012-07-05 14:32 ` Mauro Carvalho Chehab
2012-07-05 14:35 ` Antti Palosaari
2012-07-05 14:41 ` Antti Palosaari
1 sibling, 2 replies; 53+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 14:32 UTC (permalink / raw)
To: Thomas Mair; +Cc: linux-media, crope, pomidorabelisima
Em 18-05-2012 15:47, Thomas Mair escreveu:
> Changelog for ver. 0.5:
> - fixed code style and naming errors
>
> Changelog for ver. 0.4:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
> ---
> drivers/media/dvb/frontends/Kconfig | 7 +
> drivers/media/dvb/frontends/Makefile | 1 +
> drivers/media/dvb/frontends/rtl2832.c | 823 ++++++++++++++++++++++++++++
> drivers/media/dvb/frontends/rtl2832.h | 74 +++
> drivers/media/dvb/frontends/rtl2832_priv.h | 260 +++++++++
> 5 files changed, 1165 insertions(+), 0 deletions(-)
> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
> help
> Say Y when you want to support this frontend.
>
> +config DVB_RTL2832
> + tristate "Realtek RTL2832 DVB-T"
> + depends on DVB_CORE && I2C
> + default m if DVB_FE_CUSTOMISE
> + help
> + Say Y when you want to support this frontend.
> +
> comment "DVB-C (cable) frontends"
> depends on DVB_CORE
>
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..2279c5d 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
> obj-$(CONFIG_DVB_A8293) += a8293.o
> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
> obj-$(CONFIG_DVB_AF9033) += af9033.o
>
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..d0cbe27
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,823 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static const int reg_mask[32] = {
> + 0x00000001,
> + 0x00000003,
> + 0x00000007,
> + 0x0000000f,
> + 0x0000001f,
> + 0x0000003f,
> + 0x0000007f,
> + 0x000000ff,
> + 0x000001ff,
> + 0x000003ff,
> + 0x000007ff,
> + 0x00000fff,
> + 0x00001fff,
> + 0x00003fff,
> + 0x00007fff,
> + 0x0000ffff,
> + 0x0001ffff,
> + 0x0003ffff,
> + 0x0007ffff,
> + 0x000fffff,
> + 0x001fffff,
> + 0x003fffff,
> + 0x007fffff,
> + 0x00ffffff,
> + 0x01ffffff,
> + 0x03ffffff,
> + 0x07ffffff,
> + 0x0fffffff,
> + 0x1fffffff,
> + 0x3fffffff,
> + 0x7fffffff,
> + 0xffffffff
> +};
It would be better to use a macro here like:
#define REG_MASK(b) ((1 << ((b) + 1)) -1)
Even better, you could use the bitops.h BIT() macro:
#define REG_MASK(b) (BIT(b + 1) - 1)
> +
> +static const struct rtl2832_reg_entry registers[] = {
> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + u8 buf[1+len];
> + struct i2c_msg msg[1] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1+len,
> + .buf = buf,
> + }
> + };
> +
> + buf[0] = reg;
> + memcpy(&buf[1], val, len);
> +
> + ret = i2c_transfer(priv->i2c, msg, 1);
> + if (ret == 1) {
> + ret = 0;
> + } else {
> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> + }
> + return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> + int ret;
> + struct i2c_msg msg[2] = {
> + {
> + .addr = priv->cfg.i2c_addr,
> + .flags = 0,
> + .len = 1,
> + .buf = ®,
> + }, {
> + .addr = priv->cfg.i2c_addr,
> + .flags = I2C_M_RD,
> + .len = len,
> + .buf = val,
> + }
> + };
> +
> + ret = i2c_transfer(priv->i2c, msg, 2);
> + if (ret == 2) {
> + ret = 0;
> + } else {
> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> + ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00, &page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> + int len)
> +{
> + int ret;
> +
> + /* switch bank if needed */
> + if (page != priv->page) {
> + ret = rtl2832_wr(priv, 0x00, &page, 1);
> + if (ret)
> + return ret;
> +
> + priv->page = page;
> + }
> +
> + return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> + return rtl2832_wr_regs(priv, reg, page, &val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> + return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> + int ret;
> +
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u8 reading[4];
> + u32 reading_tmp;
> + int i;
> +
> + u8 len;
> + u32 mask;
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb >> 3) + 1;
> + mask = reg_mask[msb - lsb];
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i < len; i++)
> + reading_tmp |= reading[i] << ((len - 1 - i) * 8);
> +
> + *val = (reading_tmp >> lsb) & mask;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> + int ret, i;
> + u8 len;
> + u8 reg_start_addr;
> + u8 msb, lsb;
> + u8 page;
> + u32 mask;
> +
> +
> + u8 reading[4];
> + u8 writing[4];
> + u32 reading_tmp;
> + u32 writing_tmp;
> +
> +
> + reg_start_addr = registers[reg].start_address;
> + msb = registers[reg].msb;
> + lsb = registers[reg].lsb;
> + page = registers[reg].page;
> +
> + len = (msb >> 3) + 1;
> + mask = reg_mask[msb - lsb];
> +
> +
> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> + if (ret)
> + goto err;
> +
> + reading_tmp = 0;
> + for (i = 0; i < len; i++)
> + reading_tmp |= reading[i] << ((len - 1 - i) * 8);
> +
> + writing_tmp = reading_tmp & ~(mask << lsb);
> + writing_tmp |= ((val & mask) << lsb);
> +
> +
> + for (i = 0; i < len; i++)
> + writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
> +
> + ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
> + if (ret)
> + goto err;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> + int ret;
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s: enable=%d", __func__, enable);
> +
> + /* gate already open or close */
> + if (priv->i2c_gate_state == enable)
> + return 0;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> + if (ret)
> + goto err;
> +
> + priv->i2c_gate_state = enable;
> +
> + return ret;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int i, ret;
> +
> + u8 en_bbin;
> + u64 pset_iffreq;
> +
> + /* initialization values for the demodulator registers */
> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
Please, declare it with const.
> + {DVBT_AD_EN_REG, 0x1},
> + {DVBT_AD_EN_REG1, 0x1},
> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
> + {DVBT_MGD_THD0, 0x10},
> + {DVBT_MGD_THD1, 0x20},
> + {DVBT_MGD_THD2, 0x20},
> + {DVBT_MGD_THD3, 0x40},
> + {DVBT_MGD_THD4, 0x22},
> + {DVBT_MGD_THD5, 0x32},
> + {DVBT_MGD_THD6, 0x37},
> + {DVBT_MGD_THD7, 0x39},
> + {DVBT_EN_BK_TRK, 0x0},
> + {DVBT_EN_CACQ_NOTCH, 0x0},
> + {DVBT_AD_AV_REF, 0x2a},
> + {DVBT_REG_PI, 0x6},
> + {DVBT_PIP_ON, 0x0},
> + {DVBT_CDIV_PH0, 0x8},
> + {DVBT_CDIV_PH1, 0x8},
> + {DVBT_SCALE1_B92, 0x4},
> + {DVBT_SCALE1_B93, 0xb0},
> + {DVBT_SCALE1_BA7, 0x78},
> + {DVBT_SCALE1_BA9, 0x28},
> + {DVBT_SCALE1_BAA, 0x59},
> + {DVBT_SCALE1_BAB, 0x83},
> + {DVBT_SCALE1_BAC, 0xd4},
> + {DVBT_SCALE1_BB0, 0x65},
> + {DVBT_SCALE1_BB1, 0x43},
> + {DVBT_KB_P1, 0x1},
> + {DVBT_KB_P2, 0x4},
> + {DVBT_KB_P3, 0x7},
> + {DVBT_K1_CR_STEP12, 0xa},
> + {DVBT_REG_GPE, 0x1},
> + {DVBT_SERIAL, 0x0},
> + {DVBT_CDIV_PH0, 0x9},
> + {DVBT_CDIV_PH1, 0x9},
> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
> + {DVBT_TRK_KS_P2, 0x4},
> + {DVBT_TRK_KS_I2, 0x7},
> + {DVBT_TR_THD_SET2, 0x6},
> + {DVBT_TRK_KC_I2, 0x5},
> + {DVBT_CR_THD_SET2, 0x1},
> + {DVBT_SPEC_INV, 0x0},
> + {DVBT_DAGC_TRG_VAL, 0x5a},
> + {DVBT_AGC_TARG_VAL_0, 0x0},
> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
> + {DVBT_AAGC_LOOP_GAIN, 0x16},
> + {DVBT_LOOP_GAIN2_3_0, 0x6},
> + {DVBT_LOOP_GAIN2_4, 0x1},
> + {DVBT_LOOP_GAIN3, 0x16},
> + {DVBT_VTOP1, 0x35},
> + {DVBT_VTOP2, 0x21},
> + {DVBT_VTOP3, 0x21},
> + {DVBT_KRF1, 0x0},
> + {DVBT_KRF2, 0x40},
> + {DVBT_KRF3, 0x10},
> + {DVBT_KRF4, 0x10},
> + {DVBT_IF_AGC_MIN, 0x80},
> + {DVBT_IF_AGC_MAX, 0x7f},
> + {DVBT_RF_AGC_MIN, 0x80},
> + {DVBT_RF_AGC_MAX, 0x7f},
> + {DVBT_POLAR_RF_AGC, 0x0},
> + {DVBT_POLAR_IF_AGC, 0x0},
> + {DVBT_AD7_SETTING, 0xe9bf},
> + {DVBT_EN_GI_PGA, 0x0},
> + {DVBT_THD_LOCK_UP, 0x0},
> + {DVBT_THD_LOCK_DW, 0x0},
> + {DVBT_THD_UP1, 0x11},
> + {DVBT_THD_DW1, 0xef},
> + {DVBT_INTER_CNT_LEN, 0xc},
> + {DVBT_GI_PGA_STATE, 0x0},
> + {DVBT_EN_AGC_PGA, 0x1},
> + {DVBT_IF_AGC_MAN, 0x0},
> + };
> +
> +
> + dbg("%s", __func__);
> +
> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> + /*
> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> + * / CrystalFreqHz)
> + */
> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> + pset_iffreq *= 0x400000;
> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> + pset_iffreq = pset_iffreq & 0x3fffff;
> +
> +
> +
> + for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> + rtl2832_initial_regs[i].value);
> + if (ret)
> + goto err;
> + }
> +
> + /* if frequency settings */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> + if (ret)
> + goto err;
> +
> + priv->sleeping = false;
> +
> + return ret;
> +
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + priv->sleeping = true;
> + return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> + struct dvb_frontend_tune_settings *s)
> +{
> + dbg("%s", __func__);
> + s->min_delay_ms = 1000;
> + s->step_size = fe->ops.info.frequency_stepsize * 2;
> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> + return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + struct dtv_frontend_properties *c = &fe->dtv_property_cache;
> + int ret, i, j;
> + u64 bw_mode, num, num2;
> + u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> + static u8 bw_params[3][32] = {
> + /* 6 MHz bandwidth */
> + {
> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> + 0x19, 0xe0,
> + },
> +
> + /* 7 MHz bandwidth */
> + {
> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> + 0x19, 0x10,
> + },
> +
> + /* 8 MHz bandwidth */
> + {
> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> + 0x19, 0xe0,
> + },
> + };
> +
> +
> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> + c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> + /* program tuner */
> + if (fe->ops.tuner_ops.set_params)
> + fe->ops.tuner_ops.set_params(fe);
> +
> +
> + switch (c->bandwidth_hz) {
> + case 6000000:
> + i = 0;
> + bw_mode = 48000000;
> + break;
> + case 7000000:
> + i = 1;
> + bw_mode = 56000000;
> + break;
> + case 8000000:
> + i = 2;
> + bw_mode = 64000000;
> + break;
> + default:
> + dbg("invalid bandwidth");
> + return -EINVAL;
> + }
> +
> + for (j = 0; j < sizeof(bw_params[j]); j++) {
> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
> + if (ret)
> + goto err;
> + }
> +
> + /* calculate and set resample ratio
> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> + * / ConstWithBandwidthMode)
> + */
> + num = priv->cfg.xtal * 7;
> + num *= 0x400000;
> + num = div_u64(num, bw_mode);
> + resamp_ratio = num & 0x3ffffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> + if (ret)
> + goto err;
> +
> + /* calculate and set cfreq off ratio
> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> + * / (CrystalFreqHz * 7))
> + */
> + num = bw_mode << 20;
> + num2 = priv->cfg.xtal * 7;
> + num = div_u64(num, num2);
> + num = -num;
> + cfreq_off_ratio = num & 0xfffff;
> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> + if (ret)
> + goto err;
> +
> +
> + /* soft reset */
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> + if (ret)
> + goto err;
> +
> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> + if (ret)
> + goto err;
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> + int ret;
> + u32 tmp;
> + *status = 0;
> +
> +
> + dbg("%s", __func__);
> + if (priv->sleeping)
> + return 0;
> +
> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
> + if (ret)
> + goto err;
> +
> + if (tmp == 11) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> + }
> + /* TODO find out if this is also true for rtl2832? */
> + /*else if (tmp == 10) {
> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> + FE_HAS_VITERBI;
> + }*/
> +
> + return ret;
> +err:
> + info("%s: failed=%d", __func__, ret);
> + return ret;
> +}
> +
> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> + *snr = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> + *ber = 0;
> + return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> + *ucblocks = 0;
> + return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> + *strength = 0;
> + return 0;
> +}
Why to implement the above, if they're doing nothing?
> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> + struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> + dbg("%s", __func__);
> + kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c)
> +{
> + struct rtl2832_priv *priv = NULL;
> + int ret = 0;
> + u8 tmp;
> +
> + dbg("%s", __func__);
> +
> + /* allocate memory for the internal state */
> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> + if (priv == NULL)
> + goto err;
> +
> + /* setup the priv */
> + priv->i2c = i2c;
> + priv->tuner = cfg->tuner;
> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> + /* check if the demod is there */
> + ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
> + if (ret)
> + goto err;
> +
> + /* create dvb_frontend */
> + memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
> + priv->fe.demodulator_priv = priv;
> +
> + /* TODO implement sleep mode */
> + priv->sleeping = true;
> +
> + return &priv->fe;
> +err:
> + dbg("%s: failed=%d", __func__, ret);
> + kfree(priv);
> + return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);
EXPORT_SYMBOL_GPL() if preferred.
> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> + .delsys = { SYS_DVBT },
> + .info = {
> + .name = "Realtek RTL2832 (DVB-T)",
> + .frequency_min = 174000000,
> + .frequency_max = 862000000,
> + .frequency_stepsize = 166667,
> + .caps = FE_CAN_FEC_1_2 |
> + FE_CAN_FEC_2_3 |
> + FE_CAN_FEC_3_4 |
> + FE_CAN_FEC_5_6 |
> + FE_CAN_FEC_7_8 |
> + FE_CAN_FEC_AUTO |
> + FE_CAN_QPSK |
> + FE_CAN_QAM_16 |
> + FE_CAN_QAM_64 |
> + FE_CAN_QAM_AUTO |
> + FE_CAN_TRANSMISSION_MODE_AUTO |
> + FE_CAN_GUARD_INTERVAL_AUTO |
> + FE_CAN_HIERARCHY_AUTO |
> + FE_CAN_RECOVER |
> + FE_CAN_MUTE_TS
> + },
> +
> + .release = rtl2832_release,
> +
> + .init = rtl2832_init,
> + .sleep = rtl2832_sleep,
> +
> + .get_tune_settings = rtl2832_get_tune_settings,
> +
> + .set_frontend = rtl2832_set_frontend,
> +
> + .read_status = rtl2832_read_status,
> + .read_snr = rtl2832_read_snr,
> + .read_ber = rtl2832_read_ber,
> + .read_ucblocks = rtl2832_read_ucblocks,
> + .read_signal_strength = rtl2832_read_signal_strength,
> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.5");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include <linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> + /*
> + * Demodulator I2C address.
> + */
> + u8 i2c_addr;
> +
> + /*
> + * Xtal frequency.
> + * Hz
> + * 4000000, 16000000, 25000000, 28800000
> + */
> + u32 xtal;
> +
> + /*
> + * IFs for all used modes.
> + * Hz
> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> + */
> + u32 if_dvbt;
> +
> + /*
> + */
> + u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> + (defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *cfg,
> + struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> + struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> + const struct rtl2832_config *config,
> + struct i2c_adapter *i2c
> +)
> +{
> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> + return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..cd01a8a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,260 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> +do { \
> + if (rtl2832_debug) \
> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg); \
> +} while (0)
> +#undef err
> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> + struct i2c_adapter *i2c;
> + struct dvb_frontend fe;
> + struct rtl2832_config cfg;
> +
> + bool i2c_gate_state;
> + bool sleeping;
> +
> + u8 tuner;
> + u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> + u8 page;
> + u8 start_address;
> + u8 msb;
> + u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> + int reg;
> + u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> + DVBT_SOFT_RST,
> + DVBT_IIC_REPEAT,
> + DVBT_TR_WAIT_MIN_8K,
> + DVBT_RSD_BER_FAIL_VAL,
> + DVBT_EN_BK_TRK,
> + DVBT_REG_PI,
> + DVBT_REG_PFREQ_1_0,
> + DVBT_PD_DA8,
> + DVBT_LOCK_TH,
> + DVBT_BER_PASS_SCAL,
> + DVBT_CE_FFSM_BYPASS,
> + DVBT_ALPHAIIR_N,
> + DVBT_ALPHAIIR_DIF,
> + DVBT_EN_TRK_SPAN,
> + DVBT_LOCK_TH_LEN,
> + DVBT_CCI_THRE,
> + DVBT_CCI_MON_SCAL,
> + DVBT_CCI_M0,
> + DVBT_CCI_M1,
> + DVBT_CCI_M2,
> + DVBT_CCI_M3,
> + DVBT_SPEC_INIT_0,
> + DVBT_SPEC_INIT_1,
> + DVBT_SPEC_INIT_2,
> + DVBT_AD_EN_REG,
> + DVBT_AD_EN_REG1,
> + DVBT_EN_BBIN,
> + DVBT_MGD_THD0,
> + DVBT_MGD_THD1,
> + DVBT_MGD_THD2,
> + DVBT_MGD_THD3,
> + DVBT_MGD_THD4,
> + DVBT_MGD_THD5,
> + DVBT_MGD_THD6,
> + DVBT_MGD_THD7,
> + DVBT_EN_CACQ_NOTCH,
> + DVBT_AD_AV_REF,
> + DVBT_PIP_ON,
> + DVBT_SCALE1_B92,
> + DVBT_SCALE1_B93,
> + DVBT_SCALE1_BA7,
> + DVBT_SCALE1_BA9,
> + DVBT_SCALE1_BAA,
> + DVBT_SCALE1_BAB,
> + DVBT_SCALE1_BAC,
> + DVBT_SCALE1_BB0,
> + DVBT_SCALE1_BB1,
> + DVBT_KB_P1,
> + DVBT_KB_P2,
> + DVBT_KB_P3,
> + DVBT_OPT_ADC_IQ,
> + DVBT_AD_AVI,
> + DVBT_AD_AVQ,
> + DVBT_K1_CR_STEP12,
> + DVBT_TRK_KS_P2,
> + DVBT_TRK_KS_I2,
> + DVBT_TR_THD_SET2,
> + DVBT_TRK_KC_P2,
> + DVBT_TRK_KC_I2,
> + DVBT_CR_THD_SET2,
> + DVBT_PSET_IFFREQ,
> + DVBT_SPEC_INV,
> + DVBT_BW_INDEX,
> + DVBT_RSAMP_RATIO,
> + DVBT_CFREQ_OFF_RATIO,
> + DVBT_FSM_STAGE,
> + DVBT_RX_CONSTEL,
> + DVBT_RX_HIER,
> + DVBT_RX_C_RATE_LP,
> + DVBT_RX_C_RATE_HP,
> + DVBT_GI_IDX,
> + DVBT_FFT_MODE_IDX,
> + DVBT_RSD_BER_EST,
> + DVBT_CE_EST_EVM,
> + DVBT_RF_AGC_VAL,
> + DVBT_IF_AGC_VAL,
> + DVBT_DAGC_VAL,
> + DVBT_SFREQ_OFF,
> + DVBT_CFREQ_OFF,
> + DVBT_POLAR_RF_AGC,
> + DVBT_POLAR_IF_AGC,
> + DVBT_AAGC_HOLD,
> + DVBT_EN_RF_AGC,
> + DVBT_EN_IF_AGC,
> + DVBT_IF_AGC_MIN,
> + DVBT_IF_AGC_MAX,
> + DVBT_RF_AGC_MIN,
> + DVBT_RF_AGC_MAX,
> + DVBT_IF_AGC_MAN,
> + DVBT_IF_AGC_MAN_VAL,
> + DVBT_RF_AGC_MAN,
> + DVBT_RF_AGC_MAN_VAL,
> + DVBT_DAGC_TRG_VAL,
> + DVBT_AGC_TARG_VAL,
> + DVBT_LOOP_GAIN_3_0,
> + DVBT_LOOP_GAIN_4,
> + DVBT_VTOP,
> + DVBT_KRF,
> + DVBT_AGC_TARG_VAL_0,
> + DVBT_AGC_TARG_VAL_8_1,
> + DVBT_AAGC_LOOP_GAIN,
> + DVBT_LOOP_GAIN2_3_0,
> + DVBT_LOOP_GAIN2_4,
> + DVBT_LOOP_GAIN3,
> + DVBT_VTOP1,
> + DVBT_VTOP2,
> + DVBT_VTOP3,
> + DVBT_KRF1,
> + DVBT_KRF2,
> + DVBT_KRF3,
> + DVBT_KRF4,
> + DVBT_EN_GI_PGA,
> + DVBT_THD_LOCK_UP,
> + DVBT_THD_LOCK_DW,
> + DVBT_THD_UP1,
> + DVBT_THD_DW1,
> + DVBT_INTER_CNT_LEN,
> + DVBT_GI_PGA_STATE,
> + DVBT_EN_AGC_PGA,
> + DVBT_CKOUTPAR,
> + DVBT_CKOUT_PWR,
> + DVBT_SYNC_DUR,
> + DVBT_ERR_DUR,
> + DVBT_SYNC_LVL,
> + DVBT_ERR_LVL,
> + DVBT_VAL_LVL,
> + DVBT_SERIAL,
> + DVBT_SER_LSB,
> + DVBT_CDIV_PH0,
> + DVBT_CDIV_PH1,
> + DVBT_MPEG_IO_OPT_2_2,
> + DVBT_MPEG_IO_OPT_1_0,
> + DVBT_CKOUTPAR_PIP,
> + DVBT_CKOUT_PWR_PIP,
> + DVBT_SYNC_LVL_PIP,
> + DVBT_ERR_LVL_PIP,
> + DVBT_VAL_LVL_PIP,
> + DVBT_CKOUTPAR_PID,
> + DVBT_CKOUT_PWR_PID,
> + DVBT_SYNC_LVL_PID,
> + DVBT_ERR_LVL_PID,
> + DVBT_VAL_LVL_PID,
> + DVBT_SM_PASS,
> + DVBT_UPDATE_REG_2,
> + DVBT_BTHD_P3,
> + DVBT_BTHD_D3,
> + DVBT_FUNC4_REG0,
> + DVBT_FUNC4_REG1,
> + DVBT_FUNC4_REG2,
> + DVBT_FUNC4_REG3,
> + DVBT_FUNC4_REG4,
> + DVBT_FUNC4_REG5,
> + DVBT_FUNC4_REG6,
> + DVBT_FUNC4_REG7,
> + DVBT_FUNC4_REG8,
> + DVBT_FUNC4_REG9,
> + DVBT_FUNC4_REG10,
> + DVBT_FUNC5_REG0,
> + DVBT_FUNC5_REG1,
> + DVBT_FUNC5_REG2,
> + DVBT_FUNC5_REG3,
> + DVBT_FUNC5_REG4,
> + DVBT_FUNC5_REG5,
> + DVBT_FUNC5_REG6,
> + DVBT_FUNC5_REG7,
> + DVBT_FUNC5_REG8,
> + DVBT_FUNC5_REG9,
> + DVBT_FUNC5_REG10,
> + DVBT_FUNC5_REG11,
> + DVBT_FUNC5_REG12,
> + DVBT_FUNC5_REG13,
> + DVBT_FUNC5_REG14,
> + DVBT_FUNC5_REG15,
> + DVBT_FUNC5_REG16,
> + DVBT_FUNC5_REG17,
> + DVBT_FUNC5_REG18,
> + DVBT_AD7_SETTING,
> + DVBT_RSSI_R,
> + DVBT_ACI_DET_IND,
> + DVBT_REG_MON,
> + DVBT_REG_MONSEL,
> + DVBT_REG_GPE,
> + DVBT_REG_GPO,
> + DVBT_REG_4MSEL,
> + DVBT_TEST_REG_1,
> + DVBT_TEST_REG_2,
> + DVBT_TEST_REG_3,
> + DVBT_TEST_REG_4,
> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */
>
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-07-05 14:32 ` Mauro Carvalho Chehab
@ 2012-07-05 14:35 ` Antti Palosaari
2012-07-05 15:54 ` Mauro Carvalho Chehab
2012-07-05 14:41 ` Antti Palosaari
1 sibling, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-07-05 14:35 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Thomas Mair, linux-media, pomidorabelisima
On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
> Em 18-05-2012 15:47, Thomas Mair escreveu:
>> Changelog for ver. 0.5:
>> - fixed code style and naming errors
>>
>> Changelog for ver. 0.4:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
>> ---
>> drivers/media/dvb/frontends/Kconfig | 7 +
>> drivers/media/dvb/frontends/Makefile | 1 +
>> drivers/media/dvb/frontends/rtl2832.c | 823 ++++++++++++++++++++++++++++
>> drivers/media/dvb/frontends/rtl2832.h | 74 +++
>> drivers/media/dvb/frontends/rtl2832_priv.h | 260 +++++++++
>> 5 files changed, 1165 insertions(+), 0 deletions(-)
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>> create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>> create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>> help
>> Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> + tristate "Realtek RTL2832 DVB-T"
>> + depends on DVB_CORE && I2C
>> + default m if DVB_FE_CUSTOMISE
>> + help
>> + Say Y when you want to support this frontend.
>> +
>> comment "DVB-C (cable) frontends"
>> depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..2279c5d 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>> obj-$(CONFIG_DVB_A8293) += a8293.o
>> obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>> obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
>> obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>> obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..d0cbe27
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,823 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public License along
>> + * with this program; if not, write to the Free Software Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
>> +
>> +
>> +static const int reg_mask[32] = {
>> + 0x00000001,
>> + 0x00000003,
>> + 0x00000007,
>> + 0x0000000f,
>> + 0x0000001f,
>> + 0x0000003f,
>> + 0x0000007f,
>> + 0x000000ff,
>> + 0x000001ff,
>> + 0x000003ff,
>> + 0x000007ff,
>> + 0x00000fff,
>> + 0x00001fff,
>> + 0x00003fff,
>> + 0x00007fff,
>> + 0x0000ffff,
>> + 0x0001ffff,
>> + 0x0003ffff,
>> + 0x0007ffff,
>> + 0x000fffff,
>> + 0x001fffff,
>> + 0x003fffff,
>> + 0x007fffff,
>> + 0x00ffffff,
>> + 0x01ffffff,
>> + 0x03ffffff,
>> + 0x07ffffff,
>> + 0x0fffffff,
>> + 0x1fffffff,
>> + 0x3fffffff,
>> + 0x7fffffff,
>> + 0xffffffff
>> +};
>
> It would be better to use a macro here like:
>
> #define REG_MASK(b) ((1 << ((b) + 1)) -1)
>
> Even better, you could use the bitops.h BIT() macro:
>
> #define REG_MASK(b) (BIT(b + 1) - 1)
I said also that once for Thomas during review but he didn't changed it :)
>
>> +
>> +static const struct rtl2832_reg_entry registers[] = {
>> + [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
>> + [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
>> + [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
>> + [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
>> + [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
>> + [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
>> + [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
>> + [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
>> + [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
>> + [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
>> + [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
>> + [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
>> + [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
>> + [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
>> + [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
>> + [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
>> + [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
>> + [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
>> + [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
>> + [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
>> + [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
>> + [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
>> + [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
>> + [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
>> + [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
>> + [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
>> + [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
>> + [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
>> + [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
>> + [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
>> + [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
>> + [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
>> + [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
>> + [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
>> + [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
>> + [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
>> + [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
>> + [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
>> + [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
>> + [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
>> + [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
>> + [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
>> + [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
>> + [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
>> + [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
>> + [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
>> + [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
>> + [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
>> + [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
>> + [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
>> + [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
>> + [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
>> + [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
>> + [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
>> + [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
>> + [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
>> + [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
>> + [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
>> + [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
>> + [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
>> + [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
>> + [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
>> + [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
>> + [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
>> + [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
>> + [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
>> + [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
>> + [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
>> + [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
>> + [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
>> + [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
>> + [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
>> + [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
>> + [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
>> + [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
>> + [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
>> + [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
>> + [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
>> + [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
>> + [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
>> + [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
>> + [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
>> + [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
>> + [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
>> + [DVBT_KRF2] = {0x1, 0x7, 7, 0},
>> + [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
>> + [DVBT_KRF4] = {0x1, 0xce, 7, 0},
>> + [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
>> + [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
>> + [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
>> + [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
>> + [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
>> + [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
>> + [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
>> + [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
>> + [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
>> + [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
>> + [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
>> + [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
>> + [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
>> + [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
>> + [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
>> + [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
>> + [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
>> + [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
>> + [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
>> + [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
>> + [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
>> + [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
>> + [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
>> + [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
>> + [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
>> + [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
>> + [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
>> + [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
>> + [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
>> + [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
>> + [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
>> + [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
>> + [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
>> + [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
>> + [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
>> + [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
>> + [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
>> + [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
>> + [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
>> + [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
>> +{
>> + int ret;
>> + u8 buf[1+len];
>> + struct i2c_msg msg[1] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1+len,
>> + .buf = buf,
>> + }
>> + };
>> +
>> + buf[0] = reg;
>> + memcpy(&buf[1], val, len);
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 1);
>> + if (ret == 1) {
>> + ret = 0;
>> + } else {
>> + warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> + }
>> + return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
>> +{
>> + int ret;
>> + struct i2c_msg msg[2] = {
>> + {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = 0,
>> + .len = 1,
>> + .buf = ®,
>> + }, {
>> + .addr = priv->cfg.i2c_addr,
>> + .flags = I2C_M_RD,
>> + .len = len,
>> + .buf = val,
>> + }
>> + };
>> +
>> + ret = i2c_transfer(priv->i2c, msg, 2);
>> + if (ret == 2) {
>> + ret = 0;
>> + } else {
>> + warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> + ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00, &page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
>> + int len)
>> +{
>> + int ret;
>> +
>> + /* switch bank if needed */
>> + if (page != priv->page) {
>> + ret = rtl2832_wr(priv, 0x00, &page, 1);
>> + if (ret)
>> + return ret;
>> +
>> + priv->page = page;
>> + }
>> +
>> + return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
>> +{
>> + return rtl2832_wr_regs(priv, reg, page, &val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
>> +{
>> + return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> + int ret;
>> +
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u8 reading[4];
>> + u32 reading_tmp;
>> + int i;
>> +
>> + u8 len;
>> + u32 mask;
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb >> 3) + 1;
>> + mask = reg_mask[msb - lsb];
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i < len; i++)
>> + reading_tmp |= reading[i] << ((len - 1 - i) * 8);
>> +
>> + *val = (reading_tmp >> lsb) & mask;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> + int ret, i;
>> + u8 len;
>> + u8 reg_start_addr;
>> + u8 msb, lsb;
>> + u8 page;
>> + u32 mask;
>> +
>> +
>> + u8 reading[4];
>> + u8 writing[4];
>> + u32 reading_tmp;
>> + u32 writing_tmp;
>> +
>> +
>> + reg_start_addr = registers[reg].start_address;
>> + msb = registers[reg].msb;
>> + lsb = registers[reg].lsb;
>> + page = registers[reg].page;
>> +
>> + len = (msb >> 3) + 1;
>> + mask = reg_mask[msb - lsb];
>> +
>> +
>> + ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + reading_tmp = 0;
>> + for (i = 0; i < len; i++)
>> + reading_tmp |= reading[i] << ((len - 1 - i) * 8);
>> +
>> + writing_tmp = reading_tmp & ~(mask << lsb);
>> + writing_tmp |= ((val & mask) << lsb);
>> +
>> +
>> + for (i = 0; i < len; i++)
>> + writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
>> +
>> + ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> + int ret;
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s: enable=%d", __func__, enable);
>> +
>> + /* gate already open or close */
>> + if (priv->i2c_gate_state == enable)
>> + return 0;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
>> + if (ret)
>> + goto err;
>> +
>> + priv->i2c_gate_state = enable;
>> +
>> + return ret;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int i, ret;
>> +
>> + u8 en_bbin;
>> + u64 pset_iffreq;
>> +
>> + /* initialization values for the demodulator registers */
>> + struct rtl2832_reg_value rtl2832_initial_regs[] = {
>
> Please, declare it with const.
>
>> + {DVBT_AD_EN_REG, 0x1},
>> + {DVBT_AD_EN_REG1, 0x1},
>> + {DVBT_RSD_BER_FAIL_VAL, 0x2800},
>> + {DVBT_MGD_THD0, 0x10},
>> + {DVBT_MGD_THD1, 0x20},
>> + {DVBT_MGD_THD2, 0x20},
>> + {DVBT_MGD_THD3, 0x40},
>> + {DVBT_MGD_THD4, 0x22},
>> + {DVBT_MGD_THD5, 0x32},
>> + {DVBT_MGD_THD6, 0x37},
>> + {DVBT_MGD_THD7, 0x39},
>> + {DVBT_EN_BK_TRK, 0x0},
>> + {DVBT_EN_CACQ_NOTCH, 0x0},
>> + {DVBT_AD_AV_REF, 0x2a},
>> + {DVBT_REG_PI, 0x6},
>> + {DVBT_PIP_ON, 0x0},
>> + {DVBT_CDIV_PH0, 0x8},
>> + {DVBT_CDIV_PH1, 0x8},
>> + {DVBT_SCALE1_B92, 0x4},
>> + {DVBT_SCALE1_B93, 0xb0},
>> + {DVBT_SCALE1_BA7, 0x78},
>> + {DVBT_SCALE1_BA9, 0x28},
>> + {DVBT_SCALE1_BAA, 0x59},
>> + {DVBT_SCALE1_BAB, 0x83},
>> + {DVBT_SCALE1_BAC, 0xd4},
>> + {DVBT_SCALE1_BB0, 0x65},
>> + {DVBT_SCALE1_BB1, 0x43},
>> + {DVBT_KB_P1, 0x1},
>> + {DVBT_KB_P2, 0x4},
>> + {DVBT_KB_P3, 0x7},
>> + {DVBT_K1_CR_STEP12, 0xa},
>> + {DVBT_REG_GPE, 0x1},
>> + {DVBT_SERIAL, 0x0},
>> + {DVBT_CDIV_PH0, 0x9},
>> + {DVBT_CDIV_PH1, 0x9},
>> + {DVBT_MPEG_IO_OPT_2_2, 0x0},
>> + {DVBT_MPEG_IO_OPT_1_0, 0x0},
>> + {DVBT_TRK_KS_P2, 0x4},
>> + {DVBT_TRK_KS_I2, 0x7},
>> + {DVBT_TR_THD_SET2, 0x6},
>> + {DVBT_TRK_KC_I2, 0x5},
>> + {DVBT_CR_THD_SET2, 0x1},
>> + {DVBT_SPEC_INV, 0x0},
>> + {DVBT_DAGC_TRG_VAL, 0x5a},
>> + {DVBT_AGC_TARG_VAL_0, 0x0},
>> + {DVBT_AGC_TARG_VAL_8_1, 0x5a},
>> + {DVBT_AAGC_LOOP_GAIN, 0x16},
>> + {DVBT_LOOP_GAIN2_3_0, 0x6},
>> + {DVBT_LOOP_GAIN2_4, 0x1},
>> + {DVBT_LOOP_GAIN3, 0x16},
>> + {DVBT_VTOP1, 0x35},
>> + {DVBT_VTOP2, 0x21},
>> + {DVBT_VTOP3, 0x21},
>> + {DVBT_KRF1, 0x0},
>> + {DVBT_KRF2, 0x40},
>> + {DVBT_KRF3, 0x10},
>> + {DVBT_KRF4, 0x10},
>> + {DVBT_IF_AGC_MIN, 0x80},
>> + {DVBT_IF_AGC_MAX, 0x7f},
>> + {DVBT_RF_AGC_MIN, 0x80},
>> + {DVBT_RF_AGC_MAX, 0x7f},
>> + {DVBT_POLAR_RF_AGC, 0x0},
>> + {DVBT_POLAR_IF_AGC, 0x0},
>> + {DVBT_AD7_SETTING, 0xe9bf},
>> + {DVBT_EN_GI_PGA, 0x0},
>> + {DVBT_THD_LOCK_UP, 0x0},
>> + {DVBT_THD_LOCK_DW, 0x0},
>> + {DVBT_THD_UP1, 0x11},
>> + {DVBT_THD_DW1, 0xef},
>> + {DVBT_INTER_CNT_LEN, 0xc},
>> + {DVBT_GI_PGA_STATE, 0x0},
>> + {DVBT_EN_AGC_PGA, 0x1},
>> + {DVBT_IF_AGC_MAN, 0x0},
>> + };
>> +
>> +
>> + dbg("%s", __func__);
>> +
>> + en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> + /*
>> + * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> + * / CrystalFreqHz)
>> + */
>> + pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> + pset_iffreq *= 0x400000;
>> + pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> + pset_iffreq = pset_iffreq & 0x3fffff;
>> +
>> +
>> +
>> + for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> + ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> + rtl2832_initial_regs[i].value);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* if frequency settings */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> + if (ret)
>> + goto err;
>> +
>> + priv->sleeping = false;
>> +
>> + return ret;
>> +
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + priv->sleeping = true;
>> + return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> + struct dvb_frontend_tune_settings *s)
>> +{
>> + dbg("%s", __func__);
>> + s->min_delay_ms = 1000;
>> + s->step_size = fe->ops.info.frequency_stepsize * 2;
>> + s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + struct dtv_frontend_properties *c = &fe->dtv_property_cache;
>> + int ret, i, j;
>> + u64 bw_mode, num, num2;
>> + u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> + static u8 bw_params[3][32] = {
>> + /* 6 MHz bandwidth */
>> + {
>> + 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> + 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> + 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> + 0x19, 0xe0,
>> + },
>> +
>> + /* 7 MHz bandwidth */
>> + {
>> + 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> + 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> + 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> + 0x19, 0x10,
>> + },
>> +
>> + /* 8 MHz bandwidth */
>> + {
>> + 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> + 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> + 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> + 0x19, 0xe0,
>> + },
>> + };
>> +
>> +
>> + dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> + c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> + /* program tuner */
>> + if (fe->ops.tuner_ops.set_params)
>> + fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> + switch (c->bandwidth_hz) {
>> + case 6000000:
>> + i = 0;
>> + bw_mode = 48000000;
>> + break;
>> + case 7000000:
>> + i = 1;
>> + bw_mode = 56000000;
>> + break;
>> + case 8000000:
>> + i = 2;
>> + bw_mode = 64000000;
>> + break;
>> + default:
>> + dbg("invalid bandwidth");
>> + return -EINVAL;
>> + }
>> +
>> + for (j = 0; j < sizeof(bw_params[j]); j++) {
>> + ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
>> + if (ret)
>> + goto err;
>> + }
>> +
>> + /* calculate and set resample ratio
>> + * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> + * / ConstWithBandwidthMode)
>> + */
>> + num = priv->cfg.xtal * 7;
>> + num *= 0x400000;
>> + num = div_u64(num, bw_mode);
>> + resamp_ratio = num & 0x3ffffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> + if (ret)
>> + goto err;
>> +
>> + /* calculate and set cfreq off ratio
>> + * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> + * / (CrystalFreqHz * 7))
>> + */
>> + num = bw_mode << 20;
>> + num2 = priv->cfg.xtal * 7;
>> + num = div_u64(num, num2);
>> + num = -num;
>> + cfreq_off_ratio = num & 0xfffff;
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
>> + if (ret)
>> + goto err;
>> +
>> +
>> + /* soft reset */
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> + if (ret)
>> + goto err;
>> +
>> + ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> + if (ret)
>> + goto err;
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> + int ret;
>> + u32 tmp;
>> + *status = 0;
>> +
>> +
>> + dbg("%s", __func__);
>> + if (priv->sleeping)
>> + return 0;
>> +
>> + ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
>> + if (ret)
>> + goto err;
>> +
>> + if (tmp == 11) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> + }
>> + /* TODO find out if this is also true for rtl2832? */
>> + /*else if (tmp == 10) {
>> + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> + FE_HAS_VITERBI;
>> + }*/
>> +
>> + return ret;
>> +err:
>> + info("%s: failed=%d", __func__, ret);
>> + return ret;
>> +}
>> +
>
>
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> + *snr = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> + *ber = 0;
>> + return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> + *ucblocks = 0;
>> + return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>> +{
>> + *strength = 0;
>> + return 0;
>> +}
>
> Why to implement the above, if they're doing nothing?
>
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> + struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> + dbg("%s", __func__);
>> + kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c)
>> +{
>> + struct rtl2832_priv *priv = NULL;
>> + int ret = 0;
>> + u8 tmp;
>> +
>> + dbg("%s", __func__);
>> +
>> + /* allocate memory for the internal state */
>> + priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> + if (priv == NULL)
>> + goto err;
>> +
>> + /* setup the priv */
>> + priv->i2c = i2c;
>> + priv->tuner = cfg->tuner;
>> + memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> + /* check if the demod is there */
>> + ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
>> + if (ret)
>> + goto err;
>> +
>> + /* create dvb_frontend */
>> + memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> + priv->fe.demodulator_priv = priv;
>> +
>> + /* TODO implement sleep mode */
>> + priv->sleeping = true;
>> +
>> + return &priv->fe;
>> +err:
>> + dbg("%s: failed=%d", __func__, ret);
>> + kfree(priv);
>> + return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>
> EXPORT_SYMBOL_GPL() if preferred.
>
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> + .delsys = { SYS_DVBT },
>> + .info = {
>> + .name = "Realtek RTL2832 (DVB-T)",
>> + .frequency_min = 174000000,
>> + .frequency_max = 862000000,
>> + .frequency_stepsize = 166667,
>> + .caps = FE_CAN_FEC_1_2 |
>> + FE_CAN_FEC_2_3 |
>> + FE_CAN_FEC_3_4 |
>> + FE_CAN_FEC_5_6 |
>> + FE_CAN_FEC_7_8 |
>> + FE_CAN_FEC_AUTO |
>> + FE_CAN_QPSK |
>> + FE_CAN_QAM_16 |
>> + FE_CAN_QAM_64 |
>> + FE_CAN_QAM_AUTO |
>> + FE_CAN_TRANSMISSION_MODE_AUTO |
>> + FE_CAN_GUARD_INTERVAL_AUTO |
>> + FE_CAN_HIERARCHY_AUTO |
>> + FE_CAN_RECOVER |
>> + FE_CAN_MUTE_TS
>> + },
>> +
>> + .release = rtl2832_release,
>> +
>> + .init = rtl2832_init,
>> + .sleep = rtl2832_sleep,
>> +
>> + .get_tune_settings = rtl2832_get_tune_settings,
>> +
>> + .set_frontend = rtl2832_set_frontend,
>> +
>> + .read_status = rtl2832_read_status,
>> + .read_snr = rtl2832_read_snr,
>> + .read_ber = rtl2832_read_ber,
>> + .read_ucblocks = rtl2832_read_ucblocks,
>> + .read_signal_strength = rtl2832_read_signal_strength,
>> + .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.5");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public License along
>> + * with this program; if not, write to the Free Software Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include <linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> + /*
>> + * Demodulator I2C address.
>> + */
>> + u8 i2c_addr;
>> +
>> + /*
>> + * Xtal frequency.
>> + * Hz
>> + * 4000000, 16000000, 25000000, 28800000
>> + */
>> + u32 xtal;
>> +
>> + /*
>> + * IFs for all used modes.
>> + * Hz
>> + * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> + */
>> + u32 if_dvbt;
>> +
>> + /*
>> + */
>> + u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> + (defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *cfg,
>> + struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> + struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> + const struct rtl2832_config *config,
>> + struct i2c_adapter *i2c
>> +)
>> +{
>> + printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> + return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..cd01a8a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,260 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@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; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * 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.
>> + *
>> + * You should have received a copy of the GNU General Public License along
>> + * with this program; if not, write to the Free Software Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> +do { \
>> + if (rtl2832_debug) \
>> + printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg); \
>> +} while (0)
>> +#undef err
>> +#define err(f, arg...) printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>> +
>> +struct rtl2832_priv {
>> + struct i2c_adapter *i2c;
>> + struct dvb_frontend fe;
>> + struct rtl2832_config cfg;
>> +
>> + bool i2c_gate_state;
>> + bool sleeping;
>> +
>> + u8 tuner;
>> + u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> + u8 page;
>> + u8 start_address;
>> + u8 msb;
>> + u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> + int reg;
>> + u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> + DVBT_SOFT_RST,
>> + DVBT_IIC_REPEAT,
>> + DVBT_TR_WAIT_MIN_8K,
>> + DVBT_RSD_BER_FAIL_VAL,
>> + DVBT_EN_BK_TRK,
>> + DVBT_REG_PI,
>> + DVBT_REG_PFREQ_1_0,
>> + DVBT_PD_DA8,
>> + DVBT_LOCK_TH,
>> + DVBT_BER_PASS_SCAL,
>> + DVBT_CE_FFSM_BYPASS,
>> + DVBT_ALPHAIIR_N,
>> + DVBT_ALPHAIIR_DIF,
>> + DVBT_EN_TRK_SPAN,
>> + DVBT_LOCK_TH_LEN,
>> + DVBT_CCI_THRE,
>> + DVBT_CCI_MON_SCAL,
>> + DVBT_CCI_M0,
>> + DVBT_CCI_M1,
>> + DVBT_CCI_M2,
>> + DVBT_CCI_M3,
>> + DVBT_SPEC_INIT_0,
>> + DVBT_SPEC_INIT_1,
>> + DVBT_SPEC_INIT_2,
>> + DVBT_AD_EN_REG,
>> + DVBT_AD_EN_REG1,
>> + DVBT_EN_BBIN,
>> + DVBT_MGD_THD0,
>> + DVBT_MGD_THD1,
>> + DVBT_MGD_THD2,
>> + DVBT_MGD_THD3,
>> + DVBT_MGD_THD4,
>> + DVBT_MGD_THD5,
>> + DVBT_MGD_THD6,
>> + DVBT_MGD_THD7,
>> + DVBT_EN_CACQ_NOTCH,
>> + DVBT_AD_AV_REF,
>> + DVBT_PIP_ON,
>> + DVBT_SCALE1_B92,
>> + DVBT_SCALE1_B93,
>> + DVBT_SCALE1_BA7,
>> + DVBT_SCALE1_BA9,
>> + DVBT_SCALE1_BAA,
>> + DVBT_SCALE1_BAB,
>> + DVBT_SCALE1_BAC,
>> + DVBT_SCALE1_BB0,
>> + DVBT_SCALE1_BB1,
>> + DVBT_KB_P1,
>> + DVBT_KB_P2,
>> + DVBT_KB_P3,
>> + DVBT_OPT_ADC_IQ,
>> + DVBT_AD_AVI,
>> + DVBT_AD_AVQ,
>> + DVBT_K1_CR_STEP12,
>> + DVBT_TRK_KS_P2,
>> + DVBT_TRK_KS_I2,
>> + DVBT_TR_THD_SET2,
>> + DVBT_TRK_KC_P2,
>> + DVBT_TRK_KC_I2,
>> + DVBT_CR_THD_SET2,
>> + DVBT_PSET_IFFREQ,
>> + DVBT_SPEC_INV,
>> + DVBT_BW_INDEX,
>> + DVBT_RSAMP_RATIO,
>> + DVBT_CFREQ_OFF_RATIO,
>> + DVBT_FSM_STAGE,
>> + DVBT_RX_CONSTEL,
>> + DVBT_RX_HIER,
>> + DVBT_RX_C_RATE_LP,
>> + DVBT_RX_C_RATE_HP,
>> + DVBT_GI_IDX,
>> + DVBT_FFT_MODE_IDX,
>> + DVBT_RSD_BER_EST,
>> + DVBT_CE_EST_EVM,
>> + DVBT_RF_AGC_VAL,
>> + DVBT_IF_AGC_VAL,
>> + DVBT_DAGC_VAL,
>> + DVBT_SFREQ_OFF,
>> + DVBT_CFREQ_OFF,
>> + DVBT_POLAR_RF_AGC,
>> + DVBT_POLAR_IF_AGC,
>> + DVBT_AAGC_HOLD,
>> + DVBT_EN_RF_AGC,
>> + DVBT_EN_IF_AGC,
>> + DVBT_IF_AGC_MIN,
>> + DVBT_IF_AGC_MAX,
>> + DVBT_RF_AGC_MIN,
>> + DVBT_RF_AGC_MAX,
>> + DVBT_IF_AGC_MAN,
>> + DVBT_IF_AGC_MAN_VAL,
>> + DVBT_RF_AGC_MAN,
>> + DVBT_RF_AGC_MAN_VAL,
>> + DVBT_DAGC_TRG_VAL,
>> + DVBT_AGC_TARG_VAL,
>> + DVBT_LOOP_GAIN_3_0,
>> + DVBT_LOOP_GAIN_4,
>> + DVBT_VTOP,
>> + DVBT_KRF,
>> + DVBT_AGC_TARG_VAL_0,
>> + DVBT_AGC_TARG_VAL_8_1,
>> + DVBT_AAGC_LOOP_GAIN,
>> + DVBT_LOOP_GAIN2_3_0,
>> + DVBT_LOOP_GAIN2_4,
>> + DVBT_LOOP_GAIN3,
>> + DVBT_VTOP1,
>> + DVBT_VTOP2,
>> + DVBT_VTOP3,
>> + DVBT_KRF1,
>> + DVBT_KRF2,
>> + DVBT_KRF3,
>> + DVBT_KRF4,
>> + DVBT_EN_GI_PGA,
>> + DVBT_THD_LOCK_UP,
>> + DVBT_THD_LOCK_DW,
>> + DVBT_THD_UP1,
>> + DVBT_THD_DW1,
>> + DVBT_INTER_CNT_LEN,
>> + DVBT_GI_PGA_STATE,
>> + DVBT_EN_AGC_PGA,
>> + DVBT_CKOUTPAR,
>> + DVBT_CKOUT_PWR,
>> + DVBT_SYNC_DUR,
>> + DVBT_ERR_DUR,
>> + DVBT_SYNC_LVL,
>> + DVBT_ERR_LVL,
>> + DVBT_VAL_LVL,
>> + DVBT_SERIAL,
>> + DVBT_SER_LSB,
>> + DVBT_CDIV_PH0,
>> + DVBT_CDIV_PH1,
>> + DVBT_MPEG_IO_OPT_2_2,
>> + DVBT_MPEG_IO_OPT_1_0,
>> + DVBT_CKOUTPAR_PIP,
>> + DVBT_CKOUT_PWR_PIP,
>> + DVBT_SYNC_LVL_PIP,
>> + DVBT_ERR_LVL_PIP,
>> + DVBT_VAL_LVL_PIP,
>> + DVBT_CKOUTPAR_PID,
>> + DVBT_CKOUT_PWR_PID,
>> + DVBT_SYNC_LVL_PID,
>> + DVBT_ERR_LVL_PID,
>> + DVBT_VAL_LVL_PID,
>> + DVBT_SM_PASS,
>> + DVBT_UPDATE_REG_2,
>> + DVBT_BTHD_P3,
>> + DVBT_BTHD_D3,
>> + DVBT_FUNC4_REG0,
>> + DVBT_FUNC4_REG1,
>> + DVBT_FUNC4_REG2,
>> + DVBT_FUNC4_REG3,
>> + DVBT_FUNC4_REG4,
>> + DVBT_FUNC4_REG5,
>> + DVBT_FUNC4_REG6,
>> + DVBT_FUNC4_REG7,
>> + DVBT_FUNC4_REG8,
>> + DVBT_FUNC4_REG9,
>> + DVBT_FUNC4_REG10,
>> + DVBT_FUNC5_REG0,
>> + DVBT_FUNC5_REG1,
>> + DVBT_FUNC5_REG2,
>> + DVBT_FUNC5_REG3,
>> + DVBT_FUNC5_REG4,
>> + DVBT_FUNC5_REG5,
>> + DVBT_FUNC5_REG6,
>> + DVBT_FUNC5_REG7,
>> + DVBT_FUNC5_REG8,
>> + DVBT_FUNC5_REG9,
>> + DVBT_FUNC5_REG10,
>> + DVBT_FUNC5_REG11,
>> + DVBT_FUNC5_REG12,
>> + DVBT_FUNC5_REG13,
>> + DVBT_FUNC5_REG14,
>> + DVBT_FUNC5_REG15,
>> + DVBT_FUNC5_REG16,
>> + DVBT_FUNC5_REG17,
>> + DVBT_FUNC5_REG18,
>> + DVBT_AD7_SETTING,
>> + DVBT_RSSI_R,
>> + DVBT_ACI_DET_IND,
>> + DVBT_REG_MON,
>> + DVBT_REG_MONSEL,
>> + DVBT_REG_GPE,
>> + DVBT_REG_GPO,
>> + DVBT_REG_4MSEL,
>> + DVBT_TEST_REG_1,
>> + DVBT_TEST_REG_2,
>> + DVBT_TEST_REG_3,
>> + DVBT_TEST_REG_4,
>> + DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
>>
>
>
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-07-05 14:32 ` Mauro Carvalho Chehab
2012-07-05 14:35 ` Antti Palosaari
@ 2012-07-05 14:41 ` Antti Palosaari
2012-07-05 15:53 ` Mauro Carvalho Chehab
1 sibling, 1 reply; 53+ messages in thread
From: Antti Palosaari @ 2012-07-05 14:41 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Thomas Mair, linux-media, pomidorabelisima
On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
> Em 18-05-2012 15:47, Thomas Mair escreveu:
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>> +{
>> + *strength = 0;
>> + return 0;
>> +}
>
> Why to implement the above, if they're doing nothing?
Other your findings were correct but for that I would like to comment.
Have you ever tested what happens you lest those without stub
implementation? IIRC ugly errors are seen for example zap and femon
outputs. Some kind of DVB-core changes are needed. And IIRC there was
some error code defined too for API - but such code does not exists.
regards
Antti
--
http://palosaari.fi/
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-07-05 14:41 ` Antti Palosaari
@ 2012-07-05 15:53 ` Mauro Carvalho Chehab
0 siblings, 0 replies; 53+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 15:53 UTC (permalink / raw)
To: Antti Palosaari; +Cc: Thomas Mair, linux-media, pomidorabelisima
Em 05-07-2012 11:41, Antti Palosaari escreveu:
> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>> Em 18-05-2012 15:47, Thomas Mair escreveu:
>
>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>>> +{
>>> + *strength = 0;
>>> + return 0;
>>> +}
>>
>> Why to implement the above, if they're doing nothing?
>
> Other your findings were correct but for that I would like to comment.
>
> Have you ever tested what happens you lest those without stub implementation?
> IIRC ugly errors are seen for example zap and femon outputs. Some kind of DVB-core
> changes are needed. And IIRC there was some error code defined too for API - but such
> code does not exists.
So, let's fix the dvb_core, and not fill drivers with stubs. With regards to userspace
tools, they should be patched to accept the error code that signalizes that an ioctl
was not implemented, and not try to fix an userpace issue in Kernel.
Regards,
Mauro
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-07-05 14:35 ` Antti Palosaari
@ 2012-07-05 15:54 ` Mauro Carvalho Chehab
2012-07-07 15:45 ` poma
0 siblings, 1 reply; 53+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 15:54 UTC (permalink / raw)
To: Antti Palosaari; +Cc: Thomas Mair, linux-media, pomidorabelisima
Em 05-07-2012 11:35, Antti Palosaari escreveu:
> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>> Em 18-05-2012 15:47, Thomas Mair escreveu:
>>> +static const int reg_mask[32] = {
>>> + 0x00000001,
>>> + 0x00000003,
>>> + 0x00000007,
>>> + 0x0000000f,
>>> + 0x0000001f,
>>> + 0x0000003f,
>>> + 0x0000007f,
>>> + 0x000000ff,
>>> + 0x000001ff,
>>> + 0x000003ff,
>>> + 0x000007ff,
>>> + 0x00000fff,
>>> + 0x00001fff,
>>> + 0x00003fff,
>>> + 0x00007fff,
>>> + 0x0000ffff,
>>> + 0x0001ffff,
>>> + 0x0003ffff,
>>> + 0x0007ffff,
>>> + 0x000fffff,
>>> + 0x001fffff,
>>> + 0x003fffff,
>>> + 0x007fffff,
>>> + 0x00ffffff,
>>> + 0x01ffffff,
>>> + 0x03ffffff,
>>> + 0x07ffffff,
>>> + 0x0fffffff,
>>> + 0x1fffffff,
>>> + 0x3fffffff,
>>> + 0x7fffffff,
>>> + 0xffffffff
>>> +};
>>
>> It would be better to use a macro here like:
>>
>> #define REG_MASK(b) ((1 << ((b) + 1)) -1)
>>
>> Even better, you could use the bitops.h BIT() macro:
>>
>> #define REG_MASK(b) (BIT(b + 1) - 1)
>
> I said also that once for Thomas during review but he didn't changed it :)
As those findings are minor ones, I'll just apply the patch series
and add a patch replacing reg_mask table by a macro like above.
>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>>> +{
>>> + *strength = 0;
>>> + return 0;
>>> +}
>>
>> Why to implement the above, if they're doing nothing?
>
> Other your findings were correct but for that I would like to comment.
>
> Have you ever tested what happens you lest those without stub implementation? IIRC ugly errors are seen for example zap and femon outputs. Some kind of DVB-core changes are needed. And IIRC there was some error code defined too for API - but such code does not exists.
>
I'll keep those stubs for now, but we should really fix the core and not allow/add
crap things like that.
Regards,
Mauro
^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
2012-07-05 15:54 ` Mauro Carvalho Chehab
@ 2012-07-07 15:45 ` poma
0 siblings, 0 replies; 53+ messages in thread
From: poma @ 2012-07-07 15:45 UTC (permalink / raw)
To: Mauro Carvalho Chehab, linux-media
On 07/05/2012 05:54 PM, Mauro Carvalho Chehab wrote:
> Em 05-07-2012 11:35, Antti Palosaari escreveu:
>> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>>> Em 18-05-2012 15:47, Thomas Mair escreveu:
>
>>>> +static const int reg_mask[32] = {
>>>> + 0x00000001,
>>>> + 0x00000003,
>>>> + 0x00000007,
>>>> + 0x0000000f,
>>>> + 0x0000001f,
>>>> + 0x0000003f,
>>>> + 0x0000007f,
>>>> + 0x000000ff,
>>>> + 0x000001ff,
>>>> + 0x000003ff,
>>>> + 0x000007ff,
>>>> + 0x00000fff,
>>>> + 0x00001fff,
>>>> + 0x00003fff,
>>>> + 0x00007fff,
>>>> + 0x0000ffff,
>>>> + 0x0001ffff,
>>>> + 0x0003ffff,
>>>> + 0x0007ffff,
>>>> + 0x000fffff,
>>>> + 0x001fffff,
>>>> + 0x003fffff,
>>>> + 0x007fffff,
>>>> + 0x00ffffff,
>>>> + 0x01ffffff,
>>>> + 0x03ffffff,
>>>> + 0x07ffffff,
>>>> + 0x0fffffff,
>>>> + 0x1fffffff,
>>>> + 0x3fffffff,
>>>> + 0x7fffffff,
>>>> + 0xffffffff
>>>> +};
>>>
>>> It would be better to use a macro here like:
>>>
>>> #define REG_MASK(b) ((1 << ((b) + 1)) -1)
>>>
>>> Even better, you could use the bitops.h BIT() macro:
>>>
>>> #define REG_MASK(b) (BIT(b + 1) - 1)
>>
>> I said also that once for Thomas during review but he didn't changed it :)
>
> As those findings are minor ones, I'll just apply the patch series
> and add a patch replacing reg_mask table by a macro like above.
>
Thank you!
Have a nice vacation.
cheers,
poma
^ permalink raw reply [flat|nested] 53+ messages in thread
end of thread, other threads:[~2012-07-07 15:45 UTC | newest]
Thread overview: 53+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1>
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
2012-05-16 22:13 ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
2012-05-17 3:36 ` poma
2012-05-17 3:40 ` poma
2012-05-17 8:04 ` Thomas Mair
2012-05-17 14:19 ` Antti Palosaari
2012-05-17 20:27 ` poma
2012-05-17 20:41 ` Antti Palosaari
2012-05-17 20:45 ` Thomas Mair
2012-05-17 20:49 ` Antti Palosaari
2012-05-17 21:03 ` poma
2012-05-17 21:08 ` poma
2012-05-17 21:19 ` Thomas Mair
2012-05-17 21:30 ` poma
2012-05-18 0:55 ` poma
[not found] ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
2012-05-18 9:15 ` poma
2012-05-18 10:38 ` poma
2012-05-18 12:38 ` Antti Palosaari
2012-05-18 13:26 ` poma
2012-05-18 17:46 ` Thomas Mair
2012-05-18 17:51 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
2012-05-17 14:41 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
2012-05-17 14:43 ` Antti Palosaari
2012-05-16 22:13 ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
2012-05-17 14:47 ` Antti Palosaari
2012-05-17 20:43 ` poma
2012-05-16 22:13 ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
2012-05-17 14:50 ` Antti Palosaari
2012-05-17 14:53 ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
2012-05-18 18:47 ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
2012-05-18 20:21 ` Antti Palosaari
2012-07-05 14:32 ` Mauro Carvalho Chehab
2012-07-05 14:35 ` Antti Palosaari
2012-07-05 15:54 ` Mauro Carvalho Chehab
2012-07-07 15:45 ` poma
2012-07-05 14:41 ` Antti Palosaari
2012-07-05 15:53 ` Mauro Carvalho Chehab
2012-05-18 18:47 ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
2012-05-18 20:28 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
2012-05-18 20:30 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
2012-05-18 20:31 ` Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
2012-05-18 20:32 ` Antti Palosaari
2012-05-18 20:47 ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
2012-05-18 23:35 ` poma
2012-05-20 9:56 ` Thomas Mair
2012-05-20 10:14 ` Antti Palosaari
2012-05-18 23:39 ` poma
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).