aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/IR
diff options
context:
space:
mode:
authorMaxim Levitsky <maximlevitsky@gmail.com>2010-10-15 13:06:37 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-21 07:54:23 -0200
commita06423c9a264d99345e1b5a04d5ced1168c609b8 (patch)
tree3dca12c0d228ce9638b82badce583e7729b8beb7 /drivers/media/IR
parent2a4848949160208d6d02c0d9d340d2a22059b5b0 (diff)
[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: Sami R <maesesami@gmail.com> Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Acked-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/IR')
-rw-r--r--drivers/media/IR/ene_ir.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/drivers/media/IR/ene_ir.c b/drivers/media/IR/ene_ir.c
index 7880d9c72d4..9f9afe7c603 100644
--- a/drivers/media/IR/ene_ir.c
+++ b/drivers/media/IR/ene_ir.c
@@ -156,11 +156,12 @@ static int ene_hw_detect(struct ene_device *dev)
ene_notice("Firmware regs: %02x %02x", fw_reg1, fw_reg2);
- dev->hw_use_gpio_0a = fw_reg2 & ENE_FW2_GP0A;
- dev->hw_learning_and_tx_capable = fw_reg2 & ENE_FW2_LEARNING;
- 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);
+ dev->hw_use_gpio_0a = !!(fw_reg2 & ENE_FW2_GP0A);
+ dev->hw_learning_and_tx_capable = !!(fw_reg2 & ENE_FW2_LEARNING);
+ dev->hw_extra_buffer = !!(fw_reg1 & ENE_FW1_HAS_EXTRA_BUF);
+
+ if (dev->hw_learning_and_tx_capable)
+ dev->hw_fan_input = !!(fw_reg2 & ENE_FW2_FAN_INPUT);
ene_notice("Hardware features:");
@@ -255,6 +256,8 @@ static void ene_rx_setup(struct ene_device *dev)
dev->carrier_detect_enabled;
int sample_period_adjust = 0;
+ /* This selects RLC input and clears CFG2 settings */
+ ene_write_reg(dev, ENE_CIRCFG2, 0x00);
/* set sample period*/
if (sample_period == ENE_DEFAULT_SAMPLE_PERIOD)
@@ -268,7 +271,9 @@ static void ene_rx_setup(struct ene_device *dev)
if (dev->hw_revision < ENE_HW_C)
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
That means that if GPIO40 is normally used, use GPIO0A
@@ -282,6 +287,7 @@ static void ene_rx_setup(struct ene_device *dev)
ene_set_reg_mask(dev, ENE_CIRCFG, ENE_CIRCFG_CARR_DEMOD);
/* Enable carrier detection */
+ ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63);
ene_set_clear_reg_mask(dev, ENE_CIRCFG2, ENE_CIRCFG2_CARR_DETECT,
dev->carrier_detect_enabled || debug);
} else {
@@ -343,19 +349,9 @@ static void ene_rx_enable(struct ene_device *dev)
ene_write_reg(dev, ENE_IRQ, reg_value);
}
- if (dev->hw_revision >= ENE_HW_C)
- ene_write_reg(dev, ENE_CIRCAR_PULS, 0x63);
-
- /* 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);
- }
+ /* Enable inputs */
+ ene_enable_fan_input(dev, dev->rx_fan_input_inuse);
+ ene_enable_cir_engine(dev, !dev->rx_fan_input_inuse);
/* ack any pending irqs - just in case */
ene_irq_status(dev);
@@ -793,12 +789,10 @@ static void ene_setup_settings(struct ene_device *dev)
dev->tx_period = 32;
dev->tx_duty_cycle = 50; /*%*/
dev->transmitter_mask = 0x03;
-
- dev->learning_enabled =
- (learning_mode && dev->hw_learning_and_tx_capable);
+ dev->learning_enabled = learning_mode;
/* Set reasonable default timeout */
- dev->props->timeout = MS_TO_NS(15000);
+ dev->props->timeout = MS_TO_NS(150000);
}
/* 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)
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->allowed_protos = IR_TYPE_ALL;
ir_props->priv = dev;