forked from Minki/linux
51c2664ab0
At connection time (or boot) in si2168_probe(), the firmware is not loaded to the device and the device is not fully activated. It is not useful or sensible to do this full initialization on resume in case it has not been previously initialized and is expected to be in this initialized state. Calling si2168_init() and therefore reading the firmware file for the first time during resume leads to problems and should be avoided. It is however safe to read the firmware file once it has already been read outside of a suspend/resume situation. Add a staus flag 'initialized' to store whether si2168_init() has successfully been called. If initialization fails (e.g. due to missing firmware file), the flag is not set. Register a separate si2168_resume callback which only calls si2168_init() once the 'initialized' flag has been set and it is safe to load the firmware at resume. The first call to si2168_init() will now always happen when the device is actually used for the first time and never during resume. This avoids the unsafe firmware file reading and should also speed up resume by skipping unnecessary device initialization. Link: https://lore.kernel.org/linux-media/20210418001204.7453-3-kernel@tuxforce.de [mchehab: fix several Coding Style issues] Cc: Antti Palosaari <crope@iki.fi> Signed-off-by: Lukas Middendorf <kernel@tuxforce.de> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Silicon Labs Si2168 DVB-T/T2/C demodulator driver
|
|
*
|
|
* Copyright (C) 2014 Antti Palosaari <crope@iki.fi>
|
|
*/
|
|
|
|
#ifndef SI2168_PRIV_H
|
|
#define SI2168_PRIV_H
|
|
|
|
#include "si2168.h"
|
|
#include <media/dvb_frontend.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/i2c-mux.h>
|
|
#include <linux/kernel.h>
|
|
|
|
#define SI2168_A20_FIRMWARE "dvb-demod-si2168-a20-01.fw"
|
|
#define SI2168_A30_FIRMWARE "dvb-demod-si2168-a30-01.fw"
|
|
#define SI2168_B40_FIRMWARE "dvb-demod-si2168-b40-01.fw"
|
|
#define SI2168_D60_FIRMWARE "dvb-demod-si2168-d60-01.fw"
|
|
|
|
/* state struct */
|
|
struct si2168_dev {
|
|
struct mutex i2c_mutex;
|
|
struct i2c_mux_core *muxc;
|
|
struct dvb_frontend fe;
|
|
enum fe_delivery_system delivery_system;
|
|
enum fe_status fe_status;
|
|
#define SI2168_CHIP_ID_A20 ('A' << 24 | 68 << 16 | '2' << 8 | '0' << 0)
|
|
#define SI2168_CHIP_ID_A30 ('A' << 24 | 68 << 16 | '3' << 8 | '0' << 0)
|
|
#define SI2168_CHIP_ID_B40 ('B' << 24 | 68 << 16 | '4' << 8 | '0' << 0)
|
|
#define SI2168_CHIP_ID_D60 ('D' << 24 | 68 << 16 | '6' << 8 | '0' << 0)
|
|
unsigned int chip_id;
|
|
unsigned int version;
|
|
const char *firmware_name;
|
|
u8 ts_mode;
|
|
unsigned int active:1;
|
|
unsigned int warm:1;
|
|
unsigned int initialized:1;
|
|
unsigned int ts_clock_inv:1;
|
|
unsigned int ts_clock_gapped:1;
|
|
unsigned int spectral_inversion:1;
|
|
};
|
|
|
|
/* firmware command struct */
|
|
#define SI2168_ARGLEN 30
|
|
struct si2168_cmd {
|
|
u8 args[SI2168_ARGLEN];
|
|
unsigned wlen;
|
|
unsigned rlen;
|
|
};
|
|
|
|
#endif
|