Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] dvb: modify core to implement interfaces/entities at MC new gen

The Media Controller New Generation redefines the types for both
interfaces and entities to be used on DVB. Make the needed
changes at the DVB core for all interfaces, entities and
data and interface links to appear in the graph.

Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

+149 -35
+2 -2
drivers/media/dvb-core/dmxdev.c
··· 1244 1244 } 1245 1245 1246 1246 dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, 1247 - DVB_DEVICE_DEMUX); 1247 + DVB_DEVICE_DEMUX, dmxdev->filternum); 1248 1248 dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, 1249 - dmxdev, DVB_DEVICE_DVR); 1249 + dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); 1250 1250 1251 1251 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); 1252 1252
+1 -1
drivers/media/dvb-core/dvb_ca_en50221.c
··· 1695 1695 pubca->private = ca; 1696 1696 1697 1697 /* register the DVB device */ 1698 - ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca, DVB_DEVICE_CA); 1698 + ret = dvb_register_device(dvb_adapter, &ca->dvbdev, &dvbdev_ca, ca, DVB_DEVICE_CA, 0); 1699 1699 if (ret) 1700 1700 goto free_slot_info; 1701 1701
+1 -1
drivers/media/dvb-core/dvb_frontend.c
··· 2759 2759 fe->dvb->num, fe->id, fe->ops.info.name); 2760 2760 2761 2761 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template, 2762 - fe, DVB_DEVICE_FRONTEND); 2762 + fe, DVB_DEVICE_FRONTEND, 0); 2763 2763 2764 2764 /* 2765 2765 * Initialize the cache to the proper values according with the
+1 -1
drivers/media/dvb-core/dvb_net.c
··· 1502 1502 dvbnet->state[i] = 0; 1503 1503 1504 1504 return dvb_register_device(adap, &dvbnet->dvbdev, &dvbdev_net, 1505 - dvbnet, DVB_DEVICE_NET); 1505 + dvbnet, DVB_DEVICE_NET, 0); 1506 1506 } 1507 1507 EXPORT_SYMBOL(dvb_net_init);
+129 -19
drivers/media/dvb-core/dvbdev.c
··· 180 180 return -ENFILE; 181 181 } 182 182 183 - static void dvb_create_media_entity(struct dvb_device *dvbdev, 184 - int type, int minor) 183 + static void dvb_create_tsout_entity(struct dvb_device *dvbdev, 184 + const char *name, int npads) 185 185 { 186 186 #if defined(CONFIG_MEDIA_CONTROLLER_DVB) 187 - int ret = 0, npads; 187 + int i, ret = 0; 188 + 189 + dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads), 190 + GFP_KERNEL); 191 + if (!dvbdev->tsout_pads) 192 + return; 193 + dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity), 194 + GFP_KERNEL); 195 + if (!dvbdev->tsout_entity) { 196 + kfree(dvbdev->tsout_pads); 197 + dvbdev->tsout_pads = NULL; 198 + return; 199 + } 200 + for (i = 0; i < npads; i++) { 201 + struct media_pad *pads = &dvbdev->tsout_pads[i]; 202 + struct media_entity *entity = &dvbdev->tsout_entity[i]; 203 + 204 + entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i); 205 + if (!entity->name) { 206 + ret = -ENOMEM; 207 + break; 208 + } 209 + 210 + entity->type = MEDIA_ENT_T_DVB_TSOUT; 211 + pads->flags = MEDIA_PAD_FL_SINK; 212 + 213 + ret = media_entity_init(entity, 1, pads); 214 + if (ret < 0) 215 + break; 216 + 217 + ret = media_device_register_entity(dvbdev->adapter->mdev, 218 + entity); 219 + if (ret < 0) 220 + break; 221 + } 222 + 223 + if (!ret) { 224 + dvbdev->tsout_num_entities = npads; 225 + return; 226 + } 227 + 228 + for (i--; i >= 0; i--) { 229 + media_device_unregister_entity(&dvbdev->tsout_entity[i]); 230 + kfree(dvbdev->tsout_entity[i].name); 231 + } 232 + 233 + printk(KERN_ERR 234 + "%s: media_device_register_entity failed for %s\n", 235 + __func__, name); 236 + 237 + kfree(dvbdev->tsout_entity); 238 + kfree(dvbdev->tsout_pads); 239 + dvbdev->tsout_entity = NULL; 240 + dvbdev->tsout_pads = NULL; 241 + #endif 242 + } 243 + 244 + #define DEMUX_TSOUT "demux-tsout" 245 + #define DVR_TSOUT "dvr-tsout" 246 + 247 + static void dvb_create_media_entity(struct dvb_device *dvbdev, 248 + int type, int demux_sink_pads) 249 + { 250 + #if defined(CONFIG_MEDIA_CONTROLLER_DVB) 251 + int i, ret = 0, npads; 188 252 189 253 switch (type) { 190 254 case DVB_DEVICE_FRONTEND: 191 255 npads = 2; 192 256 break; 257 + case DVB_DEVICE_DVR: 258 + dvb_create_tsout_entity(dvbdev, DVR_TSOUT, demux_sink_pads); 259 + return; 193 260 case DVB_DEVICE_DEMUX: 194 - npads = 2; 261 + npads = 1 + demux_sink_pads; 262 + dvb_create_tsout_entity(dvbdev, DEMUX_TSOUT, demux_sink_pads); 195 263 break; 196 264 case DVB_DEVICE_CA: 197 265 npads = 2; ··· 283 215 if (!dvbdev->entity) 284 216 return; 285 217 286 - dvbdev->entity->info.dev.major = DVB_MAJOR; 287 - dvbdev->entity->info.dev.minor = minor; 288 218 dvbdev->entity->name = dvbdev->name; 289 219 290 220 if (npads) { ··· 303 237 case DVB_DEVICE_DEMUX: 304 238 dvbdev->entity->type = MEDIA_ENT_T_DVB_DEMUX; 305 239 dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK; 306 - dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE; 240 + for (i = 1; i < npads; i++) 241 + dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE; 307 242 break; 308 243 case DVB_DEVICE_CA: 309 244 dvbdev->entity->type = MEDIA_ENT_T_DVB_CA; ··· 326 259 printk(KERN_ERR 327 260 "%s: media_device_register_entity failed for %s\n", 328 261 __func__, dvbdev->entity->name); 262 + 263 + media_device_unregister_entity(dvbdev->entity); 264 + for (i = 0; i < dvbdev->tsout_num_entities; i++) { 265 + media_device_unregister_entity(&dvbdev->tsout_entity[i]); 266 + kfree(dvbdev->tsout_entity[i].name); 267 + } 329 268 kfree(dvbdev->pads); 330 269 kfree(dvbdev->entity); 270 + kfree(dvbdev->tsout_pads); 271 + kfree(dvbdev->tsout_entity); 331 272 dvbdev->entity = NULL; 332 273 return; 333 274 } ··· 346 271 } 347 272 348 273 static void dvb_register_media_device(struct dvb_device *dvbdev, 349 - int type, int minor) 274 + int type, int minor, 275 + unsigned demux_sink_pads) 350 276 { 351 277 #if defined(CONFIG_MEDIA_CONTROLLER_DVB) 352 278 u32 intf_type; ··· 355 279 if (!dvbdev->adapter->mdev) 356 280 return; 357 281 358 - dvb_create_media_entity(dvbdev, type, minor); 282 + dvb_create_media_entity(dvbdev, type, demux_sink_pads); 359 283 360 284 switch (type) { 361 285 case DVB_DEVICE_FRONTEND: ··· 399 323 } 400 324 401 325 int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, 402 - const struct dvb_device *template, void *priv, int type) 326 + const struct dvb_device *template, void *priv, int type, 327 + int demux_sink_pads) 403 328 { 404 329 struct dvb_device *dvbdev; 405 330 struct file_operations *dvbdevfops; ··· 479 402 dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", 480 403 adap->num, dnames[type], id, minor, minor); 481 404 482 - dvb_register_media_device(dvbdev, type, minor); 405 + dvb_register_media_device(dvbdev, type, minor, demux_sink_pads); 483 406 484 407 return 0; 485 408 } ··· 499 422 500 423 #if defined(CONFIG_MEDIA_CONTROLLER_DVB) 501 424 if (dvbdev->entity) { 425 + int i; 426 + 502 427 media_device_unregister_entity(dvbdev->entity); 428 + for (i = 0; i < dvbdev->tsout_num_entities; i++) { 429 + media_device_unregister_entity(&dvbdev->tsout_entity[i]); 430 + kfree(dvbdev->tsout_entity[i].name); 431 + } 432 + 503 433 kfree(dvbdev->entity); 504 434 kfree(dvbdev->pads); 435 + kfree(dvbdev->tsout_entity); 436 + kfree(dvbdev->tsout_pads); 505 437 } 506 438 #endif 507 439 ··· 526 440 { 527 441 struct media_device *mdev = adap->mdev; 528 442 struct media_entity *entity, *tuner = NULL, *demod = NULL; 529 - struct media_entity *demux = NULL, *dvr = NULL, *ca = NULL; 443 + struct media_entity *demux = NULL, *ca = NULL; 530 444 struct media_interface *intf; 445 + unsigned demux_pad = 0; 446 + unsigned dvr_pad = 0; 531 447 532 448 if (!mdev) 533 449 return; ··· 545 457 case MEDIA_ENT_T_DVB_DEMUX: 546 458 demux = entity; 547 459 break; 548 - case MEDIA_ENT_T_DVB_TSOUT: 549 - dvr = entity; 550 - break; 551 460 case MEDIA_ENT_T_DVB_CA: 552 461 ca = entity; 553 462 break; ··· 556 471 557 472 if (demod && demux) 558 473 media_create_pad_link(demod, 1, demux, 0, MEDIA_LNK_FL_ENABLED); 559 - 560 - if (demux && dvr) 561 - media_create_pad_link(demux, 1, dvr, 0, MEDIA_LNK_FL_ENABLED); 562 - 563 474 if (demux && ca) 564 475 media_create_pad_link(demux, 1, ca, 0, MEDIA_LNK_FL_ENABLED); 476 + 477 + /* Create demux links for each ringbuffer/pad */ 478 + if (demux) { 479 + media_device_for_each_entity(entity, mdev) { 480 + if (entity->type == MEDIA_ENT_T_DVB_TSOUT) { 481 + if (!strncmp(entity->name, DVR_TSOUT, 482 + strlen(DVR_TSOUT))) 483 + media_create_pad_link(demux, 484 + ++dvr_pad, 485 + entity, 0, 0); 486 + if (!strncmp(entity->name, DEMUX_TSOUT, 487 + strlen(DEMUX_TSOUT))) 488 + media_create_pad_link(demux, 489 + ++demux_pad, 490 + entity, 0, 0); 491 + } 492 + } 493 + } 565 494 566 495 /* Create indirect interface links for FE->tuner, DVR->demux and CA->ca */ 567 496 list_for_each_entry(intf, &mdev->interfaces, list) { ··· 583 484 media_create_intf_link(ca, intf, 0); 584 485 if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) 585 486 media_create_intf_link(tuner, intf, 0); 487 + 586 488 if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) 587 489 media_create_intf_link(demux, intf, 0); 490 + 491 + media_device_for_each_entity(entity, mdev) { 492 + if (entity->type == MEDIA_ENT_T_DVB_TSOUT) { 493 + if (!strcmp(entity->name, DVR_TSOUT)) 494 + media_create_intf_link(entity, intf, 0); 495 + if (!strcmp(entity->name, DEMUX_TSOUT)) 496 + media_create_intf_link(entity, intf, 0); 497 + break; 498 + } 499 + } 588 500 } 589 501 } 590 502 EXPORT_SYMBOL_GPL(dvb_create_media_graph);
+6 -3
drivers/media/dvb-core/dvbdev.h
··· 148 148 const char *name; 149 149 150 150 /* Allocated and filled inside dvbdev.c */ 151 - struct media_entity *entity; 152 151 struct media_intf_devnode *intf_devnode; 153 - struct media_pad *pads; 152 + 153 + unsigned tsout_num_entities; 154 + struct media_entity *entity, *tsout_entity; 155 + struct media_pad *pads, *tsout_pads; 154 156 #endif 155 157 156 158 void *priv; ··· 195 193 struct dvb_device **pdvbdev, 196 194 const struct dvb_device *template, 197 195 void *priv, 198 - int type); 196 + int type, 197 + int demux_sink_pads); 199 198 200 199 /** 201 200 * dvb_unregister_device - Unregisters a DVB device
+1 -1
drivers/media/firewire/firedtv-ci.c
··· 241 241 return -EFAULT; 242 242 243 243 err = dvb_register_device(&fdtv->adapter, &fdtv->cadev, 244 - &fdtv_ca, fdtv, DVB_DEVICE_CA); 244 + &fdtv_ca, fdtv, DVB_DEVICE_CA, 0); 245 245 246 246 if (stat.ca_application_info == 0) 247 247 dev_err(fdtv->device, "CaApplicationInfo is not set\n");
+2 -1
drivers/media/pci/bt8xx/dst_ca.c
··· 705 705 struct dvb_device *dvbdev; 706 706 707 707 dprintk(verbose, DST_CA_ERROR, 1, "registering DST-CA device"); 708 - if (dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, DVB_DEVICE_CA) == 0) { 708 + if (dvb_register_device(dvb_adapter, &dvbdev, &dvbdev_ca, dst, 709 + DVB_DEVICE_CA, 0) == 0) { 709 710 dst->dst_ca = dvbdev; 710 711 return dst->dst_ca; 711 712 }
+1 -1
drivers/media/pci/ddbridge/ddbridge-core.c
··· 1065 1065 port->en, 0, 1); 1066 1066 ret = dvb_register_device(&port->output->adap, &port->output->dev, 1067 1067 &dvbdev_ci, (void *) port->output, 1068 - DVB_DEVICE_SEC); 1068 + DVB_DEVICE_SEC, 0); 1069 1069 return ret; 1070 1070 } 1071 1071
+1 -1
drivers/media/pci/ngene/ngene-core.c
··· 1513 1513 set_transfer(&chan->dev->channel[2], 1); 1514 1514 dvb_register_device(adapter, &chan->ci_dev, 1515 1515 &ngene_dvbdev_ci, (void *) chan, 1516 - DVB_DEVICE_SEC); 1516 + DVB_DEVICE_SEC, 0); 1517 1517 if (!chan->ci_dev) 1518 1518 goto err; 1519 1519 }
+1 -1
drivers/media/pci/ttpci/av7110.c
··· 1358 1358 1359 1359 #ifdef CONFIG_DVB_AV7110_OSD 1360 1360 dvb_register_device(&av7110->dvb_adapter, &av7110->osd_dev, 1361 - &dvbdev_osd, av7110, DVB_DEVICE_OSD); 1361 + &dvbdev_osd, av7110, DVB_DEVICE_OSD, 0); 1362 1362 #endif 1363 1363 1364 1364 dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+2 -2
drivers/media/pci/ttpci/av7110_av.c
··· 1594 1594 memset(&av7110->video_size, 0, sizeof (video_size_t)); 1595 1595 1596 1596 dvb_register_device(&av7110->dvb_adapter, &av7110->video_dev, 1597 - &dvbdev_video, av7110, DVB_DEVICE_VIDEO); 1597 + &dvbdev_video, av7110, DVB_DEVICE_VIDEO, 0); 1598 1598 1599 1599 dvb_register_device(&av7110->dvb_adapter, &av7110->audio_dev, 1600 - &dvbdev_audio, av7110, DVB_DEVICE_AUDIO); 1600 + &dvbdev_audio, av7110, DVB_DEVICE_AUDIO, 0); 1601 1601 1602 1602 return 0; 1603 1603 }
+1 -1
drivers/media/pci/ttpci/av7110_ca.c
··· 378 378 int av7110_ca_register(struct av7110 *av7110) 379 379 { 380 380 return dvb_register_device(&av7110->dvb_adapter, &av7110->ca_dev, 381 - &dvbdev_ca, av7110, DVB_DEVICE_CA); 381 + &dvbdev_ca, av7110, DVB_DEVICE_CA, 0); 382 382 } 383 383 384 384 void av7110_ca_unregister(struct av7110 *av7110)