18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * tdhd1.h - ALPS TDHD1-204A tuner support 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2008 Oliver Endriss <o.endriss@gmx.de> 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * The project's page is at https://linuxtv.org 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef TDHD1_H 118c2ecf20Sopenharmony_ci#define TDHD1_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "tda1004x.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic int alps_tdhd1_204_request_firmware(struct dvb_frontend *fe, const struct firmware **fw, char *name); 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic struct tda1004x_config alps_tdhd1_204a_config = { 188c2ecf20Sopenharmony_ci .demod_address = 0x8, 198c2ecf20Sopenharmony_ci .invert = 1, 208c2ecf20Sopenharmony_ci .invert_oclk = 0, 218c2ecf20Sopenharmony_ci .xtal_freq = TDA10046_XTAL_4M, 228c2ecf20Sopenharmony_ci .agc_config = TDA10046_AGC_DEFAULT, 238c2ecf20Sopenharmony_ci .if_freq = TDA10046_FREQ_3617, 248c2ecf20Sopenharmony_ci .request_firmware = alps_tdhd1_204_request_firmware 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic int alps_tdhd1_204a_tuner_set_params(struct dvb_frontend *fe) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci struct dtv_frontend_properties *p = &fe->dtv_property_cache; 308c2ecf20Sopenharmony_ci struct i2c_adapter *i2c = fe->tuner_priv; 318c2ecf20Sopenharmony_ci u8 data[4]; 328c2ecf20Sopenharmony_ci struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; 338c2ecf20Sopenharmony_ci u32 div; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci div = (p->frequency + 36166666) / 166666; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci data[0] = (div >> 8) & 0x7f; 388c2ecf20Sopenharmony_ci data[1] = div & 0xff; 398c2ecf20Sopenharmony_ci data[2] = 0x85; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci if (p->frequency >= 174000000 && p->frequency <= 230000000) 428c2ecf20Sopenharmony_ci data[3] = 0x02; 438c2ecf20Sopenharmony_ci else if (p->frequency >= 470000000 && p->frequency <= 823000000) 448c2ecf20Sopenharmony_ci data[3] = 0x0C; 458c2ecf20Sopenharmony_ci else if (p->frequency > 823000000 && p->frequency <= 862000000) 468c2ecf20Sopenharmony_ci data[3] = 0x8C; 478c2ecf20Sopenharmony_ci else 488c2ecf20Sopenharmony_ci return -EINVAL; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci if (fe->ops.i2c_gate_ctrl) 518c2ecf20Sopenharmony_ci fe->ops.i2c_gate_ctrl(fe, 1); 528c2ecf20Sopenharmony_ci if (i2c_transfer(i2c, &msg, 1) != 1) 538c2ecf20Sopenharmony_ci return -EIO; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci return 0; 568c2ecf20Sopenharmony_ci} 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci#endif /* TDHD1_H */ 59