/* get the bits required to program the carrier frequency in CFQ bits, * unshifted */ static u8 ite_get_carrier_freq_bits(unsigned int freq) { if (ite_is_high_carrier_freq(freq)) { if (freq < 425000) return ITE_CFQ_400; else if (freq < 465000) return ITE_CFQ_450; else if (freq < 490000) return ITE_CFQ_480; else return ITE_CFQ_500; } else { /* trim to limits */ if (freq < ITE_LCF_MIN_CARRIER_FREQ) freq = ITE_LCF_MIN_CARRIER_FREQ; if (freq > ITE_LCF_MAX_CARRIER_FREQ) freq = ITE_LCF_MAX_CARRIER_FREQ; /* convert to kHz and subtract the base freq */ freq = DIV_ROUND_CLOSEST(freq - ITE_LCF_MIN_CARRIER_FREQ, 1000); return (u8) freq; } }
static u8 ite_get_carrier_freq_bits(unsigned int freq) { if (ite_is_high_carrier_freq(freq)) { if (freq < 425000) return ITE_CFQ_400; else if (freq < 465000) return ITE_CFQ_450; else if (freq < 490000) return ITE_CFQ_480; else return ITE_CFQ_500; } else { if (freq < ITE_LCF_MIN_CARRIER_FREQ) freq = ITE_LCF_MIN_CARRIER_FREQ; if (freq > ITE_LCF_MAX_CARRIER_FREQ) freq = ITE_LCF_MAX_CARRIER_FREQ; freq = DIV_ROUND_CLOSEST(freq - ITE_LCF_MIN_CARRIER_FREQ, 1000); return (u8) freq; } }
/* set all the rx/tx carrier parameters; this must be called with the device * spinlock held */ static void ite_set_carrier_params(struct ite_dev *dev) { unsigned int freq, low_freq, high_freq; int allowance; bool use_demodulator; bool for_tx = dev->transmitting; ite_dbg("%s called", __func__); if (for_tx) { /* we don't need no stinking calculations */ freq = dev->params.tx_carrier_freq; allowance = ITE_RXDCR_DEFAULT; use_demodulator = false; } else { low_freq = dev->params.rx_low_carrier_freq; high_freq = dev->params.rx_high_carrier_freq; if (low_freq == 0) { /* don't demodulate */ freq = ITE_DEFAULT_CARRIER_FREQ; allowance = ITE_RXDCR_DEFAULT; use_demodulator = false; } else { /* calculate the middle freq */ freq = (low_freq + high_freq) / 2; /* calculate the allowance */ allowance = DIV_ROUND_CLOSEST(10000 * (high_freq - low_freq), ITE_RXDCR_PER_10000_STEP * (high_freq + low_freq)); if (allowance < 1) allowance = 1; if (allowance > ITE_RXDCR_MAX) allowance = ITE_RXDCR_MAX; } } /* set the carrier parameters in a device-dependent way */ dev->params.set_carrier_params(dev, ite_is_high_carrier_freq(freq), use_demodulator, ite_get_carrier_freq_bits(freq), allowance, ite_get_pulse_width_bits(freq, dev->params.tx_duty_cycle)); }
static void ite_set_carrier_params(struct ite_dev *dev) { unsigned int freq, low_freq, high_freq; int allowance; bool use_demodulator; bool for_tx = dev->transmitting; ite_dbg("%s called", __func__); if (for_tx) { freq = dev->params.tx_carrier_freq; allowance = ITE_RXDCR_DEFAULT; use_demodulator = false; } else { low_freq = dev->params.rx_low_carrier_freq; high_freq = dev->params.rx_high_carrier_freq; if (low_freq == 0) { freq = ITE_DEFAULT_CARRIER_FREQ; allowance = ITE_RXDCR_DEFAULT; use_demodulator = false; } else { freq = (low_freq + high_freq) / 2; allowance = DIV_ROUND_CLOSEST(10000 * (high_freq - low_freq), ITE_RXDCR_PER_10000_STEP * (high_freq + low_freq)); if (allowance < 1) allowance = 1; if (allowance > ITE_RXDCR_MAX) allowance = ITE_RXDCR_MAX; } } dev->params.set_carrier_params(dev, ite_is_high_carrier_freq(freq), use_demodulator, ite_get_carrier_freq_bits(freq), allowance, ite_get_pulse_width_bits(freq, dev->params.tx_duty_cycle)); }
/* get the bits required to program the pulse with in TXMPW */ static u8 ite_get_pulse_width_bits(unsigned int freq, int duty_cycle) { unsigned long period_ns, on_ns; /* sanitize freq into range */ if (freq < ITE_LCF_MIN_CARRIER_FREQ) freq = ITE_LCF_MIN_CARRIER_FREQ; if (freq > ITE_HCF_MAX_CARRIER_FREQ) freq = ITE_HCF_MAX_CARRIER_FREQ; period_ns = 1000000000UL / freq; on_ns = period_ns * duty_cycle / 100; if (ite_is_high_carrier_freq(freq)) { if (on_ns < 750) return ITE_TXMPW_A; else if (on_ns < 850) return ITE_TXMPW_B; else if (on_ns < 950) return ITE_TXMPW_C; else if (on_ns < 1080) return ITE_TXMPW_D; else return ITE_TXMPW_E; } else { if (on_ns < 6500) return ITE_TXMPW_A; else if (on_ns < 7850) return ITE_TXMPW_B; else if (on_ns < 9650) return ITE_TXMPW_C; else if (on_ns < 11950) return ITE_TXMPW_D; else return ITE_TXMPW_E; } }