]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/serial/ioc4_serial.c
[PATCH] misc sata __iomem annotations
[linux-2.6-omap-h63xx.git] / drivers / serial / ioc4_serial.c
index c620209d7b9a5d70e31e933dd998026d0196a677..98ce88d802075b74d01f96b6259149e23958db1e 100644 (file)
@@ -987,10 +987,9 @@ intr_connect(struct ioc4_soft *soft, int type,
  * ioc4_intr - Top level IOC4 interrupt handler.
  * @irq: irq value
  * @arg: handler arg
- * @regs: registers
  */
 
-static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs)
+static irqreturn_t ioc4_intr(int irq, void *arg)
 {
        struct ioc4_soft *soft;
        uint32_t this_ir, this_mir;
@@ -2646,7 +2645,10 @@ static int ioc4_serial_remove_one(struct ioc4_driver_data *idd)
        struct ioc4_port *port;
        struct ioc4_soft *soft;
 
+       /* If serial driver did not attach, don't try to detach */
        control = idd->idd_serial_data;
+       if (!control)
+               return 0;
 
        for (port_num = 0; port_num < IOC4_NUM_SERIAL_PORTS; port_num++) {
                for (port_type = UART_PORT_MIN;
@@ -2682,6 +2684,7 @@ static int ioc4_serial_remove_one(struct ioc4_driver_data *idd)
        if (soft) {
                free_irq(control->ic_irq, soft);
                if (soft->is_ioc4_serial_addr) {
+                       iounmap(soft->is_ioc4_serial_addr);
                        release_region((unsigned long)
                             soft->is_ioc4_serial_addr,
                                sizeof(struct ioc4_serial));
@@ -2778,6 +2781,12 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
        DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev,
                                                        idd->idd_pci_id));
 
+       /* PCI-RT does not bring out serial connections.
+        * Do not attach to this particular IOC4.
+        */
+       if (idd->idd_variant == IOC4_VARIANT_PCI_RT)
+               return 0;
+
        /* request serial registers */
        tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET;
 
@@ -2846,7 +2855,7 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
        control->ic_soft = soft;
 
        /* Hook up interrupt handler */
-       if (!request_irq(idd->idd_pdev->irq, ioc4_intr, SA_SHIRQ,
+       if (!request_irq(idd->idd_pdev->irq, ioc4_intr, IRQF_SHARED,
                                "sgi-ioc4serial", soft)) {
                control->ic_irq = idd->idd_pdev->irq;
        } else {
@@ -2878,6 +2887,8 @@ out4:
 out3:
        kfree(control);
 out2:
+       if (serial)
+               iounmap(serial);
        release_region(tmp_addr1, sizeof(struct ioc4_serial));
 out1: