Now that we have an I2C function to attach DVB sub-devices, add support for media controller on it. Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxxxx> diff --git a/drivers/media/dvb-core/dvb_frontend.h b/drivers/media/dvb-core/dvb_frontend.h index 41aae1bf0103..65d002f19cc3 100644 --- a/drivers/media/dvb-core/dvb_frontend.h +++ b/drivers/media/dvb-core/dvb_frontend.h @@ -40,6 +40,8 @@ #include <linux/dvb/frontend.h> +#include <media/media-device.h> + #include "dvbdev.h" /* @@ -416,6 +418,11 @@ struct dvb_frontend { struct dvb_frontend_ops ops; struct dvb_adapter *dvb; struct i2c_client *fe_cl; +#if defined(CONFIG_MEDIA_CONTROLLER) + struct media_device *mdev; + struct media_entity demod_entity; +#endif + void *demodulator_priv; void *tuner_priv; void *frontend_priv; diff --git a/drivers/media/dvb-core/dvb_i2c.c b/drivers/media/dvb-core/dvb_i2c.c index 4ea4e5e59f14..df8b7718ca8a 100644 --- a/drivers/media/dvb-core/dvb_i2c.c +++ b/drivers/media/dvb-core/dvb_i2c.c @@ -39,11 +39,12 @@ dvb_i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info *info, struct dvb_frontend * dvb_i2c_attach_fe(struct i2c_adapter *adap, const struct i2c_board_info *info, - const void *cfg, void **out) + const void *cfg, void **out, struct media_device *mdev) { struct i2c_client *cl; struct i2c_board_info bi; struct dvb_i2c_dev_config dcfg; + struct dvb_frontend *fe; dcfg.priv_cfg = cfg; dcfg.out = out; @@ -53,7 +54,28 @@ dvb_i2c_attach_fe(struct i2c_adapter *adap, const struct i2c_board_info *info, cl = dvb_i2c_new_device(adap, &bi, NULL); if (!cl) return NULL; - return i2c_get_clientdata(cl); + fe = i2c_get_clientdata(cl); + +#if defined(CONFIG_MEDIA_CONTROLLER) + /* Register the media controller entity. */ + if (mdev) { + int ret; + + if (!fe->mdev) + fe->mdev = mdev; + + fe->demod_entity.type = MEDIA_ENT_T_DEVNODE_DVB; + fe->demod_entity.name = info->type; + fe->demod_entity.info.dvb = fe->id; + fe->demod_entity.flags = MEDIA_ENT_T_DVB_DEMOD; + ret = media_device_register_entity(fe->mdev, &fe->demod_entity); + if (ret < 0) + printk(KERN_WARNING + "%s: media_device_register_entity failed\n", + __func__); + } +#endif + return fe; } EXPORT_SYMBOL(dvb_i2c_attach_fe); @@ -193,6 +215,10 @@ static int remove_fe(struct i2c_client *client, if (param->priv_remove) param->priv_remove(client); fe = i2c_get_clientdata(client); + + if (fe->mdev) + media_device_unregister_entity(&fe->demod_entity); + kfree(fe->demodulator_priv); kfree(fe); module_put(this_module); diff --git a/drivers/media/dvb-core/dvb_i2c.h b/drivers/media/dvb-core/dvb_i2c.h index 2bf409d4bcaf..c2efed9c997e 100644 --- a/drivers/media/dvb-core/dvb_i2c.h +++ b/drivers/media/dvb-core/dvb_i2c.h @@ -33,7 +33,8 @@ struct dvb_frontend *dvb_i2c_attach_fe(struct i2c_adapter *adap, const struct i2c_board_info *info, - const void *cfg, void **out); + const void *cfg, void **out, + struct media_device *mdev); struct i2c_client *dvb_i2c_attach_tuner(struct i2c_adapter *adap, const struct i2c_board_info *info, diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index fc23b7ad194f..084526a29414 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c @@ -1510,7 +1510,7 @@ static int dvb_register(struct cx23885_tsport *port) fe0->dvb.frontend = dvb_i2c_attach_fe(&i2c_bus->i2c_adap, &mb86a20s_board_info, &mygica_x8507_mb86a20s_config, - NULL); + NULL, NULL); if (fe0->dvb.frontend == NULL) break; diff --git a/drivers/media/pci/saa7134/saa7134-dvb.c b/drivers/media/pci/saa7134/saa7134-dvb.c index 74b5ce0de488..a47630be4583 100644 --- a/drivers/media/pci/saa7134/saa7134-dvb.c +++ b/drivers/media/pci/saa7134/saa7134-dvb.c @@ -1814,7 +1814,7 @@ static int dvb_init(struct saa7134_dev *dev) fe0->dvb.frontend = dvb_i2c_attach_fe(&dev->i2c_adap, &mb86a20s_board_info, &kworld_mb86a20s_config, - NULL); + NULL, NULL); if (fe0->dvb.frontend != NULL) { dvb_attach(tda829x_attach, fe0->dvb.frontend, &dev->i2c_adap, 0x4b, diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c index 27803a8cf5a4..e6b6da44b1e5 100644 --- a/drivers/media/usb/cx231xx/cx231xx-dvb.c +++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c @@ -822,7 +822,7 @@ static int dvb_init(struct cx231xx *dev) dev->dvb->frontend = dvb_i2c_attach_fe(demod_i2c, &mb86a20s_board_info, &pv_mb86a20s_config, - NULL); + NULL, NULL); if (dev->dvb->frontend == NULL) { dev_err(dev->dev, "Failed to attach mb86a20s demod\n"); diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c index 6fa4eeed9f50..c9bbc251c7c7 100644 --- a/drivers/media/usb/em28xx/em28xx-dvb.c +++ b/drivers/media/usb/em28xx/em28xx-dvb.c @@ -1330,7 +1330,7 @@ static int em28xx_dvb_init(struct em28xx *dev) dvb->fe[0] = dvb_i2c_attach_fe(&dev->i2c_adap[dev->def_i2c_bus], &mb86a20s_board_info, &c3tech_duo_mb86a20s_config, - NULL); + NULL, NULL); if (dvb->fe[0] != NULL) dvb_attach(tda18271_attach, dvb->fe[0], 0x60, &dev->i2c_adap[dev->def_i2c_bus], diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h index d847c760e8f0..c002aed74e6b 100644 --- a/include/uapi/linux/media.h +++ b/include/uapi/linux/media.h @@ -27,7 +27,7 @@ #include <linux/types.h> #include <linux/version.h> -#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 0) +#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 1) struct media_device_info { char driver[16]; @@ -59,6 +59,8 @@ struct media_device_info { /* A converter of analogue video to its digital representation. */ #define MEDIA_ENT_T_V4L2_SUBDEV_DECODER (MEDIA_ENT_T_V4L2_SUBDEV + 4) +#define MEDIA_ENT_T_DVB_DEMOD (MEDIA_ENT_T_V4L2_SUBDEV + 5) + #define MEDIA_ENT_FL_DEFAULT (1 << 0) struct media_entity_desc { -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html