Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 82996
b: refs/heads/master
c: 4c1fc44
h: refs/heads/master
v: v3
  • Loading branch information
David Brownell authored and Linus Torvalds committed Feb 5, 2008
1 parent 4057954 commit c3558ce
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9ab9898e32971b938f9e8a997b12d0c4dd4832f7
refs/heads/master: 4c1fc445c29c6208c44e10c0253beea890bf5435
62 changes: 47 additions & 15 deletions trunk/drivers/pcmcia/at91_cf.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/sizes.h>
#include <asm/gpio.h>

#include <asm/arch/board.h>
#include <asm/arch/gpio.h>
#include <asm/arch/at91rm9200_mc.h>


Expand Down Expand Up @@ -56,7 +56,7 @@ struct at91_cf_socket {

static inline int at91_cf_present(struct at91_cf_socket *cf)
{
return !at91_get_gpio_value(cf->board->det_pin);
return !gpio_get_value(cf->board->det_pin);
}

/*--------------------------------------------------------------------------*/
Expand Down Expand Up @@ -100,9 +100,9 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp)
int vcc = cf->board->vcc_pin;

*sp = SS_DETECT | SS_3VCARD;
if (!rdy || at91_get_gpio_value(rdy))
if (!rdy || gpio_get_value(rdy))
*sp |= SS_READY;
if (!vcc || at91_get_gpio_value(vcc))
if (!vcc || gpio_get_value(vcc))
*sp |= SS_POWERON;
} else
*sp = 0;
Expand All @@ -121,18 +121,18 @@ at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
if (cf->board->vcc_pin) {
switch (s->Vcc) {
case 0:
at91_set_gpio_value(cf->board->vcc_pin, 0);
gpio_set_value(cf->board->vcc_pin, 0);
break;
case 33:
at91_set_gpio_value(cf->board->vcc_pin, 1);
gpio_set_value(cf->board->vcc_pin, 1);
break;
default:
return -EINVAL;
}
}

/* toggle reset if needed */
at91_set_gpio_value(cf->board->rst_pin, s->flags & SS_RESET);
gpio_set_value(cf->board->rst_pin, s->flags & SS_RESET);

pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n",
driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask);
Expand Down Expand Up @@ -239,28 +239,45 @@ static int __init at91_cf_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, cf);

/* must be a GPIO; ergo must trigger on both edges */
status = request_irq(board->det_pin, at91_cf_irq, 0, driver_name, cf);
status = gpio_request(board->det_pin, "cf_det");
if (status < 0)
goto fail0;
status = request_irq(board->det_pin, at91_cf_irq, 0, driver_name, cf);
if (status < 0)
goto fail00;
device_init_wakeup(&pdev->dev, 1);

status = gpio_request(board->rst_pin, "cf_rst");
if (status < 0)
goto fail0a;

if (board->vcc_pin) {
status = gpio_request(board->vcc_pin, "cf_vcc");
if (status < 0)
goto fail0b;
}

/*
* The card driver will request this irq later as needed.
* but it causes lots of "irqNN: nobody cared" messages
* unless we report that we handle everything (sigh).
* (Note: DK board doesn't wire the IRQ pin...)
*/
if (board->irq_pin) {
status = gpio_request(board->irq_pin, "cf_irq");
if (status < 0)
goto fail0c;
status = request_irq(board->irq_pin, at91_cf_irq,
IRQF_SHARED, driver_name, cf);
if (status < 0)
goto fail0a;
goto fail0d;
cf->socket.pci_irq = board->irq_pin;
} else
cf->socket.pci_irq = NR_IRQS + 1;

/* pcmcia layer only remaps "real" memory not iospace */
cf->socket.io_offset = (unsigned long) ioremap(cf->phys_baseaddr + CF_IO_PHYS, SZ_2K);
cf->socket.io_offset = (unsigned long)
ioremap(cf->phys_baseaddr + CF_IO_PHYS, SZ_2K);
if (!cf->socket.io_offset) {
status = -ENXIO;
goto fail1;
Expand Down Expand Up @@ -296,11 +313,21 @@ static int __init at91_cf_probe(struct platform_device *pdev)
fail1:
if (cf->socket.io_offset)
iounmap((void __iomem *) cf->socket.io_offset);
if (board->irq_pin)
if (board->irq_pin) {
free_irq(board->irq_pin, cf);
fail0d:
gpio_free(board->irq_pin);
}
fail0c:
if (board->vcc_pin)
gpio_free(board->vcc_pin);
fail0b:
gpio_free(board->rst_pin);
fail0a:
device_init_wakeup(&pdev->dev, 0);
free_irq(board->det_pin, cf);
fail00:
gpio_free(board->det_pin);
fail0:
kfree(cf);
return status;
Expand All @@ -313,13 +340,18 @@ static int __exit at91_cf_remove(struct platform_device *pdev)
struct resource *io = cf->socket.io[0].res;

pcmcia_unregister_socket(&cf->socket);
if (board->irq_pin)
release_mem_region(io->start, io->end + 1 - io->start);
iounmap((void __iomem *) cf->socket.io_offset);
if (board->irq_pin) {
free_irq(board->irq_pin, cf);
gpio_free(board->irq_pin);
}
if (board->vcc_pin)
gpio_free(board->vcc_pin);
gpio_free(board->rst_pin);
device_init_wakeup(&pdev->dev, 0);
free_irq(board->det_pin, cf);
iounmap((void __iomem *) cf->socket.io_offset);
release_mem_region(io->start, io->end + 1 - io->start);

gpio_free(board->det_pin);
kfree(cf);
return 0;
}
Expand Down

0 comments on commit c3558ce

Please sign in to comment.