Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * TTUSB DEC Frontend Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (C) 2003-2004 Alex Woods <linux-dvb@giblets.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <media/dvb_frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include "ttusbdecfe.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define LOF_HI			10600000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #define LOF_LO			9750000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) struct ttusbdecfe_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	/* configuration settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	const struct ttusbdecfe_config* config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	struct dvb_frontend frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	u8 hi_band;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	u8 voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) static int ttusbdecfe_dvbs_read_status(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 				       enum fe_status *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 		FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) static int ttusbdecfe_dvbt_read_status(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 				       enum fe_status *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	struct ttusbdecfe_state* state = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	u8 b[] = { 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 		   0x00, 0x00, 0x00, 0x00 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	u8 result[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	int len, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	*status=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	ret=state->config->send_command(fe, 0x73, sizeof(b), b, &len, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	if(ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	if(len != 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		printk(KERN_ERR "%s: unexpected reply\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	switch(result[3]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 		case 1:  /* not tuned yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		case 2:  /* no signal/no lock*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		case 3:	 /* signal found and locked*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 			*status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 			FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 			*status = FE_TIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 			pr_info("%s: returned unknown value: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 				__func__, result[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) static int ttusbdecfe_dvbt_set_frontend(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	u8 b[] = { 0x00, 0x00, 0x00, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		   0x00, 0x00, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		   0x00, 0x00, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		   0x00, 0x00, 0x00, 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	__be32 freq = htonl(p->frequency / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	memcpy(&b[4], &freq, sizeof (u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	state->config->send_command(fe, 0x71, sizeof(b), b, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) static int ttusbdecfe_dvbt_get_tune_settings(struct dvb_frontend* fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 					struct dvb_frontend_tune_settings* fesettings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		fesettings->min_delay_ms = 1500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		/* Drift compensation makes no sense for DVB-T */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		fesettings->step_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		fesettings->max_drift = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) static int ttusbdecfe_dvbs_set_frontend(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	u8 b[] = { 0x00, 0x00, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		   0x00, 0x00, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		   0x00, 0x00, 0x00, 0x00 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	__be32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	__be32 sym_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	__be32 band;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	__be32 lnb_voltage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	freq = htonl(p->frequency +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	       (state->hi_band ? LOF_HI : LOF_LO));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	memcpy(&b[4], &freq, sizeof(u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	sym_rate = htonl(p->symbol_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	memcpy(&b[12], &sym_rate, sizeof(u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	band = htonl(state->hi_band ? LOF_HI : LOF_LO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	memcpy(&b[24], &band, sizeof(u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	lnb_voltage = htonl(state->voltage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	memcpy(&b[28], &lnb_voltage, sizeof(u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	state->config->send_command(fe, 0x71, sizeof(b), b, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static int ttusbdecfe_dvbs_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	u8 b[] = { 0x00, 0xff, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		   0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		   0x00, 0x00 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	if (cmd->msg_len > sizeof(b) - 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	memcpy(&b[4], cmd->msg, cmd->msg_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	state->config->send_command(fe, 0x72,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 				    sizeof(b) - (6 - cmd->msg_len), b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 				    NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static int ttusbdecfe_dvbs_set_tone(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 				    enum fe_sec_tone_mode tone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	state->hi_band = (SEC_TONE_ON == tone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static int ttusbdecfe_dvbs_set_voltage(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 				       enum fe_sec_voltage voltage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	switch (voltage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	case SEC_VOLTAGE_13:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		state->voltage = 13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	case SEC_VOLTAGE_18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		state->voltage = 18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static void ttusbdecfe_release(struct dvb_frontend* fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	kfree(state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static const struct dvb_frontend_ops ttusbdecfe_dvbt_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) struct dvb_frontend* ttusbdecfe_dvbt_attach(const struct ttusbdecfe_config* config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	struct ttusbdecfe_state* state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	/* allocate memory for the internal state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	state = kmalloc(sizeof(struct ttusbdecfe_state), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	if (state == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	/* setup the state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	state->config = config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	/* create dvb_frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	memcpy(&state->frontend.ops, &ttusbdecfe_dvbt_ops, sizeof(struct dvb_frontend_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	state->frontend.demodulator_priv = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	return &state->frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static const struct dvb_frontend_ops ttusbdecfe_dvbs_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct dvb_frontend* ttusbdecfe_dvbs_attach(const struct ttusbdecfe_config* config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	struct ttusbdecfe_state* state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	/* allocate memory for the internal state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	state = kmalloc(sizeof(struct ttusbdecfe_state), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	if (state == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	/* setup the state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	state->config = config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	state->voltage = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	state->hi_band = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	/* create dvb_frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	memcpy(&state->frontend.ops, &ttusbdecfe_dvbs_ops, sizeof(struct dvb_frontend_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	state->frontend.demodulator_priv = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	return &state->frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static const struct dvb_frontend_ops ttusbdecfe_dvbt_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	.delsys = { SYS_DVBT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	.info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		.name			= "TechnoTrend/Hauppauge DEC2000-t Frontend",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 		.frequency_min_hz	=  51 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		.frequency_max_hz	= 858 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 		.frequency_stepsize_hz	= 62500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 			FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 			FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 			FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 			FE_CAN_HIERARCHY_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	.release = ttusbdecfe_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	.set_frontend = ttusbdecfe_dvbt_set_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	.get_tune_settings = ttusbdecfe_dvbt_get_tune_settings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	.read_status = ttusbdecfe_dvbt_read_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static const struct dvb_frontend_ops ttusbdecfe_dvbs_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	.delsys = { SYS_DVBS },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	.info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		.name			= "TechnoTrend/Hauppauge DEC3000-s Frontend",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 		.frequency_min_hz	=  950 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 		.frequency_max_hz	= 2150 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		.frequency_stepsize_hz	=  125 * kHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		.symbol_rate_min        = 1000000,  /* guessed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 		.symbol_rate_max        = 45000000, /* guessed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 		.caps =	FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 			FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 			FE_CAN_QPSK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	.release = ttusbdecfe_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	.set_frontend = ttusbdecfe_dvbs_set_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	.read_status = ttusbdecfe_dvbs_read_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	.diseqc_send_master_cmd = ttusbdecfe_dvbs_diseqc_send_master_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	.set_voltage = ttusbdecfe_dvbs_set_voltage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	.set_tone = ttusbdecfe_dvbs_set_tone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) MODULE_DESCRIPTION("TTUSB DEC DVB-T/S Demodulator driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) MODULE_AUTHOR("Alex Woods/Andrew de Quincey");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) EXPORT_SYMBOL(ttusbdecfe_dvbt_attach);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) EXPORT_SYMBOL(ttusbdecfe_dvbs_attach);