162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for the NXP SAA7164 PCIe bridge 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/wait.h> 962306a36Sopenharmony_ci#include <linux/slab.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "saa7164.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciint saa7164_api_get_load_info(struct saa7164_dev *dev, struct tmFwInfoStruct *i) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci int ret; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci if (!(saa_debug & DBGLVL_CPU)) 1862306a36Sopenharmony_ci return 0; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s()\n", __func__); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci i->deviceinst = 0; 2362306a36Sopenharmony_ci i->devicespec = 0; 2462306a36Sopenharmony_ci i->mode = 0; 2562306a36Sopenharmony_ci i->status = 0; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_CUR, 2862306a36Sopenharmony_ci GET_FW_STATUS_CONTROL, sizeof(struct tmFwInfoStruct), i); 2962306a36Sopenharmony_ci if (ret != SAA_OK) 3062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci printk(KERN_INFO "saa7164[%d]-CPU: %d percent", dev->nr, i->CPULoad); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return ret; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciint saa7164_api_collect_debug(struct saa7164_dev *dev) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci struct tmComResDebugGetData d; 4062306a36Sopenharmony_ci u8 more = 255; 4162306a36Sopenharmony_ci int ret; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s()\n", __func__); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci while (more--) { 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci memset(&d, 0, sizeof(d)); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_CUR, 5062306a36Sopenharmony_ci GET_DEBUG_DATA_CONTROL, sizeof(d), &d); 5162306a36Sopenharmony_ci if (ret != SAA_OK) 5262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", 5362306a36Sopenharmony_ci __func__, ret); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci if (d.dwResult != SAA_OK) 5662306a36Sopenharmony_ci break; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci printk(KERN_INFO "saa7164[%d]-FWMSG: %s", dev->nr, 5962306a36Sopenharmony_ci d.ucDebugData); 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci return 0; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciint saa7164_api_set_debug(struct saa7164_dev *dev, u8 level) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci struct tmComResDebugSetLevel lvl; 6862306a36Sopenharmony_ci int ret; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(level=%d)\n", __func__, level); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* Retrieve current state */ 7362306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_CUR, 7462306a36Sopenharmony_ci SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl); 7562306a36Sopenharmony_ci if (ret != SAA_OK) 7662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() Was %d\n", __func__, lvl.dwDebugLevel); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci lvl.dwDebugLevel = level; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* set new state */ 8362306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, SET_CUR, 8462306a36Sopenharmony_ci SET_DEBUG_LEVEL_CONTROL, sizeof(lvl), &lvl); 8562306a36Sopenharmony_ci if (ret != SAA_OK) 8662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci return ret; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciint saa7164_api_set_vbi_format(struct saa7164_port *port) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 9462306a36Sopenharmony_ci struct tmComResProbeCommit fmt, rsp; 9562306a36Sopenharmony_ci int ret; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d, unitid=0x%x)\n", __func__, 9862306a36Sopenharmony_ci port->nr, port->hwcfg.unitid); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci fmt.bmHint = 0; 10162306a36Sopenharmony_ci fmt.bFormatIndex = 1; 10262306a36Sopenharmony_ci fmt.bFrameIndex = 1; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci /* Probe, see if it can support this format */ 10562306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, 10662306a36Sopenharmony_ci SET_CUR, SAA_PROBE_CONTROL, sizeof(fmt), &fmt); 10762306a36Sopenharmony_ci if (ret != SAA_OK) 10862306a36Sopenharmony_ci printk(KERN_ERR "%s() set error, ret = 0x%x\n", __func__, ret); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci /* See of the format change was successful */ 11162306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, 11262306a36Sopenharmony_ci GET_CUR, SAA_PROBE_CONTROL, sizeof(rsp), &rsp); 11362306a36Sopenharmony_ci if (ret != SAA_OK) { 11462306a36Sopenharmony_ci printk(KERN_ERR "%s() get error, ret = 0x%x\n", __func__, ret); 11562306a36Sopenharmony_ci } else { 11662306a36Sopenharmony_ci /* Compare requested vs received, should be same */ 11762306a36Sopenharmony_ci if (memcmp(&fmt, &rsp, sizeof(rsp)) == 0) { 11862306a36Sopenharmony_ci dprintk(DBGLVL_API, "SET/PROBE Verified\n"); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci /* Ask the device to select the negotiated format */ 12162306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, 12262306a36Sopenharmony_ci SET_CUR, SAA_COMMIT_CONTROL, sizeof(fmt), &fmt); 12362306a36Sopenharmony_ci if (ret != SAA_OK) 12462306a36Sopenharmony_ci printk(KERN_ERR "%s() commit error, ret = 0x%x\n", 12562306a36Sopenharmony_ci __func__, ret); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, 12862306a36Sopenharmony_ci GET_CUR, SAA_COMMIT_CONTROL, sizeof(rsp), &rsp); 12962306a36Sopenharmony_ci if (ret != SAA_OK) 13062306a36Sopenharmony_ci printk(KERN_ERR "%s() GET commit error, ret = 0x%x\n", 13162306a36Sopenharmony_ci __func__, ret); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci if (memcmp(&fmt, &rsp, sizeof(rsp)) != 0) { 13462306a36Sopenharmony_ci printk(KERN_ERR "%s() memcmp error, ret = 0x%x\n", 13562306a36Sopenharmony_ci __func__, ret); 13662306a36Sopenharmony_ci } else 13762306a36Sopenharmony_ci dprintk(DBGLVL_API, "SET/COMMIT Verified\n"); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci dprintk(DBGLVL_API, "rsp.bmHint = 0x%x\n", rsp.bmHint); 14062306a36Sopenharmony_ci dprintk(DBGLVL_API, "rsp.bFormatIndex = 0x%x\n", 14162306a36Sopenharmony_ci rsp.bFormatIndex); 14262306a36Sopenharmony_ci dprintk(DBGLVL_API, "rsp.bFrameIndex = 0x%x\n", 14362306a36Sopenharmony_ci rsp.bFrameIndex); 14462306a36Sopenharmony_ci } else 14562306a36Sopenharmony_ci printk(KERN_ERR "%s() compare failed\n", __func__); 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci if (ret == SAA_OK) 14962306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d) Success\n", __func__, port->nr); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci return ret; 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic int saa7164_api_set_gop_size(struct saa7164_port *port) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 15762306a36Sopenharmony_ci struct tmComResEncVideoGopStructure gs; 15862306a36Sopenharmony_ci int ret; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s()\n", __func__); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci gs.ucRefFrameDist = port->encoder_params.refdist; 16362306a36Sopenharmony_ci gs.ucGOPSize = port->encoder_params.gop_size; 16462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 16562306a36Sopenharmony_ci EU_VIDEO_GOP_STRUCTURE_CONTROL, 16662306a36Sopenharmony_ci sizeof(gs), &gs); 16762306a36Sopenharmony_ci if (ret != SAA_OK) 16862306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci return ret; 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ciint saa7164_api_set_encoder(struct saa7164_port *port) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 17662306a36Sopenharmony_ci struct tmComResEncVideoBitRate vb; 17762306a36Sopenharmony_ci struct tmComResEncAudioBitRate ab; 17862306a36Sopenharmony_ci int ret; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() unitid=0x%x\n", __func__, 18162306a36Sopenharmony_ci port->hwcfg.sourceid); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci if (port->encoder_params.stream_type == V4L2_MPEG_STREAM_TYPE_MPEG2_PS) 18462306a36Sopenharmony_ci port->encoder_profile = EU_PROFILE_PS_DVD; 18562306a36Sopenharmony_ci else 18662306a36Sopenharmony_ci port->encoder_profile = EU_PROFILE_TS_HQ; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 18962306a36Sopenharmony_ci EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile); 19062306a36Sopenharmony_ci if (ret != SAA_OK) 19162306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci /* Resolution */ 19462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 19562306a36Sopenharmony_ci EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile); 19662306a36Sopenharmony_ci if (ret != SAA_OK) 19762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci /* Establish video bitrates */ 20062306a36Sopenharmony_ci if (port->encoder_params.bitrate_mode == 20162306a36Sopenharmony_ci V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) 20262306a36Sopenharmony_ci vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_CONSTANT; 20362306a36Sopenharmony_ci else 20462306a36Sopenharmony_ci vb.ucVideoBitRateMode = EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK; 20562306a36Sopenharmony_ci vb.dwVideoBitRate = port->encoder_params.bitrate; 20662306a36Sopenharmony_ci vb.dwVideoBitRatePeak = port->encoder_params.bitrate_peak; 20762306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 20862306a36Sopenharmony_ci EU_VIDEO_BIT_RATE_CONTROL, 20962306a36Sopenharmony_ci sizeof(struct tmComResEncVideoBitRate), 21062306a36Sopenharmony_ci &vb); 21162306a36Sopenharmony_ci if (ret != SAA_OK) 21262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci /* Establish audio bitrates */ 21562306a36Sopenharmony_ci ab.ucAudioBitRateMode = 0; 21662306a36Sopenharmony_ci ab.dwAudioBitRate = 384000; 21762306a36Sopenharmony_ci ab.dwAudioBitRatePeak = ab.dwAudioBitRate; 21862306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 21962306a36Sopenharmony_ci EU_AUDIO_BIT_RATE_CONTROL, 22062306a36Sopenharmony_ci sizeof(struct tmComResEncAudioBitRate), 22162306a36Sopenharmony_ci &ab); 22262306a36Sopenharmony_ci if (ret != SAA_OK) 22362306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, 22462306a36Sopenharmony_ci ret); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci saa7164_api_set_aspect_ratio(port); 22762306a36Sopenharmony_ci saa7164_api_set_gop_size(port); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci return ret; 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ciint saa7164_api_get_encoder(struct saa7164_port *port) 23362306a36Sopenharmony_ci{ 23462306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 23562306a36Sopenharmony_ci struct tmComResEncVideoBitRate v; 23662306a36Sopenharmony_ci struct tmComResEncAudioBitRate a; 23762306a36Sopenharmony_ci struct tmComResEncVideoInputAspectRatio ar; 23862306a36Sopenharmony_ci int ret; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() unitid=0x%x\n", __func__, 24162306a36Sopenharmony_ci port->hwcfg.sourceid); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci port->encoder_profile = 0; 24462306a36Sopenharmony_ci port->video_format = 0; 24562306a36Sopenharmony_ci port->video_resolution = 0; 24662306a36Sopenharmony_ci port->audio_format = 0; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 24962306a36Sopenharmony_ci EU_PROFILE_CONTROL, sizeof(u8), &port->encoder_profile); 25062306a36Sopenharmony_ci if (ret != SAA_OK) 25162306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 25462306a36Sopenharmony_ci EU_VIDEO_RESOLUTION_CONTROL, sizeof(u8), 25562306a36Sopenharmony_ci &port->video_resolution); 25662306a36Sopenharmony_ci if (ret != SAA_OK) 25762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 26062306a36Sopenharmony_ci EU_VIDEO_FORMAT_CONTROL, sizeof(u8), &port->video_format); 26162306a36Sopenharmony_ci if (ret != SAA_OK) 26262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 26562306a36Sopenharmony_ci EU_VIDEO_BIT_RATE_CONTROL, sizeof(v), &v); 26662306a36Sopenharmony_ci if (ret != SAA_OK) 26762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 27062306a36Sopenharmony_ci EU_AUDIO_FORMAT_CONTROL, sizeof(u8), &port->audio_format); 27162306a36Sopenharmony_ci if (ret != SAA_OK) 27262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 27562306a36Sopenharmony_ci EU_AUDIO_BIT_RATE_CONTROL, sizeof(a), &a); 27662306a36Sopenharmony_ci if (ret != SAA_OK) 27762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci /* Aspect Ratio */ 28062306a36Sopenharmony_ci ar.width = 0; 28162306a36Sopenharmony_ci ar.height = 0; 28262306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, GET_CUR, 28362306a36Sopenharmony_ci EU_VIDEO_INPUT_ASPECT_CONTROL, 28462306a36Sopenharmony_ci sizeof(struct tmComResEncVideoInputAspectRatio), &ar); 28562306a36Sopenharmony_ci if (ret != SAA_OK) 28662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "encoder_profile = %d\n", port->encoder_profile); 28962306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "video_format = %d\n", port->video_format); 29062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "audio_format = %d\n", port->audio_format); 29162306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "video_resolution= %d\n", port->video_resolution); 29262306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "v.ucVideoBitRateMode = %d\n", 29362306a36Sopenharmony_ci v.ucVideoBitRateMode); 29462306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "v.dwVideoBitRate = %d\n", 29562306a36Sopenharmony_ci v.dwVideoBitRate); 29662306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "v.dwVideoBitRatePeak = %d\n", 29762306a36Sopenharmony_ci v.dwVideoBitRatePeak); 29862306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "a.ucVideoBitRateMode = %d\n", 29962306a36Sopenharmony_ci a.ucAudioBitRateMode); 30062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "a.dwVideoBitRate = %d\n", 30162306a36Sopenharmony_ci a.dwAudioBitRate); 30262306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "a.dwVideoBitRatePeak = %d\n", 30362306a36Sopenharmony_ci a.dwAudioBitRatePeak); 30462306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "aspect.width / height = %d:%d\n", 30562306a36Sopenharmony_ci ar.width, ar.height); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci return ret; 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ciint saa7164_api_set_aspect_ratio(struct saa7164_port *port) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 31362306a36Sopenharmony_ci struct tmComResEncVideoInputAspectRatio ar; 31462306a36Sopenharmony_ci int ret; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s(%d)\n", __func__, 31762306a36Sopenharmony_ci port->encoder_params.ctl_aspect); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci switch (port->encoder_params.ctl_aspect) { 32062306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_ASPECT_1x1: 32162306a36Sopenharmony_ci ar.width = 1; 32262306a36Sopenharmony_ci ar.height = 1; 32362306a36Sopenharmony_ci break; 32462306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_ASPECT_4x3: 32562306a36Sopenharmony_ci ar.width = 4; 32662306a36Sopenharmony_ci ar.height = 3; 32762306a36Sopenharmony_ci break; 32862306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_ASPECT_16x9: 32962306a36Sopenharmony_ci ar.width = 16; 33062306a36Sopenharmony_ci ar.height = 9; 33162306a36Sopenharmony_ci break; 33262306a36Sopenharmony_ci case V4L2_MPEG_VIDEO_ASPECT_221x100: 33362306a36Sopenharmony_ci ar.width = 221; 33462306a36Sopenharmony_ci ar.height = 100; 33562306a36Sopenharmony_ci break; 33662306a36Sopenharmony_ci default: 33762306a36Sopenharmony_ci BUG(); 33862306a36Sopenharmony_ci } 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s(%d) now %d:%d\n", __func__, 34162306a36Sopenharmony_ci port->encoder_params.ctl_aspect, 34262306a36Sopenharmony_ci ar.width, ar.height); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci /* Aspect Ratio */ 34562306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.sourceid, SET_CUR, 34662306a36Sopenharmony_ci EU_VIDEO_INPUT_ASPECT_CONTROL, 34762306a36Sopenharmony_ci sizeof(struct tmComResEncVideoInputAspectRatio), &ar); 34862306a36Sopenharmony_ci if (ret != SAA_OK) 34962306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci return ret; 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ciint saa7164_api_set_usercontrol(struct saa7164_port *port, u8 ctl) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 35762306a36Sopenharmony_ci int ret; 35862306a36Sopenharmony_ci u16 val; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci if (ctl == PU_BRIGHTNESS_CONTROL) 36162306a36Sopenharmony_ci val = port->ctl_brightness; 36262306a36Sopenharmony_ci else 36362306a36Sopenharmony_ci if (ctl == PU_CONTRAST_CONTROL) 36462306a36Sopenharmony_ci val = port->ctl_contrast; 36562306a36Sopenharmony_ci else 36662306a36Sopenharmony_ci if (ctl == PU_HUE_CONTROL) 36762306a36Sopenharmony_ci val = port->ctl_hue; 36862306a36Sopenharmony_ci else 36962306a36Sopenharmony_ci if (ctl == PU_SATURATION_CONTROL) 37062306a36Sopenharmony_ci val = port->ctl_saturation; 37162306a36Sopenharmony_ci else 37262306a36Sopenharmony_ci if (ctl == PU_SHARPNESS_CONTROL) 37362306a36Sopenharmony_ci val = port->ctl_sharpness; 37462306a36Sopenharmony_ci else 37562306a36Sopenharmony_ci return -EINVAL; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() unitid=0x%x ctl=%d, val=%d\n", 37862306a36Sopenharmony_ci __func__, port->encunit.vsourceid, ctl, val); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->encunit.vsourceid, SET_CUR, 38162306a36Sopenharmony_ci ctl, sizeof(u16), &val); 38262306a36Sopenharmony_ci if (ret != SAA_OK) 38362306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci return ret; 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ciint saa7164_api_get_usercontrol(struct saa7164_port *port, u8 ctl) 38962306a36Sopenharmony_ci{ 39062306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 39162306a36Sopenharmony_ci int ret; 39262306a36Sopenharmony_ci u16 val; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->encunit.vsourceid, GET_CUR, 39562306a36Sopenharmony_ci ctl, sizeof(u16), &val); 39662306a36Sopenharmony_ci if (ret != SAA_OK) { 39762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 39862306a36Sopenharmony_ci return ret; 39962306a36Sopenharmony_ci } 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() ctl=%d, val=%d\n", 40262306a36Sopenharmony_ci __func__, ctl, val); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci if (ctl == PU_BRIGHTNESS_CONTROL) 40562306a36Sopenharmony_ci port->ctl_brightness = val; 40662306a36Sopenharmony_ci else 40762306a36Sopenharmony_ci if (ctl == PU_CONTRAST_CONTROL) 40862306a36Sopenharmony_ci port->ctl_contrast = val; 40962306a36Sopenharmony_ci else 41062306a36Sopenharmony_ci if (ctl == PU_HUE_CONTROL) 41162306a36Sopenharmony_ci port->ctl_hue = val; 41262306a36Sopenharmony_ci else 41362306a36Sopenharmony_ci if (ctl == PU_SATURATION_CONTROL) 41462306a36Sopenharmony_ci port->ctl_saturation = val; 41562306a36Sopenharmony_ci else 41662306a36Sopenharmony_ci if (ctl == PU_SHARPNESS_CONTROL) 41762306a36Sopenharmony_ci port->ctl_sharpness = val; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci return ret; 42062306a36Sopenharmony_ci} 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ciint saa7164_api_set_videomux(struct saa7164_port *port) 42362306a36Sopenharmony_ci{ 42462306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 42562306a36Sopenharmony_ci u8 inputs[] = { 1, 2, 2, 2, 5, 5, 5 }; 42662306a36Sopenharmony_ci int ret; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() v_mux=%d a_mux=%d\n", 42962306a36Sopenharmony_ci __func__, port->mux_input, inputs[port->mux_input - 1]); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /* Audio Mute */ 43262306a36Sopenharmony_ci ret = saa7164_api_audio_mute(port, 1); 43362306a36Sopenharmony_ci if (ret != SAA_OK) 43462306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci /* Video Mux */ 43762306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->vidproc.sourceid, SET_CUR, 43862306a36Sopenharmony_ci SU_INPUT_SELECT_CONTROL, sizeof(u8), &port->mux_input); 43962306a36Sopenharmony_ci if (ret != SAA_OK) 44062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci /* Audio Mux */ 44362306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.sourceid, SET_CUR, 44462306a36Sopenharmony_ci SU_INPUT_SELECT_CONTROL, sizeof(u8), 44562306a36Sopenharmony_ci &inputs[port->mux_input - 1]); 44662306a36Sopenharmony_ci if (ret != SAA_OK) 44762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci /* Audio UnMute */ 45062306a36Sopenharmony_ci ret = saa7164_api_audio_mute(port, 0); 45162306a36Sopenharmony_ci if (ret != SAA_OK) 45262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci return ret; 45562306a36Sopenharmony_ci} 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ciint saa7164_api_audio_mute(struct saa7164_port *port, int mute) 45862306a36Sopenharmony_ci{ 45962306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 46062306a36Sopenharmony_ci u8 v = mute; 46162306a36Sopenharmony_ci int ret; 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(%d)\n", __func__, mute); 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR, 46662306a36Sopenharmony_ci MUTE_CONTROL, sizeof(u8), &v); 46762306a36Sopenharmony_ci if (ret != SAA_OK) 46862306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci return ret; 47162306a36Sopenharmony_ci} 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci/* 0 = silence, 0xff = full */ 47462306a36Sopenharmony_ciint saa7164_api_set_audio_volume(struct saa7164_port *port, s8 level) 47562306a36Sopenharmony_ci{ 47662306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 47762306a36Sopenharmony_ci s16 v, min, max; 47862306a36Sopenharmony_ci int ret; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(%d)\n", __func__, level); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci /* Obtain the min/max ranges */ 48362306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_MIN, 48462306a36Sopenharmony_ci VOLUME_CONTROL, sizeof(u16), &min); 48562306a36Sopenharmony_ci if (ret != SAA_OK) 48662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_MAX, 48962306a36Sopenharmony_ci VOLUME_CONTROL, sizeof(u16), &max); 49062306a36Sopenharmony_ci if (ret != SAA_OK) 49162306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_CUR, 49462306a36Sopenharmony_ci (0x01 << 8) | VOLUME_CONTROL, sizeof(u16), &v); 49562306a36Sopenharmony_ci if (ret != SAA_OK) 49662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(%d) min=%d max=%d cur=%d\n", __func__, 49962306a36Sopenharmony_ci level, min, max, v); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci v = level; 50262306a36Sopenharmony_ci if (v < min) 50362306a36Sopenharmony_ci v = min; 50462306a36Sopenharmony_ci if (v > max) 50562306a36Sopenharmony_ci v = max; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci /* Left */ 50862306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR, 50962306a36Sopenharmony_ci (0x01 << 8) | VOLUME_CONTROL, sizeof(s16), &v); 51062306a36Sopenharmony_ci if (ret != SAA_OK) 51162306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci /* Right */ 51462306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR, 51562306a36Sopenharmony_ci (0x02 << 8) | VOLUME_CONTROL, sizeof(s16), &v); 51662306a36Sopenharmony_ci if (ret != SAA_OK) 51762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, GET_CUR, 52062306a36Sopenharmony_ci (0x01 << 8) | VOLUME_CONTROL, sizeof(u16), &v); 52162306a36Sopenharmony_ci if (ret != SAA_OK) 52262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(%d) min=%d max=%d cur=%d\n", __func__, 52562306a36Sopenharmony_ci level, min, max, v); 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci return ret; 52862306a36Sopenharmony_ci} 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ciint saa7164_api_set_audio_std(struct saa7164_port *port) 53162306a36Sopenharmony_ci{ 53262306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 53362306a36Sopenharmony_ci struct tmComResAudioDefaults lvl; 53462306a36Sopenharmony_ci struct tmComResTunerStandard tvaudio; 53562306a36Sopenharmony_ci int ret; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s()\n", __func__); 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci /* Establish default levels */ 54062306a36Sopenharmony_ci lvl.ucDecoderLevel = TMHW_LEV_ADJ_DECLEV_DEFAULT; 54162306a36Sopenharmony_ci lvl.ucDecoderFM_Level = TMHW_LEV_ADJ_DECLEV_DEFAULT; 54262306a36Sopenharmony_ci lvl.ucMonoLevel = TMHW_LEV_ADJ_MONOLEV_DEFAULT; 54362306a36Sopenharmony_ci lvl.ucNICAM_Level = TMHW_LEV_ADJ_NICLEV_DEFAULT; 54462306a36Sopenharmony_ci lvl.ucSAP_Level = TMHW_LEV_ADJ_SAPLEV_DEFAULT; 54562306a36Sopenharmony_ci lvl.ucADC_Level = TMHW_LEV_ADJ_ADCLEV_DEFAULT; 54662306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->audfeat.unitid, SET_CUR, 54762306a36Sopenharmony_ci AUDIO_DEFAULT_CONTROL, sizeof(struct tmComResAudioDefaults), 54862306a36Sopenharmony_ci &lvl); 54962306a36Sopenharmony_ci if (ret != SAA_OK) 55062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci /* Manually select the appropriate TV audio standard */ 55362306a36Sopenharmony_ci if (port->encodernorm.id & V4L2_STD_NTSC) { 55462306a36Sopenharmony_ci tvaudio.std = TU_STANDARD_NTSC_M; 55562306a36Sopenharmony_ci tvaudio.country = 1; 55662306a36Sopenharmony_ci } else { 55762306a36Sopenharmony_ci tvaudio.std = TU_STANDARD_PAL_I; 55862306a36Sopenharmony_ci tvaudio.country = 44; 55962306a36Sopenharmony_ci } 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->tunerunit.unitid, SET_CUR, 56262306a36Sopenharmony_ci TU_STANDARD_CONTROL, sizeof(tvaudio), &tvaudio); 56362306a36Sopenharmony_ci if (ret != SAA_OK) 56462306a36Sopenharmony_ci printk(KERN_ERR "%s() TU_STANDARD_CONTROL error, ret = 0x%x\n", 56562306a36Sopenharmony_ci __func__, ret); 56662306a36Sopenharmony_ci return ret; 56762306a36Sopenharmony_ci} 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ciint saa7164_api_set_audio_detection(struct saa7164_port *port, int autodetect) 57062306a36Sopenharmony_ci{ 57162306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 57262306a36Sopenharmony_ci struct tmComResTunerStandardAuto p; 57362306a36Sopenharmony_ci int ret; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(%d)\n", __func__, autodetect); 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci /* Disable TV Audio autodetect if not already set (buggy) */ 57862306a36Sopenharmony_ci if (autodetect) 57962306a36Sopenharmony_ci p.mode = TU_STANDARD_AUTO; 58062306a36Sopenharmony_ci else 58162306a36Sopenharmony_ci p.mode = TU_STANDARD_MANUAL; 58262306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->tunerunit.unitid, SET_CUR, 58362306a36Sopenharmony_ci TU_STANDARD_AUTO_CONTROL, sizeof(p), &p); 58462306a36Sopenharmony_ci if (ret != SAA_OK) 58562306a36Sopenharmony_ci printk(KERN_ERR 58662306a36Sopenharmony_ci "%s() TU_STANDARD_AUTO_CONTROL error, ret = 0x%x\n", 58762306a36Sopenharmony_ci __func__, ret); 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci return ret; 59062306a36Sopenharmony_ci} 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ciint saa7164_api_get_videomux(struct saa7164_port *port) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 59562306a36Sopenharmony_ci int ret; 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->vidproc.sourceid, GET_CUR, 59862306a36Sopenharmony_ci SU_INPUT_SELECT_CONTROL, sizeof(u8), &port->mux_input); 59962306a36Sopenharmony_ci if (ret != SAA_OK) 60062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci dprintk(DBGLVL_ENC, "%s() v_mux=%d\n", 60362306a36Sopenharmony_ci __func__, port->mux_input); 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci return ret; 60662306a36Sopenharmony_ci} 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_cistatic int saa7164_api_set_dif(struct saa7164_port *port, u8 reg, u8 val) 60962306a36Sopenharmony_ci{ 61062306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci u16 len = 0; 61362306a36Sopenharmony_ci u8 buf[256]; 61462306a36Sopenharmony_ci int ret; 61562306a36Sopenharmony_ci u8 mas; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d type=%d val=%x)\n", __func__, 61862306a36Sopenharmony_ci port->nr, port->type, val); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci if (port->nr == 0) 62162306a36Sopenharmony_ci mas = 0xd0; 62262306a36Sopenharmony_ci else 62362306a36Sopenharmony_ci mas = 0xe0; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci memset(buf, 0, sizeof(buf)); 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci buf[0x00] = 0x04; 62862306a36Sopenharmony_ci buf[0x01] = 0x00; 62962306a36Sopenharmony_ci buf[0x02] = 0x00; 63062306a36Sopenharmony_ci buf[0x03] = 0x00; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci buf[0x04] = 0x04; 63362306a36Sopenharmony_ci buf[0x05] = 0x00; 63462306a36Sopenharmony_ci buf[0x06] = 0x00; 63562306a36Sopenharmony_ci buf[0x07] = 0x00; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci buf[0x08] = reg; 63862306a36Sopenharmony_ci buf[0x09] = 0x26; 63962306a36Sopenharmony_ci buf[0x0a] = mas; 64062306a36Sopenharmony_ci buf[0x0b] = 0xb0; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci buf[0x0c] = val; 64362306a36Sopenharmony_ci buf[0x0d] = 0x00; 64462306a36Sopenharmony_ci buf[0x0e] = 0x00; 64562306a36Sopenharmony_ci buf[0x0f] = 0x00; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, port->ifunit.unitid, GET_LEN, 64862306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); 64962306a36Sopenharmony_ci if (ret != SAA_OK) { 65062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); 65162306a36Sopenharmony_ci return -EIO; 65262306a36Sopenharmony_ci } 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, port->ifunit.unitid, SET_CUR, 65562306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, len, &buf); 65662306a36Sopenharmony_ci if (ret != SAA_OK) 65762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); 65862306a36Sopenharmony_ci#if 0 65962306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf, 16, 66062306a36Sopenharmony_ci false); 66162306a36Sopenharmony_ci#endif 66262306a36Sopenharmony_ci return ret == SAA_OK ? 0 : -EIO; 66362306a36Sopenharmony_ci} 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci/* Disable the IF block AGC controls */ 66662306a36Sopenharmony_ciint saa7164_api_configure_dif(struct saa7164_port *port, u32 std) 66762306a36Sopenharmony_ci{ 66862306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 66962306a36Sopenharmony_ci u8 agc_disable; 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d, 0x%x)\n", __func__, port->nr, std); 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci if (std & V4L2_STD_NTSC) { 67462306a36Sopenharmony_ci dprintk(DBGLVL_API, " NTSC\n"); 67562306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */ 67662306a36Sopenharmony_ci agc_disable = 0; 67762306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_I) { 67862306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-I\n"); 67962306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x08); /* Video Standard */ 68062306a36Sopenharmony_ci agc_disable = 0; 68162306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_M) { 68262306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-M\n"); 68362306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */ 68462306a36Sopenharmony_ci agc_disable = 0; 68562306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_N) { 68662306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-N\n"); 68762306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */ 68862306a36Sopenharmony_ci agc_disable = 0; 68962306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_Nc) { 69062306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-Nc\n"); 69162306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x01); /* Video Standard */ 69262306a36Sopenharmony_ci agc_disable = 0; 69362306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_B) { 69462306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-B\n"); 69562306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x02); /* Video Standard */ 69662306a36Sopenharmony_ci agc_disable = 0; 69762306a36Sopenharmony_ci } else if (std & V4L2_STD_PAL_DK) { 69862306a36Sopenharmony_ci dprintk(DBGLVL_API, " PAL-DK\n"); 69962306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x10); /* Video Standard */ 70062306a36Sopenharmony_ci agc_disable = 0; 70162306a36Sopenharmony_ci } else if (std & V4L2_STD_SECAM_L) { 70262306a36Sopenharmony_ci dprintk(DBGLVL_API, " SECAM-L\n"); 70362306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x20); /* Video Standard */ 70462306a36Sopenharmony_ci agc_disable = 0; 70562306a36Sopenharmony_ci } else { 70662306a36Sopenharmony_ci /* Unknown standard, assume DTV */ 70762306a36Sopenharmony_ci dprintk(DBGLVL_API, " Unknown (assuming DTV)\n"); 70862306a36Sopenharmony_ci /* Undefinded Video Standard */ 70962306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x00, 0x80); 71062306a36Sopenharmony_ci agc_disable = 1; 71162306a36Sopenharmony_ci } 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x48, 0xa0); /* AGC Functions 1 */ 71462306a36Sopenharmony_ci saa7164_api_set_dif(port, 0xc0, agc_disable); /* AGC Output Disable */ 71562306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x7c, 0x04); /* CVBS EQ */ 71662306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x04, 0x01); /* Active */ 71762306a36Sopenharmony_ci msleep(100); 71862306a36Sopenharmony_ci saa7164_api_set_dif(port, 0x04, 0x00); /* Active (again) */ 71962306a36Sopenharmony_ci msleep(100); 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci return 0; 72262306a36Sopenharmony_ci} 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci/* Ensure the dif is in the correct state for the operating mode 72562306a36Sopenharmony_ci * (analog / dtv). We only configure the diff through the analog encoder 72662306a36Sopenharmony_ci * so when we're in digital mode we need to find the appropriate encoder 72762306a36Sopenharmony_ci * and use it to configure the DIF. 72862306a36Sopenharmony_ci */ 72962306a36Sopenharmony_ciint saa7164_api_initialize_dif(struct saa7164_port *port) 73062306a36Sopenharmony_ci{ 73162306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 73262306a36Sopenharmony_ci struct saa7164_port *p = NULL; 73362306a36Sopenharmony_ci int ret = -EINVAL; 73462306a36Sopenharmony_ci u32 std = 0; 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d type=%d)\n", __func__, 73762306a36Sopenharmony_ci port->nr, port->type); 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_ci if (port->type == SAA7164_MPEG_ENCODER) { 74062306a36Sopenharmony_ci /* Pick any analog standard to init the diff. 74162306a36Sopenharmony_ci * we'll come back during encoder_init' 74262306a36Sopenharmony_ci * and set the correct standard if required. 74362306a36Sopenharmony_ci */ 74462306a36Sopenharmony_ci std = V4L2_STD_NTSC; 74562306a36Sopenharmony_ci } else 74662306a36Sopenharmony_ci if (port->type == SAA7164_MPEG_DVB) { 74762306a36Sopenharmony_ci if (port->nr == SAA7164_PORT_TS1) 74862306a36Sopenharmony_ci p = &dev->ports[SAA7164_PORT_ENC1]; 74962306a36Sopenharmony_ci else 75062306a36Sopenharmony_ci p = &dev->ports[SAA7164_PORT_ENC2]; 75162306a36Sopenharmony_ci } else 75262306a36Sopenharmony_ci if (port->type == SAA7164_MPEG_VBI) { 75362306a36Sopenharmony_ci std = V4L2_STD_NTSC; 75462306a36Sopenharmony_ci if (port->nr == SAA7164_PORT_VBI1) 75562306a36Sopenharmony_ci p = &dev->ports[SAA7164_PORT_ENC1]; 75662306a36Sopenharmony_ci else 75762306a36Sopenharmony_ci p = &dev->ports[SAA7164_PORT_ENC2]; 75862306a36Sopenharmony_ci } else 75962306a36Sopenharmony_ci BUG(); 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci if (p) 76262306a36Sopenharmony_ci ret = saa7164_api_configure_dif(p, std); 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci return ret; 76562306a36Sopenharmony_ci} 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ciint saa7164_api_transition_port(struct saa7164_port *port, u8 mode) 76862306a36Sopenharmony_ci{ 76962306a36Sopenharmony_ci struct saa7164_dev *dev = port->dev; 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci int ret; 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(nr=%d unitid=0x%x,%d)\n", 77462306a36Sopenharmony_ci __func__, port->nr, port->hwcfg.unitid, mode); 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci ret = saa7164_cmd_send(port->dev, port->hwcfg.unitid, SET_CUR, 77762306a36Sopenharmony_ci SAA_STATE_CONTROL, sizeof(mode), &mode); 77862306a36Sopenharmony_ci if (ret != SAA_OK) 77962306a36Sopenharmony_ci printk(KERN_ERR "%s(portnr %d unitid 0x%x) error, ret = 0x%x\n", 78062306a36Sopenharmony_ci __func__, port->nr, port->hwcfg.unitid, ret); 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci return ret; 78362306a36Sopenharmony_ci} 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ciint saa7164_api_get_fw_version(struct saa7164_dev *dev, u32 *version) 78662306a36Sopenharmony_ci{ 78762306a36Sopenharmony_ci int ret; 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_CUR, 79062306a36Sopenharmony_ci GET_FW_VERSION_CONTROL, sizeof(u32), version); 79162306a36Sopenharmony_ci if (ret != SAA_OK) 79262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci return ret; 79562306a36Sopenharmony_ci} 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ciint saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen) 79862306a36Sopenharmony_ci{ 79962306a36Sopenharmony_ci u8 reg[] = { 0x0f, 0x00 }; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci if (buflen < 128) 80262306a36Sopenharmony_ci return -ENOMEM; 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_ci /* Assumption: Hauppauge eeprom is at 0xa0 on bus 0 */ 80562306a36Sopenharmony_ci /* TODO: Pull the details from the boards struct */ 80662306a36Sopenharmony_ci return saa7164_api_i2c_read(&dev->i2c_bus[0], 0xa0 >> 1, sizeof(reg), 80762306a36Sopenharmony_ci ®[0], 128, buf); 80862306a36Sopenharmony_ci} 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_cistatic int saa7164_api_configure_port_vbi(struct saa7164_dev *dev, 81162306a36Sopenharmony_ci struct saa7164_port *port) 81262306a36Sopenharmony_ci{ 81362306a36Sopenharmony_ci struct tmComResVBIFormatDescrHeader *fmt = &port->vbi_fmt_ntsc; 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_ci dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", fmt->bFormatIndex); 81662306a36Sopenharmony_ci dprintk(DBGLVL_API, " VideoStandard = 0x%x\n", fmt->VideoStandard); 81762306a36Sopenharmony_ci dprintk(DBGLVL_API, " StartLine = %d\n", fmt->StartLine); 81862306a36Sopenharmony_ci dprintk(DBGLVL_API, " EndLine = %d\n", fmt->EndLine); 81962306a36Sopenharmony_ci dprintk(DBGLVL_API, " FieldRate = %d\n", fmt->FieldRate); 82062306a36Sopenharmony_ci dprintk(DBGLVL_API, " bNumLines = %d\n", fmt->bNumLines); 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci /* Cache the hardware configuration in the port */ 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci port->bufcounter = port->hwcfg.BARLocation; 82562306a36Sopenharmony_ci port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32)); 82662306a36Sopenharmony_ci port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32)); 82762306a36Sopenharmony_ci port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32)); 82862306a36Sopenharmony_ci port->bufptr32l = port->hwcfg.BARLocation + 82962306a36Sopenharmony_ci (4 * sizeof(u32)) + 83062306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32); 83162306a36Sopenharmony_ci port->bufptr32h = port->hwcfg.BARLocation + 83262306a36Sopenharmony_ci (4 * sizeof(u32)) + 83362306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 83462306a36Sopenharmony_ci port->bufptr64 = port->hwcfg.BARLocation + 83562306a36Sopenharmony_ci (4 * sizeof(u32)) + 83662306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 83762306a36Sopenharmony_ci dprintk(DBGLVL_API, " = port->hwcfg.BARLocation = 0x%x\n", 83862306a36Sopenharmony_ci port->hwcfg.BARLocation); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci dprintk(DBGLVL_API, " = VS_FORMAT_VBI (becomes dev->en[%d])\n", 84162306a36Sopenharmony_ci port->nr); 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_ci return 0; 84462306a36Sopenharmony_ci} 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_cistatic int 84762306a36Sopenharmony_cisaa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev, 84862306a36Sopenharmony_ci struct saa7164_port *port, 84962306a36Sopenharmony_ci struct tmComResTSFormatDescrHeader *tsfmt) 85062306a36Sopenharmony_ci{ 85162306a36Sopenharmony_ci dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", tsfmt->bFormatIndex); 85262306a36Sopenharmony_ci dprintk(DBGLVL_API, " bDataOffset = 0x%x\n", tsfmt->bDataOffset); 85362306a36Sopenharmony_ci dprintk(DBGLVL_API, " bPacketLength= 0x%x\n", tsfmt->bPacketLength); 85462306a36Sopenharmony_ci dprintk(DBGLVL_API, " bStrideLength= 0x%x\n", tsfmt->bStrideLength); 85562306a36Sopenharmony_ci dprintk(DBGLVL_API, " bguid = (....)\n"); 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci /* Cache the hardware configuration in the port */ 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci port->bufcounter = port->hwcfg.BARLocation; 86062306a36Sopenharmony_ci port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32)); 86162306a36Sopenharmony_ci port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32)); 86262306a36Sopenharmony_ci port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32)); 86362306a36Sopenharmony_ci port->bufptr32l = port->hwcfg.BARLocation + 86462306a36Sopenharmony_ci (4 * sizeof(u32)) + 86562306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32); 86662306a36Sopenharmony_ci port->bufptr32h = port->hwcfg.BARLocation + 86762306a36Sopenharmony_ci (4 * sizeof(u32)) + 86862306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 86962306a36Sopenharmony_ci port->bufptr64 = port->hwcfg.BARLocation + 87062306a36Sopenharmony_ci (4 * sizeof(u32)) + 87162306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 87262306a36Sopenharmony_ci dprintk(DBGLVL_API, " = port->hwcfg.BARLocation = 0x%x\n", 87362306a36Sopenharmony_ci port->hwcfg.BARLocation); 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_ci dprintk(DBGLVL_API, " = VS_FORMAT_MPEGTS (becomes dev->ts[%d])\n", 87662306a36Sopenharmony_ci port->nr); 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ci return 0; 87962306a36Sopenharmony_ci} 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistatic int 88262306a36Sopenharmony_cisaa7164_api_configure_port_mpeg2ps(struct saa7164_dev *dev, 88362306a36Sopenharmony_ci struct saa7164_port *port, 88462306a36Sopenharmony_ci struct tmComResPSFormatDescrHeader *fmt) 88562306a36Sopenharmony_ci{ 88662306a36Sopenharmony_ci dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", fmt->bFormatIndex); 88762306a36Sopenharmony_ci dprintk(DBGLVL_API, " wPacketLength= 0x%x\n", fmt->wPacketLength); 88862306a36Sopenharmony_ci dprintk(DBGLVL_API, " wPackLength= 0x%x\n", fmt->wPackLength); 88962306a36Sopenharmony_ci dprintk(DBGLVL_API, " bPackDataType= 0x%x\n", fmt->bPackDataType); 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_ci /* Cache the hardware configuration in the port */ 89262306a36Sopenharmony_ci /* TODO: CHECK THIS in the port config */ 89362306a36Sopenharmony_ci port->bufcounter = port->hwcfg.BARLocation; 89462306a36Sopenharmony_ci port->pitch = port->hwcfg.BARLocation + (2 * sizeof(u32)); 89562306a36Sopenharmony_ci port->bufsize = port->hwcfg.BARLocation + (3 * sizeof(u32)); 89662306a36Sopenharmony_ci port->bufoffset = port->hwcfg.BARLocation + (4 * sizeof(u32)); 89762306a36Sopenharmony_ci port->bufptr32l = port->hwcfg.BARLocation + 89862306a36Sopenharmony_ci (4 * sizeof(u32)) + 89962306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount) + sizeof(u32); 90062306a36Sopenharmony_ci port->bufptr32h = port->hwcfg.BARLocation + 90162306a36Sopenharmony_ci (4 * sizeof(u32)) + 90262306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 90362306a36Sopenharmony_ci port->bufptr64 = port->hwcfg.BARLocation + 90462306a36Sopenharmony_ci (4 * sizeof(u32)) + 90562306a36Sopenharmony_ci (sizeof(u32) * port->hwcfg.buffercount); 90662306a36Sopenharmony_ci dprintk(DBGLVL_API, " = port->hwcfg.BARLocation = 0x%x\n", 90762306a36Sopenharmony_ci port->hwcfg.BARLocation); 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci dprintk(DBGLVL_API, " = VS_FORMAT_MPEGPS (becomes dev->enc[%d])\n", 91062306a36Sopenharmony_ci port->nr); 91162306a36Sopenharmony_ci 91262306a36Sopenharmony_ci return 0; 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_cistatic int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len) 91662306a36Sopenharmony_ci{ 91762306a36Sopenharmony_ci struct saa7164_port *tsport = NULL; 91862306a36Sopenharmony_ci struct saa7164_port *encport = NULL; 91962306a36Sopenharmony_ci struct saa7164_port *vbiport = NULL; 92062306a36Sopenharmony_ci u32 idx, next_offset; 92162306a36Sopenharmony_ci int i; 92262306a36Sopenharmony_ci struct tmComResDescrHeader *hdr, *t; 92362306a36Sopenharmony_ci struct tmComResExtDevDescrHeader *exthdr; 92462306a36Sopenharmony_ci struct tmComResPathDescrHeader *pathhdr; 92562306a36Sopenharmony_ci struct tmComResAntTermDescrHeader *anttermhdr; 92662306a36Sopenharmony_ci struct tmComResTunerDescrHeader *tunerunithdr; 92762306a36Sopenharmony_ci struct tmComResDMATermDescrHeader *vcoutputtermhdr; 92862306a36Sopenharmony_ci struct tmComResTSFormatDescrHeader *tsfmt; 92962306a36Sopenharmony_ci struct tmComResPSFormatDescrHeader *psfmt; 93062306a36Sopenharmony_ci struct tmComResSelDescrHeader *psel; 93162306a36Sopenharmony_ci struct tmComResProcDescrHeader *pdh; 93262306a36Sopenharmony_ci struct tmComResAFeatureDescrHeader *afd; 93362306a36Sopenharmony_ci struct tmComResEncoderDescrHeader *edh; 93462306a36Sopenharmony_ci struct tmComResVBIFormatDescrHeader *vbifmt; 93562306a36Sopenharmony_ci u32 currpath = 0; 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci dprintk(DBGLVL_API, 93862306a36Sopenharmony_ci "%s(?,?,%d) sizeof(struct tmComResDescrHeader) = %d bytes\n", 93962306a36Sopenharmony_ci __func__, len, (u32)sizeof(struct tmComResDescrHeader)); 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_ci for (idx = 0; idx < (len - sizeof(struct tmComResDescrHeader));) { 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_ci hdr = (struct tmComResDescrHeader *)(buf + idx); 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci if (hdr->type != CS_INTERFACE) 94662306a36Sopenharmony_ci return SAA_ERR_NOT_SUPPORTED; 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci dprintk(DBGLVL_API, "@ 0x%x =\n", idx); 94962306a36Sopenharmony_ci switch (hdr->subtype) { 95062306a36Sopenharmony_ci case GENERAL_REQUEST: 95162306a36Sopenharmony_ci dprintk(DBGLVL_API, " GENERAL_REQUEST\n"); 95262306a36Sopenharmony_ci break; 95362306a36Sopenharmony_ci case VC_TUNER_PATH: 95462306a36Sopenharmony_ci dprintk(DBGLVL_API, " VC_TUNER_PATH\n"); 95562306a36Sopenharmony_ci pathhdr = (struct tmComResPathDescrHeader *)(buf + idx); 95662306a36Sopenharmony_ci dprintk(DBGLVL_API, " pathid = 0x%x\n", 95762306a36Sopenharmony_ci pathhdr->pathid); 95862306a36Sopenharmony_ci currpath = pathhdr->pathid; 95962306a36Sopenharmony_ci break; 96062306a36Sopenharmony_ci case VC_INPUT_TERMINAL: 96162306a36Sopenharmony_ci dprintk(DBGLVL_API, " VC_INPUT_TERMINAL\n"); 96262306a36Sopenharmony_ci anttermhdr = 96362306a36Sopenharmony_ci (struct tmComResAntTermDescrHeader *)(buf + idx); 96462306a36Sopenharmony_ci dprintk(DBGLVL_API, " terminalid = 0x%x\n", 96562306a36Sopenharmony_ci anttermhdr->terminalid); 96662306a36Sopenharmony_ci dprintk(DBGLVL_API, " terminaltype = 0x%x\n", 96762306a36Sopenharmony_ci anttermhdr->terminaltype); 96862306a36Sopenharmony_ci switch (anttermhdr->terminaltype) { 96962306a36Sopenharmony_ci case ITT_ANTENNA: 97062306a36Sopenharmony_ci dprintk(DBGLVL_API, " = ITT_ANTENNA\n"); 97162306a36Sopenharmony_ci break; 97262306a36Sopenharmony_ci case LINE_CONNECTOR: 97362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = LINE_CONNECTOR\n"); 97462306a36Sopenharmony_ci break; 97562306a36Sopenharmony_ci case SPDIF_CONNECTOR: 97662306a36Sopenharmony_ci dprintk(DBGLVL_API, " = SPDIF_CONNECTOR\n"); 97762306a36Sopenharmony_ci break; 97862306a36Sopenharmony_ci case COMPOSITE_CONNECTOR: 97962306a36Sopenharmony_ci dprintk(DBGLVL_API, 98062306a36Sopenharmony_ci " = COMPOSITE_CONNECTOR\n"); 98162306a36Sopenharmony_ci break; 98262306a36Sopenharmony_ci case SVIDEO_CONNECTOR: 98362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = SVIDEO_CONNECTOR\n"); 98462306a36Sopenharmony_ci break; 98562306a36Sopenharmony_ci case COMPONENT_CONNECTOR: 98662306a36Sopenharmony_ci dprintk(DBGLVL_API, 98762306a36Sopenharmony_ci " = COMPONENT_CONNECTOR\n"); 98862306a36Sopenharmony_ci break; 98962306a36Sopenharmony_ci case STANDARD_DMA: 99062306a36Sopenharmony_ci dprintk(DBGLVL_API, " = STANDARD_DMA\n"); 99162306a36Sopenharmony_ci break; 99262306a36Sopenharmony_ci default: 99362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = undefined (0x%x)\n", 99462306a36Sopenharmony_ci anttermhdr->terminaltype); 99562306a36Sopenharmony_ci } 99662306a36Sopenharmony_ci dprintk(DBGLVL_API, " assocterminal= 0x%x\n", 99762306a36Sopenharmony_ci anttermhdr->assocterminal); 99862306a36Sopenharmony_ci dprintk(DBGLVL_API, " iterminal = 0x%x\n", 99962306a36Sopenharmony_ci anttermhdr->iterminal); 100062306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 100162306a36Sopenharmony_ci anttermhdr->controlsize); 100262306a36Sopenharmony_ci break; 100362306a36Sopenharmony_ci case VC_OUTPUT_TERMINAL: 100462306a36Sopenharmony_ci dprintk(DBGLVL_API, " VC_OUTPUT_TERMINAL\n"); 100562306a36Sopenharmony_ci vcoutputtermhdr = 100662306a36Sopenharmony_ci (struct tmComResDMATermDescrHeader *)(buf + idx); 100762306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 100862306a36Sopenharmony_ci vcoutputtermhdr->unitid); 100962306a36Sopenharmony_ci dprintk(DBGLVL_API, " terminaltype = 0x%x\n", 101062306a36Sopenharmony_ci vcoutputtermhdr->terminaltype); 101162306a36Sopenharmony_ci switch (vcoutputtermhdr->terminaltype) { 101262306a36Sopenharmony_ci case ITT_ANTENNA: 101362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = ITT_ANTENNA\n"); 101462306a36Sopenharmony_ci break; 101562306a36Sopenharmony_ci case LINE_CONNECTOR: 101662306a36Sopenharmony_ci dprintk(DBGLVL_API, " = LINE_CONNECTOR\n"); 101762306a36Sopenharmony_ci break; 101862306a36Sopenharmony_ci case SPDIF_CONNECTOR: 101962306a36Sopenharmony_ci dprintk(DBGLVL_API, " = SPDIF_CONNECTOR\n"); 102062306a36Sopenharmony_ci break; 102162306a36Sopenharmony_ci case COMPOSITE_CONNECTOR: 102262306a36Sopenharmony_ci dprintk(DBGLVL_API, 102362306a36Sopenharmony_ci " = COMPOSITE_CONNECTOR\n"); 102462306a36Sopenharmony_ci break; 102562306a36Sopenharmony_ci case SVIDEO_CONNECTOR: 102662306a36Sopenharmony_ci dprintk(DBGLVL_API, " = SVIDEO_CONNECTOR\n"); 102762306a36Sopenharmony_ci break; 102862306a36Sopenharmony_ci case COMPONENT_CONNECTOR: 102962306a36Sopenharmony_ci dprintk(DBGLVL_API, 103062306a36Sopenharmony_ci " = COMPONENT_CONNECTOR\n"); 103162306a36Sopenharmony_ci break; 103262306a36Sopenharmony_ci case STANDARD_DMA: 103362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = STANDARD_DMA\n"); 103462306a36Sopenharmony_ci break; 103562306a36Sopenharmony_ci default: 103662306a36Sopenharmony_ci dprintk(DBGLVL_API, " = undefined (0x%x)\n", 103762306a36Sopenharmony_ci vcoutputtermhdr->terminaltype); 103862306a36Sopenharmony_ci } 103962306a36Sopenharmony_ci dprintk(DBGLVL_API, " assocterminal= 0x%x\n", 104062306a36Sopenharmony_ci vcoutputtermhdr->assocterminal); 104162306a36Sopenharmony_ci dprintk(DBGLVL_API, " sourceid = 0x%x\n", 104262306a36Sopenharmony_ci vcoutputtermhdr->sourceid); 104362306a36Sopenharmony_ci dprintk(DBGLVL_API, " iterminal = 0x%x\n", 104462306a36Sopenharmony_ci vcoutputtermhdr->iterminal); 104562306a36Sopenharmony_ci dprintk(DBGLVL_API, " BARLocation = 0x%x\n", 104662306a36Sopenharmony_ci vcoutputtermhdr->BARLocation); 104762306a36Sopenharmony_ci dprintk(DBGLVL_API, " flags = 0x%x\n", 104862306a36Sopenharmony_ci vcoutputtermhdr->flags); 104962306a36Sopenharmony_ci dprintk(DBGLVL_API, " interruptid = 0x%x\n", 105062306a36Sopenharmony_ci vcoutputtermhdr->interruptid); 105162306a36Sopenharmony_ci dprintk(DBGLVL_API, " buffercount = 0x%x\n", 105262306a36Sopenharmony_ci vcoutputtermhdr->buffercount); 105362306a36Sopenharmony_ci dprintk(DBGLVL_API, " metadatasize = 0x%x\n", 105462306a36Sopenharmony_ci vcoutputtermhdr->metadatasize); 105562306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 105662306a36Sopenharmony_ci vcoutputtermhdr->controlsize); 105762306a36Sopenharmony_ci dprintk(DBGLVL_API, " numformats = 0x%x\n", 105862306a36Sopenharmony_ci vcoutputtermhdr->numformats); 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci next_offset = idx + (vcoutputtermhdr->len); 106162306a36Sopenharmony_ci for (i = 0; i < vcoutputtermhdr->numformats; i++) { 106262306a36Sopenharmony_ci t = (struct tmComResDescrHeader *) 106362306a36Sopenharmony_ci (buf + next_offset); 106462306a36Sopenharmony_ci switch (t->subtype) { 106562306a36Sopenharmony_ci case VS_FORMAT_MPEG2TS: 106662306a36Sopenharmony_ci tsfmt = 106762306a36Sopenharmony_ci (struct tmComResTSFormatDescrHeader *)t; 106862306a36Sopenharmony_ci if (currpath == 1) 106962306a36Sopenharmony_ci tsport = &dev->ports[SAA7164_PORT_TS1]; 107062306a36Sopenharmony_ci else 107162306a36Sopenharmony_ci tsport = &dev->ports[SAA7164_PORT_TS2]; 107262306a36Sopenharmony_ci memcpy(&tsport->hwcfg, vcoutputtermhdr, 107362306a36Sopenharmony_ci sizeof(*vcoutputtermhdr)); 107462306a36Sopenharmony_ci saa7164_api_configure_port_mpeg2ts(dev, 107562306a36Sopenharmony_ci tsport, tsfmt); 107662306a36Sopenharmony_ci break; 107762306a36Sopenharmony_ci case VS_FORMAT_MPEG2PS: 107862306a36Sopenharmony_ci psfmt = 107962306a36Sopenharmony_ci (struct tmComResPSFormatDescrHeader *)t; 108062306a36Sopenharmony_ci if (currpath == 1) 108162306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 108262306a36Sopenharmony_ci else 108362306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 108462306a36Sopenharmony_ci memcpy(&encport->hwcfg, vcoutputtermhdr, 108562306a36Sopenharmony_ci sizeof(*vcoutputtermhdr)); 108662306a36Sopenharmony_ci saa7164_api_configure_port_mpeg2ps(dev, 108762306a36Sopenharmony_ci encport, psfmt); 108862306a36Sopenharmony_ci break; 108962306a36Sopenharmony_ci case VS_FORMAT_VBI: 109062306a36Sopenharmony_ci vbifmt = 109162306a36Sopenharmony_ci (struct tmComResVBIFormatDescrHeader *)t; 109262306a36Sopenharmony_ci if (currpath == 1) 109362306a36Sopenharmony_ci vbiport = &dev->ports[SAA7164_PORT_VBI1]; 109462306a36Sopenharmony_ci else 109562306a36Sopenharmony_ci vbiport = &dev->ports[SAA7164_PORT_VBI2]; 109662306a36Sopenharmony_ci memcpy(&vbiport->hwcfg, vcoutputtermhdr, 109762306a36Sopenharmony_ci sizeof(*vcoutputtermhdr)); 109862306a36Sopenharmony_ci memcpy(&vbiport->vbi_fmt_ntsc, vbifmt, 109962306a36Sopenharmony_ci sizeof(*vbifmt)); 110062306a36Sopenharmony_ci saa7164_api_configure_port_vbi(dev, 110162306a36Sopenharmony_ci vbiport); 110262306a36Sopenharmony_ci break; 110362306a36Sopenharmony_ci case VS_FORMAT_RDS: 110462306a36Sopenharmony_ci dprintk(DBGLVL_API, 110562306a36Sopenharmony_ci " = VS_FORMAT_RDS\n"); 110662306a36Sopenharmony_ci break; 110762306a36Sopenharmony_ci case VS_FORMAT_UNCOMPRESSED: 110862306a36Sopenharmony_ci dprintk(DBGLVL_API, 110962306a36Sopenharmony_ci " = VS_FORMAT_UNCOMPRESSED\n"); 111062306a36Sopenharmony_ci break; 111162306a36Sopenharmony_ci case VS_FORMAT_TYPE: 111262306a36Sopenharmony_ci dprintk(DBGLVL_API, 111362306a36Sopenharmony_ci " = VS_FORMAT_TYPE\n"); 111462306a36Sopenharmony_ci break; 111562306a36Sopenharmony_ci default: 111662306a36Sopenharmony_ci dprintk(DBGLVL_API, 111762306a36Sopenharmony_ci " = undefined (0x%x)\n", 111862306a36Sopenharmony_ci t->subtype); 111962306a36Sopenharmony_ci } 112062306a36Sopenharmony_ci next_offset += t->len; 112162306a36Sopenharmony_ci } 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci break; 112462306a36Sopenharmony_ci case TUNER_UNIT: 112562306a36Sopenharmony_ci dprintk(DBGLVL_API, " TUNER_UNIT\n"); 112662306a36Sopenharmony_ci tunerunithdr = 112762306a36Sopenharmony_ci (struct tmComResTunerDescrHeader *)(buf + idx); 112862306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 112962306a36Sopenharmony_ci tunerunithdr->unitid); 113062306a36Sopenharmony_ci dprintk(DBGLVL_API, " sourceid = 0x%x\n", 113162306a36Sopenharmony_ci tunerunithdr->sourceid); 113262306a36Sopenharmony_ci dprintk(DBGLVL_API, " iunit = 0x%x\n", 113362306a36Sopenharmony_ci tunerunithdr->iunit); 113462306a36Sopenharmony_ci dprintk(DBGLVL_API, " tuningstandards = 0x%x\n", 113562306a36Sopenharmony_ci tunerunithdr->tuningstandards); 113662306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 113762306a36Sopenharmony_ci tunerunithdr->controlsize); 113862306a36Sopenharmony_ci dprintk(DBGLVL_API, " controls = 0x%x\n", 113962306a36Sopenharmony_ci tunerunithdr->controls); 114062306a36Sopenharmony_ci 114162306a36Sopenharmony_ci if (tunerunithdr->unitid == tunerunithdr->iunit) { 114262306a36Sopenharmony_ci if (currpath == 1) 114362306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 114462306a36Sopenharmony_ci else 114562306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 114662306a36Sopenharmony_ci memcpy(&encport->tunerunit, tunerunithdr, 114762306a36Sopenharmony_ci sizeof(struct tmComResTunerDescrHeader)); 114862306a36Sopenharmony_ci dprintk(DBGLVL_API, 114962306a36Sopenharmony_ci " (becomes dev->enc[%d] tuner)\n", 115062306a36Sopenharmony_ci encport->nr); 115162306a36Sopenharmony_ci } 115262306a36Sopenharmony_ci break; 115362306a36Sopenharmony_ci case VC_SELECTOR_UNIT: 115462306a36Sopenharmony_ci psel = (struct tmComResSelDescrHeader *)(buf + idx); 115562306a36Sopenharmony_ci dprintk(DBGLVL_API, " VC_SELECTOR_UNIT\n"); 115662306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 115762306a36Sopenharmony_ci psel->unitid); 115862306a36Sopenharmony_ci dprintk(DBGLVL_API, " nrinpins = 0x%x\n", 115962306a36Sopenharmony_ci psel->nrinpins); 116062306a36Sopenharmony_ci dprintk(DBGLVL_API, " sourceid = 0x%x\n", 116162306a36Sopenharmony_ci psel->sourceid); 116262306a36Sopenharmony_ci break; 116362306a36Sopenharmony_ci case VC_PROCESSING_UNIT: 116462306a36Sopenharmony_ci pdh = (struct tmComResProcDescrHeader *)(buf + idx); 116562306a36Sopenharmony_ci dprintk(DBGLVL_API, " VC_PROCESSING_UNIT\n"); 116662306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 116762306a36Sopenharmony_ci pdh->unitid); 116862306a36Sopenharmony_ci dprintk(DBGLVL_API, " sourceid = 0x%x\n", 116962306a36Sopenharmony_ci pdh->sourceid); 117062306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 117162306a36Sopenharmony_ci pdh->controlsize); 117262306a36Sopenharmony_ci if (pdh->controlsize == 0x04) { 117362306a36Sopenharmony_ci if (currpath == 1) 117462306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 117562306a36Sopenharmony_ci else 117662306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 117762306a36Sopenharmony_ci memcpy(&encport->vidproc, pdh, 117862306a36Sopenharmony_ci sizeof(struct tmComResProcDescrHeader)); 117962306a36Sopenharmony_ci dprintk(DBGLVL_API, " (becomes dev->enc[%d])\n", 118062306a36Sopenharmony_ci encport->nr); 118162306a36Sopenharmony_ci } 118262306a36Sopenharmony_ci break; 118362306a36Sopenharmony_ci case FEATURE_UNIT: 118462306a36Sopenharmony_ci afd = (struct tmComResAFeatureDescrHeader *)(buf + idx); 118562306a36Sopenharmony_ci dprintk(DBGLVL_API, " FEATURE_UNIT\n"); 118662306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 118762306a36Sopenharmony_ci afd->unitid); 118862306a36Sopenharmony_ci dprintk(DBGLVL_API, " sourceid = 0x%x\n", 118962306a36Sopenharmony_ci afd->sourceid); 119062306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 119162306a36Sopenharmony_ci afd->controlsize); 119262306a36Sopenharmony_ci if (currpath == 1) 119362306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 119462306a36Sopenharmony_ci else 119562306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 119662306a36Sopenharmony_ci memcpy(&encport->audfeat, afd, 119762306a36Sopenharmony_ci sizeof(struct tmComResAFeatureDescrHeader)); 119862306a36Sopenharmony_ci dprintk(DBGLVL_API, " (becomes dev->enc[%d])\n", 119962306a36Sopenharmony_ci encport->nr); 120062306a36Sopenharmony_ci break; 120162306a36Sopenharmony_ci case ENCODER_UNIT: 120262306a36Sopenharmony_ci edh = (struct tmComResEncoderDescrHeader *)(buf + idx); 120362306a36Sopenharmony_ci dprintk(DBGLVL_API, " ENCODER_UNIT\n"); 120462306a36Sopenharmony_ci dprintk(DBGLVL_API, " subtype = 0x%x\n", edh->subtype); 120562306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", edh->unitid); 120662306a36Sopenharmony_ci dprintk(DBGLVL_API, " vsourceid = 0x%x\n", 120762306a36Sopenharmony_ci edh->vsourceid); 120862306a36Sopenharmony_ci dprintk(DBGLVL_API, " asourceid = 0x%x\n", 120962306a36Sopenharmony_ci edh->asourceid); 121062306a36Sopenharmony_ci dprintk(DBGLVL_API, " iunit = 0x%x\n", edh->iunit); 121162306a36Sopenharmony_ci if (edh->iunit == edh->unitid) { 121262306a36Sopenharmony_ci if (currpath == 1) 121362306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 121462306a36Sopenharmony_ci else 121562306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 121662306a36Sopenharmony_ci memcpy(&encport->encunit, edh, 121762306a36Sopenharmony_ci sizeof(struct tmComResEncoderDescrHeader)); 121862306a36Sopenharmony_ci dprintk(DBGLVL_API, 121962306a36Sopenharmony_ci " (becomes dev->enc[%d])\n", 122062306a36Sopenharmony_ci encport->nr); 122162306a36Sopenharmony_ci } 122262306a36Sopenharmony_ci break; 122362306a36Sopenharmony_ci case EXTENSION_UNIT: 122462306a36Sopenharmony_ci dprintk(DBGLVL_API, " EXTENSION_UNIT\n"); 122562306a36Sopenharmony_ci exthdr = (struct tmComResExtDevDescrHeader *)(buf + idx); 122662306a36Sopenharmony_ci dprintk(DBGLVL_API, " unitid = 0x%x\n", 122762306a36Sopenharmony_ci exthdr->unitid); 122862306a36Sopenharmony_ci dprintk(DBGLVL_API, " deviceid = 0x%x\n", 122962306a36Sopenharmony_ci exthdr->deviceid); 123062306a36Sopenharmony_ci dprintk(DBGLVL_API, " devicetype = 0x%x\n", 123162306a36Sopenharmony_ci exthdr->devicetype); 123262306a36Sopenharmony_ci if (exthdr->devicetype & 0x1) 123362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Decoder Device\n"); 123462306a36Sopenharmony_ci if (exthdr->devicetype & 0x2) 123562306a36Sopenharmony_ci dprintk(DBGLVL_API, " = GPIO Source\n"); 123662306a36Sopenharmony_ci if (exthdr->devicetype & 0x4) 123762306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Video Decoder\n"); 123862306a36Sopenharmony_ci if (exthdr->devicetype & 0x8) 123962306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Audio Decoder\n"); 124062306a36Sopenharmony_ci if (exthdr->devicetype & 0x20) 124162306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Crossbar\n"); 124262306a36Sopenharmony_ci if (exthdr->devicetype & 0x40) 124362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Tuner\n"); 124462306a36Sopenharmony_ci if (exthdr->devicetype & 0x80) 124562306a36Sopenharmony_ci dprintk(DBGLVL_API, " = IF PLL\n"); 124662306a36Sopenharmony_ci if (exthdr->devicetype & 0x100) 124762306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Demodulator\n"); 124862306a36Sopenharmony_ci if (exthdr->devicetype & 0x200) 124962306a36Sopenharmony_ci dprintk(DBGLVL_API, " = RDS Decoder\n"); 125062306a36Sopenharmony_ci if (exthdr->devicetype & 0x400) 125162306a36Sopenharmony_ci dprintk(DBGLVL_API, " = Encoder\n"); 125262306a36Sopenharmony_ci if (exthdr->devicetype & 0x800) 125362306a36Sopenharmony_ci dprintk(DBGLVL_API, " = IR Decoder\n"); 125462306a36Sopenharmony_ci if (exthdr->devicetype & 0x1000) 125562306a36Sopenharmony_ci dprintk(DBGLVL_API, " = EEPROM\n"); 125662306a36Sopenharmony_ci if (exthdr->devicetype & 0x2000) 125762306a36Sopenharmony_ci dprintk(DBGLVL_API, 125862306a36Sopenharmony_ci " = VBI Decoder\n"); 125962306a36Sopenharmony_ci if (exthdr->devicetype & 0x10000) 126062306a36Sopenharmony_ci dprintk(DBGLVL_API, 126162306a36Sopenharmony_ci " = Streaming Device\n"); 126262306a36Sopenharmony_ci if (exthdr->devicetype & 0x20000) 126362306a36Sopenharmony_ci dprintk(DBGLVL_API, 126462306a36Sopenharmony_ci " = DRM Device\n"); 126562306a36Sopenharmony_ci if (exthdr->devicetype & 0x40000000) 126662306a36Sopenharmony_ci dprintk(DBGLVL_API, 126762306a36Sopenharmony_ci " = Generic Device\n"); 126862306a36Sopenharmony_ci if (exthdr->devicetype & 0x80000000) 126962306a36Sopenharmony_ci dprintk(DBGLVL_API, 127062306a36Sopenharmony_ci " = Config Space Device\n"); 127162306a36Sopenharmony_ci dprintk(DBGLVL_API, " numgpiopins = 0x%x\n", 127262306a36Sopenharmony_ci exthdr->numgpiopins); 127362306a36Sopenharmony_ci dprintk(DBGLVL_API, " numgpiogroups = 0x%x\n", 127462306a36Sopenharmony_ci exthdr->numgpiogroups); 127562306a36Sopenharmony_ci dprintk(DBGLVL_API, " controlsize = 0x%x\n", 127662306a36Sopenharmony_ci exthdr->controlsize); 127762306a36Sopenharmony_ci if (exthdr->devicetype & 0x80) { 127862306a36Sopenharmony_ci if (currpath == 1) 127962306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC1]; 128062306a36Sopenharmony_ci else 128162306a36Sopenharmony_ci encport = &dev->ports[SAA7164_PORT_ENC2]; 128262306a36Sopenharmony_ci memcpy(&encport->ifunit, exthdr, 128362306a36Sopenharmony_ci sizeof(struct tmComResExtDevDescrHeader)); 128462306a36Sopenharmony_ci dprintk(DBGLVL_API, 128562306a36Sopenharmony_ci " (becomes dev->enc[%d])\n", 128662306a36Sopenharmony_ci encport->nr); 128762306a36Sopenharmony_ci } 128862306a36Sopenharmony_ci break; 128962306a36Sopenharmony_ci case PVC_INFRARED_UNIT: 129062306a36Sopenharmony_ci dprintk(DBGLVL_API, " PVC_INFRARED_UNIT\n"); 129162306a36Sopenharmony_ci break; 129262306a36Sopenharmony_ci case DRM_UNIT: 129362306a36Sopenharmony_ci dprintk(DBGLVL_API, " DRM_UNIT\n"); 129462306a36Sopenharmony_ci break; 129562306a36Sopenharmony_ci default: 129662306a36Sopenharmony_ci dprintk(DBGLVL_API, "default %d\n", hdr->subtype); 129762306a36Sopenharmony_ci } 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci dprintk(DBGLVL_API, " 1.%x\n", hdr->len); 130062306a36Sopenharmony_ci dprintk(DBGLVL_API, " 2.%x\n", hdr->type); 130162306a36Sopenharmony_ci dprintk(DBGLVL_API, " 3.%x\n", hdr->subtype); 130262306a36Sopenharmony_ci dprintk(DBGLVL_API, " 4.%x\n", hdr->unitid); 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci idx += hdr->len; 130562306a36Sopenharmony_ci } 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci return 0; 130862306a36Sopenharmony_ci} 130962306a36Sopenharmony_ci 131062306a36Sopenharmony_ciint saa7164_api_enum_subdevs(struct saa7164_dev *dev) 131162306a36Sopenharmony_ci{ 131262306a36Sopenharmony_ci int ret; 131362306a36Sopenharmony_ci u32 buflen = 0; 131462306a36Sopenharmony_ci u8 *buf; 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s()\n", __func__); 131762306a36Sopenharmony_ci 131862306a36Sopenharmony_ci /* Get the total descriptor length */ 131962306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_LEN, 132062306a36Sopenharmony_ci GET_DESCRIPTORS_CONTROL, sizeof(buflen), &buflen); 132162306a36Sopenharmony_ci if (ret != SAA_OK) 132262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 132362306a36Sopenharmony_ci 132462306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() total descriptor size = %d bytes.\n", 132562306a36Sopenharmony_ci __func__, buflen); 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci /* Allocate enough storage for all of the descs */ 132862306a36Sopenharmony_ci buf = kzalloc(buflen, GFP_KERNEL); 132962306a36Sopenharmony_ci if (!buf) 133062306a36Sopenharmony_ci return SAA_ERR_NO_RESOURCES; 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci /* Retrieve them */ 133362306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, 0, GET_CUR, 133462306a36Sopenharmony_ci GET_DESCRIPTORS_CONTROL, buflen, buf); 133562306a36Sopenharmony_ci if (ret != SAA_OK) { 133662306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__, ret); 133762306a36Sopenharmony_ci goto out; 133862306a36Sopenharmony_ci } 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci if (saa_debug & DBGLVL_API) 134162306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf, 134262306a36Sopenharmony_ci buflen & ~15, false); 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci saa7164_api_dump_subdevs(dev, buf, buflen); 134562306a36Sopenharmony_ci 134662306a36Sopenharmony_ciout: 134762306a36Sopenharmony_ci kfree(buf); 134862306a36Sopenharmony_ci return ret; 134962306a36Sopenharmony_ci} 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ciint saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg, 135262306a36Sopenharmony_ci u32 datalen, u8 *data) 135362306a36Sopenharmony_ci{ 135462306a36Sopenharmony_ci struct saa7164_dev *dev = bus->dev; 135562306a36Sopenharmony_ci u16 len = 0; 135662306a36Sopenharmony_ci int unitid; 135762306a36Sopenharmony_ci u8 buf[256]; 135862306a36Sopenharmony_ci int ret; 135962306a36Sopenharmony_ci 136062306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() addr=%x reglen=%d datalen=%d\n", 136162306a36Sopenharmony_ci __func__, addr, reglen, datalen); 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci if (reglen > 4) 136462306a36Sopenharmony_ci return -EIO; 136562306a36Sopenharmony_ci 136662306a36Sopenharmony_ci /* Prepare the send buffer */ 136762306a36Sopenharmony_ci /* Bytes 00-03 source register length 136862306a36Sopenharmony_ci * 04-07 source bytes to read 136962306a36Sopenharmony_ci * 08... register address 137062306a36Sopenharmony_ci */ 137162306a36Sopenharmony_ci memset(buf, 0, sizeof(buf)); 137262306a36Sopenharmony_ci memcpy((buf + 2 * sizeof(u32) + 0), reg, reglen); 137362306a36Sopenharmony_ci *((u32 *)(buf + 0 * sizeof(u32))) = reglen; 137462306a36Sopenharmony_ci *((u32 *)(buf + 1 * sizeof(u32))) = datalen; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci unitid = saa7164_i2caddr_to_unitid(bus, addr); 137762306a36Sopenharmony_ci if (unitid < 0) { 137862306a36Sopenharmony_ci printk(KERN_ERR 137962306a36Sopenharmony_ci "%s() error, cannot translate regaddr 0x%x to unitid\n", 138062306a36Sopenharmony_ci __func__, addr); 138162306a36Sopenharmony_ci return -EIO; 138262306a36Sopenharmony_ci } 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_ci ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN, 138562306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); 138662306a36Sopenharmony_ci if (ret != SAA_OK) { 138762306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); 138862306a36Sopenharmony_ci return -EIO; 138962306a36Sopenharmony_ci } 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() len = %d bytes\n", __func__, len); 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci if (saa_debug & DBGLVL_I2C) 139462306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, buf, 139562306a36Sopenharmony_ci 32, false); 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci ret = saa7164_cmd_send(bus->dev, unitid, GET_CUR, 139862306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, len, &buf); 139962306a36Sopenharmony_ci if (ret != SAA_OK) 140062306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); 140162306a36Sopenharmony_ci else { 140262306a36Sopenharmony_ci if (saa_debug & DBGLVL_I2C) 140362306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, 140462306a36Sopenharmony_ci buf, sizeof(buf), false); 140562306a36Sopenharmony_ci memcpy(data, (buf + 2 * sizeof(u32) + reglen), datalen); 140662306a36Sopenharmony_ci } 140762306a36Sopenharmony_ci 140862306a36Sopenharmony_ci return ret == SAA_OK ? 0 : -EIO; 140962306a36Sopenharmony_ci} 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci/* For a given 8 bit i2c address device, write the buffer */ 141262306a36Sopenharmony_ciint saa7164_api_i2c_write(struct saa7164_i2c *bus, u8 addr, u32 datalen, 141362306a36Sopenharmony_ci u8 *data) 141462306a36Sopenharmony_ci{ 141562306a36Sopenharmony_ci struct saa7164_dev *dev = bus->dev; 141662306a36Sopenharmony_ci u16 len = 0; 141762306a36Sopenharmony_ci int unitid; 141862306a36Sopenharmony_ci int reglen; 141962306a36Sopenharmony_ci u8 buf[256]; 142062306a36Sopenharmony_ci int ret; 142162306a36Sopenharmony_ci 142262306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() addr=0x%2x len=0x%x\n", 142362306a36Sopenharmony_ci __func__, addr, datalen); 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci if ((datalen == 0) || (datalen > 232)) 142662306a36Sopenharmony_ci return -EIO; 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci memset(buf, 0, sizeof(buf)); 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci unitid = saa7164_i2caddr_to_unitid(bus, addr); 143162306a36Sopenharmony_ci if (unitid < 0) { 143262306a36Sopenharmony_ci printk(KERN_ERR 143362306a36Sopenharmony_ci "%s() error, cannot translate regaddr 0x%x to unitid\n", 143462306a36Sopenharmony_ci __func__, addr); 143562306a36Sopenharmony_ci return -EIO; 143662306a36Sopenharmony_ci } 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_ci reglen = saa7164_i2caddr_to_reglen(bus, addr); 143962306a36Sopenharmony_ci if (reglen < 0) { 144062306a36Sopenharmony_ci printk(KERN_ERR 144162306a36Sopenharmony_ci "%s() error, cannot translate regaddr to reglen\n", 144262306a36Sopenharmony_ci __func__); 144362306a36Sopenharmony_ci return -EIO; 144462306a36Sopenharmony_ci } 144562306a36Sopenharmony_ci 144662306a36Sopenharmony_ci ret = saa7164_cmd_send(bus->dev, unitid, GET_LEN, 144762306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, sizeof(len), &len); 144862306a36Sopenharmony_ci if (ret != SAA_OK) { 144962306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(1) = 0x%x\n", __func__, ret); 145062306a36Sopenharmony_ci return -EIO; 145162306a36Sopenharmony_ci } 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s() len = %d bytes unitid=0x%x\n", __func__, 145462306a36Sopenharmony_ci len, unitid); 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_ci /* Prepare the send buffer */ 145762306a36Sopenharmony_ci /* Bytes 00-03 dest register length 145862306a36Sopenharmony_ci * 04-07 dest bytes to write 145962306a36Sopenharmony_ci * 08... register address 146062306a36Sopenharmony_ci */ 146162306a36Sopenharmony_ci *((u32 *)(buf + 0 * sizeof(u32))) = reglen; 146262306a36Sopenharmony_ci *((u32 *)(buf + 1 * sizeof(u32))) = datalen - reglen; 146362306a36Sopenharmony_ci memcpy((buf + 2 * sizeof(u32)), data, datalen); 146462306a36Sopenharmony_ci 146562306a36Sopenharmony_ci if (saa_debug & DBGLVL_I2C) 146662306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, 146762306a36Sopenharmony_ci buf, sizeof(buf), false); 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci ret = saa7164_cmd_send(bus->dev, unitid, SET_CUR, 147062306a36Sopenharmony_ci EXU_REGISTER_ACCESS_CONTROL, len, &buf); 147162306a36Sopenharmony_ci if (ret != SAA_OK) 147262306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret(2) = 0x%x\n", __func__, ret); 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_ci return ret == SAA_OK ? 0 : -EIO; 147562306a36Sopenharmony_ci} 147662306a36Sopenharmony_ci 147762306a36Sopenharmony_cistatic int saa7164_api_modify_gpio(struct saa7164_dev *dev, u8 unitid, 147862306a36Sopenharmony_ci u8 pin, u8 state) 147962306a36Sopenharmony_ci{ 148062306a36Sopenharmony_ci int ret; 148162306a36Sopenharmony_ci struct tmComResGPIO t; 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci dprintk(DBGLVL_API, "%s(0x%x, %d, %d)\n", 148462306a36Sopenharmony_ci __func__, unitid, pin, state); 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ci if ((pin > 7) || (state > 2)) 148762306a36Sopenharmony_ci return SAA_ERR_BAD_PARAMETER; 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ci t.pin = pin; 149062306a36Sopenharmony_ci t.state = state; 149162306a36Sopenharmony_ci 149262306a36Sopenharmony_ci ret = saa7164_cmd_send(dev, unitid, SET_CUR, 149362306a36Sopenharmony_ci EXU_GPIO_CONTROL, sizeof(t), &t); 149462306a36Sopenharmony_ci if (ret != SAA_OK) 149562306a36Sopenharmony_ci printk(KERN_ERR "%s() error, ret = 0x%x\n", 149662306a36Sopenharmony_ci __func__, ret); 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_ci return ret; 149962306a36Sopenharmony_ci} 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ciint saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, 150262306a36Sopenharmony_ci u8 pin) 150362306a36Sopenharmony_ci{ 150462306a36Sopenharmony_ci return saa7164_api_modify_gpio(dev, unitid, pin, 1); 150562306a36Sopenharmony_ci} 150662306a36Sopenharmony_ci 150762306a36Sopenharmony_ciint saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, 150862306a36Sopenharmony_ci u8 pin) 150962306a36Sopenharmony_ci{ 151062306a36Sopenharmony_ci return saa7164_api_modify_gpio(dev, unitid, pin, 0); 151162306a36Sopenharmony_ci} 151262306a36Sopenharmony_ci 1513