[media] saa7164: monitor the RISC cpu load via a thread
[deliverable/linux.git] / drivers / media / video / saa7164 / saa7164-api.c
index 5630a5d408966c318cda5e0736189a3ed029e98f..0a2fdcde2f96ac68c35c00b72fb8adebdc850552 100644 (file)
 
 #include "saa7164.h"
 
+int saa7164_api_get_load_info(struct saa7164_dev *dev, tmFwInfoStruct_t *i)
+{
+       int ret, debug;
+
+       if (!(debug & DBGLVL_CPU))
+               return 0;
+
+       dprintk(DBGLVL_API, "%s()\n", __func__);
+
+       i->deviceinst = 0;
+       i->devicespec = 0;
+       i->mode = 0;
+       i->status = 0;
+
+       ret = saa7164_cmd_send(dev, 0, GET_CUR,
+               GET_FW_STATUS_CONTROL, sizeof(tmFwInfoStruct_t), i);
+       if (ret != SAA_OK) {
+               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+       }
+
+       printk(KERN_INFO "saa7164[%d]-CPU: %d percent", dev->nr, i->CPULoad);
+
+       return ret;
+}
+
+int saa7164_api_collect_debug(struct saa7164_dev *dev)
+{
+       tmComResDebugGetData_t d;
+       u8 more = 255;
+       int ret;
+
+       dprintk(DBGLVL_API, "%s()\n", __func__);
+
+       while (more--) {
+
+               memset(&d, 0, sizeof(d));
+
+               ret = saa7164_cmd_send(dev, 0, GET_CUR,
+                       GET_DEBUG_DATA_CONTROL, sizeof(d), &d);
+               if (ret != SAA_OK) {
+                       printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+               }
+
+               if (d.dwResult != SAA_OK)
+                       break;
+
+               printk(KERN_INFO "saa7164[%d]-FWMSG: %s", dev->nr, d.ucDebugData);
+       }
+
+       return 0;
+}
+
+int saa7164_api_set_debug(struct saa7164_dev *dev, u8 level)
+{
+       tmComResDebugSetLevel_t lvl;
+       int ret;
+
+       dprintk(DBGLVL_API, "%s(level=%d)\n", __func__, level);
+
+       /* Retrieve current state */
+       ret = saa7164_cmd_send(dev, 0, GET_CUR,
+               SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl);
+       if (ret != SAA_OK) {
+               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+       }
+       dprintk(DBGLVL_API, "%s() Was %d\n", __func__, lvl.dwDebugLevel);
+
+       lvl.dwDebugLevel = level;
+
+       /* set new state */
+       ret = saa7164_cmd_send(dev, 0, SET_CUR,
+               SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl);
+       if (ret != SAA_OK) {
+               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+       }
+
+       return ret;
+}
+
+int saa7164_api_set_vbi_format(struct saa7164_port *port)
+{
+       struct saa7164_dev *dev = port->dev;
+       tmComResProbeCommit_t fmt, rsp;
+       int ret;
+
+       dprintk(DBGLVL_API, "%s(nr=%d, unitid=0x%x)\n", __func__,
+               port->nr, port->hwcfg.unitid);
+
+       fmt.bmHint = 0;
+       fmt.bFormatIndex = 1;
+       fmt.bFrameIndex = 1;
+
+       /* Probe, see if it can support this format */
+       ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
+               SET_CUR, SAA_PROBE_CONTROL, sizeof(fmt), &fmt);
+       if (ret != SAA_OK)
+               printk(KERN_ERR "%s() set error, ret = 0x%x\n", __func__, ret);
+
+       /* See of the format change was successful */
+       ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
+               GET_CUR, SAA_PROBE_CONTROL, sizeof(rsp), &rsp);
+       if (ret != SAA_OK) {
+               printk(KERN_ERR "%s() get error, ret = 0x%x\n", __func__, ret);
+       } else {
+               /* Compare requested vs received, should be same */
+               if (memcmp(&fmt, &rsp, sizeof(rsp)) == 0) {
+                       dprintk(DBGLVL_API, "SET/PROBE Verified\n");
+
+                       /* Ask the device to select the negotiated format */
+                       ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
+                               SET_CUR, SAA_COMMIT_CONTROL, sizeof(fmt), &fmt);
+                       if (ret != SAA_OK)
+                               printk(KERN_ERR "%s() commit error, ret = 0x%x\n",
+                                       __func__, ret);
+
+                       ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
+                               GET_CUR, SAA_COMMIT_CONTROL, sizeof(rsp), &rsp);
+                       if (ret != SAA_OK)
+                               printk(KERN_ERR "%s() GET commit error, ret = 0x%x\n",
+                                       __func__, ret);
+
+                       if (memcmp(&fmt, &rsp, sizeof(rsp)) != 0) {
+                               printk(KERN_ERR "%s() memcmp error, ret = 0x%x\n",
+                                       __func__, ret);
+                       } else
+                               dprintk(DBGLVL_API, "SET/COMMIT Verified\n");
+
+                       dprintk(DBGLVL_API, "rsp.bmHint = 0x%x\n", rsp.bmHint);
+                       dprintk(DBGLVL_API, "rsp.bFormatIndex = 0x%x\n", rsp.bFormatIndex);
+                       dprintk(DBGLVL_API, "rsp.bFrameIndex = 0x%x\n", rsp.bFrameIndex);
+               } else
+                       printk(KERN_ERR "%s() compare failed\n", __func__);
+       }
+
+       if (ret == SAA_OK)
+               dprintk(DBGLVL_API, "%s(nr=%d) Success\n", __func__, port->nr);
+
+       return ret;
+}
+
 int saa7164_api_set_gop_size(struct saa7164_port *port)
 {
        struct saa7164_dev *dev = port->dev;
@@ -63,6 +203,12 @@ int saa7164_api_set_encoder(struct saa7164_port *port)
        if (ret != SAA_OK)
                printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 
+       /* Resolution */
+       ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
+               EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile);
+       if (ret != SAA_OK)
+               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+
        /* Establish video bitrates */
        if (port->encoder_params.bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
                vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_CONSTANT;
@@ -110,6 +256,11 @@ int saa7164_api_get_encoder(struct saa7164_port *port)
        if (ret != SAA_OK)
                printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 
+       ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
+               EU_VIDEO_RESOLUTION_CONTROL, sizeof(u8), &port->video_resolution);
+       if (ret != SAA_OK)
+               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+
        ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
                EU_VIDEO_FORMAT_CONTROL, sizeof(u8), &port->video_format);
        if (ret != SAA_OK)
@@ -452,7 +603,8 @@ int saa7164_api_set_dif(struct saa7164_port *port, u8 reg, u8 val)
        int ret;
        u8 mas;
 
-       dprintk(DBGLVL_API, "%s()\n", __func__);
+       dprintk(DBGLVL_API, "%s(nr=%d type=%d val=%x)\n", __func__,
+               port->nr, port->type, val);
 
        if (port->nr == 0)
                mas = 0xd0;
@@ -505,7 +657,7 @@ int saa7164_api_configure_dif(struct saa7164_port *port, u32 std)
        int ret = 0;
        u8 agc_disable;
 
-       dprintk(DBGLVL_API, "%s(%p, 0x%x)\n", __func__, port, std);
+       dprintk(DBGLVL_API, "%s(nr=%d, 0x%x)\n", __func__, port->nr, std);
 
        if (std & V4L2_STD_NTSC) {
                dprintk(DBGLVL_API, " NTSC\n");
@@ -569,6 +721,9 @@ int saa7164_api_initialize_dif(struct saa7164_port *port)
        int ret = -EINVAL;
        u32 std = 0;
 
+       dprintk(DBGLVL_API, "%s(nr=%d type=%d)\n", __func__,
+               port->nr, port->type);
+
        if (port->type == SAA7164_MPEG_ENCODER) {
                /* Pick any analog standard to init the diff.
                 * we'll come back during encoder_init'
@@ -581,6 +736,13 @@ int saa7164_api_initialize_dif(struct saa7164_port *port)
                        p = &dev->ports[ SAA7164_PORT_ENC1 ];
                else
                        p = &dev->ports[ SAA7164_PORT_ENC2 ];
+       } else
+       if (port->type == SAA7164_MPEG_VBI) {
+               std = V4L2_STD_NTSC;
+               if (port->nr == SAA7164_PORT_VBI1)
+                       p = &dev->ports[ SAA7164_PORT_ENC1 ];
+               else
+                       p = &dev->ports[ SAA7164_PORT_ENC2 ];
        } else
                BUG();
 
@@ -592,12 +754,18 @@ int saa7164_api_initialize_dif(struct saa7164_port *port)
 
 int saa7164_api_transition_port(struct saa7164_port *port, u8 mode)
 {
+       struct saa7164_dev *dev = port->dev;
+
        int ret;
 
+       dprintk(DBGLVL_API, "%s(nr=%d unitid=0x%x,%d)\n",
+               __func__, port->nr, port->hwcfg.unitid, mode);
+
        ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, SET_CUR,
                SAA_STATE_CONTROL, sizeof(mode), &mode);
        if (ret != SAA_OK)
-               printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
+               printk(KERN_ERR "%s(portnr %d unitid 0x%x) error, ret = 0x%x\n",
+                       __func__, port->nr, port->hwcfg.unitid, ret);
 
        return ret;
 }
@@ -628,6 +796,42 @@ int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen)
 }
 
 
+int saa7164_api_configure_port_vbi(struct saa7164_dev *dev,
+       struct saa7164_port *port)
+{
+       tmComResVBIFormatDescrHeader_t *fmt = &port->vbi_fmt_ntsc;
+
+       dprintk(DBGLVL_API, "    bFormatIndex  = 0x%x\n", fmt->bFormatIndex);
+       dprintk(DBGLVL_API, "    VideoStandard = 0x%x\n", fmt->VideoStandard);
+       dprintk(DBGLVL_API, "    StartLine     = %d\n", fmt->StartLine);
+       dprintk(DBGLVL_API, "    EndLine       = %d\n", fmt->EndLine);
+       dprintk(DBGLVL_API, "    FieldRate     = %d\n", fmt->FieldRate);
+       dprintk(DBGLVL_API, "    bNumLines     = %d\n", fmt->bNumLines);
+
+       /* Cache the hardware configuration in the port */
+
+       port->bufcounter = port->hwcfg.BARLocation;
+       port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32));
+       port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32));
+       port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32));
+       port->bufptr32l = port->hwcfg.BARLocation +
+               (4 * sizeof(u32)) +
+               (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32);
+       port->bufptr32h = port->hwcfg.BARLocation +
+               (4 * sizeof(u32)) +
+               (sizeof(u32) * port->hwcfg.buffercount);
+       port->bufptr64 = port->hwcfg.BARLocation +
+               (4 * sizeof(u32)) +
+               (sizeof(u32) * port->hwcfg.buffercount);
+       dprintk(DBGLVL_API, "   = port->hwcfg.BARLocation = 0x%x\n",
+               port->hwcfg.BARLocation);
+
+       dprintk(DBGLVL_API, "   = VS_FORMAT_VBI (becomes dev->en[%d])\n",
+               port->nr);
+
+       return 0;
+}
+
 int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,
        struct saa7164_port *port,
        tmComResTSFormatDescrHeader_t *tsfmt)
@@ -699,6 +903,7 @@ int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
 {
        struct saa7164_port *tsport = 0;
        struct saa7164_port *encport = 0;
+       struct saa7164_port *vbiport = 0;
        u32 idx, next_offset;
        int i;
        tmComResDescrHeader_t *hdr, *t;
@@ -713,6 +918,7 @@ int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
        tmComResProcDescrHeader_t *pdh;
        tmComResAFeatureDescrHeader_t *afd;
        tmComResEncoderDescrHeader_t *edh;
+       tmComResVBIFormatDescrHeader_t *vbifmt;
        u32 currpath = 0;
 
        dprintk(DBGLVL_API,
@@ -870,8 +1076,17 @@ int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
                                                encport, psfmt);
                                        break;
                                case VS_FORMAT_VBI:
-                                       dprintk(DBGLVL_API,
-                                               "   = VS_FORMAT_VBI\n");
+                                       vbifmt =
+                                       (tmComResVBIFormatDescrHeader_t *)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,
This page took 0.157404 seconds and 5 git commands to generate.