Re: [PATCHv3 2/2] dib0700: add support for Xbox One Digital TV Tuner

2017-10-27 Thread Michael Ira Krufky
On Wed, Aug 2, 2017 at 9:00 AM,   wrote:
> From: Olli Salonen 
>
> Xbox One Digital TV Tuner is a low-cost USB 2.0 multistandard TV tuner. It
> supports DVB-T, DVB-T2 and DVB-C broadcast standards.
>
> USB bridge: DibCom 0700C
> Demodulator: Panasonic MN88472
> Tuner: TDA18250BHN
>
> The demodulator requires firmware. Download one from here:
> http://palosaari.fi/linux/v4l-dvb/firmware/MN88472/02/latest/
>
> Signed-off-by: Olli Salonen 

Reviewed-by: Michael Ira Krufky 

> ---
>  drivers/media/dvb-core/dvb-usb-ids.h|   2 +
>  drivers/media/usb/dvb-usb/Kconfig   |   2 +
>  drivers/media/usb/dvb-usb/dib0700.h |   2 +
>  drivers/media/usb/dvb-usb/dib0700_core.c|  26 ++-
>  drivers/media/usb/dvb-usb/dib0700_devices.c | 109 
> +++-
>  5 files changed, 139 insertions(+), 2 deletions(-)
>



Thanks for this contribution!  It's good to finally have an example of
card support within the dib0700 driver that can serve an an example of
using the newer method of frontend attachment.

It would be nice to move some of the attachment code out of the
card-specific `_attach()` function into a common function, but since
this is the only attachment that works this way, leaving things as-is
is fine enough for now.   After we convert some of the other
`_attach()` functions, or adding some new ones using this method, we
may want to refactor this a bit.

Meanwhile, this is good for merge.  Nice work.



> diff --git a/drivers/media/dvb-core/dvb-usb-ids.h 
> b/drivers/media/dvb-core/dvb-usb-ids.h
> index 5b6041d..daf49ec 100644
> --- a/drivers/media/dvb-core/dvb-usb-ids.h
> +++ b/drivers/media/dvb-core/dvb-usb-ids.h
> @@ -80,6 +80,7 @@
>  #define USB_VID_AZUREWAVE  0x13d3
>  #define USB_VID_TECHNISAT  0x14f7
>  #define USB_VID_HAMA   0x147f
> +#define USB_VID_MICROSOFT  0x045e
>
>  /* Product IDs */
>  #define USB_PID_ADSTECH_USB2_COLD  0xa333
> @@ -417,4 +418,5 @@
>  #define USB_PID_WINTV_SOLOHD0x0264
>  #define USB_PID_EVOLVEO_XTRATV_STICK   0xa115
>  #define USB_PID_HAMA_DVBT_HYBRID   0x2758
> +#define USB_PID_XBOX_ONE_TUNER  0x02d5
>  #endif
> diff --git a/drivers/media/usb/dvb-usb/Kconfig 
> b/drivers/media/usb/dvb-usb/Kconfig
> index 959fa09..2651ae2 100644
> --- a/drivers/media/usb/dvb-usb/Kconfig
> +++ b/drivers/media/usb/dvb-usb/Kconfig
> @@ -86,6 +86,7 @@ config DVB_USB_DIB0700
> select DVB_USB_DIB3000MC if MEDIA_SUBDRV_AUTOSELECT
> select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
> select DVB_LGDT3305 if MEDIA_SUBDRV_AUTOSELECT
> +   select DVB_MN88472 if MEDIA_SUBDRV_AUTOSELECT
> select DVB_TUNER_DIB0070 if MEDIA_SUBDRV_AUTOSELECT
> select DVB_TUNER_DIB0090 if MEDIA_SUBDRV_AUTOSELECT
> select MEDIA_TUNER_MT2060 if MEDIA_SUBDRV_AUTOSELECT
> @@ -94,6 +95,7 @@ config DVB_USB_DIB0700
> select MEDIA_TUNER_XC5000 if MEDIA_SUBDRV_AUTOSELECT
> select MEDIA_TUNER_XC4000 if MEDIA_SUBDRV_AUTOSELECT
> select MEDIA_TUNER_MXL5007T if MEDIA_SUBDRV_AUTOSELECT
> +   select MEDIA_TUNER_TDA18250 if MEDIA_SUBDRV_AUTOSELECT
> help
>   Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB 
> bridge. The
>   USB bridge is also present in devices having the DiB7700 DVB-T-USB
> diff --git a/drivers/media/usb/dvb-usb/dib0700.h 
> b/drivers/media/usb/dvb-usb/dib0700.h
> index 8fd8f5b..5f29128 100644
> --- a/drivers/media/usb/dvb-usb/dib0700.h
> +++ b/drivers/media/usb/dvb-usb/dib0700.h
> @@ -51,6 +51,8 @@ struct dib0700_state {
> int (*read_status)(struct dvb_frontend *, enum fe_status *);
> int (*sleep)(struct dvb_frontend* fe);
> u8 buf[255];
> +   struct i2c_client *i2c_client_demod;
> +   struct i2c_client *i2c_client_tuner;
>  };
>
>  extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
> diff --git a/drivers/media/usb/dvb-usb/dib0700_core.c 
> b/drivers/media/usb/dvb-usb/dib0700_core.c
> index bea1b47..dbd031c 100644
> --- a/drivers/media/usb/dvb-usb/dib0700_core.c
> +++ b/drivers/media/usb/dvb-usb/dib0700_core.c
> @@ -911,10 +911,34 @@ static int dib0700_probe(struct usb_interface *intf,
> return -ENODEV;
>  }
>
> +static void dib0700_disconnect(struct usb_interface *intf)
> +{
> +   struct dvb_usb_device *d = usb_get_intfdata(intf);
> +   struct dib0700_state *st = d->priv;
> +   struct i2c_client *client;
> +
> +   /* remove I2C client for tuner */
> +   client = st->i2c_client_tuner;
> +   if (client) {
> +   module_put(client->dev.driver->owner);
> +   i2c_unregister_device(client);
> +   }
> +
> +   /* remove I2C client for demodulator */
> +   client = st->i2c_client_demod;
> + 

[PATCHv3 2/2] dib0700: add support for Xbox One Digital TV Tuner

2017-08-02 Thread olli . salonen
From: Olli Salonen 

Xbox One Digital TV Tuner is a low-cost USB 2.0 multistandard TV tuner. It
supports DVB-T, DVB-T2 and DVB-C broadcast standards.

USB bridge: DibCom 0700C
Demodulator: Panasonic MN88472
Tuner: TDA18250BHN

The demodulator requires firmware. Download one from here:
http://palosaari.fi/linux/v4l-dvb/firmware/MN88472/02/latest/

Signed-off-by: Olli Salonen 
---
 drivers/media/dvb-core/dvb-usb-ids.h|   2 +
 drivers/media/usb/dvb-usb/Kconfig   |   2 +
 drivers/media/usb/dvb-usb/dib0700.h |   2 +
 drivers/media/usb/dvb-usb/dib0700_core.c|  26 ++-
 drivers/media/usb/dvb-usb/dib0700_devices.c | 109 +++-
 5 files changed, 139 insertions(+), 2 deletions(-)

diff --git a/drivers/media/dvb-core/dvb-usb-ids.h 
b/drivers/media/dvb-core/dvb-usb-ids.h
index 5b6041d..daf49ec 100644
--- a/drivers/media/dvb-core/dvb-usb-ids.h
+++ b/drivers/media/dvb-core/dvb-usb-ids.h
@@ -80,6 +80,7 @@
 #define USB_VID_AZUREWAVE  0x13d3
 #define USB_VID_TECHNISAT  0x14f7
 #define USB_VID_HAMA   0x147f
+#define USB_VID_MICROSOFT  0x045e
 
 /* Product IDs */
 #define USB_PID_ADSTECH_USB2_COLD  0xa333
@@ -417,4 +418,5 @@
 #define USB_PID_WINTV_SOLOHD0x0264
 #define USB_PID_EVOLVEO_XTRATV_STICK   0xa115
 #define USB_PID_HAMA_DVBT_HYBRID   0x2758
+#define USB_PID_XBOX_ONE_TUNER  0x02d5
 #endif
diff --git a/drivers/media/usb/dvb-usb/Kconfig 
b/drivers/media/usb/dvb-usb/Kconfig
index 959fa09..2651ae2 100644
--- a/drivers/media/usb/dvb-usb/Kconfig
+++ b/drivers/media/usb/dvb-usb/Kconfig
@@ -86,6 +86,7 @@ config DVB_USB_DIB0700
select DVB_USB_DIB3000MC if MEDIA_SUBDRV_AUTOSELECT
select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
select DVB_LGDT3305 if MEDIA_SUBDRV_AUTOSELECT
+   select DVB_MN88472 if MEDIA_SUBDRV_AUTOSELECT
select DVB_TUNER_DIB0070 if MEDIA_SUBDRV_AUTOSELECT
select DVB_TUNER_DIB0090 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_MT2060 if MEDIA_SUBDRV_AUTOSELECT
@@ -94,6 +95,7 @@ config DVB_USB_DIB0700
select MEDIA_TUNER_XC5000 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_XC4000 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_MXL5007T if MEDIA_SUBDRV_AUTOSELECT
+   select MEDIA_TUNER_TDA18250 if MEDIA_SUBDRV_AUTOSELECT
help
  Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. 
The
  USB bridge is also present in devices having the DiB7700 DVB-T-USB
diff --git a/drivers/media/usb/dvb-usb/dib0700.h 
b/drivers/media/usb/dvb-usb/dib0700.h
index 8fd8f5b..5f29128 100644
--- a/drivers/media/usb/dvb-usb/dib0700.h
+++ b/drivers/media/usb/dvb-usb/dib0700.h
@@ -51,6 +51,8 @@ struct dib0700_state {
int (*read_status)(struct dvb_frontend *, enum fe_status *);
int (*sleep)(struct dvb_frontend* fe);
u8 buf[255];
+   struct i2c_client *i2c_client_demod;
+   struct i2c_client *i2c_client_tuner;
 };
 
 extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
diff --git a/drivers/media/usb/dvb-usb/dib0700_core.c 
b/drivers/media/usb/dvb-usb/dib0700_core.c
index bea1b47..dbd031c 100644
--- a/drivers/media/usb/dvb-usb/dib0700_core.c
+++ b/drivers/media/usb/dvb-usb/dib0700_core.c
@@ -911,10 +911,34 @@ static int dib0700_probe(struct usb_interface *intf,
return -ENODEV;
 }
 
+static void dib0700_disconnect(struct usb_interface *intf)
+{
+   struct dvb_usb_device *d = usb_get_intfdata(intf);
+   struct dib0700_state *st = d->priv;
+   struct i2c_client *client;
+
+   /* remove I2C client for tuner */
+   client = st->i2c_client_tuner;
+   if (client) {
+   module_put(client->dev.driver->owner);
+   i2c_unregister_device(client);
+   }
+
+   /* remove I2C client for demodulator */
+   client = st->i2c_client_demod;
+   if (client) {
+   module_put(client->dev.driver->owner);
+   i2c_unregister_device(client);
+   }
+
+   dvb_usb_device_exit(intf);
+}
+
+
 static struct usb_driver dib0700_driver = {
.name   = "dvb_usb_dib0700",
.probe  = dib0700_probe,
-   .disconnect = dvb_usb_device_exit,
+   .disconnect = dib0700_disconnect,
.id_table   = dib0700_usb_id_table,
 };
 
diff --git a/drivers/media/usb/dvb-usb/dib0700_devices.c 
b/drivers/media/usb/dvb-usb/dib0700_devices.c
index 6a57fc6..7c0fb18 100644
--- a/drivers/media/usb/dvb-usb/dib0700_devices.c
+++ b/drivers/media/usb/dvb-usb/dib0700_devices.c
@@ -23,6 +23,9 @@
 #include "dib0090.h"
 #include "lgdt3305.h"
 #include "mxl5007t.h"
+#include "mn88472.h"
+#include "tda18250.h"
+
 
 static int force_lna_activation;
 module_param(force_lna_activation, int, 0644);
@@ -3725,6 +3728,90 @@ static int