199 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Abilis Systems Single DVB-T Receiver4 * Copyright (C) 2008 Pierrick Hascoet <pierrick.hascoet@abilis.com>5 */6 7#include <linux/kernel.h>8#include "as102_drv.h"9#include "as10x_cmd.h"10 11/**12 * as10x_cmd_add_PID_filter - send add filter command to AS10x13 * @adap: pointer to AS10x bus adapter14 * @filter: TSFilter filter for DVB-T15 *16 * Return 0 on success or negative value in case of error.17 */18int as10x_cmd_add_PID_filter(struct as10x_bus_adapter_t *adap,19 struct as10x_ts_filter *filter)20{21 int error;22 struct as10x_cmd_t *pcmd, *prsp;23 24 pcmd = adap->cmd;25 prsp = adap->rsp;26 27 /* prepare command */28 as10x_cmd_build(pcmd, (++adap->cmd_xid),29 sizeof(pcmd->body.add_pid_filter.req));30 31 /* fill command */32 pcmd->body.add_pid_filter.req.proc_id =33 cpu_to_le16(CONTROL_PROC_SETFILTER);34 pcmd->body.add_pid_filter.req.pid = cpu_to_le16(filter->pid);35 pcmd->body.add_pid_filter.req.stream_type = filter->type;36 37 if (filter->idx < 16)38 pcmd->body.add_pid_filter.req.idx = filter->idx;39 else40 pcmd->body.add_pid_filter.req.idx = 0xFF;41 42 /* send command */43 if (adap->ops->xfer_cmd) {44 error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,45 sizeof(pcmd->body.add_pid_filter.req)46 + HEADER_SIZE, (uint8_t *) prsp,47 sizeof(prsp->body.add_pid_filter.rsp)48 + HEADER_SIZE);49 } else {50 error = AS10X_CMD_ERROR;51 }52 53 if (error < 0)54 goto out;55 56 /* parse response */57 error = as10x_rsp_parse(prsp, CONTROL_PROC_SETFILTER_RSP);58 59 if (error == 0) {60 /* Response OK -> get response data */61 filter->idx = prsp->body.add_pid_filter.rsp.filter_id;62 }63 64out:65 return error;66}67 68/**69 * as10x_cmd_del_PID_filter - Send delete filter command to AS10x70 * @adap: pointer to AS10x bus adapte71 * @pid_value: PID to delete72 *73 * Return 0 on success or negative value in case of error.74 */75int as10x_cmd_del_PID_filter(struct as10x_bus_adapter_t *adap,76 uint16_t pid_value)77{78 int error;79 struct as10x_cmd_t *pcmd, *prsp;80 81 pcmd = adap->cmd;82 prsp = adap->rsp;83 84 /* prepare command */85 as10x_cmd_build(pcmd, (++adap->cmd_xid),86 sizeof(pcmd->body.del_pid_filter.req));87 88 /* fill command */89 pcmd->body.del_pid_filter.req.proc_id =90 cpu_to_le16(CONTROL_PROC_REMOVEFILTER);91 pcmd->body.del_pid_filter.req.pid = cpu_to_le16(pid_value);92 93 /* send command */94 if (adap->ops->xfer_cmd) {95 error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,96 sizeof(pcmd->body.del_pid_filter.req)97 + HEADER_SIZE, (uint8_t *) prsp,98 sizeof(prsp->body.del_pid_filter.rsp)99 + HEADER_SIZE);100 } else {101 error = AS10X_CMD_ERROR;102 }103 104 if (error < 0)105 goto out;106 107 /* parse response */108 error = as10x_rsp_parse(prsp, CONTROL_PROC_REMOVEFILTER_RSP);109 110out:111 return error;112}113 114/**115 * as10x_cmd_start_streaming - Send start streaming command to AS10x116 * @adap: pointer to AS10x bus adapter117 *118 * Return 0 on success or negative value in case of error.119 */120int as10x_cmd_start_streaming(struct as10x_bus_adapter_t *adap)121{122 int error;123 struct as10x_cmd_t *pcmd, *prsp;124 125 pcmd = adap->cmd;126 prsp = adap->rsp;127 128 /* prepare command */129 as10x_cmd_build(pcmd, (++adap->cmd_xid),130 sizeof(pcmd->body.start_streaming.req));131 132 /* fill command */133 pcmd->body.start_streaming.req.proc_id =134 cpu_to_le16(CONTROL_PROC_START_STREAMING);135 136 /* send command */137 if (adap->ops->xfer_cmd) {138 error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,139 sizeof(pcmd->body.start_streaming.req)140 + HEADER_SIZE, (uint8_t *) prsp,141 sizeof(prsp->body.start_streaming.rsp)142 + HEADER_SIZE);143 } else {144 error = AS10X_CMD_ERROR;145 }146 147 if (error < 0)148 goto out;149 150 /* parse response */151 error = as10x_rsp_parse(prsp, CONTROL_PROC_START_STREAMING_RSP);152 153out:154 return error;155}156 157/**158 * as10x_cmd_stop_streaming - Send stop streaming command to AS10x159 * @adap: pointer to AS10x bus adapter160 *161 * Return 0 on success or negative value in case of error.162 */163int as10x_cmd_stop_streaming(struct as10x_bus_adapter_t *adap)164{165 int8_t error;166 struct as10x_cmd_t *pcmd, *prsp;167 168 pcmd = adap->cmd;169 prsp = adap->rsp;170 171 /* prepare command */172 as10x_cmd_build(pcmd, (++adap->cmd_xid),173 sizeof(pcmd->body.stop_streaming.req));174 175 /* fill command */176 pcmd->body.stop_streaming.req.proc_id =177 cpu_to_le16(CONTROL_PROC_STOP_STREAMING);178 179 /* send command */180 if (adap->ops->xfer_cmd) {181 error = adap->ops->xfer_cmd(adap, (uint8_t *) pcmd,182 sizeof(pcmd->body.stop_streaming.req)183 + HEADER_SIZE, (uint8_t *) prsp,184 sizeof(prsp->body.stop_streaming.rsp)185 + HEADER_SIZE);186 } else {187 error = AS10X_CMD_ERROR;188 }189 190 if (error < 0)191 goto out;192 193 /* parse response */194 error = as10x_rsp_parse(prsp, CONTROL_PROC_STOP_STREAMING_RSP);195 196out:197 return error;198}199