Lines Matching +full:firmware +full:- +full:initialised
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * This driver needs external firmware. Please use the command
12 * download/extract it, and then copy it to /usr/lib/hotplug/firmware
13 * or /lib/firmware (depending on configuration of firmware hotplug).
15 #define SP8870_DEFAULT_FIRMWARE "dvb-fe-sp8870.fw"
20 #include <linux/firmware.h>
38 u8 initialised:1; member
47 /* firmware size for sp8870 */
50 /* starting point for firmware in file 'Sc_main.mc' */
56 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 4 }; in sp8870_writereg()
59 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) { in sp8870_writereg()
61 return -EREMOTEIO; in sp8870_writereg()
72 …struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 … in sp8870_readreg()
73 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 } }; in sp8870_readreg()
75 ret = i2c_transfer (state->i2c, msg, 2); in sp8870_readreg()
79 return -1; in sp8870_readreg()
85 static int sp8870_firmware_upload (struct sp8870_state* state, const struct firmware *fw) in sp8870_firmware_upload()
88 const char *fw_buf = fw->data; in sp8870_firmware_upload()
96 if (fw->size < SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET) in sp8870_firmware_upload()
97 return -EINVAL; in sp8870_firmware_upload()
108 // do firmware upload in sp8870_firmware_upload()
111 …P8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET - 252) ? 252 : SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE… in sp8870_firmware_upload()
116 msg.addr = state->config->demod_address; in sp8870_firmware_upload()
120 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) { in sp8870_firmware_upload()
121 printk("%s: firmware upload failed!\n", __func__); in sp8870_firmware_upload()
164 switch (p->modulation) { in configure_reg0xc05()
177 return -EINVAL; in configure_reg0xc05()
180 switch (p->hierarchy) { in configure_reg0xc05()
196 return -EINVAL; in configure_reg0xc05()
199 switch (p->code_rate_HP) { in configure_reg0xc05()
218 return -EINVAL; in configure_reg0xc05()
237 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in sp8870_set_frontend_parameters()
238 struct sp8870_state* state = fe->demodulator_priv; in sp8870_set_frontend_parameters()
249 if (fe->ops.tuner_ops.set_params) { in sp8870_set_frontend_parameters()
250 fe->ops.tuner_ops.set_params(fe); in sp8870_set_frontend_parameters()
251 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); in sp8870_set_frontend_parameters()
267 if (p->bandwidth_hz == 6000000) in sp8870_set_frontend_parameters()
269 else if (p->bandwidth_hz == 7000000) in sp8870_set_frontend_parameters()
275 if (p->transmission_mode == TRANSMISSION_MODE_2K) in sp8870_set_frontend_parameters()
295 struct sp8870_state* state = fe->demodulator_priv; in sp8870_init()
296 const struct firmware *fw = NULL; in sp8870_init()
299 if (state->initialised) return 0; in sp8870_init()
300 state->initialised = 1; in sp8870_init()
305 /* request the firmware, this will block until someone uploads it */ in sp8870_init()
306 printk("sp8870: waiting for firmware upload (%s)...\n", SP8870_DEFAULT_FIRMWARE); in sp8870_init()
307 if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) { in sp8870_init()
308 printk("sp8870: no firmware upload (timeout or file not found?)\n"); in sp8870_init()
309 return -EIO; in sp8870_init()
313 printk("sp8870: writing firmware to device failed\n"); in sp8870_init()
315 return -EIO; in sp8870_init()
318 printk("sp8870: firmware upload complete\n"); in sp8870_init()
345 struct sp8870_state* state = fe->demodulator_priv; in sp8870_read_status()
353 return -EIO; in sp8870_read_status()
357 return -EIO; in sp8870_read_status()
371 struct sp8870_state* state = fe->demodulator_priv; in sp8870_read_ber()
379 return -EIO; in sp8870_read_ber()
385 return -EIO; in sp8870_read_ber()
398 struct sp8870_state* state = fe->demodulator_priv; in sp8870_read_signal_strength()
406 return -EIO; in sp8870_read_signal_strength()
412 return -EIO; in sp8870_read_signal_strength()
417 *signal = 0xFFFF - tmp; in sp8870_read_signal_strength()
424 struct sp8870_state* state = fe->demodulator_priv; in sp8870_read_uncorrected_blocks()
431 return -EIO; in sp8870_read_uncorrected_blocks()
453 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in sp8870_set_frontend()
454 struct sp8870_state* state = fe->demodulator_priv; in sp8870_set_frontend()
457 The firmware of the sp8870 sometimes locks up after setting frontend parameters. in sp8870_set_frontend()
468 dprintk("%s: frequency = %i\n", __func__, p->frequency); in sp8870_set_frontend()
491 printk("%s: firmware crash!!!!!!\n", __func__); in sp8870_set_frontend()
492 return -EIO; in sp8870_set_frontend()
498 printk("%s: firmware lockup!!!\n", __func__); in sp8870_set_frontend()
499 printk("%s: recovered after %i trial(s))\n", __func__, trials - 1); in sp8870_set_frontend()
512 struct sp8870_state* state = fe->demodulator_priv; in sp8870_sleep()
520 fesettings->min_delay_ms = 350; in sp8870_get_tune_settings()
521 fesettings->step_size = 0; in sp8870_get_tune_settings()
522 fesettings->max_drift = 0; in sp8870_get_tune_settings()
528 struct sp8870_state* state = fe->demodulator_priv; in sp8870_i2c_gate_ctrl()
539 struct sp8870_state* state = fe->demodulator_priv; in sp8870_release()
555 state->config = config; in sp8870_attach()
556 state->i2c = i2c; in sp8870_attach()
557 state->initialised = 0; in sp8870_attach()
563 memcpy(&state->frontend.ops, &sp8870_ops, sizeof(struct dvb_frontend_ops)); in sp8870_attach()
564 state->frontend.demodulator_priv = state; in sp8870_attach()
565 return &state->frontend; in sp8870_attach()
575 .name = "Spase SP8870 DVB-T",
605 MODULE_DESCRIPTION("Spase SP8870 DVB-T Demodulator driver");