static int saa7164_api_dump_subdevs()

in pci/saa7164/saa7164-api.c [915:1308]


static int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
{
	struct saa7164_port *tsport = NULL;
	struct saa7164_port *encport = NULL;
	struct saa7164_port *vbiport = NULL;
	u32 idx, next_offset;
	int i;
	struct tmComResDescrHeader *hdr, *t;
	struct tmComResExtDevDescrHeader *exthdr;
	struct tmComResPathDescrHeader *pathhdr;
	struct tmComResAntTermDescrHeader *anttermhdr;
	struct tmComResTunerDescrHeader *tunerunithdr;
	struct tmComResDMATermDescrHeader *vcoutputtermhdr;
	struct tmComResTSFormatDescrHeader *tsfmt;
	struct tmComResPSFormatDescrHeader *psfmt;
	struct tmComResSelDescrHeader *psel;
	struct tmComResProcDescrHeader *pdh;
	struct tmComResAFeatureDescrHeader *afd;
	struct tmComResEncoderDescrHeader *edh;
	struct tmComResVBIFormatDescrHeader *vbifmt;
	u32 currpath = 0;

	dprintk(DBGLVL_API,
		"%s(?,?,%d) sizeof(struct tmComResDescrHeader) = %d bytes\n",
		__func__, len, (u32)sizeof(struct tmComResDescrHeader));

	for (idx = 0; idx < (len - sizeof(struct tmComResDescrHeader));) {

		hdr = (struct tmComResDescrHeader *)(buf + idx);

		if (hdr->type != CS_INTERFACE)
			return SAA_ERR_NOT_SUPPORTED;

		dprintk(DBGLVL_API, "@ 0x%x =\n", idx);
		switch (hdr->subtype) {
		case GENERAL_REQUEST:
			dprintk(DBGLVL_API, " GENERAL_REQUEST\n");
			break;
		case VC_TUNER_PATH:
			dprintk(DBGLVL_API, " VC_TUNER_PATH\n");
			pathhdr = (struct tmComResPathDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, "  pathid = 0x%x\n",
				pathhdr->pathid);
			currpath = pathhdr->pathid;
			break;
		case VC_INPUT_TERMINAL:
			dprintk(DBGLVL_API, " VC_INPUT_TERMINAL\n");
			anttermhdr =
				(struct tmComResAntTermDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, "  terminalid   = 0x%x\n",
				anttermhdr->terminalid);
			dprintk(DBGLVL_API, "  terminaltype = 0x%x\n",
				anttermhdr->terminaltype);
			switch (anttermhdr->terminaltype) {
			case ITT_ANTENNA:
				dprintk(DBGLVL_API, "   = ITT_ANTENNA\n");
				break;
			case LINE_CONNECTOR:
				dprintk(DBGLVL_API, "   = LINE_CONNECTOR\n");
				break;
			case SPDIF_CONNECTOR:
				dprintk(DBGLVL_API, "   = SPDIF_CONNECTOR\n");
				break;
			case COMPOSITE_CONNECTOR:
				dprintk(DBGLVL_API,
					"   = COMPOSITE_CONNECTOR\n");
				break;
			case SVIDEO_CONNECTOR:
				dprintk(DBGLVL_API, "   = SVIDEO_CONNECTOR\n");
				break;
			case COMPONENT_CONNECTOR:
				dprintk(DBGLVL_API,
					"   = COMPONENT_CONNECTOR\n");
				break;
			case STANDARD_DMA:
				dprintk(DBGLVL_API, "   = STANDARD_DMA\n");
				break;
			default:
				dprintk(DBGLVL_API, "   = undefined (0x%x)\n",
					anttermhdr->terminaltype);
			}
			dprintk(DBGLVL_API, "  assocterminal= 0x%x\n",
				anttermhdr->assocterminal);
			dprintk(DBGLVL_API, "  iterminal    = 0x%x\n",
				anttermhdr->iterminal);
			dprintk(DBGLVL_API, "  controlsize  = 0x%x\n",
				anttermhdr->controlsize);
			break;
		case VC_OUTPUT_TERMINAL:
			dprintk(DBGLVL_API, " VC_OUTPUT_TERMINAL\n");
			vcoutputtermhdr =
				(struct tmComResDMATermDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				vcoutputtermhdr->unitid);
			dprintk(DBGLVL_API, "  terminaltype = 0x%x\n",
				vcoutputtermhdr->terminaltype);
			switch (vcoutputtermhdr->terminaltype) {
			case ITT_ANTENNA:
				dprintk(DBGLVL_API, "   = ITT_ANTENNA\n");
				break;
			case LINE_CONNECTOR:
				dprintk(DBGLVL_API, "   = LINE_CONNECTOR\n");
				break;
			case SPDIF_CONNECTOR:
				dprintk(DBGLVL_API, "   = SPDIF_CONNECTOR\n");
				break;
			case COMPOSITE_CONNECTOR:
				dprintk(DBGLVL_API,
					"   = COMPOSITE_CONNECTOR\n");
				break;
			case SVIDEO_CONNECTOR:
				dprintk(DBGLVL_API, "   = SVIDEO_CONNECTOR\n");
				break;
			case COMPONENT_CONNECTOR:
				dprintk(DBGLVL_API,
					"   = COMPONENT_CONNECTOR\n");
				break;
			case STANDARD_DMA:
				dprintk(DBGLVL_API, "   = STANDARD_DMA\n");
				break;
			default:
				dprintk(DBGLVL_API, "   = undefined (0x%x)\n",
					vcoutputtermhdr->terminaltype);
			}
			dprintk(DBGLVL_API, "  assocterminal= 0x%x\n",
				vcoutputtermhdr->assocterminal);
			dprintk(DBGLVL_API, "  sourceid     = 0x%x\n",
				vcoutputtermhdr->sourceid);
			dprintk(DBGLVL_API, "  iterminal    = 0x%x\n",
				vcoutputtermhdr->iterminal);
			dprintk(DBGLVL_API, "  BARLocation  = 0x%x\n",
				vcoutputtermhdr->BARLocation);
			dprintk(DBGLVL_API, "  flags        = 0x%x\n",
				vcoutputtermhdr->flags);
			dprintk(DBGLVL_API, "  interruptid  = 0x%x\n",
				vcoutputtermhdr->interruptid);
			dprintk(DBGLVL_API, "  buffercount  = 0x%x\n",
				vcoutputtermhdr->buffercount);
			dprintk(DBGLVL_API, "  metadatasize = 0x%x\n",
				vcoutputtermhdr->metadatasize);
			dprintk(DBGLVL_API, "  controlsize  = 0x%x\n",
				vcoutputtermhdr->controlsize);
			dprintk(DBGLVL_API, "  numformats   = 0x%x\n",
				vcoutputtermhdr->numformats);

			next_offset = idx + (vcoutputtermhdr->len);
			for (i = 0; i < vcoutputtermhdr->numformats; i++) {
				t = (struct tmComResDescrHeader *)
					(buf + next_offset);
				switch (t->subtype) {
				case VS_FORMAT_MPEG2TS:
					tsfmt =
					(struct tmComResTSFormatDescrHeader *)t;
					if (currpath == 1)
						tsport = &dev->ports[SAA7164_PORT_TS1];
					else
						tsport = &dev->ports[SAA7164_PORT_TS2];
					memcpy(&tsport->hwcfg, vcoutputtermhdr,
						sizeof(*vcoutputtermhdr));
					saa7164_api_configure_port_mpeg2ts(dev,
						tsport, tsfmt);
					break;
				case VS_FORMAT_MPEG2PS:
					psfmt =
					(struct tmComResPSFormatDescrHeader *)t;
					if (currpath == 1)
						encport = &dev->ports[SAA7164_PORT_ENC1];
					else
						encport = &dev->ports[SAA7164_PORT_ENC2];
					memcpy(&encport->hwcfg, vcoutputtermhdr,
						sizeof(*vcoutputtermhdr));
					saa7164_api_configure_port_mpeg2ps(dev,
						encport, psfmt);
					break;
				case VS_FORMAT_VBI:
					vbifmt =
					(struct tmComResVBIFormatDescrHeader *)t;
					if (currpath == 1)
						vbiport = &dev->ports[SAA7164_PORT_VBI1];
					else
						vbiport = &dev->ports[SAA7164_PORT_VBI2];
					memcpy(&vbiport->hwcfg, vcoutputtermhdr,
						sizeof(*vcoutputtermhdr));
					memcpy(&vbiport->vbi_fmt_ntsc, vbifmt,
						sizeof(*vbifmt));
					saa7164_api_configure_port_vbi(dev,
						vbiport);
					break;
				case VS_FORMAT_RDS:
					dprintk(DBGLVL_API,
						"   = VS_FORMAT_RDS\n");
					break;
				case VS_FORMAT_UNCOMPRESSED:
					dprintk(DBGLVL_API,
					"   = VS_FORMAT_UNCOMPRESSED\n");
					break;
				case VS_FORMAT_TYPE:
					dprintk(DBGLVL_API,
						"   = VS_FORMAT_TYPE\n");
					break;
				default:
					dprintk(DBGLVL_API,
						"   = undefined (0x%x)\n",
						t->subtype);
				}
				next_offset += t->len;
			}

			break;
		case TUNER_UNIT:
			dprintk(DBGLVL_API, " TUNER_UNIT\n");
			tunerunithdr =
				(struct tmComResTunerDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				tunerunithdr->unitid);
			dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
				tunerunithdr->sourceid);
			dprintk(DBGLVL_API, "  iunit = 0x%x\n",
				tunerunithdr->iunit);
			dprintk(DBGLVL_API, "  tuningstandards = 0x%x\n",
				tunerunithdr->tuningstandards);
			dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
				tunerunithdr->controlsize);
			dprintk(DBGLVL_API, "  controls = 0x%x\n",
				tunerunithdr->controls);

			if (tunerunithdr->unitid == tunerunithdr->iunit) {
				if (currpath == 1)
					encport = &dev->ports[SAA7164_PORT_ENC1];
				else
					encport = &dev->ports[SAA7164_PORT_ENC2];
				memcpy(&encport->tunerunit, tunerunithdr,
					sizeof(struct tmComResTunerDescrHeader));
				dprintk(DBGLVL_API,
					"  (becomes dev->enc[%d] tuner)\n",
					encport->nr);
			}
			break;
		case VC_SELECTOR_UNIT:
			psel = (struct tmComResSelDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, " VC_SELECTOR_UNIT\n");
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				psel->unitid);
			dprintk(DBGLVL_API, "  nrinpins = 0x%x\n",
				psel->nrinpins);
			dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
				psel->sourceid);
			break;
		case VC_PROCESSING_UNIT:
			pdh = (struct tmComResProcDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, " VC_PROCESSING_UNIT\n");
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				pdh->unitid);
			dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
				pdh->sourceid);
			dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
				pdh->controlsize);
			if (pdh->controlsize == 0x04) {
				if (currpath == 1)
					encport = &dev->ports[SAA7164_PORT_ENC1];
				else
					encport = &dev->ports[SAA7164_PORT_ENC2];
				memcpy(&encport->vidproc, pdh,
					sizeof(struct tmComResProcDescrHeader));
				dprintk(DBGLVL_API, "  (becomes dev->enc[%d])\n",
					encport->nr);
			}
			break;
		case FEATURE_UNIT:
			afd = (struct tmComResAFeatureDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, " FEATURE_UNIT\n");
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				afd->unitid);
			dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
				afd->sourceid);
			dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
				afd->controlsize);
			if (currpath == 1)
				encport = &dev->ports[SAA7164_PORT_ENC1];
			else
				encport = &dev->ports[SAA7164_PORT_ENC2];
			memcpy(&encport->audfeat, afd,
				sizeof(struct tmComResAFeatureDescrHeader));
			dprintk(DBGLVL_API, "  (becomes dev->enc[%d])\n",
				encport->nr);
			break;
		case ENCODER_UNIT:
			edh = (struct tmComResEncoderDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, " ENCODER_UNIT\n");
			dprintk(DBGLVL_API, "  subtype = 0x%x\n", edh->subtype);
			dprintk(DBGLVL_API, "  unitid = 0x%x\n", edh->unitid);
			dprintk(DBGLVL_API, "  vsourceid = 0x%x\n",
			edh->vsourceid);
			dprintk(DBGLVL_API, "  asourceid = 0x%x\n",
				edh->asourceid);
			dprintk(DBGLVL_API, "  iunit = 0x%x\n", edh->iunit);
			if (edh->iunit == edh->unitid) {
				if (currpath == 1)
					encport = &dev->ports[SAA7164_PORT_ENC1];
				else
					encport = &dev->ports[SAA7164_PORT_ENC2];
				memcpy(&encport->encunit, edh,
					sizeof(struct tmComResEncoderDescrHeader));
				dprintk(DBGLVL_API,
					"  (becomes dev->enc[%d])\n",
					encport->nr);
			}
			break;
		case EXTENSION_UNIT:
			dprintk(DBGLVL_API, " EXTENSION_UNIT\n");
			exthdr = (struct tmComResExtDevDescrHeader *)(buf + idx);
			dprintk(DBGLVL_API, "  unitid = 0x%x\n",
				exthdr->unitid);
			dprintk(DBGLVL_API, "  deviceid = 0x%x\n",
				exthdr->deviceid);
			dprintk(DBGLVL_API, "  devicetype = 0x%x\n",
				exthdr->devicetype);
			if (exthdr->devicetype & 0x1)
				dprintk(DBGLVL_API, "   = Decoder Device\n");
			if (exthdr->devicetype & 0x2)
				dprintk(DBGLVL_API, "   = GPIO Source\n");
			if (exthdr->devicetype & 0x4)
				dprintk(DBGLVL_API, "   = Video Decoder\n");
			if (exthdr->devicetype & 0x8)
				dprintk(DBGLVL_API, "   = Audio Decoder\n");
			if (exthdr->devicetype & 0x20)
				dprintk(DBGLVL_API, "   = Crossbar\n");
			if (exthdr->devicetype & 0x40)
				dprintk(DBGLVL_API, "   = Tuner\n");
			if (exthdr->devicetype & 0x80)
				dprintk(DBGLVL_API, "   = IF PLL\n");
			if (exthdr->devicetype & 0x100)
				dprintk(DBGLVL_API, "   = Demodulator\n");
			if (exthdr->devicetype & 0x200)
				dprintk(DBGLVL_API, "   = RDS Decoder\n");
			if (exthdr->devicetype & 0x400)
				dprintk(DBGLVL_API, "   = Encoder\n");
			if (exthdr->devicetype & 0x800)
				dprintk(DBGLVL_API, "   = IR Decoder\n");
			if (exthdr->devicetype & 0x1000)
				dprintk(DBGLVL_API, "   = EEPROM\n");
			if (exthdr->devicetype & 0x2000)
				dprintk(DBGLVL_API,
					"   = VBI Decoder\n");
			if (exthdr->devicetype & 0x10000)
				dprintk(DBGLVL_API,
					"   = Streaming Device\n");
			if (exthdr->devicetype & 0x20000)
				dprintk(DBGLVL_API,
					"   = DRM Device\n");
			if (exthdr->devicetype & 0x40000000)
				dprintk(DBGLVL_API,
					"   = Generic Device\n");
			if (exthdr->devicetype & 0x80000000)
				dprintk(DBGLVL_API,
					"   = Config Space Device\n");
			dprintk(DBGLVL_API, "  numgpiopins = 0x%x\n",
				exthdr->numgpiopins);
			dprintk(DBGLVL_API, "  numgpiogroups = 0x%x\n",
				exthdr->numgpiogroups);
			dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
				exthdr->controlsize);
			if (exthdr->devicetype & 0x80) {
				if (currpath == 1)
					encport = &dev->ports[SAA7164_PORT_ENC1];
				else
					encport = &dev->ports[SAA7164_PORT_ENC2];
				memcpy(&encport->ifunit, exthdr,
					sizeof(struct tmComResExtDevDescrHeader));
				dprintk(DBGLVL_API,
					"  (becomes dev->enc[%d])\n",
					encport->nr);
			}
			break;
		case PVC_INFRARED_UNIT:
			dprintk(DBGLVL_API, " PVC_INFRARED_UNIT\n");
			break;
		case DRM_UNIT:
			dprintk(DBGLVL_API, " DRM_UNIT\n");
			break;
		default:
			dprintk(DBGLVL_API, "default %d\n", hdr->subtype);
		}

		dprintk(DBGLVL_API, " 1.%x\n", hdr->len);
		dprintk(DBGLVL_API, " 2.%x\n", hdr->type);
		dprintk(DBGLVL_API, " 3.%x\n", hdr->subtype);
		dprintk(DBGLVL_API, " 4.%x\n", hdr->unitid);

		idx += hdr->len;
	}

	return 0;
}