[media] fintek-cir: change || to &&
[pandora-kernel.git] / drivers / media / rc / fintek-cir.c
index 7f7079b..4a3a238 100644 (file)
@@ -117,7 +117,7 @@ static u8 fintek_cir_reg_read(struct fintek_dev *fintek, u8 offset)
 static void cir_dump_regs(struct fintek_dev *fintek)
 {
        fintek_config_mode_enable(fintek);
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
 
        pr_reg("%s: Dump CIR logical device registers:\n", FINTEK_DRIVER_NAME);
        pr_reg(" * CR CIR BASE ADDR: 0x%x\n",
@@ -143,7 +143,7 @@ static int fintek_hw_detect(struct fintek_dev *fintek)
        u8 chip_major, chip_minor;
        u8 vendor_major, vendor_minor;
        u8 portsel, ir_class;
-       u16 vendor;
+       u16 vendor, chip;
        int ret = 0;
 
        fintek_config_mode_enable(fintek);
@@ -176,6 +176,7 @@ static int fintek_hw_detect(struct fintek_dev *fintek)
 
        chip_major = fintek_cr_read(fintek, GCR_CHIP_ID_HI);
        chip_minor = fintek_cr_read(fintek, GCR_CHIP_ID_LO);
+       chip  = chip_major << 8 | chip_minor;
 
        vendor_major = fintek_cr_read(fintek, GCR_VENDOR_ID_HI);
        vendor_minor = fintek_cr_read(fintek, GCR_VENDOR_ID_LO);
@@ -192,6 +193,15 @@ static int fintek_hw_detect(struct fintek_dev *fintek)
        fintek->chip_major  = chip_major;
        fintek->chip_minor  = chip_minor;
        fintek->chip_vendor = vendor;
+
+       /*
+        * Newer reviews of this chipset uses port 8 instead of 5
+        */
+       if ((chip != 0x0408) && (chip != 0x0804))
+               fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV2;
+       else
+               fintek->logical_dev_cir = LOGICAL_DEV_CIR_REV1;
+
        spin_unlock_irqrestore(&fintek->fintek_lock, flags);
 
        return ret;
@@ -200,7 +210,7 @@ static int fintek_hw_detect(struct fintek_dev *fintek)
 static void fintek_cir_ldev_init(struct fintek_dev *fintek)
 {
        /* Select CIR logical device and enable */
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_cr_write(fintek, LOGICAL_DEV_ENABLE, CIR_CR_DEV_EN);
 
        /* Write allocated CIR address and IRQ information to hardware */
@@ -381,7 +391,7 @@ static irqreturn_t fintek_cir_isr(int irq, void *data)
        fit_dbg_verbose("%s firing", __func__);
 
        fintek_config_mode_enable(fintek);
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_config_mode_disable(fintek);
 
        /*
@@ -422,7 +432,7 @@ static void fintek_enable_cir(struct fintek_dev *fintek)
        fintek_config_mode_enable(fintek);
 
        /* enable the CIR logical device */
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_cr_write(fintek, LOGICAL_DEV_ENABLE, CIR_CR_DEV_EN);
 
        fintek_config_mode_disable(fintek);
@@ -439,7 +449,7 @@ static void fintek_disable_cir(struct fintek_dev *fintek)
        fintek_config_mode_enable(fintek);
 
        /* disable the CIR logical device */
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_cr_write(fintek, LOGICAL_DEV_DISABLE, CIR_CR_DEV_EN);
 
        fintek_config_mode_disable(fintek);
@@ -504,16 +514,6 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
 
        spin_lock_init(&fintek->fintek_lock);
 
-       ret = -EBUSY;
-       /* now claim resources */
-       if (!request_region(fintek->cir_addr,
-                           fintek->cir_port_len, FINTEK_DRIVER_NAME))
-               goto failure;
-
-       if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED,
-                       FINTEK_DRIVER_NAME, (void *)fintek))
-               goto failure;
-
        pnp_set_drvdata(pdev, fintek);
        fintek->pdev = pdev;
 
@@ -548,6 +548,16 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
        /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
        rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
 
+       ret = -EBUSY;
+       /* now claim resources */
+       if (!request_region(fintek->cir_addr,
+                           fintek->cir_port_len, FINTEK_DRIVER_NAME))
+               goto failure;
+
+       if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED,
+                       FINTEK_DRIVER_NAME, (void *)fintek))
+               goto failure;
+
        ret = rc_register_device(rdev);
        if (ret)
                goto failure;
@@ -611,7 +621,7 @@ static int fintek_suspend(struct pnp_dev *pdev, pm_message_t state)
        fintek_config_mode_enable(fintek);
 
        /* disable cir logical dev */
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_cr_write(fintek, LOGICAL_DEV_DISABLE, CIR_CR_DEV_EN);
 
        fintek_config_mode_disable(fintek);
@@ -634,7 +644,7 @@ static int fintek_resume(struct pnp_dev *pdev)
 
        /* Enable CIR logical device */
        fintek_config_mode_enable(fintek);
-       fintek_select_logical_dev(fintek, LOGICAL_DEV_CIR);
+       fintek_select_logical_dev(fintek, fintek->logical_dev_cir);
        fintek_cr_write(fintek, LOGICAL_DEV_ENABLE, CIR_CR_DEV_EN);
 
        fintek_config_mode_disable(fintek);