diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-03-23 17:08:53 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2011-03-25 13:45:16 -0400 |
commit | 42b64f388c171a7a1a8962d93d9bae2c04da7738 (patch) | |
tree | 9a5633124bc37814f09e5c60f3a14012fbe1583c /arch/mips/jz4740/gpio.c | |
parent | db00bed4baa8951b579519e90d8d7f215db2827a (diff) |
MIPS: JZ4740: Convert to new irq functions
Convert the JZ4740 intc and gpio irq chips to use newstyle irq functions.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
To: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2181/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/jz4740/gpio.c')
-rw-r--r-- | arch/mips/jz4740/gpio.c | 93 |
1 files changed, 47 insertions, 46 deletions
diff --git a/arch/mips/jz4740/gpio.c b/arch/mips/jz4740/gpio.c index 88e6aeda5bf1..1e28b758de1f 100644 --- a/arch/mips/jz4740/gpio.c +++ b/arch/mips/jz4740/gpio.c | |||
@@ -102,9 +102,9 @@ static inline struct jz_gpio_chip *gpio_chip_to_jz_gpio_chip(struct gpio_chip *g | |||
102 | return container_of(gpio_chip, struct jz_gpio_chip, gpio_chip); | 102 | return container_of(gpio_chip, struct jz_gpio_chip, gpio_chip); |
103 | } | 103 | } |
104 | 104 | ||
105 | static inline struct jz_gpio_chip *irq_to_jz_gpio_chip(unsigned int irq) | 105 | static inline struct jz_gpio_chip *irq_to_jz_gpio_chip(struct irq_data *data) |
106 | { | 106 | { |
107 | return get_irq_chip_data(irq); | 107 | return irq_data_get_irq_chip_data(data); |
108 | } | 108 | } |
109 | 109 | ||
110 | static inline void jz_gpio_write_bit(unsigned int gpio, unsigned int reg) | 110 | static inline void jz_gpio_write_bit(unsigned int gpio, unsigned int reg) |
@@ -325,62 +325,63 @@ static void jz_gpio_irq_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
325 | generic_handle_irq(gpio_irq); | 325 | generic_handle_irq(gpio_irq); |
326 | }; | 326 | }; |
327 | 327 | ||
328 | static inline void jz_gpio_set_irq_bit(unsigned int irq, unsigned int reg) | 328 | static inline void jz_gpio_set_irq_bit(struct irq_data *data, unsigned int reg) |
329 | { | 329 | { |
330 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(irq); | 330 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(data); |
331 | writel(IRQ_TO_BIT(irq), chip->base + reg); | 331 | writel(IRQ_TO_BIT(data->irq), chip->base + reg); |
332 | } | 332 | } |
333 | 333 | ||
334 | static void jz_gpio_irq_mask(unsigned int irq) | 334 | static void jz_gpio_irq_mask(struct irq_data *data) |
335 | { | 335 | { |
336 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_MASK_SET); | 336 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_MASK_SET); |
337 | }; | 337 | }; |
338 | 338 | ||
339 | static void jz_gpio_irq_unmask(unsigned int irq) | 339 | static void jz_gpio_irq_unmask(struct irq_data *data) |
340 | { | 340 | { |
341 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(irq); | 341 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(data); |
342 | 342 | ||
343 | jz_gpio_check_trigger_both(chip, irq); | 343 | jz_gpio_check_trigger_both(chip, data->irq); |
344 | 344 | ||
345 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_MASK_CLEAR); | 345 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_MASK_CLEAR); |
346 | }; | 346 | }; |
347 | 347 | ||
348 | /* TODO: Check if function is gpio */ | 348 | /* TODO: Check if function is gpio */ |
349 | static unsigned int jz_gpio_irq_startup(unsigned int irq) | 349 | static unsigned int jz_gpio_irq_startup(struct irq_data *data) |
350 | { | 350 | { |
351 | struct irq_desc *desc = irq_to_desc(irq); | 351 | struct irq_desc *desc = irq_to_desc(data->irq); |
352 | 352 | ||
353 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_SELECT_SET); | 353 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_SELECT_SET); |
354 | 354 | ||
355 | desc->status &= ~IRQ_MASKED; | 355 | desc->status &= ~IRQ_MASKED; |
356 | jz_gpio_irq_unmask(irq); | 356 | jz_gpio_irq_unmask(data); |
357 | 357 | ||
358 | return 0; | 358 | return 0; |
359 | } | 359 | } |
360 | 360 | ||
361 | static void jz_gpio_irq_shutdown(unsigned int irq) | 361 | static void jz_gpio_irq_shutdown(struct irq_data *data) |
362 | { | 362 | { |
363 | struct irq_desc *desc = irq_to_desc(irq); | 363 | struct irq_desc *desc = irq_to_desc(data->irq); |
364 | 364 | ||
365 | jz_gpio_irq_mask(irq); | 365 | jz_gpio_irq_mask(data); |
366 | desc->status |= IRQ_MASKED; | 366 | desc->status |= IRQ_MASKED; |
367 | 367 | ||
368 | /* Set direction to input */ | 368 | /* Set direction to input */ |
369 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_DIRECTION_CLEAR); | 369 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_DIRECTION_CLEAR); |
370 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_SELECT_CLEAR); | 370 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_SELECT_CLEAR); |
371 | } | 371 | } |
372 | 372 | ||
373 | static void jz_gpio_irq_ack(unsigned int irq) | 373 | static void jz_gpio_irq_ack(struct irq_data *data) |
374 | { | 374 | { |
375 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_FLAG_CLEAR); | 375 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_FLAG_CLEAR); |
376 | }; | 376 | }; |
377 | 377 | ||
378 | static int jz_gpio_irq_set_type(unsigned int irq, unsigned int flow_type) | 378 | static int jz_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type) |
379 | { | 379 | { |
380 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(irq); | 380 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(data); |
381 | struct irq_desc *desc = irq_to_desc(irq); | 381 | struct irq_desc *desc = irq_to_desc(data->irq); |
382 | unsigned int irq = data->irq; | ||
382 | 383 | ||
383 | jz_gpio_irq_mask(irq); | 384 | jz_gpio_irq_mask(data); |
384 | 385 | ||
385 | if (flow_type == IRQ_TYPE_EDGE_BOTH) { | 386 | if (flow_type == IRQ_TYPE_EDGE_BOTH) { |
386 | uint32_t value = readl(chip->base + JZ_REG_GPIO_PIN); | 387 | uint32_t value = readl(chip->base + JZ_REG_GPIO_PIN); |
@@ -395,39 +396,39 @@ static int jz_gpio_irq_set_type(unsigned int irq, unsigned int flow_type) | |||
395 | 396 | ||
396 | switch (flow_type) { | 397 | switch (flow_type) { |
397 | case IRQ_TYPE_EDGE_RISING: | 398 | case IRQ_TYPE_EDGE_RISING: |
398 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_DIRECTION_SET); | 399 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_DIRECTION_SET); |
399 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_TRIGGER_SET); | 400 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_TRIGGER_SET); |
400 | break; | 401 | break; |
401 | case IRQ_TYPE_EDGE_FALLING: | 402 | case IRQ_TYPE_EDGE_FALLING: |
402 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_DIRECTION_CLEAR); | 403 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_DIRECTION_CLEAR); |
403 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_TRIGGER_SET); | 404 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_TRIGGER_SET); |
404 | break; | 405 | break; |
405 | case IRQ_TYPE_LEVEL_HIGH: | 406 | case IRQ_TYPE_LEVEL_HIGH: |
406 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_DIRECTION_SET); | 407 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_DIRECTION_SET); |
407 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_TRIGGER_CLEAR); | 408 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_TRIGGER_CLEAR); |
408 | break; | 409 | break; |
409 | case IRQ_TYPE_LEVEL_LOW: | 410 | case IRQ_TYPE_LEVEL_LOW: |
410 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_DIRECTION_CLEAR); | 411 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_DIRECTION_CLEAR); |
411 | jz_gpio_set_irq_bit(irq, JZ_REG_GPIO_TRIGGER_CLEAR); | 412 | jz_gpio_set_irq_bit(data, JZ_REG_GPIO_TRIGGER_CLEAR); |
412 | break; | 413 | break; |
413 | default: | 414 | default: |
414 | return -EINVAL; | 415 | return -EINVAL; |
415 | } | 416 | } |
416 | 417 | ||
417 | if (!(desc->status & IRQ_MASKED)) | 418 | if (!(desc->status & IRQ_MASKED)) |
418 | jz_gpio_irq_unmask(irq); | 419 | jz_gpio_irq_unmask(data); |
419 | 420 | ||
420 | return 0; | 421 | return 0; |
421 | } | 422 | } |
422 | 423 | ||
423 | static int jz_gpio_irq_set_wake(unsigned int irq, unsigned int on) | 424 | static int jz_gpio_irq_set_wake(struct irq_data *data, unsigned int on) |
424 | { | 425 | { |
425 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(irq); | 426 | struct jz_gpio_chip *chip = irq_to_jz_gpio_chip(data); |
426 | spin_lock(&chip->lock); | 427 | spin_lock(&chip->lock); |
427 | if (on) | 428 | if (on) |
428 | chip->wakeup |= IRQ_TO_BIT(irq); | 429 | chip->wakeup |= IRQ_TO_BIT(data->irq); |
429 | else | 430 | else |
430 | chip->wakeup &= ~IRQ_TO_BIT(irq); | 431 | chip->wakeup &= ~IRQ_TO_BIT(data->irq); |
431 | spin_unlock(&chip->lock); | 432 | spin_unlock(&chip->lock); |
432 | 433 | ||
433 | set_irq_wake(chip->irq, on); | 434 | set_irq_wake(chip->irq, on); |
@@ -454,13 +455,13 @@ static struct lock_class_key gpio_lock_class; | |||
454 | }, \ | 455 | }, \ |
455 | .irq_chip = { \ | 456 | .irq_chip = { \ |
456 | .name = "GPIO Bank " # _bank, \ | 457 | .name = "GPIO Bank " # _bank, \ |
457 | .mask = jz_gpio_irq_mask, \ | 458 | .irq_mask = jz_gpio_irq_mask, \ |
458 | .unmask = jz_gpio_irq_unmask, \ | 459 | .irq_unmask = jz_gpio_irq_unmask, \ |
459 | .ack = jz_gpio_irq_ack, \ | 460 | .irq_ack = jz_gpio_irq_ack, \ |
460 | .startup = jz_gpio_irq_startup, \ | 461 | .irq_startup = jz_gpio_irq_startup, \ |
461 | .shutdown = jz_gpio_irq_shutdown, \ | 462 | .irq_shutdown = jz_gpio_irq_shutdown, \ |
462 | .set_type = jz_gpio_irq_set_type, \ | 463 | .irq_set_type = jz_gpio_irq_set_type, \ |
463 | .set_wake = jz_gpio_irq_set_wake, \ | 464 | .irq_set_wake = jz_gpio_irq_set_wake, \ |
464 | }, \ | 465 | }, \ |
465 | } | 466 | } |
466 | 467 | ||