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