Re: [PATCH v3 2/5] tuners: add new i2c driver for Sharp qm1d1b0004 ISDB-S tuner

2018-05-05 Thread Mauro Carvalho Chehab
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

2018-04-08 Thread tskd08
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