From c4318baf00ed24b7fdcc255de33a18ab37ee8606 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 12 Oct 2010 02:03:09 +0900 Subject: sh: Sanitize sparse irq Switch over to the new allocator functions. Signed-off-by: Thomas Gleixner Signed-off-by: Paul Mundt --- drivers/sh/intc/core.c | 10 +++++----- drivers/sh/intc/dynamic.c | 23 +++++++++-------------- 2 files changed, 14 insertions(+), 19 deletions(-) (limited to 'drivers') diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 306ed287077a..8f3c27e9f9e2 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -300,13 +300,13 @@ int __init register_intc_controller(struct intc_desc *desc) for (i = 0; i < hw->nr_vectors; i++) { struct intc_vect *vect = hw->vectors + i; unsigned int irq = evt2irq(vect->vect); - struct irq_desc *irq_desc; + int res; if (!vect->enum_id) continue; - irq_desc = irq_to_desc_alloc_node(irq, numa_node_id()); - if (unlikely(!irq_desc)) { + res = irq_alloc_desc_at(irq, numa_node_id()); + if (res != irq && res != -EEXIST) { pr_err("can't get irq_desc for %d\n", irq); continue; } @@ -326,8 +326,8 @@ int __init register_intc_controller(struct intc_desc *desc) * IRQ support, each vector still needs to have * its own backing irq_desc. */ - irq_desc = irq_to_desc_alloc_node(irq2, numa_node_id()); - if (unlikely(!irq_desc)) { + res = irq_alloc_desc_at(irq2, numa_node_id()); + if (res != irq2 && res != -EEXIST) { pr_err("can't get irq_desc for %d\n", irq2); continue; } diff --git a/drivers/sh/intc/dynamic.c b/drivers/sh/intc/dynamic.c index 6caecdffe201..e994c7ed916e 100644 --- a/drivers/sh/intc/dynamic.c +++ b/drivers/sh/intc/dynamic.c @@ -37,7 +37,6 @@ unsigned int create_irq_nr(unsigned int irq_want, int node) { unsigned int irq = 0, new; unsigned long flags; - struct irq_desc *desc; raw_spin_lock_irqsave(&vector_lock, flags); @@ -55,24 +54,20 @@ unsigned int create_irq_nr(unsigned int irq_want, int node) __set_bit(new, intc_irq_map); } - desc = irq_to_desc_alloc_node(new, node); - if (unlikely(!desc)) { + raw_spin_unlock_irqrestore(&vector_lock, flags); + + irq = irq_alloc_desc_at(new, node); + if (unlikely(irq != new)) { pr_err("can't get irq_desc for %d\n", new); - goto out_unlock; + return 0; } - desc = move_irq_desc(desc, node); - irq = new; + activate_irq(irq); + return 0; out_unlock: raw_spin_unlock_irqrestore(&vector_lock, flags); - - if (irq > 0) { - dynamic_irq_init(irq); - activate_irq(irq); - } - - return irq; + return 0; } int create_irq(void) @@ -91,7 +86,7 @@ void destroy_irq(unsigned int irq) { unsigned long flags; - dynamic_irq_cleanup(irq); + irq_free_desc(irq); raw_spin_lock_irqsave(&vector_lock, flags); __clear_bit(irq, intc_irq_map); -- cgit v1.2.1 From 38ab13441c36c0c470b7e4e3b30ec2fb6beba253 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Tue, 26 Oct 2010 16:05:08 +0900 Subject: sh: Switch dynamic IRQ creation to generic irq allocator. Now that the genirq code provides an IRQ bitmap of its own and the necessary API to manipulate it, there's no need to keep our own version around anymore. In the process we kill off some unused IRQ reservation code, with future users now having to tie in to the genirq API as normal. Signed-off-by: Paul Mundt --- drivers/sh/intc/core.c | 2 +- drivers/sh/intc/dynamic.c | 82 +++++------------------------------------------ 2 files changed, 9 insertions(+), 75 deletions(-) (limited to 'drivers') diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 8f3c27e9f9e2..0801089828e7 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -78,7 +78,7 @@ static void __init intc_register_irq(struct intc_desc *desc, * Register the IRQ position with the global IRQ map, then insert * it in to the radix tree. */ - reserve_irq_vector(irq); + irq_reserve_irqs(irq, 1); raw_spin_lock_irqsave(&intc_big_lock, flags); radix_tree_insert(&d->tree, enum_id, intc_irq_xlate_get(irq)); diff --git a/drivers/sh/intc/dynamic.c b/drivers/sh/intc/dynamic.c index e994c7ed916e..4187cce20ffd 100644 --- a/drivers/sh/intc/dynamic.c +++ b/drivers/sh/intc/dynamic.c @@ -17,7 +17,7 @@ #include "internals.h" /* only for activate_irq() damage.. */ /* - * The intc_irq_map provides a global map of bound IRQ vectors for a + * The IRQ bitmap provides a global map of bound IRQ vectors for a * given platform. Allocation of IRQs are either static through the CPU * vector map, or dynamic in the case of board mux vectors or MSI. * @@ -27,104 +27,38 @@ * when dynamically creating IRQs, as well as tying in to otherwise * unused irq_desc positions in the sparse array. */ -static DECLARE_BITMAP(intc_irq_map, NR_IRQS); -static DEFINE_RAW_SPINLOCK(vector_lock); /* * Dynamic IRQ allocation and deallocation */ unsigned int create_irq_nr(unsigned int irq_want, int node) { - unsigned int irq = 0, new; - unsigned long flags; - - raw_spin_lock_irqsave(&vector_lock, flags); - - /* - * First try the wanted IRQ - */ - if (test_and_set_bit(irq_want, intc_irq_map) == 0) { - new = irq_want; - } else { - /* .. then fall back to scanning. */ - new = find_first_zero_bit(intc_irq_map, nr_irqs); - if (unlikely(new == nr_irqs)) - goto out_unlock; - - __set_bit(new, intc_irq_map); - } - - raw_spin_unlock_irqrestore(&vector_lock, flags); - - irq = irq_alloc_desc_at(new, node); - if (unlikely(irq != new)) { - pr_err("can't get irq_desc for %d\n", new); + int irq = irq_alloc_desc_at(irq_want, node); + if (irq < 0) return 0; - } activate_irq(irq); - return 0; - -out_unlock: - raw_spin_unlock_irqrestore(&vector_lock, flags); - return 0; + return irq; } int create_irq(void) { - int nid = cpu_to_node(smp_processor_id()); - int irq; - - irq = create_irq_nr(NR_IRQS_LEGACY, nid); - if (irq == 0) - irq = -1; + int irq = irq_alloc_desc(numa_node_id()); + if (irq >= 0) + activate_irq(irq); return irq; } void destroy_irq(unsigned int irq) { - unsigned long flags; - irq_free_desc(irq); - - raw_spin_lock_irqsave(&vector_lock, flags); - __clear_bit(irq, intc_irq_map); - raw_spin_unlock_irqrestore(&vector_lock, flags); -} - -int reserve_irq_vector(unsigned int irq) -{ - unsigned long flags; - int ret = 0; - - raw_spin_lock_irqsave(&vector_lock, flags); - if (test_and_set_bit(irq, intc_irq_map)) - ret = -EBUSY; - raw_spin_unlock_irqrestore(&vector_lock, flags); - - return ret; } void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs) { - unsigned long flags; int i; - raw_spin_lock_irqsave(&vector_lock, flags); for (i = 0; i < nr_vecs; i++) - __set_bit(evt2irq(vectors[i].vect), intc_irq_map); - raw_spin_unlock_irqrestore(&vector_lock, flags); -} - -void reserve_irq_legacy(void) -{ - unsigned long flags; - int i, j; - - raw_spin_lock_irqsave(&vector_lock, flags); - j = find_first_bit(intc_irq_map, nr_irqs); - for (i = 0; i < j; i++) - __set_bit(i, intc_irq_map); - raw_spin_unlock_irqrestore(&vector_lock, flags); + irq_reserve_irqs(evt2irq(vectors[i].vect), 1); } -- cgit v1.2.1 From 9eb79bb3f54ce1843d579ef42ded61e0c607e850 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 14:33:39 +0900 Subject: cdrom: gdrom: ctrl_in/outX to __raw_read/writeX conversion. The ctrl_xxx routines are deprecated, switch over to the __raw_xxx versions. Signed-off-by: Paul Mundt --- drivers/cdrom/gdrom.c | 76 +++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) (limited to 'drivers') diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index 3af6516919b7..de65915308fb 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c @@ -142,18 +142,18 @@ static int gdrom_hardreset(struct cdrom_device_info *cd_info); static bool gdrom_is_busy(void) { - return (ctrl_inb(GDROM_ALTSTATUS_REG) & 0x80) != 0; + return (__raw_readb(GDROM_ALTSTATUS_REG) & 0x80) != 0; } static bool gdrom_data_request(void) { - return (ctrl_inb(GDROM_ALTSTATUS_REG) & 0x88) == 8; + return (__raw_readb(GDROM_ALTSTATUS_REG) & 0x88) == 8; } static bool gdrom_wait_clrbusy(void) { unsigned long timeout = jiffies + GDROM_DEFAULT_TIMEOUT; - while ((ctrl_inb(GDROM_ALTSTATUS_REG) & 0x80) && + while ((__raw_readb(GDROM_ALTSTATUS_REG) & 0x80) && (time_before(jiffies, timeout))) cpu_relax(); return time_before(jiffies, timeout + 1); @@ -181,14 +181,14 @@ static void gdrom_identifydevice(void *buf) gdrom_getsense(NULL); return; } - ctrl_outb(GDROM_COM_IDDEV, GDROM_STATUSCOMMAND_REG); + __raw_writeb(GDROM_COM_IDDEV, GDROM_STATUSCOMMAND_REG); if (!gdrom_wait_busy_sleeps()) { gdrom_getsense(NULL); return; } /* now read in the data */ for (c = 0; c < 40; c++) - data[c] = ctrl_inw(GDROM_DATA_REG); + data[c] = __raw_readw(GDROM_DATA_REG); } static void gdrom_spicommand(void *spi_string, int buflen) @@ -197,21 +197,21 @@ static void gdrom_spicommand(void *spi_string, int buflen) unsigned long timeout; /* ensure IRQ_WAIT is set */ - ctrl_outb(0x08, GDROM_ALTSTATUS_REG); + __raw_writeb(0x08, GDROM_ALTSTATUS_REG); /* specify how many bytes we expect back */ - ctrl_outb(buflen & 0xFF, GDROM_BCL_REG); - ctrl_outb((buflen >> 8) & 0xFF, GDROM_BCH_REG); + __raw_writeb(buflen & 0xFF, GDROM_BCL_REG); + __raw_writeb((buflen >> 8) & 0xFF, GDROM_BCH_REG); /* other parameters */ - ctrl_outb(0, GDROM_INTSEC_REG); - ctrl_outb(0, GDROM_SECNUM_REG); - ctrl_outb(0, GDROM_ERROR_REG); + __raw_writeb(0, GDROM_INTSEC_REG); + __raw_writeb(0, GDROM_SECNUM_REG); + __raw_writeb(0, GDROM_ERROR_REG); /* Wait until we can go */ if (!gdrom_wait_clrbusy()) { gdrom_getsense(NULL); return; } timeout = jiffies + GDROM_DEFAULT_TIMEOUT; - ctrl_outb(GDROM_COM_PACKET, GDROM_STATUSCOMMAND_REG); + __raw_writeb(GDROM_COM_PACKET, GDROM_STATUSCOMMAND_REG); while (!gdrom_data_request() && time_before(jiffies, timeout)) cpu_relax(); if (!time_before(jiffies, timeout + 1)) { @@ -233,10 +233,10 @@ static char gdrom_execute_diagnostic(void) gdrom_hardreset(gd.cd_info); if (!gdrom_wait_clrbusy()) return 0; - ctrl_outb(GDROM_COM_EXECDIAG, GDROM_STATUSCOMMAND_REG); + __raw_writeb(GDROM_COM_EXECDIAG, GDROM_STATUSCOMMAND_REG); if (!gdrom_wait_busy_sleeps()) return 0; - return ctrl_inb(GDROM_ERROR_REG); + return __raw_readb(GDROM_ERROR_REG); } /* @@ -385,7 +385,7 @@ static void gdrom_release(struct cdrom_device_info *cd_info) static int gdrom_drivestatus(struct cdrom_device_info *cd_info, int ignore) { /* read the sense key */ - char sense = ctrl_inb(GDROM_ERROR_REG); + char sense = __raw_readb(GDROM_ERROR_REG); sense &= 0xF0; if (sense == 0) return CDS_DISC_OK; @@ -398,16 +398,16 @@ static int gdrom_drivestatus(struct cdrom_device_info *cd_info, int ignore) static int gdrom_mediachanged(struct cdrom_device_info *cd_info, int ignore) { /* check the sense key */ - return (ctrl_inb(GDROM_ERROR_REG) & 0xF0) == 0x60; + return (__raw_readb(GDROM_ERROR_REG) & 0xF0) == 0x60; } /* reset the G1 bus */ static int gdrom_hardreset(struct cdrom_device_info *cd_info) { int count; - ctrl_outl(0x1fffff, GDROM_RESET_REG); + __raw_writel(0x1fffff, GDROM_RESET_REG); for (count = 0xa0000000; count < 0xa0200000; count += 4) - ctrl_inl(count); + __raw_readl(count); return 0; } @@ -536,7 +536,7 @@ static const struct block_device_operations gdrom_bdops = { static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) { - gd.status = ctrl_inb(GDROM_STATUSCOMMAND_REG); + gd.status = __raw_readb(GDROM_STATUSCOMMAND_REG); if (gd.pending != 1) return IRQ_HANDLED; gd.pending = 0; @@ -546,7 +546,7 @@ static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) static irqreturn_t gdrom_dma_interrupt(int irq, void *dev_id) { - gd.status = ctrl_inb(GDROM_STATUSCOMMAND_REG); + gd.status = __raw_readb(GDROM_STATUSCOMMAND_REG); if (gd.transfer != 1) return IRQ_HANDLED; gd.transfer = 0; @@ -600,10 +600,10 @@ static void gdrom_readdisk_dma(struct work_struct *work) spin_unlock(&gdrom_lock); block = blk_rq_pos(req)/GD_TO_BLK + GD_SESSION_OFFSET; block_cnt = blk_rq_sectors(req)/GD_TO_BLK; - ctrl_outl(virt_to_phys(req->buffer), GDROM_DMA_STARTADDR_REG); - ctrl_outl(block_cnt * GDROM_HARD_SECTOR, GDROM_DMA_LENGTH_REG); - ctrl_outl(1, GDROM_DMA_DIRECTION_REG); - ctrl_outl(1, GDROM_DMA_ENABLE_REG); + __raw_writel(virt_to_phys(req->buffer), GDROM_DMA_STARTADDR_REG); + __raw_writel(block_cnt * GDROM_HARD_SECTOR, GDROM_DMA_LENGTH_REG); + __raw_writel(1, GDROM_DMA_DIRECTION_REG); + __raw_writel(1, GDROM_DMA_ENABLE_REG); read_command->cmd[2] = (block >> 16) & 0xFF; read_command->cmd[3] = (block >> 8) & 0xFF; read_command->cmd[4] = block & 0xFF; @@ -611,18 +611,18 @@ static void gdrom_readdisk_dma(struct work_struct *work) read_command->cmd[9] = (block_cnt >> 8) & 0xFF; read_command->cmd[10] = block_cnt & 0xFF; /* set for DMA */ - ctrl_outb(1, GDROM_ERROR_REG); + __raw_writeb(1, GDROM_ERROR_REG); /* other registers */ - ctrl_outb(0, GDROM_SECNUM_REG); - ctrl_outb(0, GDROM_BCL_REG); - ctrl_outb(0, GDROM_BCH_REG); - ctrl_outb(0, GDROM_DSEL_REG); - ctrl_outb(0, GDROM_INTSEC_REG); + __raw_writeb(0, GDROM_SECNUM_REG); + __raw_writeb(0, GDROM_BCL_REG); + __raw_writeb(0, GDROM_BCH_REG); + __raw_writeb(0, GDROM_DSEL_REG); + __raw_writeb(0, GDROM_INTSEC_REG); /* Wait for registers to reset after any previous activity */ timeout = jiffies + HZ / 2; while (gdrom_is_busy() && time_before(jiffies, timeout)) cpu_relax(); - ctrl_outb(GDROM_COM_PACKET, GDROM_STATUSCOMMAND_REG); + __raw_writeb(GDROM_COM_PACKET, GDROM_STATUSCOMMAND_REG); timeout = jiffies + HZ / 2; /* Wait for packet command to finish */ while (gdrom_is_busy() && time_before(jiffies, timeout)) @@ -632,11 +632,11 @@ static void gdrom_readdisk_dma(struct work_struct *work) outsw(GDROM_DATA_REG, &read_command->cmd, 6); timeout = jiffies + HZ / 2; /* Wait for any pending DMA to finish */ - while (ctrl_inb(GDROM_DMA_STATUS_REG) && + while (__raw_readb(GDROM_DMA_STATUS_REG) && time_before(jiffies, timeout)) cpu_relax(); /* start transfer */ - ctrl_outb(1, GDROM_DMA_STATUS_REG); + __raw_writeb(1, GDROM_DMA_STATUS_REG); wait_event_interruptible_timeout(request_queue, gd.transfer == 0, GDROM_DEFAULT_TIMEOUT); err = gd.transfer ? -EIO : 0; @@ -714,11 +714,11 @@ free_id: /* set the default mode for DMA transfer */ static int __devinit gdrom_init_dma_mode(void) { - ctrl_outb(0x13, GDROM_ERROR_REG); - ctrl_outb(0x22, GDROM_INTSEC_REG); + __raw_writeb(0x13, GDROM_ERROR_REG); + __raw_writeb(0x22, GDROM_INTSEC_REG); if (!gdrom_wait_clrbusy()) return -EBUSY; - ctrl_outb(0xEF, GDROM_STATUSCOMMAND_REG); + __raw_writeb(0xEF, GDROM_STATUSCOMMAND_REG); if (!gdrom_wait_busy_sleeps()) return -EBUSY; /* Memory protection setting for GDROM DMA @@ -728,8 +728,8 @@ static int __devinit gdrom_init_dma_mode(void) * Bits 6 - 0 end of transfer range in 1 MB blocks OR'ed with 0x80 * (0x40 | 0x80) = start range at 0x0C000000 * (0x7F | 0x80) = end range at 0x0FFFFFFF */ - ctrl_outl(0x8843407F, GDROM_DMA_ACCESS_CTRL_REG); - ctrl_outl(9, GDROM_DMA_WAIT_REG); /* DMA word setting */ + __raw_writel(0x8843407F, GDROM_DMA_ACCESS_CTRL_REG); + __raw_writel(9, GDROM_DMA_WAIT_REG); /* DMA word setting */ return 0; } -- cgit v1.2.1 From c053784454550cf750399caa65482b31ffbe3c57 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 14:34:41 +0900 Subject: sh: maple: ctrl_in/outX to __raw_read/writeX conversion. The ctrl_xxx routines are deprecated, switch over to the __raw_xxx versions. Signed-off-by: Paul Mundt --- drivers/sh/maple/maple.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'drivers') diff --git a/drivers/sh/maple/maple.c b/drivers/sh/maple/maple.c index 4e8f57d4131f..1e20604257af 100644 --- a/drivers/sh/maple/maple.c +++ b/drivers/sh/maple/maple.c @@ -94,9 +94,9 @@ EXPORT_SYMBOL_GPL(maple_driver_unregister); /* set hardware registers to enable next round of dma */ static void maple_dma_reset(void) { - ctrl_outl(MAPLE_MAGIC, MAPLE_RESET); + __raw_writel(MAPLE_MAGIC, MAPLE_RESET); /* set trig type to 0 for software trigger, 1 for hardware (VBLANK) */ - ctrl_outl(1, MAPLE_TRIGTYPE); + __raw_writel(1, MAPLE_TRIGTYPE); /* * Maple system register * bits 31 - 16 timeout in units of 20nsec @@ -105,9 +105,9 @@ static void maple_dma_reset(void) * bits 3 - 0 delay (in 1.3ms) between VBLANK and start of DMA * max delay is 11 */ - ctrl_outl(MAPLE_2MBPS | MAPLE_TIMEOUT(0xFFFF), MAPLE_SPEED); - ctrl_outl(virt_to_phys(maple_sendbuf), MAPLE_DMAADDR); - ctrl_outl(1, MAPLE_ENABLE); + __raw_writel(MAPLE_2MBPS | MAPLE_TIMEOUT(0xFFFF), MAPLE_SPEED); + __raw_writel(virt_to_phys(maple_sendbuf), MAPLE_DMAADDR); + __raw_writel(1, MAPLE_ENABLE); } /** @@ -130,7 +130,7 @@ EXPORT_SYMBOL_GPL(maple_getcond_callback); static int maple_dma_done(void) { - return (ctrl_inl(MAPLE_STATE) & 1) == 0; + return (__raw_readl(MAPLE_STATE) & 1) == 0; } static void maple_release_device(struct device *dev) @@ -275,7 +275,7 @@ static void maple_send(void) return; /* disable DMA */ - ctrl_outl(0, MAPLE_ENABLE); + __raw_writel(0, MAPLE_ENABLE); if (!list_empty(&maple_sentq)) goto finish; @@ -450,7 +450,7 @@ static void maple_vblank_handler(struct work_struct *work) if (!maple_dma_done()) return; - ctrl_outl(0, MAPLE_ENABLE); + __raw_writel(0, MAPLE_ENABLE); if (!list_empty(&maple_sentq)) goto finish; @@ -636,7 +636,7 @@ static void maple_dma_handler(struct work_struct *work) if (!maple_dma_done()) return; - ctrl_outl(0, MAPLE_ENABLE); + __raw_writel(0, MAPLE_ENABLE); if (!list_empty(&maple_sentq)) { list_for_each_entry_safe(mq, nmq, &maple_sentq, list) { mdev = mq->dev; @@ -796,7 +796,7 @@ static int __init maple_bus_init(void) int retval, i; struct maple_device *mdev[MAPLE_PORTS]; - ctrl_outl(0, MAPLE_ENABLE); + __raw_writel(0, MAPLE_ENABLE); retval = device_register(&maple_bus); if (retval) -- cgit v1.2.1 From 0af2840892ead5e07c7b08fef61881ef45b8b9c2 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 15:24:49 +0900 Subject: input: jornada680_kbd: ctrl_in/outX to __raw_read/writeX conversion. The ctrl_xxx routines are deprecated, switch over to the __raw_xxx versions. Signed-off-by: Paul Mundt --- drivers/input/keyboard/jornada680_kbd.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'drivers') diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c index 5fc976dbce0b..7197c5698747 100644 --- a/drivers/input/keyboard/jornada680_kbd.c +++ b/drivers/input/keyboard/jornada680_kbd.c @@ -139,35 +139,35 @@ static void jornada_scan_keyb(unsigned char *s) }, *y = matrix_PDE; /* Save these control reg bits */ - dc_static = (ctrl_inw(PDCR) & (~0xcc0c)); - ec_static = (ctrl_inw(PECR) & (~0xf0cf)); + dc_static = (__raw_readw(PDCR) & (~0xcc0c)); + ec_static = (__raw_readw(PECR) & (~0xf0cf)); for (i = 0; i < 8; i++) { /* disable output for all but the one we want to scan */ - ctrl_outw((dc_static | *y++), PDCR); - ctrl_outw((ec_static | *y++), PECR); + __raw_writew((dc_static | *y++), PDCR); + __raw_writew((ec_static | *y++), PECR); udelay(5); /* Get scanline row */ - ctrl_outb(*t++, PDDR); - ctrl_outb(*t++, PEDR); + __raw_writeb(*t++, PDDR); + __raw_writeb(*t++, PEDR); udelay(50); /* Read data */ - *s++ = ctrl_inb(PCDR); - *s++ = ctrl_inb(PFDR); + *s++ = __raw_readb(PCDR); + *s++ = __raw_readb(PFDR); } /* Scan no lines */ - ctrl_outb(0xff, PDDR); - ctrl_outb(0xff, PEDR); + __raw_writeb(0xff, PDDR); + __raw_writeb(0xff, PEDR); /* Enable all scanlines */ - ctrl_outw((dc_static | (0x5555 & 0xcc0c)),PDCR); - ctrl_outw((ec_static | (0x5555 & 0xf0cf)),PECR); + __raw_writew((dc_static | (0x5555 & 0xcc0c)),PDCR); + __raw_writew((ec_static | (0x5555 & 0xf0cf)),PECR); /* Ignore extra keys and events */ - *s++ = ctrl_inb(PGDR); - *s++ = ctrl_inb(PHDR); + *s++ = __raw_readb(PGDR); + *s++ = __raw_readb(PHDR); } static void jornadakbd680_poll(struct input_polled_dev *dev) -- cgit v1.2.1 From e28abafbab4205bda07087ea29cde39a14ba82c9 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 15:25:42 +0900 Subject: input: hp680_ts_input: ctrl_in/outX to __raw_read/writeX conversion. The ctrl_xxx routines are deprecated, switch over to the __raw_xxx versions. Signed-off-by: Paul Mundt --- drivers/input/touchscreen/hp680_ts_input.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/input/touchscreen/hp680_ts_input.c b/drivers/input/touchscreen/hp680_ts_input.c index 498bd62af09a..dd4e8f020b99 100644 --- a/drivers/input/touchscreen/hp680_ts_input.c +++ b/drivers/input/touchscreen/hp680_ts_input.c @@ -28,29 +28,29 @@ static void do_softint(struct work_struct *work) u8 scpdr; int touched = 0; - if (ctrl_inb(PHDR) & PHDR_TS_PEN_DOWN) { - scpdr = ctrl_inb(SCPDR); + if (__raw_readb(PHDR) & PHDR_TS_PEN_DOWN) { + scpdr = __raw_readb(SCPDR); scpdr |= SCPDR_TS_SCAN_ENABLE; scpdr &= ~SCPDR_TS_SCAN_Y; - ctrl_outb(scpdr, SCPDR); + __raw_writeb(scpdr, SCPDR); udelay(30); absy = adc_single(ADC_CHANNEL_TS_Y); - scpdr = ctrl_inb(SCPDR); + scpdr = __raw_readb(SCPDR); scpdr |= SCPDR_TS_SCAN_Y; scpdr &= ~SCPDR_TS_SCAN_X; - ctrl_outb(scpdr, SCPDR); + __raw_writeb(scpdr, SCPDR); udelay(30); absx = adc_single(ADC_CHANNEL_TS_X); - scpdr = ctrl_inb(SCPDR); + scpdr = __raw_readb(SCPDR); scpdr |= SCPDR_TS_SCAN_X; scpdr &= ~SCPDR_TS_SCAN_ENABLE; - ctrl_outb(scpdr, SCPDR); + __raw_writeb(scpdr, SCPDR); udelay(100); - touched = ctrl_inb(PHDR) & PHDR_TS_PEN_DOWN; + touched = __raw_readb(PHDR) & PHDR_TS_PEN_DOWN; } if (touched) { -- cgit v1.2.1 From 071a1e33bac5c4ff8667d074be58365bd164b350 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 15:30:32 +0900 Subject: rtc: rtc-rs5c313: ctrl_in/outX to __raw_read/writeX conversion. The ctrl_xxx routines are deprecated, switch over to the __raw_xxx versions. Signed-off-by: Paul Mundt --- drivers/rtc/rtc-rs5c313.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'drivers') diff --git a/drivers/rtc/rtc-rs5c313.c b/drivers/rtc/rtc-rs5c313.c index e6ea3f5ee1eb..e3ff179b99ca 100644 --- a/drivers/rtc/rtc-rs5c313.c +++ b/drivers/rtc/rtc-rs5c313.c @@ -80,21 +80,21 @@ /* SCSPTR1 data */ unsigned char scsptr1_data; -#define RS5C313_CEENABLE ctrl_outb(RS5C313_CE_RTCCE, RS5C313_CE); -#define RS5C313_CEDISABLE ctrl_outb(0x00, RS5C313_CE) -#define RS5C313_MISCOP ctrl_outb(0x02, 0xB0000008) +#define RS5C313_CEENABLE __raw_writeb(RS5C313_CE_RTCCE, RS5C313_CE); +#define RS5C313_CEDISABLE __raw_writeb(0x00, RS5C313_CE) +#define RS5C313_MISCOP __raw_writeb(0x02, 0xB0000008) static void rs5c313_init_port(void) { /* Set SCK as I/O port and Initialize SCSPTR1 data & I/O port. */ - ctrl_outb(ctrl_inb(SCSMR1) & ~SCSMR1_CA, SCSMR1); - ctrl_outb(ctrl_inb(SCSCR1) & ~SCSCR1_CKE, SCSCR1); + __raw_writeb(__raw_readb(SCSMR1) & ~SCSMR1_CA, SCSMR1); + __raw_writeb(__raw_readb(SCSCR1) & ~SCSCR1_CKE, SCSCR1); /* And Initialize SCL for RS5C313 clock */ - scsptr1_data = ctrl_inb(SCSPTR1) | SCL; /* SCL:H */ - ctrl_outb(scsptr1_data, SCSPTR1); - scsptr1_data = ctrl_inb(SCSPTR1) | SCL_OEN; /* SCL output enable */ - ctrl_outb(scsptr1_data, SCSPTR1); + scsptr1_data = __raw_readb(SCSPTR1) | SCL; /* SCL:H */ + __raw_writeb(scsptr1_data, SCSPTR1); + scsptr1_data = __raw_readb(SCSPTR1) | SCL_OEN; /* SCL output enable */ + __raw_writeb(scsptr1_data, SCSPTR1); RS5C313_CEDISABLE; /* CE:L */ } @@ -106,21 +106,21 @@ static void rs5c313_write_data(unsigned char data) /* SDA:Write Data */ scsptr1_data = (scsptr1_data & ~SDA) | ((((0x80 >> i) & data) >> (7 - i)) << 2); - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); if (i == 0) { scsptr1_data |= SDA_OEN; /* SDA:output enable */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); } ndelay(700); scsptr1_data &= ~SCL; /* SCL:L */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); ndelay(700); scsptr1_data |= SCL; /* SCL:H */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); } scsptr1_data &= ~SDA_OEN; /* SDA:output disable */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); } static unsigned char rs5c313_read_data(void) @@ -131,12 +131,12 @@ static unsigned char rs5c313_read_data(void) for (i = 0; i < 8; i++) { ndelay(700); /* SDA:Read Data */ - data |= ((ctrl_inb(SCSPTR1) & SDA) >> 2) << (7 - i); + data |= ((__raw_readb(SCSPTR1) & SDA) >> 2) << (7 - i); scsptr1_data &= ~SCL; /* SCL:L */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); ndelay(700); scsptr1_data |= SCL; /* SCL:H */ - ctrl_outb(scsptr1_data, SCSPTR1); + __raw_writeb(scsptr1_data, SCSPTR1); } return data & 0x0F; } -- cgit v1.2.1 From 26599a94dcadbed528a3e32a4f482a9766332f5b Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Wed, 27 Oct 2010 15:42:10 +0900 Subject: sh: intc: irq_data conversion. Signed-off-by: Paul Mundt --- drivers/sh/intc/chip.c | 53 +++++++++++++++++++++++++-------------------- drivers/sh/intc/core.c | 39 ++++++++++++++++++++++++--------- drivers/sh/intc/internals.h | 2 +- drivers/sh/intc/virq.c | 14 +++++++----- 4 files changed, 68 insertions(+), 40 deletions(-) (limited to 'drivers') diff --git a/drivers/sh/intc/chip.c b/drivers/sh/intc/chip.c index 35c03706cc21..de885a0f917a 100644 --- a/drivers/sh/intc/chip.c +++ b/drivers/sh/intc/chip.c @@ -12,15 +12,16 @@ #include #include "internals.h" -void _intc_enable(unsigned int irq, unsigned long handle) +void _intc_enable(struct irq_data *data, unsigned long handle) { + unsigned int irq = data->irq; struct intc_desc_int *d = get_intc_desc(irq); unsigned long addr; unsigned int cpu; for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_E(handle)); cpu++) { #ifdef CONFIG_SMP - if (!cpumask_test_cpu(cpu, irq_to_desc(irq)->affinity)) + if (!cpumask_test_cpu(cpu, data->affinity)) continue; #endif addr = INTC_REG(d, _INTC_ADDR_E(handle), cpu); @@ -31,15 +32,16 @@ void _intc_enable(unsigned int irq, unsigned long handle) intc_balancing_enable(irq); } -static void intc_enable(unsigned int irq) +static void intc_enable(struct irq_data *data) { - _intc_enable(irq, (unsigned long)get_irq_chip_data(irq)); + _intc_enable(data, (unsigned long)irq_data_get_irq_chip_data(data)); } -static void intc_disable(unsigned int irq) +static void intc_disable(struct irq_data *data) { + unsigned int irq = data->irq; struct intc_desc_int *d = get_intc_desc(irq); - unsigned long handle = (unsigned long)get_irq_chip_data(irq); + unsigned long handle = (unsigned long)irq_data_get_irq_chip_data(data); unsigned long addr; unsigned int cpu; @@ -47,7 +49,7 @@ static void intc_disable(unsigned int irq) for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_D(handle)); cpu++) { #ifdef CONFIG_SMP - if (!cpumask_test_cpu(cpu, irq_to_desc(irq)->affinity)) + if (!cpumask_test_cpu(cpu, data->affinity)) continue; #endif addr = INTC_REG(d, _INTC_ADDR_D(handle), cpu); @@ -56,7 +58,7 @@ static void intc_disable(unsigned int irq) } } -static int intc_set_wake(unsigned int irq, unsigned int on) +static int intc_set_wake(struct irq_data *data, unsigned int on) { return 0; /* allow wakeup, but setup hardware in intc_suspend() */ } @@ -67,24 +69,27 @@ static int intc_set_wake(unsigned int irq, unsigned int on) * additional locking here at the intc desc level. The affinity mask is * later tested in the enable/disable paths. */ -static int intc_set_affinity(unsigned int irq, const struct cpumask *cpumask) +static int intc_set_affinity(struct irq_data *data, + const struct cpumask *cpumask, + bool force) { if (!cpumask_intersects(cpumask, cpu_online_mask)) return -1; - cpumask_copy(irq_to_desc(irq)->affinity, cpumask); + cpumask_copy(data->affinity, cpumask); return 0; } #endif -static void intc_mask_ack(unsigned int irq) +static void intc_mask_ack(struct irq_data *data) { + unsigned int irq = data->irq; struct intc_desc_int *d = get_intc_desc(irq); unsigned long handle = intc_get_ack_handle(irq); unsigned long addr; - intc_disable(irq); + intc_disable(data); /* read register and write zero only to the associated bit */ if (handle) { @@ -144,6 +149,7 @@ static struct intc_handle_int *intc_find_irq(struct intc_handle_int *hp, int intc_set_priority(unsigned int irq, unsigned int prio) { struct intc_desc_int *d = get_intc_desc(irq); + struct irq_data *data = irq_get_irq_data(irq); struct intc_handle_int *ihp; if (!intc_get_prio_level(irq) || prio <= 1) @@ -162,7 +168,7 @@ int intc_set_priority(unsigned int irq, unsigned int prio) * priority level will be set during next enable() */ if (_INTC_FN(ihp->handle) != REG_FN_ERR) - _intc_enable(irq, ihp->handle); + _intc_enable(data, ihp->handle); } return 0; } @@ -181,8 +187,9 @@ static unsigned char intc_irq_sense_table[IRQ_TYPE_SENSE_MASK + 1] = { #endif }; -static int intc_set_type(unsigned int irq, unsigned int type) +static int intc_set_type(struct irq_data *data, unsigned int type) { + unsigned int irq = data->irq; struct intc_desc_int *d = get_intc_desc(irq); unsigned char value = intc_irq_sense_table[type & IRQ_TYPE_SENSE_MASK]; struct intc_handle_int *ihp; @@ -201,15 +208,15 @@ static int intc_set_type(unsigned int irq, unsigned int type) } struct irq_chip intc_irq_chip = { - .mask = intc_disable, - .unmask = intc_enable, - .mask_ack = intc_mask_ack, - .enable = intc_enable, - .disable = intc_disable, - .shutdown = intc_disable, - .set_type = intc_set_type, - .set_wake = intc_set_wake, + .irq_mask = intc_disable, + .irq_unmask = intc_enable, + .irq_mask_ack = intc_mask_ack, + .irq_enable = intc_enable, + .irq_disable = intc_disable, + .irq_shutdown = intc_disable, + .irq_set_type = intc_set_type, + .irq_set_wake = intc_set_wake, #ifdef CONFIG_SMP - .set_affinity = intc_set_affinity, + .irq_set_affinity = intc_set_affinity, #endif }; diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 0801089828e7..338fad2a3fa4 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -71,6 +71,7 @@ static void __init intc_register_irq(struct intc_desc *desc, unsigned int irq) { struct intc_handle_int *hp; + struct irq_data *irq_data; unsigned int data[2], primary; unsigned long flags; @@ -111,6 +112,8 @@ static void __init intc_register_irq(struct intc_desc *desc, BUG_ON(!data[primary]); /* must have primary masking method */ + irq_data = irq_get_irq_data(irq); + disable_irq_nosync(irq); set_irq_chip_and_handler_name(irq, &d->chip, handle_level_irq, "level"); @@ -123,7 +126,7 @@ static void __init intc_register_irq(struct intc_desc *desc, /* enable secondary masking method if present */ if (data[!primary]) - _intc_enable(irq, data[!primary]); + _intc_enable(irq_data, data[!primary]); /* add irq to d->prio list if priority is available */ if (data[1]) { @@ -151,7 +154,7 @@ static void __init intc_register_irq(struct intc_desc *desc, } /* irq should be disabled by default */ - d->chip.mask(irq); + d->chip.irq_mask(irq_data); intc_set_ack_handle(irq, desc, d, enum_id); intc_set_dist_handle(irq, desc, d, enum_id); @@ -284,7 +287,7 @@ int __init register_intc_controller(struct intc_desc *desc) for (i = 0; i < hw->nr_ack_regs; i++) k += save_reg(d, k, hw->ack_regs[i].set_reg, 0); else - d->chip.mask_ack = d->chip.disable; + d->chip.irq_mask_ack = d->chip.irq_disable; /* disable bits matching force_disable before registering irqs */ if (desc->force_disable) @@ -387,7 +390,9 @@ static SYSDEV_ATTR(name, S_IRUGO, show_intc_name, NULL); static int intc_suspend(struct sys_device *dev, pm_message_t state) { struct intc_desc_int *d; + struct irq_data *data; struct irq_desc *desc; + struct irq_chip *chip; int irq; /* get intc controller associated with this sysdev */ @@ -398,17 +403,24 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) if (d->state.event != PM_EVENT_FREEZE) break; - for_each_irq_desc(irq, desc) { + for_each_irq_nr(irq) { + desc = irq_to_desc(irq); + if (!desc) + continue; + + data = irq_get_irq_data(irq); + chip = irq_data_get_irq_chip(data); + /* * This will catch the redirect and VIRQ cases * due to the dummy_irq_chip being inserted. */ - if (desc->chip != &d->chip) + if (chip != &d->chip) continue; if (desc->status & IRQ_DISABLED) - desc->chip->disable(irq); + chip->irq_disable(data); else - desc->chip->enable(irq); + chip->irq_enable(data); } break; case PM_EVENT_FREEZE: @@ -416,11 +428,18 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) break; case PM_EVENT_SUSPEND: /* enable wakeup irqs belonging to this intc controller */ - for_each_irq_desc(irq, desc) { - if (desc->chip != &d->chip) + for_each_irq_nr(irq) { + desc = irq_to_desc(irq); + if (!desc) + continue; + + data = irq_get_irq_data(irq); + chip = irq_data_get_irq_chip(data); + + if (chip != &d->chip) continue; if ((desc->status & IRQ_WAKEUP)) - desc->chip->enable(irq); + chip->irq_enable(data); } break; } diff --git a/drivers/sh/intc/internals.h b/drivers/sh/intc/internals.h index d49482c623fa..0cf8260971d4 100644 --- a/drivers/sh/intc/internals.h +++ b/drivers/sh/intc/internals.h @@ -152,7 +152,7 @@ intc_set_dist_handle(unsigned int irq, struct intc_desc *desc, /* chip.c */ extern struct irq_chip intc_irq_chip; -void _intc_enable(unsigned int irq, unsigned long handle); +void _intc_enable(struct irq_data *data, unsigned long handle); /* core.c */ extern struct list_head intc_list; diff --git a/drivers/sh/intc/virq.c b/drivers/sh/intc/virq.c index 643dfd4d2057..e5bf5d3c698e 100644 --- a/drivers/sh/intc/virq.c +++ b/drivers/sh/intc/virq.c @@ -83,11 +83,11 @@ EXPORT_SYMBOL_GPL(intc_irq_lookup); static int add_virq_to_pirq(unsigned int irq, unsigned int virq) { struct intc_virq_list **last, *entry; - struct irq_desc *desc = irq_to_desc(irq); + struct irq_data *data = irq_get_irq_data(irq); /* scan for duplicates */ - last = (struct intc_virq_list **)&desc->handler_data; - for_each_virq(entry, desc->handler_data) { + last = (struct intc_virq_list **)&data->handler_data; + for_each_virq(entry, data->handler_data) { if (entry->irq == virq) return 0; last = &entry->next; @@ -108,10 +108,12 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq) static void intc_virq_handler(unsigned int irq, struct irq_desc *desc) { - struct intc_virq_list *entry, *vlist = get_irq_data(irq); + struct irq_data *data = irq_get_irq_data(irq); + struct irq_chip *chip = irq_data_get_irq_chip(data); + struct intc_virq_list *entry, *vlist = irq_data_get_irq_data(data); struct intc_desc_int *d = get_intc_desc(irq); - desc->chip->mask_ack(irq); + chip->irq_mask_ack(data); for_each_virq(entry, vlist) { unsigned long addr, handle; @@ -123,7 +125,7 @@ static void intc_virq_handler(unsigned int irq, struct irq_desc *desc) generic_handle_irq(entry->irq); } - desc->chip->unmask(irq); + chip->irq_unmask(data); } static unsigned long __init intc_subgroup_data(struct intc_subgroup *subgroup, -- cgit v1.2.1 From 63111a3a70fb4d80e3b54ed75f13795e98f7a467 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Thu, 28 Oct 2010 11:36:31 +0900 Subject: sh: intc: switch irq_desc iteration to new active IRQ iterator. There's no need to iterative over every single irq_desc when we can already work out which IRQs have a backing descriptor via the shiny new for_each_active_irq(). Switch to that instead. Signed-off-by: Paul Mundt --- drivers/sh/intc/core.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 338fad2a3fa4..873a99ff8f64 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -403,11 +403,8 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) if (d->state.event != PM_EVENT_FREEZE) break; - for_each_irq_nr(irq) { + for_each_active_irq(irq) { desc = irq_to_desc(irq); - if (!desc) - continue; - data = irq_get_irq_data(irq); chip = irq_data_get_irq_chip(data); @@ -428,11 +425,8 @@ static int intc_suspend(struct sys_device *dev, pm_message_t state) break; case PM_EVENT_SUSPEND: /* enable wakeup irqs belonging to this intc controller */ - for_each_irq_nr(irq) { + for_each_active_irq(irq) { desc = irq_to_desc(irq); - if (!desc) - continue; - data = irq_get_irq_data(irq); chip = irq_data_get_irq_chip(data); -- cgit v1.2.1