root/drivers/media/pci/saa7164/saa7164-api.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. saa7164_api_get_load_info
  2. saa7164_api_collect_debug
  3. saa7164_api_set_debug
  4. saa7164_api_set_vbi_format
  5. saa7164_api_set_gop_size
  6. saa7164_api_set_encoder
  7. saa7164_api_get_encoder
  8. saa7164_api_set_aspect_ratio
  9. saa7164_api_set_usercontrol
  10. saa7164_api_get_usercontrol
  11. saa7164_api_set_videomux
  12. saa7164_api_audio_mute
  13. saa7164_api_set_audio_volume
  14. saa7164_api_set_audio_std
  15. saa7164_api_set_audio_detection
  16. saa7164_api_get_videomux
  17. saa7164_api_set_dif
  18. saa7164_api_configure_dif
  19. saa7164_api_initialize_dif
  20. saa7164_api_transition_port
  21. saa7164_api_get_fw_version
  22. saa7164_api_read_eeprom
  23. saa7164_api_configure_port_vbi
  24. saa7164_api_configure_port_mpeg2ts
  25. saa7164_api_configure_port_mpeg2ps
  26. saa7164_api_dump_subdevs
  27. saa7164_api_enum_subdevs
  28. saa7164_api_i2c_read
  29. saa7164_api_i2c_write
  30. saa7164_api_modify_gpio
  31. saa7164_api_set_gpiobit
  32. saa7164_api_clear_gpiobit

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Driver for the NXP SAA7164 PCIe bridge
   4  *
   5  *  Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com>
   6  */
   7 
   8 #include <linux/wait.h>
   9 #include <linux/slab.h>
  10 
  11 #include "saa7164.h"
  12 
  13 int saa7164_api_get_load_info(struct saa7164_dev *dev, struct tmFwInfoStruct *i)
  14 {
  15         int ret;
  16 
  17         if (!(saa_debug & DBGLVL_CPU))
  18                 return 0;
  19 
  20         dprintk(DBGLVL_API, "%s()\n", __func__);
  21 
  22         i->deviceinst = 0;
  23         i->devicespec = 0;
  24         i->mode = 0;
  25         i->status = 0;
  26 
  27         ret = saa7164_cmd_send(dev, 0, GET_CUR,
  28                 GET_FW_STATUS_CONTROL, sizeof(struct tmFwInfoStruct), i);
  29         if (ret != SAA_OK)
  30                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
  31 
  32         printk(KERN_INFO "saa7164[%d]-CPU: %d percent", dev->nr, i->CPULoad);
  33 
  34         return ret;
  35 }
  36 
  37 int saa7164_api_collect_debug(struct saa7164_dev *dev)
  38 {
  39         struct tmComResDebugGetData d;
  40         u8 more = 255;
  41         int ret;
  42 
  43         dprintk(DBGLVL_API, "%s()\n", __func__);
  44 
  45         while (more--) {
  46 
  47                 memset(&d, 0, sizeof(d));
  48 
  49                 ret = saa7164_cmd_send(dev, 0, GET_CUR,
  50                         GET_DEBUG_DATA_CONTROL, sizeof(d), &d);
  51                 if (ret != SAA_OK)
  52                         printk(KERN_ERR "%s() error, ret = 0x%x\n",
  53                                 __func__, ret);
  54 
  55                 if (d.dwResult != SAA_OK)
  56                         break;
  57 
  58                 printk(KERN_INFO "saa7164[%d]-FWMSG: %s", dev->nr,
  59                         d.ucDebugData);
  60         }
  61 
  62         return 0;
  63 }
  64 
  65 int saa7164_api_set_debug(struct saa7164_dev *dev, u8 level)
  66 {
  67         struct tmComResDebugSetLevel lvl;
  68         int ret;
  69 
  70         dprintk(DBGLVL_API, "%s(level=%d)\n", __func__, level);
  71 
  72         /* Retrieve current state */
  73         ret = saa7164_cmd_send(dev, 0, GET_CUR,
  74                 SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl);
  75         if (ret != SAA_OK)
  76                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
  77 
  78         dprintk(DBGLVL_API, "%s() Was %d\n", __func__, lvl.dwDebugLevel);
  79 
  80         lvl.dwDebugLevel = level;
  81 
  82         /* set new state */
  83         ret = saa7164_cmd_send(dev, 0, SET_CUR,
  84                 SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl);
  85         if (ret != SAA_OK)
  86                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
  87 
  88         return ret;
  89 }
  90 
  91 int saa7164_api_set_vbi_format(struct saa7164_port *port)
  92 {
  93         struct saa7164_dev *dev = port->dev;
  94         struct tmComResProbeCommit fmt, rsp;
  95         int ret;
  96 
  97         dprintk(DBGLVL_API, "%s(nr=%d, unitid=0x%x)\n", __func__,
  98                 port->nr, port->hwcfg.unitid);
  99 
 100         fmt.bmHint = 0;
 101         fmt.bFormatIndex = 1;
 102         fmt.bFrameIndex = 1;
 103 
 104         /* Probe, see if it can support this format */
 105         ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
 106                 SET_CUR, SAA_PROBE_CONTROL, sizeof(fmt), &fmt);
 107         if (ret != SAA_OK)
 108                 printk(KERN_ERR "%s() set error, ret = 0x%x\n", __func__, ret);
 109 
 110         /* See of the format change was successful */
 111         ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
 112                 GET_CUR, SAA_PROBE_CONTROL, sizeof(rsp), &rsp);
 113         if (ret != SAA_OK) {
 114                 printk(KERN_ERR "%s() get error, ret = 0x%x\n", __func__, ret);
 115         } else {
 116                 /* Compare requested vs received, should be same */
 117                 if (memcmp(&fmt, &rsp, sizeof(rsp)) == 0) {
 118                         dprintk(DBGLVL_API, "SET/PROBE Verified\n");
 119 
 120                         /* Ask the device to select the negotiated format */
 121                         ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
 122                                 SET_CUR, SAA_COMMIT_CONTROL, sizeof(fmt), &fmt);
 123                         if (ret != SAA_OK)
 124                                 printk(KERN_ERR "%s() commit error, ret = 0x%x\n",
 125                                         __func__, ret);
 126 
 127                         ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid,
 128                                 GET_CUR, SAA_COMMIT_CONTROL, sizeof(rsp), &rsp);
 129                         if (ret != SAA_OK)
 130                                 printk(KERN_ERR "%s() GET commit error, ret = 0x%x\n",
 131                                         __func__, ret);
 132 
 133                         if (memcmp(&fmt, &rsp, sizeof(rsp)) != 0) {
 134                                 printk(KERN_ERR "%s() memcmp error, ret = 0x%x\n",
 135                                         __func__, ret);
 136                         } else
 137                                 dprintk(DBGLVL_API, "SET/COMMIT Verified\n");
 138 
 139                         dprintk(DBGLVL_API, "rsp.bmHint = 0x%x\n", rsp.bmHint);
 140                         dprintk(DBGLVL_API, "rsp.bFormatIndex = 0x%x\n",
 141                                 rsp.bFormatIndex);
 142                         dprintk(DBGLVL_API, "rsp.bFrameIndex = 0x%x\n",
 143                                 rsp.bFrameIndex);
 144                 } else
 145                         printk(KERN_ERR "%s() compare failed\n", __func__);
 146         }
 147 
 148         if (ret == SAA_OK)
 149                 dprintk(DBGLVL_API, "%s(nr=%d) Success\n", __func__, port->nr);
 150 
 151         return ret;
 152 }
 153 
 154 static int saa7164_api_set_gop_size(struct saa7164_port *port)
 155 {
 156         struct saa7164_dev *dev = port->dev;
 157         struct tmComResEncVideoGopStructure gs;
 158         int ret;
 159 
 160         dprintk(DBGLVL_ENC, "%s()\n", __func__);
 161 
 162         gs.ucRefFrameDist = port->encoder_params.refdist;
 163         gs.ucGOPSize = port->encoder_params.gop_size;
 164         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 165                 EU_VIDEO_GOP_STRUCTURE_CONTROL,
 166                 sizeof(gs), &gs);
 167         if (ret != SAA_OK)
 168                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 169 
 170         return ret;
 171 }
 172 
 173 int saa7164_api_set_encoder(struct saa7164_port *port)
 174 {
 175         struct saa7164_dev *dev = port->dev;
 176         struct tmComResEncVideoBitRate vb;
 177         struct tmComResEncAudioBitRate ab;
 178         int ret;
 179 
 180         dprintk(DBGLVL_ENC, "%s() unitid=0x%x\n", __func__,
 181                 port->hwcfg.sourceid);
 182 
 183         if (port->encoder_params.stream_type == V4L2_MPEG_STREAM_TYPE_MPEG2_PS)
 184                 port->encoder_profile = EU_PROFILE_PS_DVD;
 185         else
 186                 port->encoder_profile = EU_PROFILE_TS_HQ;
 187 
 188         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 189                 EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile);
 190         if (ret != SAA_OK)
 191                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 192 
 193         /* Resolution */
 194         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 195                 EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile);
 196         if (ret != SAA_OK)
 197                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 198 
 199         /* Establish video bitrates */
 200         if (port->encoder_params.bitrate_mode ==
 201                 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
 202                 vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_CONSTANT;
 203         else
 204                 vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK;
 205         vb.dwVideoBitRate = port->encoder_params.bitrate;
 206         vb.dwVideoBitRatePeak = port->encoder_params.bitrate_peak;
 207         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 208                 EU_VIDEO_BIT_RATE_CONTROL,
 209                 sizeof(struct tmComResEncVideoBitRate),
 210                 &vb);
 211         if (ret != SAA_OK)
 212                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 213 
 214         /* Establish audio bitrates */
 215         ab.ucAudioBitRateMode = 0;
 216         ab.dwAudioBitRate = 384000;
 217         ab.dwAudioBitRatePeak = ab.dwAudioBitRate;
 218         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 219                 EU_AUDIO_BIT_RATE_CONTROL,
 220                 sizeof(struct tmComResEncAudioBitRate),
 221                 &ab);
 222         if (ret != SAA_OK)
 223                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__,
 224                         ret);
 225 
 226         saa7164_api_set_aspect_ratio(port);
 227         saa7164_api_set_gop_size(port);
 228 
 229         return ret;
 230 }
 231 
 232 int saa7164_api_get_encoder(struct saa7164_port *port)
 233 {
 234         struct saa7164_dev *dev = port->dev;
 235         struct tmComResEncVideoBitRate v;
 236         struct tmComResEncAudioBitRate a;
 237         struct tmComResEncVideoInputAspectRatio ar;
 238         int ret;
 239 
 240         dprintk(DBGLVL_ENC, "%s() unitid=0x%x\n", __func__,
 241                 port->hwcfg.sourceid);
 242 
 243         port->encoder_profile = 0;
 244         port->video_format = 0;
 245         port->video_resolution = 0;
 246         port->audio_format = 0;
 247 
 248         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 249                 EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile);
 250         if (ret != SAA_OK)
 251                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 252 
 253         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 254                 EU_VIDEO_RESOLUTION_CONTROL, sizeof(u8),
 255                 &port->video_resolution);
 256         if (ret != SAA_OK)
 257                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 258 
 259         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 260                 EU_VIDEO_FORMAT_CONTROL, sizeof(u8), &port->video_format);
 261         if (ret != SAA_OK)
 262                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 263 
 264         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 265                 EU_VIDEO_BIT_RATE_CONTROL, sizeof(v), &v);
 266         if (ret != SAA_OK)
 267                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 268 
 269         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 270                 EU_AUDIO_FORMAT_CONTROL, sizeof(u8), &port->audio_format);
 271         if (ret != SAA_OK)
 272                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 273 
 274         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 275                 EU_AUDIO_BIT_RATE_CONTROL, sizeof(a), &a);
 276         if (ret != SAA_OK)
 277                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 278 
 279         /* Aspect Ratio */
 280         ar.width = 0;
 281         ar.height = 0;
 282         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR,
 283                 EU_VIDEO_INPUT_ASPECT_CONTROL,
 284                 sizeof(struct tmComResEncVideoInputAspectRatio), &ar);
 285         if (ret != SAA_OK)
 286                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 287 
 288         dprintk(DBGLVL_ENC, "encoder_profile = %d\n", port->encoder_profile);
 289         dprintk(DBGLVL_ENC, "video_format    = %d\n", port->video_format);
 290         dprintk(DBGLVL_ENC, "audio_format    = %d\n", port->audio_format);
 291         dprintk(DBGLVL_ENC, "video_resolution= %d\n", port->video_resolution);
 292         dprintk(DBGLVL_ENC, "v.ucVideoBitRateMode = %d\n",
 293                 v.ucVideoBitRateMode);
 294         dprintk(DBGLVL_ENC, "v.dwVideoBitRate     = %d\n",
 295                 v.dwVideoBitRate);
 296         dprintk(DBGLVL_ENC, "v.dwVideoBitRatePeak = %d\n",
 297                 v.dwVideoBitRatePeak);
 298         dprintk(DBGLVL_ENC, "a.ucVideoBitRateMode = %d\n",
 299                 a.ucAudioBitRateMode);
 300         dprintk(DBGLVL_ENC, "a.dwVideoBitRate     = %d\n",
 301                 a.dwAudioBitRate);
 302         dprintk(DBGLVL_ENC, "a.dwVideoBitRatePeak = %d\n",
 303                 a.dwAudioBitRatePeak);
 304         dprintk(DBGLVL_ENC, "aspect.width / height = %d:%d\n",
 305                 ar.width, ar.height);
 306 
 307         return ret;
 308 }
 309 
 310 int saa7164_api_set_aspect_ratio(struct saa7164_port *port)
 311 {
 312         struct saa7164_dev *dev = port->dev;
 313         struct tmComResEncVideoInputAspectRatio ar;
 314         int ret;
 315 
 316         dprintk(DBGLVL_ENC, "%s(%d)\n", __func__,
 317                 port->encoder_params.ctl_aspect);
 318 
 319         switch (port->encoder_params.ctl_aspect) {
 320         case V4L2_MPEG_VIDEO_ASPECT_1x1:
 321                 ar.width = 1;
 322                 ar.height = 1;
 323                 break;
 324         case V4L2_MPEG_VIDEO_ASPECT_4x3:
 325                 ar.width = 4;
 326                 ar.height = 3;
 327                 break;
 328         case V4L2_MPEG_VIDEO_ASPECT_16x9:
 329                 ar.width = 16;
 330                 ar.height = 9;
 331                 break;
 332         case V4L2_MPEG_VIDEO_ASPECT_221x100:
 333                 ar.width = 221;
 334                 ar.height = 100;
 335                 break;
 336         default:
 337                 BUG();
 338         }
 339 
 340         dprintk(DBGLVL_ENC, "%s(%d) now %d:%d\n", __func__,
 341                 port->encoder_params.ctl_aspect,
 342                 ar.width, ar.height);
 343 
 344         /* Aspect Ratio */
 345         ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR,
 346                 EU_VIDEO_INPUT_ASPECT_CONTROL,
 347                 sizeof(struct tmComResEncVideoInputAspectRatio), &ar);
 348         if (ret != SAA_OK)
 349                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 350 
 351         return ret;
 352 }
 353 
 354 int saa7164_api_set_usercontrol(struct saa7164_port *port, u8 ctl)
 355 {
 356         struct saa7164_dev *dev = port->dev;
 357         int ret;
 358         u16 val;
 359 
 360         if (ctl == PU_BRIGHTNESS_CONTROL)
 361                 val = port->ctl_brightness;
 362         else
 363         if (ctl == PU_CONTRAST_CONTROL)
 364                 val = port->ctl_contrast;
 365         else
 366         if (ctl == PU_HUE_CONTROL)
 367                 val = port->ctl_hue;
 368         else
 369         if (ctl == PU_SATURATION_CONTROL)
 370                 val = port->ctl_saturation;
 371         else
 372         if (ctl == PU_SHARPNESS_CONTROL)
 373                 val = port->ctl_sharpness;
 374         else
 375                 return -EINVAL;
 376 
 377         dprintk(DBGLVL_ENC, "%s() unitid=0x%x ctl=%d, val=%d\n",
 378                 __func__, port->encunit.vsourceid, ctl, val);
 379 
 380         ret = saa7164_cmd_send(port->dev, port->encunit.vsourceid, SET_CUR,
 381                 ctl, sizeof(u16), &val);
 382         if (ret != SAA_OK)
 383                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 384 
 385         return ret;
 386 }
 387 
 388 int saa7164_api_get_usercontrol(struct saa7164_port *port, u8 ctl)
 389 {
 390         struct saa7164_dev *dev = port->dev;
 391         int ret;
 392         u16 val;
 393 
 394         ret = saa7164_cmd_send(port->dev, port->encunit.vsourceid, GET_CUR,
 395                 ctl, sizeof(u16), &val);
 396         if (ret != SAA_OK) {
 397                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 398                 return ret;
 399         }
 400 
 401         dprintk(DBGLVL_ENC, "%s() ctl=%d, val=%d\n",
 402                 __func__, ctl, val);
 403 
 404         if (ctl == PU_BRIGHTNESS_CONTROL)
 405                 port->ctl_brightness = val;
 406         else
 407         if (ctl == PU_CONTRAST_CONTROL)
 408                 port->ctl_contrast = val;
 409         else
 410         if (ctl == PU_HUE_CONTROL)
 411                 port->ctl_hue = val;
 412         else
 413         if (ctl == PU_SATURATION_CONTROL)
 414                 port->ctl_saturation = val;
 415         else
 416         if (ctl == PU_SHARPNESS_CONTROL)
 417                 port->ctl_sharpness = val;
 418 
 419         return ret;
 420 }
 421 
 422 int saa7164_api_set_videomux(struct saa7164_port *port)
 423 {
 424         struct saa7164_dev *dev = port->dev;
 425         u8 inputs[] = { 1, 2, 2, 2, 5, 5, 5 };
 426         int ret;
 427 
 428         dprintk(DBGLVL_ENC, "%s() v_mux=%d a_mux=%d\n",
 429                 __func__, port->mux_input, inputs[port->mux_input - 1]);
 430 
 431         /* Audio Mute */
 432         ret = saa7164_api_audio_mute(port, 1);
 433         if (ret != SAA_OK)
 434                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 435 
 436         /* Video Mux */
 437         ret = saa7164_cmd_send(port->dev, port->vidproc.sourceid, SET_CUR,
 438                 SU_INPUT_SELECT_CONTROL, sizeof(u8), &port->mux_input);
 439         if (ret != SAA_OK)
 440                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 441 
 442         /* Audio Mux */
 443         ret = saa7164_cmd_send(port->dev, port->audfeat.sourceid, SET_CUR,
 444                 SU_INPUT_SELECT_CONTROL, sizeof(u8),
 445                 &inputs[port->mux_input - 1]);
 446         if (ret != SAA_OK)
 447                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 448 
 449         /* Audio UnMute */
 450         ret = saa7164_api_audio_mute(port, 0);
 451         if (ret != SAA_OK)
 452                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 453 
 454         return ret;
 455 }
 456 
 457 int saa7164_api_audio_mute(struct saa7164_port *port, int mute)
 458 {
 459         struct saa7164_dev *dev = port->dev;
 460         u8 v = mute;
 461         int ret;
 462 
 463         dprintk(DBGLVL_API, "%s(%d)\n", __func__, mute);
 464 
 465         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR,
 466                 MUTE_CONTROL, sizeof(u8), &v);
 467         if (ret != SAA_OK)
 468                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 469 
 470         return ret;
 471 }
 472 
 473 /* 0 = silence, 0xff = full */
 474 int saa7164_api_set_audio_volume(struct saa7164_port *port, s8 level)
 475 {
 476         struct saa7164_dev *dev = port->dev;
 477         s16 v, min, max;
 478         int ret;
 479 
 480         dprintk(DBGLVL_API, "%s(%d)\n", __func__, level);
 481 
 482         /* Obtain the min/max ranges */
 483         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_MIN,
 484                 VOLUME_CONTROL, sizeof(u16), &min);
 485         if (ret != SAA_OK)
 486                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 487 
 488         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_MAX,
 489                 VOLUME_CONTROL, sizeof(u16), &max);
 490         if (ret != SAA_OK)
 491                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 492 
 493         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_CUR,
 494                 (0x01 << 8) | VOLUME_CONTROL, sizeof(u16), &v);
 495         if (ret != SAA_OK)
 496                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 497 
 498         dprintk(DBGLVL_API, "%s(%d) min=%d max=%d cur=%d\n", __func__,
 499                 level, min, max, v);
 500 
 501         v = level;
 502         if (v < min)
 503                 v = min;
 504         if (v > max)
 505                 v = max;
 506 
 507         /* Left */
 508         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR,
 509                 (0x01 << 8) | VOLUME_CONTROL, sizeof(s16), &v);
 510         if (ret != SAA_OK)
 511                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 512 
 513         /* Right */
 514         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR,
 515                 (0x02 << 8) | VOLUME_CONTROL, sizeof(s16), &v);
 516         if (ret != SAA_OK)
 517                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 518 
 519         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_CUR,
 520                 (0x01 << 8) | VOLUME_CONTROL, sizeof(u16), &v);
 521         if (ret != SAA_OK)
 522                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 523 
 524         dprintk(DBGLVL_API, "%s(%d) min=%d max=%d cur=%d\n", __func__,
 525                 level, min, max, v);
 526 
 527         return ret;
 528 }
 529 
 530 int saa7164_api_set_audio_std(struct saa7164_port *port)
 531 {
 532         struct saa7164_dev *dev = port->dev;
 533         struct tmComResAudioDefaults lvl;
 534         struct tmComResTunerStandard tvaudio;
 535         int ret;
 536 
 537         dprintk(DBGLVL_API, "%s()\n", __func__);
 538 
 539         /* Establish default levels */
 540         lvl.ucDecoderLevel = TMHW_LEV_ADJ_DECLEV_DEFAULT;
 541         lvl.ucDecoderFM_Level = TMHW_LEV_ADJ_DECLEV_DEFAULT;
 542         lvl.ucMonoLevel = TMHW_LEV_ADJ_MONOLEV_DEFAULT;
 543         lvl.ucNICAM_Level = TMHW_LEV_ADJ_NICLEV_DEFAULT;
 544         lvl.ucSAP_Level = TMHW_LEV_ADJ_SAPLEV_DEFAULT;
 545         lvl.ucADC_Level = TMHW_LEV_ADJ_ADCLEV_DEFAULT;
 546         ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR,
 547                 AUDIO_DEFAULT_CONTROL, sizeof(struct tmComResAudioDefaults),
 548                 &lvl);
 549         if (ret != SAA_OK)
 550                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 551 
 552         /* Manually select the appropriate TV audio standard */
 553         if (port->encodernorm.id & V4L2_STD_NTSC) {
 554                 tvaudio.std = TU_STANDARD_NTSC_M;
 555                 tvaudio.country = 1;
 556         } else {
 557                 tvaudio.std = TU_STANDARD_PAL_I;
 558                 tvaudio.country = 44;
 559         }
 560 
 561         ret = saa7164_cmd_send(port->dev, port->tunerunit.unitid, SET_CUR,
 562                 TU_STANDARD_CONTROL, sizeof(tvaudio), &tvaudio);
 563         if (ret != SAA_OK)
 564                 printk(KERN_ERR "%s() TU_STANDARD_CONTROL error, ret = 0x%x\n",
 565                         __func__, ret);
 566         return ret;
 567 }
 568 
 569 int saa7164_api_set_audio_detection(struct saa7164_port *port, int autodetect)
 570 {
 571         struct saa7164_dev *dev = port->dev;
 572         struct tmComResTunerStandardAuto p;
 573         int ret;
 574 
 575         dprintk(DBGLVL_API, "%s(%d)\n", __func__, autodetect);
 576 
 577         /* Disable TV Audio autodetect if not already set (buggy) */
 578         if (autodetect)
 579                 p.mode = TU_STANDARD_AUTO;
 580         else
 581                 p.mode = TU_STANDARD_MANUAL;
 582         ret = saa7164_cmd_send(port->dev, port->tunerunit.unitid, SET_CUR,
 583                 TU_STANDARD_AUTO_CONTROL, sizeof(p), &p);
 584         if (ret != SAA_OK)
 585                 printk(KERN_ERR
 586                         "%s() TU_STANDARD_AUTO_CONTROL error, ret = 0x%x\n",
 587                         __func__, ret);
 588 
 589         return ret;
 590 }
 591 
 592 int saa7164_api_get_videomux(struct saa7164_port *port)
 593 {
 594         struct saa7164_dev *dev = port->dev;
 595         int ret;
 596 
 597         ret = saa7164_cmd_send(port->dev, port->vidproc.sourceid, GET_CUR,
 598                 SU_INPUT_SELECT_CONTROL, sizeof(u8), &port->mux_input);
 599         if (ret != SAA_OK)
 600                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 601 
 602         dprintk(DBGLVL_ENC, "%s() v_mux=%d\n",
 603                 __func__, port->mux_input);
 604 
 605         return ret;
 606 }
 607 
 608 static int saa7164_api_set_dif(struct saa7164_port *port, u8 reg, u8 val)
 609 {
 610         struct saa7164_dev *dev = port->dev;
 611 
 612         u16 len = 0;
 613         u8 buf[256];
 614         int ret;
 615         u8 mas;
 616 
 617         dprintk(DBGLVL_API, "%s(nr=%d type=%d val=%x)\n", __func__,
 618                 port->nr, port->type, val);
 619 
 620         if (port->nr == 0)
 621                 mas = 0xd0;
 622         else
 623                 mas = 0xe0;
 624 
 625         memset(buf, 0, sizeof(buf));
 626 
 627         buf[0x00] = 0x04;
 628         buf[0x01] = 0x00;
 629         buf[0x02] = 0x00;
 630         buf[0x03] = 0x00;
 631 
 632         buf[0x04] = 0x04;
 633         buf[0x05] = 0x00;
 634         buf[0x06] = 0x00;
 635         buf[0x07] = 0x00;
 636 
 637         buf[0x08] = reg;
 638         buf[0x09] = 0x26;
 639         buf[0x0a] = mas;
 640         buf[0x0b] = 0xb0;
 641 
 642         buf[0x0c] = val;
 643         buf[0x0d] = 0x00;
 644         buf[0x0e] = 0x00;
 645         buf[0x0f] = 0x00;
 646 
 647         ret = saa7164_cmd_send(dev, port->ifunit.unitid, GET_LEN,
 648                 EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len);
 649         if (ret != SAA_OK) {
 650                 printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret);
 651                 return -EIO;
 652         }
 653 
 654         ret = saa7164_cmd_send(dev, port->ifunit.unitid, SET_CUR,
 655                 EXU_REGISTER_ACCESS_CONTROL, len, &buf);
 656         if (ret != SAA_OK)
 657                 printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret);
 658 #if 0
 659         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf, 16,
 660                        false);
 661 #endif
 662         return ret == SAA_OK ? 0 : -EIO;
 663 }
 664 
 665 /* Disable the IF block AGC controls */
 666 int saa7164_api_configure_dif(struct saa7164_port *port, u32 std)
 667 {
 668         struct saa7164_dev *dev = port->dev;
 669         u8 agc_disable;
 670 
 671         dprintk(DBGLVL_API, "%s(nr=%d, 0x%x)\n", __func__, port->nr, std);
 672 
 673         if (std & V4L2_STD_NTSC) {
 674                 dprintk(DBGLVL_API, " NTSC\n");
 675                 saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */
 676                 agc_disable = 0;
 677         } else if (std & V4L2_STD_PAL_I) {
 678                 dprintk(DBGLVL_API, " PAL-I\n");
 679                 saa7164_api_set_dif(port, 0x00, 0x08); /* Video Standard */
 680                 agc_disable = 0;
 681         } else if (std & V4L2_STD_PAL_M) {
 682                 dprintk(DBGLVL_API, " PAL-M\n");
 683                 saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */
 684                 agc_disable = 0;
 685         } else if (std & V4L2_STD_PAL_N) {
 686                 dprintk(DBGLVL_API, " PAL-N\n");
 687                 saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */
 688                 agc_disable = 0;
 689         } else if (std & V4L2_STD_PAL_Nc) {
 690                 dprintk(DBGLVL_API, " PAL-Nc\n");
 691                 saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */
 692                 agc_disable = 0;
 693         } else if (std & V4L2_STD_PAL_B) {
 694                 dprintk(DBGLVL_API, " PAL-B\n");
 695                 saa7164_api_set_dif(port, 0x00, 0x02); /* Video Standard */
 696                 agc_disable = 0;
 697         } else if (std & V4L2_STD_PAL_DK) {
 698                 dprintk(DBGLVL_API, " PAL-DK\n");
 699                 saa7164_api_set_dif(port, 0x00, 0x10); /* Video Standard */
 700                 agc_disable = 0;
 701         } else if (std & V4L2_STD_SECAM_L) {
 702                 dprintk(DBGLVL_API, " SECAM-L\n");
 703                 saa7164_api_set_dif(port, 0x00, 0x20); /* Video Standard */
 704                 agc_disable = 0;
 705         } else {
 706                 /* Unknown standard, assume DTV */
 707                 dprintk(DBGLVL_API, " Unknown (assuming DTV)\n");
 708                 /* Undefinded Video Standard */
 709                 saa7164_api_set_dif(port, 0x00, 0x80);
 710                 agc_disable = 1;
 711         }
 712 
 713         saa7164_api_set_dif(port, 0x48, 0xa0); /* AGC Functions 1 */
 714         saa7164_api_set_dif(port, 0xc0, agc_disable); /* AGC Output Disable */
 715         saa7164_api_set_dif(port, 0x7c, 0x04); /* CVBS EQ */
 716         saa7164_api_set_dif(port, 0x04, 0x01); /* Active */
 717         msleep(100);
 718         saa7164_api_set_dif(port, 0x04, 0x00); /* Active (again) */
 719         msleep(100);
 720 
 721         return 0;
 722 }
 723 
 724 /* Ensure the dif is in the correct state for the operating mode
 725  * (analog / dtv). We only configure the diff through the analog encoder
 726  * so when we're in digital mode we need to find the appropriate encoder
 727  * and use it to configure the DIF.
 728  */
 729 int saa7164_api_initialize_dif(struct saa7164_port *port)
 730 {
 731         struct saa7164_dev *dev = port->dev;
 732         struct saa7164_port *p = NULL;
 733         int ret = -EINVAL;
 734         u32 std = 0;
 735 
 736         dprintk(DBGLVL_API, "%s(nr=%d type=%d)\n", __func__,
 737                 port->nr, port->type);
 738 
 739         if (port->type == SAA7164_MPEG_ENCODER) {
 740                 /* Pick any analog standard to init the diff.
 741                  * we'll come back during encoder_init'
 742                  * and set the correct standard if required.
 743                  */
 744                 std = V4L2_STD_NTSC;
 745         } else
 746         if (port->type == SAA7164_MPEG_DVB) {
 747                 if (port->nr == SAA7164_PORT_TS1)
 748                         p = &dev->ports[SAA7164_PORT_ENC1];
 749                 else
 750                         p = &dev->ports[SAA7164_PORT_ENC2];
 751         } else
 752         if (port->type == SAA7164_MPEG_VBI) {
 753                 std = V4L2_STD_NTSC;
 754                 if (port->nr == SAA7164_PORT_VBI1)
 755                         p = &dev->ports[SAA7164_PORT_ENC1];
 756                 else
 757                         p = &dev->ports[SAA7164_PORT_ENC2];
 758         } else
 759                 BUG();
 760 
 761         if (p)
 762                 ret = saa7164_api_configure_dif(p, std);
 763 
 764         return ret;
 765 }
 766 
 767 int saa7164_api_transition_port(struct saa7164_port *port, u8 mode)
 768 {
 769         struct saa7164_dev *dev = port->dev;
 770 
 771         int ret;
 772 
 773         dprintk(DBGLVL_API, "%s(nr=%d unitid=0x%x,%d)\n",
 774                 __func__, port->nr, port->hwcfg.unitid, mode);
 775 
 776         ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, SET_CUR,
 777                 SAA_STATE_CONTROL, sizeof(mode), &mode);
 778         if (ret != SAA_OK)
 779                 printk(KERN_ERR "%s(portnr %d unitid 0x%x) error, ret = 0x%x\n",
 780                         __func__, port->nr, port->hwcfg.unitid, ret);
 781 
 782         return ret;
 783 }
 784 
 785 int saa7164_api_get_fw_version(struct saa7164_dev *dev, u32 *version)
 786 {
 787         int ret;
 788 
 789         ret = saa7164_cmd_send(dev, 0, GET_CUR,
 790                 GET_FW_VERSION_CONTROL, sizeof(u32), version);
 791         if (ret != SAA_OK)
 792                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
 793 
 794         return ret;
 795 }
 796 
 797 int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen)
 798 {
 799         u8 reg[] = { 0x0f, 0x00 };
 800 
 801         if (buflen < 128)
 802                 return -ENOMEM;
 803 
 804         /* Assumption: Hauppauge eeprom is at 0xa0 on on bus 0 */
 805         /* TODO: Pull the details from the boards struct */
 806         return saa7164_api_i2c_read(&dev->i2c_bus[0], 0xa0 >> 1, sizeof(reg),
 807                 &reg[0], 128, buf);
 808 }
 809 
 810 static int saa7164_api_configure_port_vbi(struct saa7164_dev *dev,
 811                                           struct saa7164_port *port)
 812 {
 813         struct tmComResVBIFormatDescrHeader *fmt = &port->vbi_fmt_ntsc;
 814 
 815         dprintk(DBGLVL_API, "    bFormatIndex  = 0x%x\n", fmt->bFormatIndex);
 816         dprintk(DBGLVL_API, "    VideoStandard = 0x%x\n", fmt->VideoStandard);
 817         dprintk(DBGLVL_API, "    StartLine     = %d\n", fmt->StartLine);
 818         dprintk(DBGLVL_API, "    EndLine       = %d\n", fmt->EndLine);
 819         dprintk(DBGLVL_API, "    FieldRate     = %d\n", fmt->FieldRate);
 820         dprintk(DBGLVL_API, "    bNumLines     = %d\n", fmt->bNumLines);
 821 
 822         /* Cache the hardware configuration in the port */
 823 
 824         port->bufcounter = port->hwcfg.BARLocation;
 825         port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32));
 826         port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32));
 827         port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32));
 828         port->bufptr32l = port->hwcfg.BARLocation +
 829                 (4 * sizeof(u32)) +
 830                 (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32);
 831         port->bufptr32h = port->hwcfg.BARLocation +
 832                 (4 * sizeof(u32)) +
 833                 (sizeof(u32) * port->hwcfg.buffercount);
 834         port->bufptr64 = port->hwcfg.BARLocation +
 835                 (4 * sizeof(u32)) +
 836                 (sizeof(u32) * port->hwcfg.buffercount);
 837         dprintk(DBGLVL_API, "   = port->hwcfg.BARLocation = 0x%x\n",
 838                 port->hwcfg.BARLocation);
 839 
 840         dprintk(DBGLVL_API, "   = VS_FORMAT_VBI (becomes dev->en[%d])\n",
 841                 port->nr);
 842 
 843         return 0;
 844 }
 845 
 846 static int
 847 saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,
 848                                    struct saa7164_port *port,
 849                                    struct tmComResTSFormatDescrHeader *tsfmt)
 850 {
 851         dprintk(DBGLVL_API, "    bFormatIndex = 0x%x\n", tsfmt->bFormatIndex);
 852         dprintk(DBGLVL_API, "    bDataOffset  = 0x%x\n", tsfmt->bDataOffset);
 853         dprintk(DBGLVL_API, "    bPacketLength= 0x%x\n", tsfmt->bPacketLength);
 854         dprintk(DBGLVL_API, "    bStrideLength= 0x%x\n", tsfmt->bStrideLength);
 855         dprintk(DBGLVL_API, "    bguid        = (....)\n");
 856 
 857         /* Cache the hardware configuration in the port */
 858 
 859         port->bufcounter = port->hwcfg.BARLocation;
 860         port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32));
 861         port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32));
 862         port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32));
 863         port->bufptr32l = port->hwcfg.BARLocation +
 864                 (4 * sizeof(u32)) +
 865                 (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32);
 866         port->bufptr32h = port->hwcfg.BARLocation +
 867                 (4 * sizeof(u32)) +
 868                 (sizeof(u32) * port->hwcfg.buffercount);
 869         port->bufptr64 = port->hwcfg.BARLocation +
 870                 (4 * sizeof(u32)) +
 871                 (sizeof(u32) * port->hwcfg.buffercount);
 872         dprintk(DBGLVL_API, "   = port->hwcfg.BARLocation = 0x%x\n",
 873                 port->hwcfg.BARLocation);
 874 
 875         dprintk(DBGLVL_API, "   = VS_FORMAT_MPEGTS (becomes dev->ts[%d])\n",
 876                 port->nr);
 877 
 878         return 0;
 879 }
 880 
 881 static int
 882 saa7164_api_configure_port_mpeg2ps(struct saa7164_dev *dev,
 883                                    struct saa7164_port *port,
 884                                    struct tmComResPSFormatDescrHeader *fmt)
 885 {
 886         dprintk(DBGLVL_API, "    bFormatIndex = 0x%x\n", fmt->bFormatIndex);
 887         dprintk(DBGLVL_API, "    wPacketLength= 0x%x\n", fmt->wPacketLength);
 888         dprintk(DBGLVL_API, "    wPackLength=   0x%x\n", fmt->wPackLength);
 889         dprintk(DBGLVL_API, "    bPackDataType= 0x%x\n", fmt->bPackDataType);
 890 
 891         /* Cache the hardware configuration in the port */
 892         /* TODO: CHECK THIS in the port config */
 893         port->bufcounter = port->hwcfg.BARLocation;
 894         port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32));
 895         port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32));
 896         port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32));
 897         port->bufptr32l = port->hwcfg.BARLocation +
 898                 (4 * sizeof(u32)) +
 899                 (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32);
 900         port->bufptr32h = port->hwcfg.BARLocation +
 901                 (4 * sizeof(u32)) +
 902                 (sizeof(u32) * port->hwcfg.buffercount);
 903         port->bufptr64 = port->hwcfg.BARLocation +
 904                 (4 * sizeof(u32)) +
 905                 (sizeof(u32) * port->hwcfg.buffercount);
 906         dprintk(DBGLVL_API, "   = port->hwcfg.BARLocation = 0x%x\n",
 907                 port->hwcfg.BARLocation);
 908 
 909         dprintk(DBGLVL_API, "   = VS_FORMAT_MPEGPS (becomes dev->enc[%d])\n",
 910                 port->nr);
 911 
 912         return 0;
 913 }
 914 
 915 static int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
 916 {
 917         struct saa7164_port *tsport = NULL;
 918         struct saa7164_port *encport = NULL;
 919         struct saa7164_port *vbiport = NULL;
 920         u32 idx, next_offset;
 921         int i;
 922         struct tmComResDescrHeader *hdr, *t;
 923         struct tmComResExtDevDescrHeader *exthdr;
 924         struct tmComResPathDescrHeader *pathhdr;
 925         struct tmComResAntTermDescrHeader *anttermhdr;
 926         struct tmComResTunerDescrHeader *tunerunithdr;
 927         struct tmComResDMATermDescrHeader *vcoutputtermhdr;
 928         struct tmComResTSFormatDescrHeader *tsfmt;
 929         struct tmComResPSFormatDescrHeader *psfmt;
 930         struct tmComResSelDescrHeader *psel;
 931         struct tmComResProcDescrHeader *pdh;
 932         struct tmComResAFeatureDescrHeader *afd;
 933         struct tmComResEncoderDescrHeader *edh;
 934         struct tmComResVBIFormatDescrHeader *vbifmt;
 935         u32 currpath = 0;
 936 
 937         dprintk(DBGLVL_API,
 938                 "%s(?,?,%d) sizeof(struct tmComResDescrHeader) = %d bytes\n",
 939                 __func__, len, (u32)sizeof(struct tmComResDescrHeader));
 940 
 941         for (idx = 0; idx < (len - sizeof(struct tmComResDescrHeader));) {
 942 
 943                 hdr = (struct tmComResDescrHeader *)(buf + idx);
 944 
 945                 if (hdr->type != CS_INTERFACE)
 946                         return SAA_ERR_NOT_SUPPORTED;
 947 
 948                 dprintk(DBGLVL_API, "@ 0x%x =\n", idx);
 949                 switch (hdr->subtype) {
 950                 case GENERAL_REQUEST:
 951                         dprintk(DBGLVL_API, " GENERAL_REQUEST\n");
 952                         break;
 953                 case VC_TUNER_PATH:
 954                         dprintk(DBGLVL_API, " VC_TUNER_PATH\n");
 955                         pathhdr = (struct tmComResPathDescrHeader *)(buf + idx);
 956                         dprintk(DBGLVL_API, "  pathid = 0x%x\n",
 957                                 pathhdr->pathid);
 958                         currpath = pathhdr->pathid;
 959                         break;
 960                 case VC_INPUT_TERMINAL:
 961                         dprintk(DBGLVL_API, " VC_INPUT_TERMINAL\n");
 962                         anttermhdr =
 963                                 (struct tmComResAntTermDescrHeader *)(buf + idx);
 964                         dprintk(DBGLVL_API, "  terminalid   = 0x%x\n",
 965                                 anttermhdr->terminalid);
 966                         dprintk(DBGLVL_API, "  terminaltype = 0x%x\n",
 967                                 anttermhdr->terminaltype);
 968                         switch (anttermhdr->terminaltype) {
 969                         case ITT_ANTENNA:
 970                                 dprintk(DBGLVL_API, "   = ITT_ANTENNA\n");
 971                                 break;
 972                         case LINE_CONNECTOR:
 973                                 dprintk(DBGLVL_API, "   = LINE_CONNECTOR\n");
 974                                 break;
 975                         case SPDIF_CONNECTOR:
 976                                 dprintk(DBGLVL_API, "   = SPDIF_CONNECTOR\n");
 977                                 break;
 978                         case COMPOSITE_CONNECTOR:
 979                                 dprintk(DBGLVL_API,
 980                                         "   = COMPOSITE_CONNECTOR\n");
 981                                 break;
 982                         case SVIDEO_CONNECTOR:
 983                                 dprintk(DBGLVL_API, "   = SVIDEO_CONNECTOR\n");
 984                                 break;
 985                         case COMPONENT_CONNECTOR:
 986                                 dprintk(DBGLVL_API,
 987                                         "   = COMPONENT_CONNECTOR\n");
 988                                 break;
 989                         case STANDARD_DMA:
 990                                 dprintk(DBGLVL_API, "   = STANDARD_DMA\n");
 991                                 break;
 992                         default:
 993                                 dprintk(DBGLVL_API, "   = undefined (0x%x)\n",
 994                                         anttermhdr->terminaltype);
 995                         }
 996                         dprintk(DBGLVL_API, "  assocterminal= 0x%x\n",
 997                                 anttermhdr->assocterminal);
 998                         dprintk(DBGLVL_API, "  iterminal    = 0x%x\n",
 999                                 anttermhdr->iterminal);
1000                         dprintk(DBGLVL_API, "  controlsize  = 0x%x\n",
1001                                 anttermhdr->controlsize);
1002                         break;
1003                 case VC_OUTPUT_TERMINAL:
1004                         dprintk(DBGLVL_API, " VC_OUTPUT_TERMINAL\n");
1005                         vcoutputtermhdr =
1006                                 (struct tmComResDMATermDescrHeader *)(buf + idx);
1007                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1008                                 vcoutputtermhdr->unitid);
1009                         dprintk(DBGLVL_API, "  terminaltype = 0x%x\n",
1010                                 vcoutputtermhdr->terminaltype);
1011                         switch (vcoutputtermhdr->terminaltype) {
1012                         case ITT_ANTENNA:
1013                                 dprintk(DBGLVL_API, "   = ITT_ANTENNA\n");
1014                                 break;
1015                         case LINE_CONNECTOR:
1016                                 dprintk(DBGLVL_API, "   = LINE_CONNECTOR\n");
1017                                 break;
1018                         case SPDIF_CONNECTOR:
1019                                 dprintk(DBGLVL_API, "   = SPDIF_CONNECTOR\n");
1020                                 break;
1021                         case COMPOSITE_CONNECTOR:
1022                                 dprintk(DBGLVL_API,
1023                                         "   = COMPOSITE_CONNECTOR\n");
1024                                 break;
1025                         case SVIDEO_CONNECTOR:
1026                                 dprintk(DBGLVL_API, "   = SVIDEO_CONNECTOR\n");
1027                                 break;
1028                         case COMPONENT_CONNECTOR:
1029                                 dprintk(DBGLVL_API,
1030                                         "   = COMPONENT_CONNECTOR\n");
1031                                 break;
1032                         case STANDARD_DMA:
1033                                 dprintk(DBGLVL_API, "   = STANDARD_DMA\n");
1034                                 break;
1035                         default:
1036                                 dprintk(DBGLVL_API, "   = undefined (0x%x)\n",
1037                                         vcoutputtermhdr->terminaltype);
1038                         }
1039                         dprintk(DBGLVL_API, "  assocterminal= 0x%x\n",
1040                                 vcoutputtermhdr->assocterminal);
1041                         dprintk(DBGLVL_API, "  sourceid     = 0x%x\n",
1042                                 vcoutputtermhdr->sourceid);
1043                         dprintk(DBGLVL_API, "  iterminal    = 0x%x\n",
1044                                 vcoutputtermhdr->iterminal);
1045                         dprintk(DBGLVL_API, "  BARLocation  = 0x%x\n",
1046                                 vcoutputtermhdr->BARLocation);
1047                         dprintk(DBGLVL_API, "  flags        = 0x%x\n",
1048                                 vcoutputtermhdr->flags);
1049                         dprintk(DBGLVL_API, "  interruptid  = 0x%x\n",
1050                                 vcoutputtermhdr->interruptid);
1051                         dprintk(DBGLVL_API, "  buffercount  = 0x%x\n",
1052                                 vcoutputtermhdr->buffercount);
1053                         dprintk(DBGLVL_API, "  metadatasize = 0x%x\n",
1054                                 vcoutputtermhdr->metadatasize);
1055                         dprintk(DBGLVL_API, "  controlsize  = 0x%x\n",
1056                                 vcoutputtermhdr->controlsize);
1057                         dprintk(DBGLVL_API, "  numformats   = 0x%x\n",
1058                                 vcoutputtermhdr->numformats);
1059 
1060                         t = (struct tmComResDescrHeader *)
1061                                 ((struct tmComResDMATermDescrHeader *)(buf + idx));
1062                         next_offset = idx + (vcoutputtermhdr->len);
1063                         for (i = 0; i < vcoutputtermhdr->numformats; i++) {
1064                                 t = (struct tmComResDescrHeader *)
1065                                         (buf + next_offset);
1066                                 switch (t->subtype) {
1067                                 case VS_FORMAT_MPEG2TS:
1068                                         tsfmt =
1069                                         (struct tmComResTSFormatDescrHeader *)t;
1070                                         if (currpath == 1)
1071                                                 tsport = &dev->ports[SAA7164_PORT_TS1];
1072                                         else
1073                                                 tsport = &dev->ports[SAA7164_PORT_TS2];
1074                                         memcpy(&tsport->hwcfg, vcoutputtermhdr,
1075                                                 sizeof(*vcoutputtermhdr));
1076                                         saa7164_api_configure_port_mpeg2ts(dev,
1077                                                 tsport, tsfmt);
1078                                         break;
1079                                 case VS_FORMAT_MPEG2PS:
1080                                         psfmt =
1081                                         (struct tmComResPSFormatDescrHeader *)t;
1082                                         if (currpath == 1)
1083                                                 encport = &dev->ports[SAA7164_PORT_ENC1];
1084                                         else
1085                                                 encport = &dev->ports[SAA7164_PORT_ENC2];
1086                                         memcpy(&encport->hwcfg, vcoutputtermhdr,
1087                                                 sizeof(*vcoutputtermhdr));
1088                                         saa7164_api_configure_port_mpeg2ps(dev,
1089                                                 encport, psfmt);
1090                                         break;
1091                                 case VS_FORMAT_VBI:
1092                                         vbifmt =
1093                                         (struct tmComResVBIFormatDescrHeader *)t;
1094                                         if (currpath == 1)
1095                                                 vbiport = &dev->ports[SAA7164_PORT_VBI1];
1096                                         else
1097                                                 vbiport = &dev->ports[SAA7164_PORT_VBI2];
1098                                         memcpy(&vbiport->hwcfg, vcoutputtermhdr,
1099                                                 sizeof(*vcoutputtermhdr));
1100                                         memcpy(&vbiport->vbi_fmt_ntsc, vbifmt,
1101                                                 sizeof(*vbifmt));
1102                                         saa7164_api_configure_port_vbi(dev,
1103                                                 vbiport);
1104                                         break;
1105                                 case VS_FORMAT_RDS:
1106                                         dprintk(DBGLVL_API,
1107                                                 "   = VS_FORMAT_RDS\n");
1108                                         break;
1109                                 case VS_FORMAT_UNCOMPRESSED:
1110                                         dprintk(DBGLVL_API,
1111                                         "   = VS_FORMAT_UNCOMPRESSED\n");
1112                                         break;
1113                                 case VS_FORMAT_TYPE:
1114                                         dprintk(DBGLVL_API,
1115                                                 "   = VS_FORMAT_TYPE\n");
1116                                         break;
1117                                 default:
1118                                         dprintk(DBGLVL_API,
1119                                                 "   = undefined (0x%x)\n",
1120                                                 t->subtype);
1121                                 }
1122                                 next_offset += t->len;
1123                         }
1124 
1125                         break;
1126                 case TUNER_UNIT:
1127                         dprintk(DBGLVL_API, " TUNER_UNIT\n");
1128                         tunerunithdr =
1129                                 (struct tmComResTunerDescrHeader *)(buf + idx);
1130                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1131                                 tunerunithdr->unitid);
1132                         dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
1133                                 tunerunithdr->sourceid);
1134                         dprintk(DBGLVL_API, "  iunit = 0x%x\n",
1135                                 tunerunithdr->iunit);
1136                         dprintk(DBGLVL_API, "  tuningstandards = 0x%x\n",
1137                                 tunerunithdr->tuningstandards);
1138                         dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
1139                                 tunerunithdr->controlsize);
1140                         dprintk(DBGLVL_API, "  controls = 0x%x\n",
1141                                 tunerunithdr->controls);
1142 
1143                         if (tunerunithdr->unitid == tunerunithdr->iunit) {
1144                                 if (currpath == 1)
1145                                         encport = &dev->ports[SAA7164_PORT_ENC1];
1146                                 else
1147                                         encport = &dev->ports[SAA7164_PORT_ENC2];
1148                                 memcpy(&encport->tunerunit, tunerunithdr,
1149                                         sizeof(struct tmComResTunerDescrHeader));
1150                                 dprintk(DBGLVL_API,
1151                                         "  (becomes dev->enc[%d] tuner)\n",
1152                                         encport->nr);
1153                         }
1154                         break;
1155                 case VC_SELECTOR_UNIT:
1156                         psel = (struct tmComResSelDescrHeader *)(buf + idx);
1157                         dprintk(DBGLVL_API, " VC_SELECTOR_UNIT\n");
1158                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1159                                 psel->unitid);
1160                         dprintk(DBGLVL_API, "  nrinpins = 0x%x\n",
1161                                 psel->nrinpins);
1162                         dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
1163                                 psel->sourceid);
1164                         break;
1165                 case VC_PROCESSING_UNIT:
1166                         pdh = (struct tmComResProcDescrHeader *)(buf + idx);
1167                         dprintk(DBGLVL_API, " VC_PROCESSING_UNIT\n");
1168                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1169                                 pdh->unitid);
1170                         dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
1171                                 pdh->sourceid);
1172                         dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
1173                                 pdh->controlsize);
1174                         if (pdh->controlsize == 0x04) {
1175                                 if (currpath == 1)
1176                                         encport = &dev->ports[SAA7164_PORT_ENC1];
1177                                 else
1178                                         encport = &dev->ports[SAA7164_PORT_ENC2];
1179                                 memcpy(&encport->vidproc, pdh,
1180                                         sizeof(struct tmComResProcDescrHeader));
1181                                 dprintk(DBGLVL_API, "  (becomes dev->enc[%d])\n",
1182                                         encport->nr);
1183                         }
1184                         break;
1185                 case FEATURE_UNIT:
1186                         afd = (struct tmComResAFeatureDescrHeader *)(buf + idx);
1187                         dprintk(DBGLVL_API, " FEATURE_UNIT\n");
1188                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1189                                 afd->unitid);
1190                         dprintk(DBGLVL_API, "  sourceid = 0x%x\n",
1191                                 afd->sourceid);
1192                         dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
1193                                 afd->controlsize);
1194                         if (currpath == 1)
1195                                 encport = &dev->ports[SAA7164_PORT_ENC1];
1196                         else
1197                                 encport = &dev->ports[SAA7164_PORT_ENC2];
1198                         memcpy(&encport->audfeat, afd,
1199                                 sizeof(struct tmComResAFeatureDescrHeader));
1200                         dprintk(DBGLVL_API, "  (becomes dev->enc[%d])\n",
1201                                 encport->nr);
1202                         break;
1203                 case ENCODER_UNIT:
1204                         edh = (struct tmComResEncoderDescrHeader *)(buf + idx);
1205                         dprintk(DBGLVL_API, " ENCODER_UNIT\n");
1206                         dprintk(DBGLVL_API, "  subtype = 0x%x\n", edh->subtype);
1207                         dprintk(DBGLVL_API, "  unitid = 0x%x\n", edh->unitid);
1208                         dprintk(DBGLVL_API, "  vsourceid = 0x%x\n",
1209                         edh->vsourceid);
1210                         dprintk(DBGLVL_API, "  asourceid = 0x%x\n",
1211                                 edh->asourceid);
1212                         dprintk(DBGLVL_API, "  iunit = 0x%x\n", edh->iunit);
1213                         if (edh->iunit == edh->unitid) {
1214                                 if (currpath == 1)
1215                                         encport = &dev->ports[SAA7164_PORT_ENC1];
1216                                 else
1217                                         encport = &dev->ports[SAA7164_PORT_ENC2];
1218                                 memcpy(&encport->encunit, edh,
1219                                         sizeof(struct tmComResEncoderDescrHeader));
1220                                 dprintk(DBGLVL_API,
1221                                         "  (becomes dev->enc[%d])\n",
1222                                         encport->nr);
1223                         }
1224                         break;
1225                 case EXTENSION_UNIT:
1226                         dprintk(DBGLVL_API, " EXTENSION_UNIT\n");
1227                         exthdr = (struct tmComResExtDevDescrHeader *)(buf + idx);
1228                         dprintk(DBGLVL_API, "  unitid = 0x%x\n",
1229                                 exthdr->unitid);
1230                         dprintk(DBGLVL_API, "  deviceid = 0x%x\n",
1231                                 exthdr->deviceid);
1232                         dprintk(DBGLVL_API, "  devicetype = 0x%x\n",
1233                                 exthdr->devicetype);
1234                         if (exthdr->devicetype & 0x1)
1235                                 dprintk(DBGLVL_API, "   = Decoder Device\n");
1236                         if (exthdr->devicetype & 0x2)
1237                                 dprintk(DBGLVL_API, "   = GPIO Source\n");
1238                         if (exthdr->devicetype & 0x4)
1239                                 dprintk(DBGLVL_API, "   = Video Decoder\n");
1240                         if (exthdr->devicetype & 0x8)
1241                                 dprintk(DBGLVL_API, "   = Audio Decoder\n");
1242                         if (exthdr->devicetype & 0x20)
1243                                 dprintk(DBGLVL_API, "   = Crossbar\n");
1244                         if (exthdr->devicetype & 0x40)
1245                                 dprintk(DBGLVL_API, "   = Tuner\n");
1246                         if (exthdr->devicetype & 0x80)
1247                                 dprintk(DBGLVL_API, "   = IF PLL\n");
1248                         if (exthdr->devicetype & 0x100)
1249                                 dprintk(DBGLVL_API, "   = Demodulator\n");
1250                         if (exthdr->devicetype & 0x200)
1251                                 dprintk(DBGLVL_API, "   = RDS Decoder\n");
1252                         if (exthdr->devicetype & 0x400)
1253                                 dprintk(DBGLVL_API, "   = Encoder\n");
1254                         if (exthdr->devicetype & 0x800)
1255                                 dprintk(DBGLVL_API, "   = IR Decoder\n");
1256                         if (exthdr->devicetype & 0x1000)
1257                                 dprintk(DBGLVL_API, "   = EEPROM\n");
1258                         if (exthdr->devicetype & 0x2000)
1259                                 dprintk(DBGLVL_API,
1260                                         "   = VBI Decoder\n");
1261                         if (exthdr->devicetype & 0x10000)
1262                                 dprintk(DBGLVL_API,
1263                                         "   = Streaming Device\n");
1264                         if (exthdr->devicetype & 0x20000)
1265                                 dprintk(DBGLVL_API,
1266                                         "   = DRM Device\n");
1267                         if (exthdr->devicetype & 0x40000000)
1268                                 dprintk(DBGLVL_API,
1269                                         "   = Generic Device\n");
1270                         if (exthdr->devicetype & 0x80000000)
1271                                 dprintk(DBGLVL_API,
1272                                         "   = Config Space Device\n");
1273                         dprintk(DBGLVL_API, "  numgpiopins = 0x%x\n",
1274                                 exthdr->numgpiopins);
1275                         dprintk(DBGLVL_API, "  numgpiogroups = 0x%x\n",
1276                                 exthdr->numgpiogroups);
1277                         dprintk(DBGLVL_API, "  controlsize = 0x%x\n",
1278                                 exthdr->controlsize);
1279                         if (exthdr->devicetype & 0x80) {
1280                                 if (currpath == 1)
1281                                         encport = &dev->ports[SAA7164_PORT_ENC1];
1282                                 else
1283                                         encport = &dev->ports[SAA7164_PORT_ENC2];
1284                                 memcpy(&encport->ifunit, exthdr,
1285                                         sizeof(struct tmComResExtDevDescrHeader));
1286                                 dprintk(DBGLVL_API,
1287                                         "  (becomes dev->enc[%d])\n",
1288                                         encport->nr);
1289                         }
1290                         break;
1291                 case PVC_INFRARED_UNIT:
1292                         dprintk(DBGLVL_API, " PVC_INFRARED_UNIT\n");
1293                         break;
1294                 case DRM_UNIT:
1295                         dprintk(DBGLVL_API, " DRM_UNIT\n");
1296                         break;
1297                 default:
1298                         dprintk(DBGLVL_API, "default %d\n", hdr->subtype);
1299                 }
1300 
1301                 dprintk(DBGLVL_API, " 1.%x\n", hdr->len);
1302                 dprintk(DBGLVL_API, " 2.%x\n", hdr->type);
1303                 dprintk(DBGLVL_API, " 3.%x\n", hdr->subtype);
1304                 dprintk(DBGLVL_API, " 4.%x\n", hdr->unitid);
1305 
1306                 idx += hdr->len;
1307         }
1308 
1309         return 0;
1310 }
1311 
1312 int saa7164_api_enum_subdevs(struct saa7164_dev *dev)
1313 {
1314         int ret;
1315         u32 buflen = 0;
1316         u8 *buf;
1317 
1318         dprintk(DBGLVL_API, "%s()\n", __func__);
1319 
1320         /* Get the total descriptor length */
1321         ret = saa7164_cmd_send(dev, 0, GET_LEN,
1322                 GET_DESCRIPTORS_CONTROL, sizeof(buflen), &buflen);
1323         if (ret != SAA_OK)
1324                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
1325 
1326         dprintk(DBGLVL_API, "%s() total descriptor size = %d bytes.\n",
1327                 __func__, buflen);
1328 
1329         /* Allocate enough storage for all of the descs */
1330         buf = kzalloc(buflen, GFP_KERNEL);
1331         if (!buf)
1332                 return SAA_ERR_NO_RESOURCES;
1333 
1334         /* Retrieve them */
1335         ret = saa7164_cmd_send(dev, 0, GET_CUR,
1336                 GET_DESCRIPTORS_CONTROL, buflen, buf);
1337         if (ret != SAA_OK) {
1338                 printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret);
1339                 goto out;
1340         }
1341 
1342         if (saa_debug & DBGLVL_API)
1343                 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf,
1344                                buflen & ~15, false);
1345 
1346         saa7164_api_dump_subdevs(dev, buf, buflen);
1347 
1348 out:
1349         kfree(buf);
1350         return ret;
1351 }
1352 
1353 int saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg,
1354         u32 datalen, u8 *data)
1355 {
1356         struct saa7164_dev *dev = bus->dev;
1357         u16 len = 0;
1358         int unitid;
1359         u8 buf[256];
1360         int ret;
1361 
1362         dprintk(DBGLVL_API, "%s() addr=%x reglen=%d datalen=%d\n",
1363                 __func__, addr, reglen, datalen);
1364 
1365         if (reglen > 4)
1366                 return -EIO;
1367 
1368         /* Prepare the send buffer */
1369         /* Bytes 00-03 source register length
1370          *       04-07 source bytes to read
1371          *       08... register address
1372          */
1373         memset(buf, 0, sizeof(buf));
1374         memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen);
1375         *((u32 *)(buf + 0 * sizeof(u32))) = reglen;
1376         *((u32 *)(buf + 1 * sizeof(u32))) = datalen;
1377 
1378         unitid = saa7164_i2caddr_to_unitid(bus, addr);
1379         if (unitid < 0) {
1380                 printk(KERN_ERR
1381                         "%s() error, cannot translate regaddr 0x%x to unitid\n",
1382                         __func__, addr);
1383                 return -EIO;
1384         }
1385 
1386         ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN,
1387                 EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len);
1388         if (ret != SAA_OK) {
1389                 printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret);
1390                 return -EIO;
1391         }
1392 
1393         dprintk(DBGLVL_API, "%s() len = %d bytes\n", __func__, len);
1394 
1395         if (saa_debug & DBGLVL_I2C)
1396                 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf,
1397                                32, false);
1398 
1399         ret = saa7164_cmd_send(bus->dev, unitid, GET_CUR,
1400                 EXU_REGISTER_ACCESS_CONTROL, len, &buf);
1401         if (ret != SAA_OK)
1402                 printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret);
1403         else {
1404                 if (saa_debug & DBGLVL_I2C)
1405                         print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
1406                                        buf, sizeof(buf), false);
1407                 memcpy(data, (buf + 2 * sizeof(u32) + reglen), datalen);
1408         }
1409 
1410         return ret == SAA_OK ? 0 : -EIO;
1411 }
1412 
1413 /* For a given 8 bit i2c address device, write the buffer */
1414 int saa7164_api_i2c_write(struct saa7164_i2c *bus, u8 addr, u32 datalen,
1415         u8 *data)
1416 {
1417         struct saa7164_dev *dev = bus->dev;
1418         u16 len = 0;
1419         int unitid;
1420         int reglen;
1421         u8 buf[256];
1422         int ret;
1423 
1424         dprintk(DBGLVL_API, "%s() addr=0x%2x len=0x%x\n",
1425                 __func__, addr, datalen);
1426 
1427         if ((datalen == 0) || (datalen > 232))
1428                 return -EIO;
1429 
1430         memset(buf, 0, sizeof(buf));
1431 
1432         unitid = saa7164_i2caddr_to_unitid(bus, addr);
1433         if (unitid < 0) {
1434                 printk(KERN_ERR
1435                         "%s() error, cannot translate regaddr 0x%x to unitid\n",
1436                         __func__, addr);
1437                 return -EIO;
1438         }
1439 
1440         reglen = saa7164_i2caddr_to_reglen(bus, addr);
1441         if (reglen < 0) {
1442                 printk(KERN_ERR
1443                         "%s() error, cannot translate regaddr to reglen\n",
1444                         __func__);
1445                 return -EIO;
1446         }
1447 
1448         ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN,
1449                 EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len);
1450         if (ret != SAA_OK) {
1451                 printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret);
1452                 return -EIO;
1453         }
1454 
1455         dprintk(DBGLVL_API, "%s() len = %d bytes unitid=0x%x\n", __func__,
1456                 len, unitid);
1457 
1458         /* Prepare the send buffer */
1459         /* Bytes 00-03 dest register length
1460          *       04-07 dest bytes to write
1461          *       08... register address
1462          */
1463         *((u32 *)(buf + 0 * sizeof(u32))) = reglen;
1464         *((u32 *)(buf + 1 * sizeof(u32))) = datalen - reglen;
1465         memcpy((buf + 2 * sizeof(u32)), data, datalen);
1466 
1467         if (saa_debug & DBGLVL_I2C)
1468                 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
1469                                buf, sizeof(buf), false);
1470 
1471         ret = saa7164_cmd_send(bus->dev, unitid, SET_CUR,
1472                 EXU_REGISTER_ACCESS_CONTROL, len, &buf);
1473         if (ret != SAA_OK)
1474                 printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret);
1475 
1476         return ret == SAA_OK ? 0 : -EIO;
1477 }
1478 
1479 static int saa7164_api_modify_gpio(struct saa7164_dev *dev, u8 unitid,
1480         u8 pin, u8 state)
1481 {
1482         int ret;
1483         struct tmComResGPIO t;
1484 
1485         dprintk(DBGLVL_API, "%s(0x%x, %d, %d)\n",
1486                 __func__, unitid, pin, state);
1487 
1488         if ((pin > 7) || (state > 2))
1489                 return SAA_ERR_BAD_PARAMETER;
1490 
1491         t.pin = pin;
1492         t.state = state;
1493 
1494         ret = saa7164_cmd_send(dev, unitid, SET_CUR,
1495                 EXU_GPIO_CONTROL, sizeof(t), &t);
1496         if (ret != SAA_OK)
1497                 printk(KERN_ERR "%s() error, ret = 0x%x\n",
1498                         __func__, ret);
1499 
1500         return ret;
1501 }
1502 
1503 int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid,
1504         u8 pin)
1505 {
1506         return saa7164_api_modify_gpio(dev, unitid, pin, 1);
1507 }
1508 
1509 int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid,
1510         u8 pin)
1511 {
1512         return saa7164_api_modify_gpio(dev, unitid, pin, 0);
1513 }
1514 

/* [<][>][^][v][top][bottom][index][help] */