Commit a06423c9 authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Mauro Carvalho Chehab

[media] IR: ene_ir: few bugfixes

This is a result of last round of debug with
Sami R <maesesami@gmail.com>.

Thank you Sami very much!

The biggest bug I fixed is that,
I was clobbering the CIRCFG register after it is setup
That wasn't a good idea really

And some small refactoring, etc.
Tested-by: default avatarSami R <maesesami@gmail.com>
Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Acked-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 2a484894
...@@ -156,11 +156,12 @@ static int ene_hw_detect(struct ene_device *dev) ...@@ -156,11 +156,12 @@ static int ene_hw_detect(struct ene_device *dev)
ene_notice("Firmware regs: %02x %02x", fw_reg1, fw_reg2); ene_notice("Firmware regs: %02x %02x", fw_reg1, fw_reg2);
dev->hw_use_gpio_0a = fw_reg2 & ENE_FW2_GP0A; dev->hw_use_gpio_0a = !!(fw_reg2 & ENE_FW2_GP0A);
dev->hw_learning_and_tx_capable = fw_reg2 & ENE_FW2_LEARNING; dev->hw_learning_and_tx_capable = !!(fw_reg2 & ENE_FW2_LEARNING);
dev->hw_extra_buffer = fw_reg1 & ENE_FW1_HAS_EXTRA_BUF; dev->hw_extra_buffer = !!(fw_reg1 & ENE_FW1_HAS_EXTRA_BUF);
dev->hw_fan_input = dev->hw_learning_and_tx_capable &&
(fw_reg2 & ENE_FW2_FAN_INPUT); if (dev->hw_learning_and_tx_capable)
dev->hw_fan_input = !!(fw_reg2 & ENE_FW2_FAN_INPUT);
ene_notice("Hardware features:"); ene_notice("Hardware features:");
...@@ -255,6 +256,8 @@ static void ene_rx_setup(struct ene_device *dev) ...@@ -255,6 +256,8 @@ static void ene_rx_setup(struct ene_device *dev)
dev->carrier_detect_enabled; dev->carrier_detect_enabled;
int sample_period_adjust = 0; int sample_period_adjust = 0;
/* This selects RLC input and clears CFG2 settings */
ene_write_reg(dev, ENE_CIRCFG2, 0x00);
/* set sample period*/ /* set sample period*/
if (sample_period == ENE_DEFAULT_SAMPLE_PERIOD) if (sample_period == ENE_DEFAULT_SAMPLE_PERIOD)
...@@ -268,7 +271,9 @@ static void ene_rx_setup(struct ene_device *dev) ...@@ -268,7 +271,9 @@ static void ene_rx_setup(struct ene_device *dev)
if (dev->hw_revision < ENE_HW_C) if (dev->hw_revision < ENE_HW_C)
goto select_timeout; goto select_timeout;
if (learning_mode && dev->hw_learning_and_tx_capable) { if (learning_mode) {
WARN_ON(!dev->hw_learning_and_tx_capable);
/* Enable the opposite of the normal input /* Enable the opposite of the normal input
That means that if GPIO40 is normally used, use GPIO0A That means that if GPIO40 is normally used, use GPIO0A
...@@ -282,6 +287,7 @@ static void ene_rx_setup(struct ene_device *dev) ...@@ -282,6 +287,7 @@ static void ene_rx_setup(struct ene_device *dev)
ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD); ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
/* Enable carrier detection */ /* Enable carrier detection */
ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63);
ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT, ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT,
dev->carrier_detect_enabled || debug); dev->carrier_detect_enabled || debug);
} else { } else {
...@@ -343,19 +349,9 @@ static void ene_rx_enable(struct ene_device *dev) ...@@ -343,19 +349,9 @@ static void ene_rx_enable(struct ene_device *dev)
ene_write_reg(dev, ENE_IRQ, reg_value); ene_write_reg(dev, ENE_IRQ, reg_value);
} }
if (dev->hw_revision >= ENE_HW_C) /* Enable inputs */
ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63); ene_enable_fan_input(dev, dev->rx_fan_input_inuse);
ene_enable_cir_engine(dev, !dev->rx_fan_input_inuse);
/* Enable the inputs */
ene_write_reg(dev, ENE_CIRCFG2, 0x00);
if (dev->rx_fan_input_inuse) {
ene_enable_cir_engine(dev, false);
ene_enable_fan_input(dev, true);
} else {
ene_enable_cir_engine(dev, true);
ene_enable_fan_input(dev, false);
}
/* ack any pending irqs - just in case */ /* ack any pending irqs - just in case */
ene_irq_status(dev); ene_irq_status(dev);
...@@ -793,12 +789,10 @@ static void ene_setup_settings(struct ene_device *dev) ...@@ -793,12 +789,10 @@ static void ene_setup_settings(struct ene_device *dev)
dev->tx_period = 32; dev->tx_period = 32;
dev->tx_duty_cycle = 50; /*%*/ dev->tx_duty_cycle = 50; /*%*/
dev->transmitter_mask = 0x03; dev->transmitter_mask = 0x03;
dev->learning_enabled = learning_mode;
dev->learning_enabled =
(learning_mode && dev->hw_learning_and_tx_capable);
/* Set reasonable default timeout */ /* Set reasonable default timeout */
dev->props->timeout = MS_TO_NS(15000); dev->props->timeout = MS_TO_NS(150000);
} }
/* outside interface: called on first open*/ /* outside interface: called on first open*/
...@@ -1015,6 +1009,9 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) ...@@ -1015,6 +1009,9 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
ene_warn("Simulation of TX activated"); ene_warn("Simulation of TX activated");
} }
if (!dev->hw_learning_and_tx_capable)
learning_mode = false;
ir_props->driver_type = RC_DRIVER_IR_RAW; ir_props->driver_type = RC_DRIVER_IR_RAW;
ir_props->allowed_protos = IR_TYPE_ALL; ir_props->allowed_protos = IR_TYPE_ALL;
ir_props->priv = dev; ir_props->priv = dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment