~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to arch/arm/mach-msm/gpio-v2.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
230
230
               val, val2);
231
231
}
232
232
 
233
 
static void msm_gpio_irq_ack(unsigned int irq)
 
233
static void msm_gpio_irq_ack(struct irq_data *d)
234
234
{
235
 
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq);
 
235
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, d->irq);
236
236
 
237
237
        writel(BIT(INTR_STATUS), GPIO_INTR_STATUS(gpio));
238
238
        if (test_bit(gpio, msm_gpio.dual_edge_irqs))
239
239
                msm_gpio_update_dual_edge_pos(gpio);
240
240
}
241
241
 
242
 
static void msm_gpio_irq_mask(unsigned int irq)
 
242
static void msm_gpio_irq_mask(struct irq_data *d)
243
243
{
244
 
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq);
 
244
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, d->irq);
245
245
        unsigned long irq_flags;
246
246
 
247
247
        spin_lock_irqsave(&tlmm_lock, irq_flags);
251
251
        spin_unlock_irqrestore(&tlmm_lock, irq_flags);
252
252
}
253
253
 
254
 
static void msm_gpio_irq_unmask(unsigned int irq)
 
254
static void msm_gpio_irq_unmask(struct irq_data *d)
255
255
{
256
 
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq);
 
256
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, d->irq);
257
257
        unsigned long irq_flags;
258
258
 
259
259
        spin_lock_irqsave(&tlmm_lock, irq_flags);
263
263
        spin_unlock_irqrestore(&tlmm_lock, irq_flags);
264
264
}
265
265
 
266
 
static int msm_gpio_irq_set_type(unsigned int irq, unsigned int flow_type)
 
266
static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int flow_type)
267
267
{
268
 
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq);
 
268
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, d->irq);
269
269
        unsigned long irq_flags;
270
270
        uint32_t bits;
271
271
 
275
275
 
276
276
        if (flow_type & IRQ_TYPE_EDGE_BOTH) {
277
277
                bits |= BIT(INTR_DECT_CTL);
278
 
                irq_desc[irq].handle_irq = handle_edge_irq;
 
278
                __irq_set_handler_locked(d->irq, handle_edge_irq);
279
279
                if ((flow_type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH)
280
280
                        __set_bit(gpio, msm_gpio.dual_edge_irqs);
281
281
                else
282
282
                        __clear_bit(gpio, msm_gpio.dual_edge_irqs);
283
283
        } else {
284
284
                bits &= ~BIT(INTR_DECT_CTL);
285
 
                irq_desc[irq].handle_irq = handle_level_irq;
 
285
                __irq_set_handler_locked(d->irq, handle_level_irq);
286
286
                __clear_bit(gpio, msm_gpio.dual_edge_irqs);
287
287
        }
288
288
 
309
309
 */
310
310
static void msm_summary_irq_handler(unsigned int irq, struct irq_desc *desc)
311
311
{
 
312
        struct irq_data *data = irq_desc_get_irq_data(desc);
312
313
        unsigned long i;
313
314
 
314
315
        for (i = find_first_bit(msm_gpio.enabled_irqs, NR_GPIO_IRQS);
318
319
                        generic_handle_irq(msm_gpio_to_irq(&msm_gpio.gpio_chip,
319
320
                                                           i));
320
321
        }
321
 
        desc->chip->ack(irq);
 
322
        data->chip->irq_ack(data);
322
323
}
323
324
 
324
 
static int msm_gpio_irq_set_wake(unsigned int irq, unsigned int on)
 
325
static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
325
326
{
326
 
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq);
 
327
        int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, d->irq);
327
328
 
328
329
        if (on) {
329
330
                if (bitmap_empty(msm_gpio.wake_irqs, NR_GPIO_IRQS))
330
 
                        set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 1);
 
331
                        irq_set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 1);
331
332
                set_bit(gpio, msm_gpio.wake_irqs);
332
333
        } else {
333
334
                clear_bit(gpio, msm_gpio.wake_irqs);
334
335
                if (bitmap_empty(msm_gpio.wake_irqs, NR_GPIO_IRQS))
335
 
                        set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 0);
 
336
                        irq_set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 0);
336
337
        }
337
338
 
338
339
        return 0;
340
341
 
341
342
static struct irq_chip msm_gpio_irq_chip = {
342
343
        .name           = "msmgpio",
343
 
        .mask           = msm_gpio_irq_mask,
344
 
        .unmask         = msm_gpio_irq_unmask,
345
 
        .ack            = msm_gpio_irq_ack,
346
 
        .set_type       = msm_gpio_irq_set_type,
347
 
        .set_wake       = msm_gpio_irq_set_wake,
 
344
        .irq_mask       = msm_gpio_irq_mask,
 
345
        .irq_unmask     = msm_gpio_irq_unmask,
 
346
        .irq_ack        = msm_gpio_irq_ack,
 
347
        .irq_set_type   = msm_gpio_irq_set_type,
 
348
        .irq_set_wake   = msm_gpio_irq_set_wake,
348
349
};
349
350
 
350
351
static int __devinit msm_gpio_probe(struct platform_device *dev)
361
362
 
362
363
        for (i = 0; i < msm_gpio.gpio_chip.ngpio; ++i) {
363
364
                irq = msm_gpio_to_irq(&msm_gpio.gpio_chip, i);
364
 
                set_irq_chip(irq, &msm_gpio_irq_chip);
365
 
                set_irq_handler(irq, handle_level_irq);
 
365
                irq_set_chip_and_handler(irq, &msm_gpio_irq_chip,
 
366
                                         handle_level_irq);
366
367
                set_irq_flags(irq, IRQF_VALID);
367
368
        }
368
369
 
369
 
        set_irq_chained_handler(TLMM_SCSS_SUMMARY_IRQ,
 
370
        irq_set_chained_handler(TLMM_SCSS_SUMMARY_IRQ,
370
371
                                msm_summary_irq_handler);
371
372
        return 0;
372
373
}
378
379
        if (ret < 0)
379
380
                return ret;
380
381
 
381
 
        set_irq_handler(TLMM_SCSS_SUMMARY_IRQ, NULL);
 
382
        irq_set_handler(TLMM_SCSS_SUMMARY_IRQ, NULL);
382
383
 
383
384
        return 0;
384
385
}