Lines Matching +full:fw +full:- +full:cfg
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include "cx18-version.h"
10 #include "cx18-dvb.h"
11 #include "cx18-io.h"
12 #include "cx18-queue.h"
13 #include "cx18-streams.h"
14 #include "cx18-cards.h"
15 #include "cx18-gpio.h"
29 #define FWFILE "dvb-cx18-mpc718-mt352.fw"
123 const struct firmware **fw) in yuan_mpc718_mt352_reqfw() argument
125 struct cx18 *cx = stream->cx; in yuan_mpc718_mt352_reqfw()
129 ret = request_firmware(fw, fn, &cx->pci_dev->dev); in yuan_mpc718_mt352_reqfw()
133 size_t sz = (*fw)->size; in yuan_mpc718_mt352_reqfw()
137 ret = -EILSEQ; in yuan_mpc718_mt352_reqfw()
138 release_firmware(*fw); in yuan_mpc718_mt352_reqfw()
139 *fw = NULL; in yuan_mpc718_mt352_reqfw()
144 CX18_ERR("The MPC718 board variant with the MT352 DVB-T demodulator will not work without it\n"); in yuan_mpc718_mt352_reqfw()
152 struct cx18_dvb *dvb = container_of(fe->dvb, in yuan_mpc718_mt352_init()
154 struct cx18_stream *stream = dvb->stream; in yuan_mpc718_mt352_init()
155 const struct firmware *fw = NULL; in yuan_mpc718_mt352_init() local
160 ret = yuan_mpc718_mt352_reqfw(stream, &fw); in yuan_mpc718_mt352_init()
164 /* Loop through all the register-value pairs in the firmware file */ in yuan_mpc718_mt352_init()
165 for (i = 0; i < fw->size; i += 2) { in yuan_mpc718_mt352_init()
166 buf[0] = fw->data[i]; in yuan_mpc718_mt352_init()
184 /* 4.56 MHz IF: (20.48 - 4.56)/20.48 * 2^14 = 0x31c0 */ in yuan_mpc718_mt352_init()
190 /* Pass through the register-value pair from the fw */ in yuan_mpc718_mt352_init()
191 buf[1] = fw->data[i+1]; in yuan_mpc718_mt352_init()
200 release_firmware(fw); in yuan_mpc718_mt352_init()
236 struct dvb_demux *demux = feed->demux; in cx18_dvb_start_feed()
237 struct cx18_stream *stream = demux->priv; in cx18_dvb_start_feed()
243 return -EINVAL; in cx18_dvb_start_feed()
245 cx = stream->cx; in cx18_dvb_start_feed()
247 feed->pid, feed->index); in cx18_dvb_start_feed()
249 mutex_lock(&cx->serialize_lock); in cx18_dvb_start_feed()
251 mutex_unlock(&cx->serialize_lock); in cx18_dvb_start_feed()
256 ret = -EINVAL; in cx18_dvb_start_feed()
258 switch (cx->card->type) { in cx18_dvb_start_feed()
264 v |= 0x00002000; /* Data Length - Byte */ in cx18_dvb_start_feed()
265 v |= 0x00010000; /* Error - Polarity */ in cx18_dvb_start_feed()
266 v |= 0x00020000; /* Error - Passthru */ in cx18_dvb_start_feed()
267 v |= 0x000c0000; /* Error - Ignore */ in cx18_dvb_start_feed()
275 /* Assumption - Parallel transport - Signalling in cx18_dvb_start_feed()
281 if (!demux->dmx.frontend) in cx18_dvb_start_feed()
282 return -EINVAL; in cx18_dvb_start_feed()
284 mutex_lock(&stream->dvb->feedlock); in cx18_dvb_start_feed()
285 if (stream->dvb->feeding++ == 0) { in cx18_dvb_start_feed()
287 mutex_lock(&cx->serialize_lock); in cx18_dvb_start_feed()
288 set_bit(CX18_F_S_STREAMING, &stream->s_flags); in cx18_dvb_start_feed()
292 stream->dvb->feeding--; in cx18_dvb_start_feed()
293 if (stream->dvb->feeding == 0) in cx18_dvb_start_feed()
294 clear_bit(CX18_F_S_STREAMING, &stream->s_flags); in cx18_dvb_start_feed()
296 mutex_unlock(&cx->serialize_lock); in cx18_dvb_start_feed()
299 mutex_unlock(&stream->dvb->feedlock); in cx18_dvb_start_feed()
307 struct dvb_demux *demux = feed->demux; in cx18_dvb_stop_feed()
308 struct cx18_stream *stream = demux->priv; in cx18_dvb_stop_feed()
310 int ret = -EINVAL; in cx18_dvb_stop_feed()
313 cx = stream->cx; in cx18_dvb_stop_feed()
315 feed->pid, feed->index); in cx18_dvb_stop_feed()
317 mutex_lock(&stream->dvb->feedlock); in cx18_dvb_stop_feed()
318 if (--stream->dvb->feeding == 0) { in cx18_dvb_stop_feed()
320 mutex_lock(&cx->serialize_lock); in cx18_dvb_stop_feed()
322 mutex_unlock(&cx->serialize_lock); in cx18_dvb_stop_feed()
325 mutex_unlock(&stream->dvb->feedlock); in cx18_dvb_stop_feed()
333 struct cx18 *cx = stream->cx; in cx18_dvb_register()
334 struct cx18_dvb *dvb = stream->dvb; in cx18_dvb_register()
341 return -EINVAL; in cx18_dvb_register()
343 dvb->enabled = 0; in cx18_dvb_register()
344 dvb->stream = stream; in cx18_dvb_register()
346 ret = dvb_register_adapter(&dvb->dvb_adapter, in cx18_dvb_register()
348 THIS_MODULE, &cx->pci_dev->dev, adapter_nr); in cx18_dvb_register()
352 dvb_adapter = &dvb->dvb_adapter; in cx18_dvb_register()
354 dvbdemux = &dvb->demux; in cx18_dvb_register()
356 dvbdemux->priv = (void *)stream; in cx18_dvb_register()
358 dvbdemux->filternum = 256; in cx18_dvb_register()
359 dvbdemux->feednum = 256; in cx18_dvb_register()
360 dvbdemux->start_feed = cx18_dvb_start_feed; in cx18_dvb_register()
361 dvbdemux->stop_feed = cx18_dvb_stop_feed; in cx18_dvb_register()
362 dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | in cx18_dvb_register()
368 dmx = &dvbdemux->dmx; in cx18_dvb_register()
370 dvb->hw_frontend.source = DMX_FRONTEND_0; in cx18_dvb_register()
371 dvb->mem_frontend.source = DMX_MEMORY_FE; in cx18_dvb_register()
372 dvb->dmxdev.filternum = 256; in cx18_dvb_register()
373 dvb->dmxdev.demux = dmx; in cx18_dvb_register()
375 ret = dvb_dmxdev_init(&dvb->dmxdev, dvb_adapter); in cx18_dvb_register()
379 ret = dmx->add_frontend(dmx, &dvb->hw_frontend); in cx18_dvb_register()
383 ret = dmx->add_frontend(dmx, &dvb->mem_frontend); in cx18_dvb_register()
387 ret = dmx->connect_frontend(dmx, &dvb->hw_frontend); in cx18_dvb_register()
395 dvb_net_init(dvb_adapter, &dvb->dvbnet, dmx); in cx18_dvb_register()
399 stream->dvb->dvb_adapter.num, stream->name, in cx18_dvb_register()
400 stream->buffers, stream->buf_size/1024, in cx18_dvb_register()
401 (stream->buf_size * 100 / 1024) % 100); in cx18_dvb_register()
403 mutex_init(&dvb->feedlock); in cx18_dvb_register()
404 dvb->enabled = 1; in cx18_dvb_register()
408 dmx->disconnect_frontend(dmx); in cx18_dvb_register()
410 dmx->remove_frontend(dmx, &dvb->mem_frontend); in cx18_dvb_register()
412 dmx->remove_frontend(dmx, &dvb->hw_frontend); in cx18_dvb_register()
414 dvb_dmxdev_release(&dvb->dmxdev); in cx18_dvb_register()
425 struct cx18 *cx = stream->cx; in cx18_dvb_unregister()
426 struct cx18_dvb *dvb = stream->dvb; in cx18_dvb_unregister()
433 if (dvb == NULL || !dvb->enabled) in cx18_dvb_unregister()
436 dvb_adapter = &dvb->dvb_adapter; in cx18_dvb_unregister()
437 dvbdemux = &dvb->demux; in cx18_dvb_unregister()
438 dmx = &dvbdemux->dmx; in cx18_dvb_unregister()
440 dmx->close(dmx); in cx18_dvb_unregister()
441 dvb_net_release(&dvb->dvbnet); in cx18_dvb_unregister()
442 dmx->remove_frontend(dmx, &dvb->mem_frontend); in cx18_dvb_unregister()
443 dmx->remove_frontend(dmx, &dvb->hw_frontend); in cx18_dvb_unregister()
444 dvb_dmxdev_release(&dvb->dmxdev); in cx18_dvb_unregister()
446 dvb_unregister_frontend(dvb->fe); in cx18_dvb_unregister()
447 dvb_frontend_detach(dvb->fe); in cx18_dvb_unregister()
456 struct cx18_dvb *dvb = stream->dvb; in dvb_register()
457 struct cx18 *cx = stream->cx; in dvb_register()
460 switch (cx->card->type) { in dvb_register()
463 dvb->fe = dvb_attach(s5h1409_attach, in dvb_register()
465 &cx->i2c_adap[0]); in dvb_register()
466 if (dvb->fe != NULL) { in dvb_register()
467 dvb_attach(mxl5005s_attach, dvb->fe, in dvb_register()
468 &cx->i2c_adap[0], in dvb_register()
474 dvb->fe = dvb_attach(s5h1411_attach, in dvb_register()
476 &cx->i2c_adap[0]); in dvb_register()
477 if (dvb->fe != NULL) in dvb_register()
478 dvb_attach(tda18271_attach, dvb->fe, in dvb_register()
479 0x60, &cx->i2c_adap[0], in dvb_register()
483 dvb->fe = dvb_attach(zl10353_attach, in dvb_register()
485 &cx->i2c_adap[1]); in dvb_register()
486 if (dvb->fe != NULL) { in dvb_register()
488 struct xc2028_config cfg = { in dvb_register() local
489 .i2c_adap = &cx->i2c_adap[1], in dvb_register()
500 fe = dvb_attach(xc2028_attach, dvb->fe, &cfg); in dvb_register()
501 if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) in dvb_register()
502 fe->ops.tuner_ops.set_config(fe, &ctrl); in dvb_register()
511 dvb->fe = dvb_attach(mt352_attach, in dvb_register()
513 &cx->i2c_adap[1]); in dvb_register()
514 if (dvb->fe == NULL) in dvb_register()
515 dvb->fe = dvb_attach(zl10353_attach, in dvb_register()
517 &cx->i2c_adap[1]); in dvb_register()
518 if (dvb->fe != NULL) { in dvb_register()
520 struct xc2028_config cfg = { in dvb_register() local
521 .i2c_adap = &cx->i2c_adap[1], in dvb_register()
532 fe = dvb_attach(xc2028_attach, dvb->fe, &cfg); in dvb_register()
533 if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) in dvb_register()
534 fe->ops.tuner_ops.set_config(fe, &ctrl); in dvb_register()
538 dvb->fe = dvb_attach(zl10353_attach, in dvb_register()
540 &cx->i2c_adap[1]); in dvb_register()
541 if (dvb->fe != NULL) { in dvb_register()
543 struct xc2028_config cfg = { in dvb_register() local
544 .i2c_adap = &cx->i2c_adap[1], in dvb_register()
555 fe = dvb_attach(xc2028_attach, dvb->fe, &cfg); in dvb_register()
556 if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) in dvb_register()
557 fe->ops.tuner_ops.set_config(fe, &ctrl); in dvb_register()
565 if (dvb->fe == NULL) { in dvb_register()
567 return -1; in dvb_register()
570 dvb->fe->callback = cx18_reset_tuner_gpio; in dvb_register()
572 ret = dvb_register_frontend(&dvb->dvb_adapter, dvb->fe); in dvb_register()
574 if (dvb->fe->ops.release) in dvb_register()
575 dvb->fe->ops.release(dvb->fe); in dvb_register()