162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * FM Driver for Connectivity chip of Texas Instruments. 462306a36Sopenharmony_ci * This sub-module of FM driver implements FM TX functionality. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2011 Texas Instruments 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/delay.h> 1062306a36Sopenharmony_ci#include "fmdrv.h" 1162306a36Sopenharmony_ci#include "fmdrv_common.h" 1262306a36Sopenharmony_ci#include "fmdrv_tx.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciint fm_tx_set_stereo_mono(struct fmdev *fmdev, u16 mode) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci u16 payload; 1762306a36Sopenharmony_ci int ret; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (fmdev->tx_data.aud_mode == mode) 2062306a36Sopenharmony_ci return 0; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci fmdbg("stereo mode: %d\n", mode); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci /* Set Stereo/Mono mode */ 2562306a36Sopenharmony_ci payload = (1 - mode); 2662306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, MONO_SET, REG_WR, &payload, 2762306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 2862306a36Sopenharmony_ci if (ret < 0) 2962306a36Sopenharmony_ci return ret; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci fmdev->tx_data.aud_mode = mode; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci return ret; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic int set_rds_text(struct fmdev *fmdev, u8 *rds_text) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci u16 payload; 3962306a36Sopenharmony_ci int ret; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, RDS_DATA_SET, REG_WR, rds_text, 4262306a36Sopenharmony_ci strlen(rds_text), NULL, NULL); 4362306a36Sopenharmony_ci if (ret < 0) 4462306a36Sopenharmony_ci return ret; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* Scroll mode */ 4762306a36Sopenharmony_ci payload = (u16)0x1; 4862306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, DISPLAY_MODE, REG_WR, &payload, 4962306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 5062306a36Sopenharmony_ci if (ret < 0) 5162306a36Sopenharmony_ci return ret; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci return 0; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic int set_rds_data_mode(struct fmdev *fmdev, u8 mode) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci u16 payload; 5962306a36Sopenharmony_ci int ret; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci /* Setting unique PI TODO: how unique? */ 6262306a36Sopenharmony_ci payload = (u16)0xcafe; 6362306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, PI_SET, REG_WR, &payload, 6462306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 6562306a36Sopenharmony_ci if (ret < 0) 6662306a36Sopenharmony_ci return ret; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* Set decoder id */ 6962306a36Sopenharmony_ci payload = (u16)0xa; 7062306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, DI_SET, REG_WR, &payload, 7162306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 7262306a36Sopenharmony_ci if (ret < 0) 7362306a36Sopenharmony_ci return ret; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* TODO: RDS_MODE_GET? */ 7662306a36Sopenharmony_ci return 0; 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic int set_rds_len(struct fmdev *fmdev, u8 type, u16 len) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci u16 payload; 8262306a36Sopenharmony_ci int ret; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci len |= type << 8; 8562306a36Sopenharmony_ci payload = len; 8662306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, RDS_CONFIG_DATA_SET, REG_WR, &payload, 8762306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 8862306a36Sopenharmony_ci if (ret < 0) 8962306a36Sopenharmony_ci return ret; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* TODO: LENGTH_GET? */ 9262306a36Sopenharmony_ci return 0; 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciint fm_tx_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci u16 payload; 9862306a36Sopenharmony_ci int ret; 9962306a36Sopenharmony_ci u8 rds_text[] = "Zoom2\n"; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci fmdbg("rds_en_dis:%d(E:%d, D:%d)\n", rds_en_dis, 10262306a36Sopenharmony_ci FM_RDS_ENABLE, FM_RDS_DISABLE); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci if (rds_en_dis == FM_RDS_ENABLE) { 10562306a36Sopenharmony_ci /* Set RDS length */ 10662306a36Sopenharmony_ci set_rds_len(fmdev, 0, strlen(rds_text)); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci /* Set RDS text */ 10962306a36Sopenharmony_ci set_rds_text(fmdev, rds_text); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci /* Set RDS mode */ 11262306a36Sopenharmony_ci set_rds_data_mode(fmdev, 0x0); 11362306a36Sopenharmony_ci } 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci /* Send command to enable RDS */ 11662306a36Sopenharmony_ci if (rds_en_dis == FM_RDS_ENABLE) 11762306a36Sopenharmony_ci payload = 0x01; 11862306a36Sopenharmony_ci else 11962306a36Sopenharmony_ci payload = 0x00; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, RDS_DATA_ENB, REG_WR, &payload, 12262306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 12362306a36Sopenharmony_ci if (ret < 0) 12462306a36Sopenharmony_ci return ret; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if (rds_en_dis == FM_RDS_ENABLE) { 12762306a36Sopenharmony_ci /* Set RDS length */ 12862306a36Sopenharmony_ci set_rds_len(fmdev, 0, strlen(rds_text)); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* Set RDS text */ 13162306a36Sopenharmony_ci set_rds_text(fmdev, rds_text); 13262306a36Sopenharmony_ci } 13362306a36Sopenharmony_ci fmdev->tx_data.rds.flag = rds_en_dis; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci return 0; 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ciint fm_tx_set_radio_text(struct fmdev *fmdev, u8 *rds_text, u8 rds_type) 13962306a36Sopenharmony_ci{ 14062306a36Sopenharmony_ci u16 payload; 14162306a36Sopenharmony_ci int ret; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci if (fmdev->curr_fmmode != FM_MODE_TX) 14462306a36Sopenharmony_ci return -EPERM; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci fm_tx_set_rds_mode(fmdev, 0); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci /* Set RDS length */ 14962306a36Sopenharmony_ci set_rds_len(fmdev, rds_type, strlen(rds_text)); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci /* Set RDS text */ 15262306a36Sopenharmony_ci set_rds_text(fmdev, rds_text); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* Set RDS mode */ 15562306a36Sopenharmony_ci set_rds_data_mode(fmdev, 0x0); 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci payload = 1; 15862306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, RDS_DATA_ENB, REG_WR, &payload, 15962306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 16062306a36Sopenharmony_ci if (ret < 0) 16162306a36Sopenharmony_ci return ret; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci return 0; 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciint fm_tx_set_af(struct fmdev *fmdev, u32 af) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci u16 payload; 16962306a36Sopenharmony_ci int ret; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci if (fmdev->curr_fmmode != FM_MODE_TX) 17262306a36Sopenharmony_ci return -EPERM; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci fmdbg("AF: %d\n", af); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci af = (af - 87500) / 100; 17762306a36Sopenharmony_ci payload = (u16)af; 17862306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, TA_SET, REG_WR, &payload, 17962306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 18062306a36Sopenharmony_ci if (ret < 0) 18162306a36Sopenharmony_ci return ret; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci return 0; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciint fm_tx_set_region(struct fmdev *fmdev, u8 region) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci u16 payload; 18962306a36Sopenharmony_ci int ret; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci if (region != FM_BAND_EUROPE_US && region != FM_BAND_JAPAN) { 19262306a36Sopenharmony_ci fmerr("Invalid band\n"); 19362306a36Sopenharmony_ci return -EINVAL; 19462306a36Sopenharmony_ci } 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci /* Send command to set the band */ 19762306a36Sopenharmony_ci payload = (u16)region; 19862306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, TX_BAND_SET, REG_WR, &payload, 19962306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 20062306a36Sopenharmony_ci if (ret < 0) 20162306a36Sopenharmony_ci return ret; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci return 0; 20462306a36Sopenharmony_ci} 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ciint fm_tx_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci u16 payload; 20962306a36Sopenharmony_ci int ret; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci fmdbg("tx: mute mode %d\n", mute_mode_toset); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci payload = mute_mode_toset; 21462306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, MUTE, REG_WR, &payload, 21562306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 21662306a36Sopenharmony_ci if (ret < 0) 21762306a36Sopenharmony_ci return ret; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci return 0; 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci/* Set TX Audio I/O */ 22362306a36Sopenharmony_cistatic int set_audio_io(struct fmdev *fmdev) 22462306a36Sopenharmony_ci{ 22562306a36Sopenharmony_ci struct fmtx_data *tx = &fmdev->tx_data; 22662306a36Sopenharmony_ci u16 payload; 22762306a36Sopenharmony_ci int ret; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci /* Set Audio I/O Enable */ 23062306a36Sopenharmony_ci payload = tx->audio_io; 23162306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, AUDIO_IO_SET, REG_WR, &payload, 23262306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 23362306a36Sopenharmony_ci if (ret < 0) 23462306a36Sopenharmony_ci return ret; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* TODO: is audio set? */ 23762306a36Sopenharmony_ci return 0; 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* Start TX Transmission */ 24162306a36Sopenharmony_cistatic int enable_xmit(struct fmdev *fmdev, u8 new_xmit_state) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci struct fmtx_data *tx = &fmdev->tx_data; 24462306a36Sopenharmony_ci unsigned long timeleft; 24562306a36Sopenharmony_ci u16 payload; 24662306a36Sopenharmony_ci int ret; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* Enable POWER_ENB interrupts */ 24962306a36Sopenharmony_ci payload = FM_POW_ENB_EVENT; 25062306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 25162306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 25262306a36Sopenharmony_ci if (ret < 0) 25362306a36Sopenharmony_ci return ret; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* Set Power Enable */ 25662306a36Sopenharmony_ci payload = new_xmit_state; 25762306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, POWER_ENB_SET, REG_WR, &payload, 25862306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 25962306a36Sopenharmony_ci if (ret < 0) 26062306a36Sopenharmony_ci return ret; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci /* Wait for Power Enabled */ 26362306a36Sopenharmony_ci init_completion(&fmdev->maintask_comp); 26462306a36Sopenharmony_ci timeleft = wait_for_completion_timeout(&fmdev->maintask_comp, 26562306a36Sopenharmony_ci FM_DRV_TX_TIMEOUT); 26662306a36Sopenharmony_ci if (!timeleft) { 26762306a36Sopenharmony_ci fmerr("Timeout(%d sec),didn't get tune ended interrupt\n", 26862306a36Sopenharmony_ci jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); 26962306a36Sopenharmony_ci return -ETIMEDOUT; 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci set_bit(FM_CORE_TX_XMITING, &fmdev->flag); 27362306a36Sopenharmony_ci tx->xmit_state = new_xmit_state; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci return 0; 27662306a36Sopenharmony_ci} 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci/* Set TX power level */ 27962306a36Sopenharmony_ciint fm_tx_set_pwr_lvl(struct fmdev *fmdev, u8 new_pwr_lvl) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci u16 payload; 28262306a36Sopenharmony_ci struct fmtx_data *tx = &fmdev->tx_data; 28362306a36Sopenharmony_ci int ret; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci if (fmdev->curr_fmmode != FM_MODE_TX) 28662306a36Sopenharmony_ci return -EPERM; 28762306a36Sopenharmony_ci fmdbg("tx: pwr_level_to_set %ld\n", (long int)new_pwr_lvl); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci /* If the core isn't ready update global variable */ 29062306a36Sopenharmony_ci if (!test_bit(FM_CORE_READY, &fmdev->flag)) { 29162306a36Sopenharmony_ci tx->pwr_lvl = new_pwr_lvl; 29262306a36Sopenharmony_ci return 0; 29362306a36Sopenharmony_ci } 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci /* Set power level: Application will specify power level value in 29662306a36Sopenharmony_ci * units of dB/uV, whereas range and step are specific to FM chip. 29762306a36Sopenharmony_ci * For TI's WL chips, convert application specified power level value 29862306a36Sopenharmony_ci * to chip specific value by subtracting 122 from it. Refer to TI FM 29962306a36Sopenharmony_ci * data sheet for details. 30062306a36Sopenharmony_ci * */ 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci payload = (FM_PWR_LVL_HIGH - new_pwr_lvl); 30362306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, POWER_LEV_SET, REG_WR, &payload, 30462306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 30562306a36Sopenharmony_ci if (ret < 0) 30662306a36Sopenharmony_ci return ret; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci /* TODO: is the power level set? */ 30962306a36Sopenharmony_ci tx->pwr_lvl = new_pwr_lvl; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci return 0; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci/* 31562306a36Sopenharmony_ci * Sets FM TX pre-emphasis filter value (OFF, 50us, or 75us) 31662306a36Sopenharmony_ci * Convert V4L2 specified filter values to chip specific filter values. 31762306a36Sopenharmony_ci */ 31862306a36Sopenharmony_ciint fm_tx_set_preemph_filter(struct fmdev *fmdev, u32 preemphasis) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci struct fmtx_data *tx = &fmdev->tx_data; 32162306a36Sopenharmony_ci u16 payload; 32262306a36Sopenharmony_ci int ret; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci if (fmdev->curr_fmmode != FM_MODE_TX) 32562306a36Sopenharmony_ci return -EPERM; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci switch (preemphasis) { 32862306a36Sopenharmony_ci case V4L2_PREEMPHASIS_DISABLED: 32962306a36Sopenharmony_ci payload = FM_TX_PREEMPH_OFF; 33062306a36Sopenharmony_ci break; 33162306a36Sopenharmony_ci case V4L2_PREEMPHASIS_50_uS: 33262306a36Sopenharmony_ci payload = FM_TX_PREEMPH_50US; 33362306a36Sopenharmony_ci break; 33462306a36Sopenharmony_ci case V4L2_PREEMPHASIS_75_uS: 33562306a36Sopenharmony_ci payload = FM_TX_PREEMPH_75US; 33662306a36Sopenharmony_ci break; 33762306a36Sopenharmony_ci } 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, PREMPH_SET, REG_WR, &payload, 34062306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 34162306a36Sopenharmony_ci if (ret < 0) 34262306a36Sopenharmony_ci return ret; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci tx->preemph = payload; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci return ret; 34762306a36Sopenharmony_ci} 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/* Get the TX tuning capacitor value.*/ 35062306a36Sopenharmony_ciint fm_tx_get_tune_cap_val(struct fmdev *fmdev) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci u16 curr_val; 35362306a36Sopenharmony_ci u32 resp_len; 35462306a36Sopenharmony_ci int ret; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci if (fmdev->curr_fmmode != FM_MODE_TX) 35762306a36Sopenharmony_ci return -EPERM; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, READ_FMANT_TUNE_VALUE, REG_RD, 36062306a36Sopenharmony_ci NULL, sizeof(curr_val), &curr_val, &resp_len); 36162306a36Sopenharmony_ci if (ret < 0) 36262306a36Sopenharmony_ci return ret; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci curr_val = be16_to_cpu((__force __be16)curr_val); 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci return curr_val; 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci/* Set TX Frequency */ 37062306a36Sopenharmony_ciint fm_tx_set_freq(struct fmdev *fmdev, u32 freq_to_set) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci struct fmtx_data *tx = &fmdev->tx_data; 37362306a36Sopenharmony_ci u16 payload, chanl_index; 37462306a36Sopenharmony_ci int ret; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci if (test_bit(FM_CORE_TX_XMITING, &fmdev->flag)) { 37762306a36Sopenharmony_ci enable_xmit(fmdev, 0); 37862306a36Sopenharmony_ci clear_bit(FM_CORE_TX_XMITING, &fmdev->flag); 37962306a36Sopenharmony_ci } 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci /* Enable FR, BL interrupts */ 38262306a36Sopenharmony_ci payload = (FM_FR_EVENT | FM_BL_EVENT); 38362306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 38462306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 38562306a36Sopenharmony_ci if (ret < 0) 38662306a36Sopenharmony_ci return ret; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci tx->tx_frq = (unsigned long)freq_to_set; 38962306a36Sopenharmony_ci fmdbg("tx: freq_to_set %ld\n", (long int)tx->tx_frq); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci chanl_index = freq_to_set / 10; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci /* Set current tuner channel */ 39462306a36Sopenharmony_ci payload = chanl_index; 39562306a36Sopenharmony_ci ret = fmc_send_cmd(fmdev, CHANL_SET, REG_WR, &payload, 39662306a36Sopenharmony_ci sizeof(payload), NULL, NULL); 39762306a36Sopenharmony_ci if (ret < 0) 39862306a36Sopenharmony_ci return ret; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci fm_tx_set_pwr_lvl(fmdev, tx->pwr_lvl); 40162306a36Sopenharmony_ci fm_tx_set_preemph_filter(fmdev, tx->preemph); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci tx->audio_io = 0x01; /* I2S */ 40462306a36Sopenharmony_ci set_audio_io(fmdev); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci enable_xmit(fmdev, 0x01); /* Enable transmission */ 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci tx->aud_mode = FM_STEREO_MODE; 40962306a36Sopenharmony_ci tx->rds.flag = FM_RDS_DISABLE; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci return 0; 41262306a36Sopenharmony_ci} 41362306a36Sopenharmony_ci 414