git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mvsdio: ignore high speed timing requests from the core
[safe/jmp/linux-2.6]
/
drivers
/
pcmcia
/
at91_cf.c
diff --git
a/drivers/pcmcia/at91_cf.c
b/drivers/pcmcia/at91_cf.c
index
52d4a38
..
9e1140f
100644
(file)
--- a/
drivers/pcmcia/at91_cf.c
+++ b/
drivers/pcmcia/at91_cf.c
@@
-11,7
+11,6
@@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kernel.h>
-#include <linux/sched.h>
#include <linux/platform_device.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/errno.h>
#include <linux/init.h>
@@
-19,13
+18,13
@@
#include <pcmcia/ss.h>
#include <pcmcia/ss.h>
-#include <
asm
/hardware.h>
+#include <
mach
/hardware.h>
#include <asm/io.h>
#include <asm/sizes.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>
+#include <mach/board.h>
+#include <mach/at91rm9200_mc.h>
/*
/*
@@
-57,7
+56,7
@@
struct at91_cf_socket {
static inline int at91_cf_present(struct at91_cf_socket *cf)
{
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);
}
/*--------------------------------------------------------------------------*/
}
/*--------------------------------------------------------------------------*/
@@
-101,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;
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;
*sp |= SS_READY;
- if (!vcc ||
at91_get_gpio
_value(vcc))
+ if (!vcc ||
gpio_get
_value(vcc))
*sp |= SS_POWERON;
} else
*sp = 0;
*sp |= SS_POWERON;
} else
*sp = 0;
@@
-122,10
+121,10
@@
at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
if (cf->board->vcc_pin) {
switch (s->Vcc) {
case 0:
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:
break;
case 33:
-
at91_set_gpio
_value(cf->board->vcc_pin, 1);
+
gpio_set
_value(cf->board->vcc_pin, 1);
break;
default:
return -EINVAL;
break;
default:
return -EINVAL;
@@
-133,7
+132,7
@@
at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
}
/* toggle reset if needed */
}
/* 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);
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);
@@
-230,7
+229,7
@@
static int __init at91_cf_probe(struct platform_device *pdev)
if (!io)
return -ENODEV;
if (!io)
return -ENODEV;
- cf = k
calloc(1,
sizeof *cf, GFP_KERNEL);
+ cf = k
zalloc(
sizeof *cf, GFP_KERNEL);
if (!cf)
return -ENOMEM;
if (!cf)
return -ENOMEM;
@@
-240,11
+239,24
@@
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 */
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;
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);
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
/*
* The card driver will request this irq later as needed.
* but it causes lots of "irqNN: nobody cared" messages
@@
-252,16
+264,20
@@
static int __init at91_cf_probe(struct platform_device *pdev)
* (Note: DK board doesn't wire the IRQ pin...)
*/
if (board->irq_pin) {
* (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)
status = request_irq(board->irq_pin, at91_cf_irq,
IRQF_SHARED, driver_name, cf);
if (status < 0)
- goto fail0
a
;
+ goto fail0
d
;
cf->socket.pci_irq = board->irq_pin;
} else
cf->socket.pci_irq = board->irq_pin;
} else
- cf->socket.pci_irq =
NR_IRQS
+ 1;
+ cf->socket.pci_irq =
nr_irqs
+ 1;
/* pcmcia layer only remaps "real" memory not iospace */
/* 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;
if (!cf->socket.io_offset) {
status = -ENXIO;
goto fail1;
@@
-278,7
+294,7
@@
static int __init at91_cf_probe(struct platform_device *pdev)
board->det_pin, board->irq_pin);
cf->socket.owner = THIS_MODULE;
board->det_pin, board->irq_pin);
cf->socket.owner = THIS_MODULE;
- cf->socket.dev.
dev
= &pdev->dev;
+ cf->socket.dev.
parent
= &pdev->dev;
cf->socket.ops = &at91_cf_ops;
cf->socket.resource_ops = &pccard_static_ops;
cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP
cf->socket.ops = &at91_cf_ops;
cf->socket.resource_ops = &pccard_static_ops;
cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP
@@
-297,11
+313,21
@@
fail2:
fail1:
if (cf->socket.io_offset)
iounmap((void __iomem *) cf->socket.io_offset);
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);
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);
fail0a:
device_init_wakeup(&pdev->dev, 0);
free_irq(board->det_pin, cf);
+fail00:
+ gpio_free(board->det_pin);
fail0:
kfree(cf);
return status;
fail0:
kfree(cf);
return status;
@@
-314,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);
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);
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);
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;
}
kfree(cf);
return 0;
}
@@
-337,16
+368,21
@@
static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
enable_irq_wake(board->det_pin);
if (board->irq_pin)
enable_irq_wake(board->irq_pin);
enable_irq_wake(board->det_pin);
if (board->irq_pin)
enable_irq_wake(board->irq_pin);
- } else {
- disable_irq_wake(board->det_pin);
- if (board->irq_pin)
- disable_irq_wake(board->irq_pin);
}
return 0;
}
static int at91_cf_resume(struct platform_device *pdev)
{
}
return 0;
}
static int at91_cf_resume(struct platform_device *pdev)
{
+ struct at91_cf_socket *cf = platform_get_drvdata(pdev);
+ struct at91_cf_data *board = cf->board;
+
+ if (device_may_wakeup(&pdev->dev)) {
+ disable_irq_wake(board->det_pin);
+ if (board->irq_pin)
+ disable_irq_wake(board->irq_pin);
+ }
+
pcmcia_socket_dev_resume(&pdev->dev);
return 0;
}
pcmcia_socket_dev_resume(&pdev->dev);
return 0;
}
@@
-361,7
+397,6
@@
static struct platform_driver at91_cf_driver = {
.name = (char *) driver_name,
.owner = THIS_MODULE,
},
.name = (char *) driver_name,
.owner = THIS_MODULE,
},
- .probe = at91_cf_probe,
.remove = __exit_p(at91_cf_remove),
.suspend = at91_cf_suspend,
.resume = at91_cf_resume,
.remove = __exit_p(at91_cf_remove),
.suspend = at91_cf_suspend,
.resume = at91_cf_resume,
@@
-371,7
+406,7
@@
static struct platform_driver at91_cf_driver = {
static int __init at91_cf_init(void)
{
static int __init at91_cf_init(void)
{
- return platform_driver_
register(&at91_cf_driver
);
+ return platform_driver_
probe(&at91_cf_driver, at91_cf_probe
);
}
module_init(at91_cf_init);
}
module_init(at91_cf_init);
@@
-384,3
+419,4
@@
module_exit(at91_cf_exit);
MODULE_DESCRIPTION("AT91 Compact Flash Driver");
MODULE_AUTHOR("David Brownell");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("AT91 Compact Flash Driver");
MODULE_AUTHOR("David Brownell");
MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:at91_cf");