Re: [PATCH v3 2/5] tuners: add new i2c driver for Sharp qm1d1b0004 ISDB-S tuner
Em Mon, 9 Apr 2018 02:39:50 +0900 tsk...@gmail.com escreveu: > From: Akihiro Tsukada > > The tuner is used in Earthsoft PT1/PT2 DVB boards, > and the driver was extraced from (the former) va1j5jf8007s.c of PT1. > it might contain PT1 specific configs. > > Signed-off-by: Akihiro Tsukada Please add yourself to MAINTAINERS file for this driver (and for other drivers you wrote). > --- > Changes since v2: > - none > > Changes since v1: > - none > > drivers/media/tuners/Kconfig | 7 + > drivers/media/tuners/Makefile | 1 + > drivers/media/tuners/qm1d1b0004.c | 264 ++ > drivers/media/tuners/qm1d1b0004.h | 24 +++ > 4 files changed, 296 insertions(+) > create mode 100644 drivers/media/tuners/qm1d1b0004.c > create mode 100644 drivers/media/tuners/qm1d1b0004.h > > diff --git a/drivers/media/tuners/Kconfig b/drivers/media/tuners/Kconfig > index 6687514df97..147f3cd0bb9 100644 > --- a/drivers/media/tuners/Kconfig > +++ b/drivers/media/tuners/Kconfig > @@ -284,4 +284,11 @@ config MEDIA_TUNER_QM1D1C0042 > default m if !MEDIA_SUBDRV_AUTOSELECT > help > Sharp QM1D1C0042 trellis coded 8PSK tuner driver. > + > +config MEDIA_TUNER_QM1D1B0004 > + tristate "Sharp QM1D1B0004 tuner" > + depends on MEDIA_SUPPORT && I2C > + default m if !MEDIA_SUBDRV_AUTOSELECT > + help > + Sharp QM1D1B0004 ISDB-S tuner driver. > endmenu > diff --git a/drivers/media/tuners/Makefile b/drivers/media/tuners/Makefile > index 0ff21f1c7ee..7b4f8423501 100644 > --- a/drivers/media/tuners/Makefile > +++ b/drivers/media/tuners/Makefile > @@ -41,6 +41,7 @@ obj-$(CONFIG_MEDIA_TUNER_IT913X) += it913x.o > obj-$(CONFIG_MEDIA_TUNER_R820T) += r820t.o > obj-$(CONFIG_MEDIA_TUNER_MXL301RF) += mxl301rf.o > obj-$(CONFIG_MEDIA_TUNER_QM1D1C0042) += qm1d1c0042.o > +obj-$(CONFIG_MEDIA_TUNER_QM1D1B0004) += qm1d1b0004.o > obj-$(CONFIG_MEDIA_TUNER_M88RS6000T) += m88rs6000t.o > obj-$(CONFIG_MEDIA_TUNER_TDA18250) += tda18250.o > > diff --git a/drivers/media/tuners/qm1d1b0004.c > b/drivers/media/tuners/qm1d1b0004.c > new file mode 100644 > index 000..9dac1b875c1 > --- /dev/null > +++ b/drivers/media/tuners/qm1d1b0004.c > @@ -0,0 +1,264 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Sharp QM1D1B0004 satellite tuner > + * > + * Copyright (C) 2014 Akihiro Tsukada > + * > + * based on (former) drivers/media/pci/pt1/va1j5jf8007s.c. > + */ > + > +/* > + * Note: > + * Since the data-sheet of this tuner chip is not available, > + * this driver lacks some tuner_ops and config options. > + * In addition, the implementation might be dependent on the specific use > + * in the FE module: VA1J5JF8007S and/or in the product: Earthsoft PT1/PT2. > + */ > + > +#include > +#include > +#include > +#include "qm1d1b0004.h" > + > +/* > + * Tuner I/F (copied from the former va1j5jf8007s.c) > + * b[0] I2C addr > + * b[1] "0":1, BG:2, divider_quotient[7:3]:5 > + * b[2] divider_quotient[2:0]:3, divider_remainder:5 > + * b[3] "111":3, LPF[3:2]:2, TM:1, "0":1, REF:1 > + * b[4] BANDX, PSC:1, LPF[1:0]:2, DIV:1, "0":1 > + * > + * PLL frequency step := > + *REF == 0 -> PLL XTL frequency(4MHz) / 8 > + *REF == 1 -> PLL XTL frequency(4MHz) / 4 > + * > + * PreScaler := > + *PSC == 0 -> x32 > + *PSC == 1 -> x16 > + * > + * divider_quotient := (frequency / PLL frequency step) / PreScaler > + * divider_remainder := (frequency / PLL frequency step) % PreScaler > + * > + * LPF := LPF Frequency / 1000 / 2 - 2 > + * LPF Frequency @ baudrate=28.86Mbps = 3 > + * > + * band (1..9) > + * band 1 (freq < 986000) -> DIV:1, BANDX:5, PSC:1 > + * band 2 (freq < 1072000) -> DIV:1, BANDX:6, PSC:1 > + * band 3 (freq < 1154000) -> DIV:1, BANDX:7, PSC:0 > + * band 4 (freq < 1291000) -> DIV:0, BANDX:1, PSC:0 > + * band 5 (freq < 1447000) -> DIV:0, BANDX:2, PSC:0 > + * band 6 (freq < 1615000) -> DIV:0, BANDX:3, PSC:0 > + * band 7 (freq < 1791000) -> DIV:0, BANDX:4, PSC:0 > + * band 8 (freq < 1972000) -> DIV:0, BANDX:5, PSC:0 > + * band 9 (freq < 215) -> DIV:0, BANDX:6, PSC:0 > + */ > + > +#define QM1D1B0004_PSC_MASK (1 << 4) > + > +#define QM1D1B0004_XTL_FREQ 4000 > +#define QM1D1B0004_LPF_FALLBACK 3 > + > +static const struct qm1d1b0004_config default_cfg = { > + .lpf_freq = QM1D1B0004_CFG_LPF_DFLT, > + .half_step = false, > +}; > + > +struct qm1d1b0004_state { > + struct qm1d1b0004_config cfg; > + struct i2c_client *i2c; > +}; > + > + > +struct qm1d1b0004_cb_map { > + u32 frequency; > + u8 cb; > +}; > + > +static const struct qm1d1b0004_cb_map cb_maps[] = { > + { 986000, 0xb2 }, > + { 1072000, 0xd2 }, > + { 1154000, 0xe2 }, > + { 1291000, 0x20 }, > + { 1447000, 0x40 }, > + { 1615000, 0x60 }, > + { 1791000, 0x80 }, > + { 1972000, 0xa0 }, > +}; > + > +static u8 lookup_cb(u32 frequency) > +{ > + int i; > + const struct qm1d1b0004_cb_map *map; > + > + for (i = 0; i < ARRAY_SIZE(cb_maps); i++) { > +
[PATCH v3 2/5] tuners: add new i2c driver for Sharp qm1d1b0004 ISDB-S tuner
From: Akihiro Tsukada The tuner is used in Earthsoft PT1/PT2 DVB boards, and the driver was extraced from (the former) va1j5jf8007s.c of PT1. it might contain PT1 specific configs. Signed-off-by: Akihiro Tsukada --- Changes since v2: - none Changes since v1: - none drivers/media/tuners/Kconfig | 7 + drivers/media/tuners/Makefile | 1 + drivers/media/tuners/qm1d1b0004.c | 264 ++ drivers/media/tuners/qm1d1b0004.h | 24 +++ 4 files changed, 296 insertions(+) create mode 100644 drivers/media/tuners/qm1d1b0004.c create mode 100644 drivers/media/tuners/qm1d1b0004.h diff --git a/drivers/media/tuners/Kconfig b/drivers/media/tuners/Kconfig index 6687514df97..147f3cd0bb9 100644 --- a/drivers/media/tuners/Kconfig +++ b/drivers/media/tuners/Kconfig @@ -284,4 +284,11 @@ config MEDIA_TUNER_QM1D1C0042 default m if !MEDIA_SUBDRV_AUTOSELECT help Sharp QM1D1C0042 trellis coded 8PSK tuner driver. + +config MEDIA_TUNER_QM1D1B0004 + tristate "Sharp QM1D1B0004 tuner" + depends on MEDIA_SUPPORT && I2C + default m if !MEDIA_SUBDRV_AUTOSELECT + help + Sharp QM1D1B0004 ISDB-S tuner driver. endmenu diff --git a/drivers/media/tuners/Makefile b/drivers/media/tuners/Makefile index 0ff21f1c7ee..7b4f8423501 100644 --- a/drivers/media/tuners/Makefile +++ b/drivers/media/tuners/Makefile @@ -41,6 +41,7 @@ obj-$(CONFIG_MEDIA_TUNER_IT913X) += it913x.o obj-$(CONFIG_MEDIA_TUNER_R820T) += r820t.o obj-$(CONFIG_MEDIA_TUNER_MXL301RF) += mxl301rf.o obj-$(CONFIG_MEDIA_TUNER_QM1D1C0042) += qm1d1c0042.o +obj-$(CONFIG_MEDIA_TUNER_QM1D1B0004) += qm1d1b0004.o obj-$(CONFIG_MEDIA_TUNER_M88RS6000T) += m88rs6000t.o obj-$(CONFIG_MEDIA_TUNER_TDA18250) += tda18250.o diff --git a/drivers/media/tuners/qm1d1b0004.c b/drivers/media/tuners/qm1d1b0004.c new file mode 100644 index 000..9dac1b875c1 --- /dev/null +++ b/drivers/media/tuners/qm1d1b0004.c @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Sharp QM1D1B0004 satellite tuner + * + * Copyright (C) 2014 Akihiro Tsukada + * + * based on (former) drivers/media/pci/pt1/va1j5jf8007s.c. + */ + +/* + * Note: + * Since the data-sheet of this tuner chip is not available, + * this driver lacks some tuner_ops and config options. + * In addition, the implementation might be dependent on the specific use + * in the FE module: VA1J5JF8007S and/or in the product: Earthsoft PT1/PT2. + */ + +#include +#include +#include +#include "qm1d1b0004.h" + +/* + * Tuner I/F (copied from the former va1j5jf8007s.c) + * b[0] I2C addr + * b[1] "0":1, BG:2, divider_quotient[7:3]:5 + * b[2] divider_quotient[2:0]:3, divider_remainder:5 + * b[3] "111":3, LPF[3:2]:2, TM:1, "0":1, REF:1 + * b[4] BANDX, PSC:1, LPF[1:0]:2, DIV:1, "0":1 + * + * PLL frequency step := + *REF == 0 -> PLL XTL frequency(4MHz) / 8 + *REF == 1 -> PLL XTL frequency(4MHz) / 4 + * + * PreScaler := + *PSC == 0 -> x32 + *PSC == 1 -> x16 + * + * divider_quotient := (frequency / PLL frequency step) / PreScaler + * divider_remainder := (frequency / PLL frequency step) % PreScaler + * + * LPF := LPF Frequency / 1000 / 2 - 2 + * LPF Frequency @ baudrate=28.86Mbps = 3 + * + * band (1..9) + * band 1 (freq < 986000) -> DIV:1, BANDX:5, PSC:1 + * band 2 (freq < 1072000) -> DIV:1, BANDX:6, PSC:1 + * band 3 (freq < 1154000) -> DIV:1, BANDX:7, PSC:0 + * band 4 (freq < 1291000) -> DIV:0, BANDX:1, PSC:0 + * band 5 (freq < 1447000) -> DIV:0, BANDX:2, PSC:0 + * band 6 (freq < 1615000) -> DIV:0, BANDX:3, PSC:0 + * band 7 (freq < 1791000) -> DIV:0, BANDX:4, PSC:0 + * band 8 (freq < 1972000) -> DIV:0, BANDX:5, PSC:0 + * band 9 (freq < 215) -> DIV:0, BANDX:6, PSC:0 + */ + +#define QM1D1B0004_PSC_MASK (1 << 4) + +#define QM1D1B0004_XTL_FREQ 4000 +#define QM1D1B0004_LPF_FALLBACK 3 + +static const struct qm1d1b0004_config default_cfg = { + .lpf_freq = QM1D1B0004_CFG_LPF_DFLT, + .half_step = false, +}; + +struct qm1d1b0004_state { + struct qm1d1b0004_config cfg; + struct i2c_client *i2c; +}; + + +struct qm1d1b0004_cb_map { + u32 frequency; + u8 cb; +}; + +static const struct qm1d1b0004_cb_map cb_maps[] = { + { 986000, 0xb2 }, + { 1072000, 0xd2 }, + { 1154000, 0xe2 }, + { 1291000, 0x20 }, + { 1447000, 0x40 }, + { 1615000, 0x60 }, + { 1791000, 0x80 }, + { 1972000, 0xa0 }, +}; + +static u8 lookup_cb(u32 frequency) +{ + int i; + const struct qm1d1b0004_cb_map *map; + + for (i = 0; i < ARRAY_SIZE(cb_maps); i++) { + map = &cb_maps[i]; + if (frequency < map->frequency) + return map->cb; + } + return 0xc0; +} + +static int qm1d1b0004_set_params(struct dvb_frontend *fe) +{ + struct qm1d1b0004_state *state; + u32 frequency, pll, lpf_freq; + u16 word; + u8 buf[4], cb, lpf; + int ret; + + state = fe->tuner_priv; + frequency