mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: (50 commits) pcmcia: rework the irq_req_t typedef pcmcia: remove deprecated handle_to_dev() macro pcmcia: pcmcia_request_window() doesn't need a pointer to a pointer pcmcia: remove unused "window_t" typedef pcmcia: move some window-related code to pcmcia_ioctl.c pcmcia: Change window_handle_t logic to unsigned long pcmcia: Pass struct pcmcia_socket to pcmcia_get_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_map_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_release_window() drivers/pcmcia: remove unnecessary kzalloc pcmcia: correct handling for Zoomed Video registers in topic.h pcmcia: fix printk formats pcmcia: autoload module pcmcia pcmcia/staging: update comedi drivers PCMCIA: stop duplicating pci_irq in soc_pcmcia_socket PCMCIA: ss: allow PCI IRQs > 255 PCMCIA: soc_common: remove 'dev' member from soc_pcmcia_socket PCMCIA: soc_common: constify soc_pcmcia_socket ops member PCMCIA: sa1111: remove duplicated initializers PCMCIA: sa1111: wrap soc_pcmcia_socket to contain sa1111 specific data ...
This commit is contained in:
commit
d9b2c4d0b0
110 changed files with 3057 additions and 4579 deletions
|
|
@ -17,24 +17,6 @@ menuconfig PCCARD
|
|||
|
||||
if PCCARD
|
||||
|
||||
config PCMCIA_DEBUG
|
||||
bool "Enable PCCARD debugging"
|
||||
help
|
||||
Say Y here to enable PCMCIA subsystem debugging. You
|
||||
will need to choose the debugging level either via the
|
||||
kernel command line, or module options depending whether
|
||||
you build the PCMCIA as modules.
|
||||
|
||||
The kernel command line options are:
|
||||
pcmcia_core.pc_debug=N
|
||||
pcmcia.pc_debug=N
|
||||
sa11xx_core.pc_debug=N
|
||||
|
||||
The module option is called pc_debug=N
|
||||
|
||||
In all the above examples, N is the debugging verbosity
|
||||
level.
|
||||
|
||||
config PCMCIA
|
||||
tristate "16-bit PCMCIA support"
|
||||
select CRC32
|
||||
|
|
@ -196,9 +178,13 @@ config PCMCIA_BCM63XX
|
|||
tristate "bcm63xx pcmcia support"
|
||||
depends on BCM63XX && PCMCIA
|
||||
|
||||
config PCMCIA_SOC_COMMON
|
||||
bool
|
||||
|
||||
config PCMCIA_SA1100
|
||||
tristate "SA1100 support"
|
||||
depends on ARM && ARCH_SA1100 && PCMCIA
|
||||
select PCMCIA_SOC_COMMON
|
||||
help
|
||||
Say Y here to include support for SA11x0-based PCMCIA or CF
|
||||
sockets, found on HP iPAQs, Yopy, and other StrongARM(R)/
|
||||
|
|
@ -209,6 +195,7 @@ config PCMCIA_SA1100
|
|||
config PCMCIA_SA1111
|
||||
tristate "SA1111 support"
|
||||
depends on ARM && ARCH_SA1100 && SA1111 && PCMCIA
|
||||
select PCMCIA_SOC_COMMON
|
||||
help
|
||||
Say Y here to include support for SA1111-based PCMCIA or CF
|
||||
sockets, found on the Jornada 720, Graphicsmaster and other
|
||||
|
|
@ -222,9 +209,28 @@ config PCMCIA_PXA2XX
|
|||
depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
|
||||
|| MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
|
||||
|| ARCH_VIPER || ARCH_PXA_ESERIES || MACH_STARGATE2)
|
||||
select PCMCIA_SOC_COMMON
|
||||
help
|
||||
Say Y here to include support for the PXA2xx PCMCIA controller
|
||||
|
||||
config PCMCIA_DEBUG
|
||||
bool "Enable debugging"
|
||||
depends on (PCMCIA_SA1111 || PCMCIA_SA1100 || PCMCIA_PXA2XX)
|
||||
help
|
||||
Say Y here to enable debugging for the SoC PCMCIA layer.
|
||||
You will need to choose the debugging level either via the
|
||||
kernel command line, or module options depending whether
|
||||
you build the drivers as modules.
|
||||
|
||||
The kernel command line options are:
|
||||
sa11xx_core.pc_debug=N
|
||||
pxa2xx_core.pc_debug=N
|
||||
|
||||
The module option is called pc_debug=N
|
||||
|
||||
In all the above examples, N is the debugging verbosity
|
||||
level.
|
||||
|
||||
config PCMCIA_PROBE
|
||||
bool
|
||||
default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X && !PARISC
|
||||
|
|
|
|||
|
|
@ -22,8 +22,9 @@ obj-$(CONFIG_I82365) += i82365.o
|
|||
obj-$(CONFIG_I82092) += i82092.o
|
||||
obj-$(CONFIG_TCIC) += tcic.o
|
||||
obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o
|
||||
obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o
|
||||
obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o
|
||||
obj-$(CONFIG_PCMCIA_SOC_COMMON) += soc_common.o
|
||||
obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_base.o sa1100_cs.o
|
||||
obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_base.o sa1111_cs.o
|
||||
obj-$(CONFIG_M32R_PCC) += m32r_pcc.o
|
||||
obj-$(CONFIG_M32R_CFC) += m32r_cfc.o
|
||||
obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ss.o
|
||||
|
|
@ -35,9 +36,6 @@ obj-$(CONFIG_BFIN_CFPCMCIA) += bfin_cf_pcmcia.o
|
|||
obj-$(CONFIG_AT91_CF) += at91_cf.o
|
||||
obj-$(CONFIG_ELECTRA_CF) += electra_cf.o
|
||||
|
||||
sa11xx_core-y += soc_common.o sa11xx_base.o
|
||||
pxa2xx_core-y += soc_common.o pxa2xx_base.o
|
||||
|
||||
au1x00_ss-y += au1000_generic.o
|
||||
au1x00_ss-$(CONFIG_MIPS_PB1000) += au1000_pb1x00.o
|
||||
au1x00_ss-$(CONFIG_MIPS_PB1100) += au1000_pb1x00.o
|
||||
|
|
@ -77,4 +75,4 @@ pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o
|
|||
pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o
|
||||
pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o
|
||||
|
||||
obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y)
|
||||
obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_base.o $(pxa2xx-obj-y)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ static u_int xlate_rom_addr(void __iomem *b, u_int addr)
|
|||
static void cb_release_cis_mem(struct pcmcia_socket * s)
|
||||
{
|
||||
if (s->cb_cis_virt) {
|
||||
cs_dbg(s, 1, "cb_release_cis_mem()\n");
|
||||
dev_dbg(&s->dev, "cb_release_cis_mem()\n");
|
||||
iounmap(s->cb_cis_virt);
|
||||
s->cb_cis_virt = NULL;
|
||||
s->cb_cis_res = NULL;
|
||||
|
|
@ -132,7 +132,7 @@ int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void
|
|||
struct pci_dev *dev;
|
||||
struct resource *res;
|
||||
|
||||
cs_dbg(s, 3, "read_cb_mem(%d, %#x, %u)\n", space, addr, len);
|
||||
dev_dbg(&s->dev, "read_cb_mem(%d, %#x, %u)\n", space, addr, len);
|
||||
|
||||
dev = pci_get_slot(s->cb_dev->subordinate, 0);
|
||||
if (!dev)
|
||||
|
|
|
|||
|
|
@ -30,16 +30,6 @@
|
|||
#ifndef _LINUX_CIRRUS_H
|
||||
#define _LINUX_CIRRUS_H
|
||||
|
||||
#ifndef PCI_VENDOR_ID_CIRRUS
|
||||
#define PCI_VENDOR_ID_CIRRUS 0x1013
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_CIRRUS_6729
|
||||
#define PCI_DEVICE_ID_CIRRUS_6729 0x1100
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_CIRRUS_6832
|
||||
#define PCI_DEVICE_ID_CIRRUS_6832 0x1110
|
||||
#endif
|
||||
|
||||
#define PD67_MISC_CTL_1 0x16 /* Misc control 1 */
|
||||
#define PD67_FIFO_CTL 0x17 /* FIFO control */
|
||||
#define PD67_MISC_CTL_2 0x1E /* Misc control 2 */
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
void __iomem *sys, *end;
|
||||
unsigned char *buf = ptr;
|
||||
|
||||
cs_dbg(s, 3, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
|
||||
dev_dbg(&s->dev, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
|
||||
|
||||
if (attr & IS_INDIRECT) {
|
||||
/* Indirect accesses use a bunch of special registers at fixed
|
||||
|
|
@ -190,7 +190,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
addr = 0;
|
||||
}
|
||||
}
|
||||
cs_dbg(s, 3, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
|
||||
dev_dbg(&s->dev, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
|
||||
*(u_char *)(ptr+0), *(u_char *)(ptr+1),
|
||||
*(u_char *)(ptr+2), *(u_char *)(ptr+3));
|
||||
return 0;
|
||||
|
|
@ -204,7 +204,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
void __iomem *sys, *end;
|
||||
unsigned char *buf = ptr;
|
||||
|
||||
cs_dbg(s, 3, "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
|
||||
dev_dbg(&s->dev, "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
|
||||
|
||||
if (attr & IS_INDIRECT) {
|
||||
/* Indirect accesses use a bunch of special registers at fixed
|
||||
|
|
@ -584,7 +584,7 @@ int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, tuple_
|
|||
ofs += link[1] + 2;
|
||||
}
|
||||
if (i == MAX_TUPLES) {
|
||||
cs_dbg(s, 1, "cs: overrun in pcmcia_get_next_tuple\n");
|
||||
dev_dbg(&s->dev, "cs: overrun in pcmcia_get_next_tuple\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
|
|
@ -1440,7 +1440,7 @@ int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse)
|
|||
break;
|
||||
}
|
||||
if (ret)
|
||||
__cs_dbg(0, "parse_tuple failed %d\n", ret);
|
||||
pr_debug("parse_tuple failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_parse_tuple);
|
||||
|
|
@ -1482,6 +1482,67 @@ done:
|
|||
}
|
||||
EXPORT_SYMBOL(pccard_read_tuple);
|
||||
|
||||
|
||||
/**
|
||||
* pccard_loop_tuple() - loop over tuples in the CIS
|
||||
* @s: the struct pcmcia_socket where the card is inserted
|
||||
* @function: the device function we loop for
|
||||
* @code: which CIS code shall we look for?
|
||||
* @parse: buffer where the tuple shall be parsed (or NULL, if no parse)
|
||||
* @priv_data: private data to be passed to the loop_tuple function.
|
||||
* @loop_tuple: function to call for each CIS entry of type @function. IT
|
||||
* gets passed the raw tuple, the paresed tuple (if @parse is
|
||||
* set) and @priv_data.
|
||||
*
|
||||
* pccard_loop_tuple() loops over all CIS entries of type @function, and
|
||||
* calls the @loop_tuple function for each entry. If the call to @loop_tuple
|
||||
* returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
|
||||
*/
|
||||
int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
|
||||
cisdata_t code, cisparse_t *parse, void *priv_data,
|
||||
int (*loop_tuple) (tuple_t *tuple,
|
||||
cisparse_t *parse,
|
||||
void *priv_data))
|
||||
{
|
||||
tuple_t tuple;
|
||||
cisdata_t *buf;
|
||||
int ret;
|
||||
|
||||
buf = kzalloc(256, GFP_KERNEL);
|
||||
if (buf == NULL) {
|
||||
dev_printk(KERN_WARNING, &s->dev, "no memory to read tuple\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tuple.TupleData = buf;
|
||||
tuple.TupleDataMax = 255;
|
||||
tuple.TupleOffset = 0;
|
||||
tuple.DesiredTuple = code;
|
||||
tuple.Attributes = 0;
|
||||
|
||||
ret = pccard_get_first_tuple(s, function, &tuple);
|
||||
while (!ret) {
|
||||
if (pccard_get_tuple_data(s, &tuple))
|
||||
goto next_entry;
|
||||
|
||||
if (parse)
|
||||
if (pcmcia_parse_tuple(&tuple, parse))
|
||||
goto next_entry;
|
||||
|
||||
ret = loop_tuple(&tuple, parse, priv_data);
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
next_entry:
|
||||
ret = pccard_get_next_tuple(s, function, &tuple);
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pccard_loop_tuple);
|
||||
|
||||
|
||||
/*======================================================================
|
||||
|
||||
This tries to determine if a card has a sensible CIS. It returns
|
||||
|
|
|
|||
|
|
@ -61,17 +61,6 @@ INT_MODULE_PARM(unreset_limit, 30); /* unreset_check's */
|
|||
/* Access speed for attribute memory windows */
|
||||
INT_MODULE_PARM(cis_speed, 300); /* ns */
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static int pc_debug;
|
||||
|
||||
module_param(pc_debug, int, 0644);
|
||||
|
||||
int cs_debug_level(int level)
|
||||
{
|
||||
return pc_debug > level;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
socket_state_t dead_socket = {
|
||||
.csc_mask = SS_DETECT,
|
||||
|
|
@ -190,7 +179,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
|
|||
if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops)
|
||||
return -EINVAL;
|
||||
|
||||
cs_dbg(socket, 0, "pcmcia_register_socket(0x%p)\n", socket->ops);
|
||||
dev_dbg(&socket->dev, "pcmcia_register_socket(0x%p)\n", socket->ops);
|
||||
|
||||
spin_lock_init(&socket->lock);
|
||||
|
||||
|
|
@ -262,6 +251,13 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
|
|||
|
||||
pcmcia_parse_events(socket, SS_DETECT);
|
||||
|
||||
/*
|
||||
* Let's try to get the PCMCIA module for 16-bit PCMCIA support.
|
||||
* If it fails, it doesn't matter -- we still have 32-bit CardBus
|
||||
* support to offer, so this is not a failure mode.
|
||||
*/
|
||||
request_module_nowait("pcmcia");
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
|
|
@ -282,7 +278,7 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket)
|
|||
if (!socket)
|
||||
return;
|
||||
|
||||
cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
|
||||
dev_dbg(&socket->dev, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
|
||||
|
||||
if (socket->thread)
|
||||
kthread_stop(socket->thread);
|
||||
|
|
@ -335,7 +331,7 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
|
|||
if (s->state & SOCKET_CARDBUS)
|
||||
return 0;
|
||||
|
||||
cs_dbg(s, 1, "send_event(event %d, pri %d, callback 0x%p)\n",
|
||||
dev_dbg(&s->dev, "send_event(event %d, pri %d, callback 0x%p)\n",
|
||||
event, priority, s->callback);
|
||||
|
||||
if (!s->callback)
|
||||
|
|
@ -352,7 +348,7 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
|
|||
|
||||
static void socket_remove_drivers(struct pcmcia_socket *skt)
|
||||
{
|
||||
cs_dbg(skt, 4, "remove_drivers\n");
|
||||
dev_dbg(&skt->dev, "remove_drivers\n");
|
||||
|
||||
send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
|
||||
}
|
||||
|
|
@ -361,7 +357,7 @@ static int socket_reset(struct pcmcia_socket *skt)
|
|||
{
|
||||
int status, i;
|
||||
|
||||
cs_dbg(skt, 4, "reset\n");
|
||||
dev_dbg(&skt->dev, "reset\n");
|
||||
|
||||
skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
|
||||
skt->ops->set_socket(skt, &skt->socket);
|
||||
|
|
@ -383,7 +379,7 @@ static int socket_reset(struct pcmcia_socket *skt)
|
|||
msleep(unreset_check * 10);
|
||||
}
|
||||
|
||||
cs_err(skt, "time out after reset.\n");
|
||||
dev_printk(KERN_ERR, &skt->dev, "time out after reset.\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
|
|
@ -397,7 +393,7 @@ static void socket_shutdown(struct pcmcia_socket *s)
|
|||
{
|
||||
int status;
|
||||
|
||||
cs_dbg(s, 4, "shutdown\n");
|
||||
dev_dbg(&s->dev, "shutdown\n");
|
||||
|
||||
socket_remove_drivers(s);
|
||||
s->state &= SOCKET_INUSE | SOCKET_PRESENT;
|
||||
|
|
@ -432,7 +428,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
|
|||
{
|
||||
int status, i;
|
||||
|
||||
cs_dbg(skt, 4, "setup\n");
|
||||
dev_dbg(&skt->dev, "setup\n");
|
||||
|
||||
skt->ops->get_status(skt, &status);
|
||||
if (!(status & SS_DETECT))
|
||||
|
|
@ -452,13 +448,15 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
|
|||
}
|
||||
|
||||
if (status & SS_PENDING) {
|
||||
cs_err(skt, "voltage interrogation timed out.\n");
|
||||
dev_printk(KERN_ERR, &skt->dev,
|
||||
"voltage interrogation timed out.\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (status & SS_CARDBUS) {
|
||||
if (!(skt->features & SS_CAP_CARDBUS)) {
|
||||
cs_err(skt, "cardbus cards are not supported.\n");
|
||||
dev_printk(KERN_ERR, &skt->dev,
|
||||
"cardbus cards are not supported.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
skt->state |= SOCKET_CARDBUS;
|
||||
|
|
@ -472,7 +470,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
|
|||
else if (!(status & SS_XVCARD))
|
||||
skt->socket.Vcc = skt->socket.Vpp = 50;
|
||||
else {
|
||||
cs_err(skt, "unsupported voltage key.\n");
|
||||
dev_printk(KERN_ERR, &skt->dev, "unsupported voltage key.\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
@ -489,7 +487,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
|
|||
|
||||
skt->ops->get_status(skt, &status);
|
||||
if (!(status & SS_POWERON)) {
|
||||
cs_err(skt, "unable to apply power.\n");
|
||||
dev_printk(KERN_ERR, &skt->dev, "unable to apply power.\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
@ -509,7 +507,7 @@ static int socket_insert(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 4, "insert\n");
|
||||
dev_dbg(&skt->dev, "insert\n");
|
||||
|
||||
if (!cs_socket_get(skt))
|
||||
return -ENODEV;
|
||||
|
|
@ -529,7 +527,7 @@ static int socket_insert(struct pcmcia_socket *skt)
|
|||
skt->state |= SOCKET_CARDBUS_CONFIG;
|
||||
}
|
||||
#endif
|
||||
cs_dbg(skt, 4, "insert done\n");
|
||||
dev_dbg(&skt->dev, "insert done\n");
|
||||
|
||||
send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
|
||||
} else {
|
||||
|
|
@ -576,7 +574,7 @@ static int socket_late_resume(struct pcmcia_socket *skt)
|
|||
* FIXME: need a better check here for cardbus cards.
|
||||
*/
|
||||
if (verify_cis_cache(skt) != 0) {
|
||||
cs_dbg(skt, 4, "cis mismatch - different card\n");
|
||||
dev_dbg(&skt->dev, "cis mismatch - different card\n");
|
||||
socket_remove_drivers(skt);
|
||||
destroy_cis_cache(skt);
|
||||
/*
|
||||
|
|
@ -587,7 +585,7 @@ static int socket_late_resume(struct pcmcia_socket *skt)
|
|||
msleep(200);
|
||||
send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
|
||||
} else {
|
||||
cs_dbg(skt, 4, "cis matches cache\n");
|
||||
dev_dbg(&skt->dev, "cis matches cache\n");
|
||||
send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
|
||||
}
|
||||
} else {
|
||||
|
|
@ -723,7 +721,7 @@ static int pccardd(void *__skt)
|
|||
void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
|
||||
{
|
||||
unsigned long flags;
|
||||
cs_dbg(s, 4, "parse_events: events %08x\n", events);
|
||||
dev_dbg(&s->dev, "parse_events: events %08x\n", events);
|
||||
if (s->thread) {
|
||||
spin_lock_irqsave(&s->thread_lock, flags);
|
||||
s->thread_events |= events;
|
||||
|
|
@ -773,19 +771,22 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 1, "resetting socket\n");
|
||||
dev_dbg(&skt->dev, "resetting socket\n");
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
do {
|
||||
if (!(skt->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&skt->dev, "can't reset, not present\n");
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
}
|
||||
if (skt->state & SOCKET_SUSPEND) {
|
||||
dev_dbg(&skt->dev, "can't reset, suspended\n");
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
if (skt->state & SOCKET_CARDBUS) {
|
||||
dev_dbg(&skt->dev, "can't reset, is cardbus\n");
|
||||
ret = -EPERM;
|
||||
break;
|
||||
}
|
||||
|
|
@ -818,7 +819,7 @@ int pcmcia_suspend_card(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 1, "suspending socket\n");
|
||||
dev_dbg(&skt->dev, "suspending socket\n");
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
do {
|
||||
|
|
@ -848,7 +849,7 @@ int pcmcia_resume_card(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 1, "waking up socket\n");
|
||||
dev_dbg(&skt->dev, "waking up socket\n");
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
do {
|
||||
|
|
@ -876,7 +877,7 @@ int pcmcia_eject_card(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 1, "user eject request\n");
|
||||
dev_dbg(&skt->dev, "user eject request\n");
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
do {
|
||||
|
|
@ -905,7 +906,7 @@ int pcmcia_insert_card(struct pcmcia_socket *skt)
|
|||
{
|
||||
int ret;
|
||||
|
||||
cs_dbg(skt, 1, "user insert request\n");
|
||||
dev_dbg(&skt->dev, "user insert request\n");
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
do {
|
||||
|
|
|
|||
|
|
@ -107,28 +107,6 @@ static inline void cs_socket_put(struct pcmcia_socket *skt)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
extern int cs_debug_level(int);
|
||||
|
||||
#define cs_dbg(skt, lvl, fmt, arg...) do { \
|
||||
if (cs_debug_level(lvl)) \
|
||||
dev_printk(KERN_DEBUG, &skt->dev, \
|
||||
"cs: " fmt, ## arg); \
|
||||
} while (0)
|
||||
#define __cs_dbg(lvl, fmt, arg...) do { \
|
||||
if (cs_debug_level(lvl)) \
|
||||
printk(KERN_DEBUG \
|
||||
"cs: " fmt, ## arg); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
#define cs_dbg(skt, lvl, fmt, arg...) do { } while (0)
|
||||
#define __cs_dbg(lvl, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#define cs_err(skt, fmt, arg...) \
|
||||
dev_printk(KERN_ERR, &skt->dev, "cs: " fmt, ## arg)
|
||||
|
||||
|
||||
/*
|
||||
* Stuff internal to module "pcmcia_core":
|
||||
|
|
@ -170,10 +148,6 @@ extern struct rw_semaphore pcmcia_socket_list_rwsem;
|
|||
extern struct list_head pcmcia_socket_list;
|
||||
extern struct class pcmcia_socket_class;
|
||||
|
||||
int pcmcia_get_window(struct pcmcia_socket *s,
|
||||
window_handle_t *handle,
|
||||
int idx,
|
||||
win_req_t *req);
|
||||
int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
|
||||
struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr);
|
||||
|
||||
|
|
@ -199,6 +173,22 @@ int pcmcia_replace_cis(struct pcmcia_socket *s,
|
|||
const u8 *data, const size_t len);
|
||||
int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count);
|
||||
|
||||
/* loop over CIS entries */
|
||||
int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
|
||||
cisdata_t code, cisparse_t *parse, void *priv_data,
|
||||
int (*loop_tuple) (tuple_t *tuple,
|
||||
cisparse_t *parse,
|
||||
void *priv_data));
|
||||
|
||||
int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
|
||||
tuple_t *tuple);
|
||||
|
||||
int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
|
||||
tuple_t *tuple);
|
||||
|
||||
int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
|
||||
|
||||
|
||||
/* rsrc_mgr.c */
|
||||
int pcmcia_validate_mem(struct pcmcia_socket *s);
|
||||
struct resource *pcmcia_find_io_region(unsigned long base,
|
||||
|
|
|
|||
|
|
@ -41,129 +41,11 @@ MODULE_AUTHOR("David Hinds <[email protected]>");
|
|||
MODULE_DESCRIPTION("PCMCIA Driver Services");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
int ds_pc_debug;
|
||||
|
||||
module_param_named(pc_debug, ds_pc_debug, int, 0644);
|
||||
|
||||
#define ds_dbg(lvl, fmt, arg...) do { \
|
||||
if (ds_pc_debug > (lvl)) \
|
||||
printk(KERN_DEBUG "ds: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#define ds_dev_dbg(lvl, dev, fmt, arg...) do { \
|
||||
if (ds_pc_debug > (lvl)) \
|
||||
dev_printk(KERN_DEBUG, dev, "ds: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define ds_dbg(lvl, fmt, arg...) do { } while (0)
|
||||
#define ds_dev_dbg(lvl, dev, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
spinlock_t pcmcia_dev_list_lock;
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
/* code which was in cs.c before */
|
||||
|
||||
/* String tables for error messages */
|
||||
|
||||
typedef struct lookup_t {
|
||||
const int key;
|
||||
const char *msg;
|
||||
} lookup_t;
|
||||
|
||||
static const lookup_t error_table[] = {
|
||||
{ 0, "Operation succeeded" },
|
||||
{ -EIO, "Input/Output error" },
|
||||
{ -ENODEV, "No card present" },
|
||||
{ -EINVAL, "Bad parameter" },
|
||||
{ -EACCES, "Configuration locked" },
|
||||
{ -EBUSY, "Resource in use" },
|
||||
{ -ENOSPC, "No more items" },
|
||||
{ -ENOMEM, "Out of resource" },
|
||||
};
|
||||
|
||||
|
||||
static const lookup_t service_table[] = {
|
||||
{ AccessConfigurationRegister, "AccessConfigurationRegister" },
|
||||
{ AddSocketServices, "AddSocketServices" },
|
||||
{ AdjustResourceInfo, "AdjustResourceInfo" },
|
||||
{ CheckEraseQueue, "CheckEraseQueue" },
|
||||
{ CloseMemory, "CloseMemory" },
|
||||
{ DeregisterClient, "DeregisterClient" },
|
||||
{ DeregisterEraseQueue, "DeregisterEraseQueue" },
|
||||
{ GetCardServicesInfo, "GetCardServicesInfo" },
|
||||
{ GetClientInfo, "GetClientInfo" },
|
||||
{ GetConfigurationInfo, "GetConfigurationInfo" },
|
||||
{ GetEventMask, "GetEventMask" },
|
||||
{ GetFirstClient, "GetFirstClient" },
|
||||
{ GetFirstRegion, "GetFirstRegion" },
|
||||
{ GetFirstTuple, "GetFirstTuple" },
|
||||
{ GetNextClient, "GetNextClient" },
|
||||
{ GetNextRegion, "GetNextRegion" },
|
||||
{ GetNextTuple, "GetNextTuple" },
|
||||
{ GetStatus, "GetStatus" },
|
||||
{ GetTupleData, "GetTupleData" },
|
||||
{ MapMemPage, "MapMemPage" },
|
||||
{ ModifyConfiguration, "ModifyConfiguration" },
|
||||
{ ModifyWindow, "ModifyWindow" },
|
||||
{ OpenMemory, "OpenMemory" },
|
||||
{ ParseTuple, "ParseTuple" },
|
||||
{ ReadMemory, "ReadMemory" },
|
||||
{ RegisterClient, "RegisterClient" },
|
||||
{ RegisterEraseQueue, "RegisterEraseQueue" },
|
||||
{ RegisterMTD, "RegisterMTD" },
|
||||
{ ReleaseConfiguration, "ReleaseConfiguration" },
|
||||
{ ReleaseIO, "ReleaseIO" },
|
||||
{ ReleaseIRQ, "ReleaseIRQ" },
|
||||
{ ReleaseWindow, "ReleaseWindow" },
|
||||
{ RequestConfiguration, "RequestConfiguration" },
|
||||
{ RequestIO, "RequestIO" },
|
||||
{ RequestIRQ, "RequestIRQ" },
|
||||
{ RequestSocketMask, "RequestSocketMask" },
|
||||
{ RequestWindow, "RequestWindow" },
|
||||
{ ResetCard, "ResetCard" },
|
||||
{ SetEventMask, "SetEventMask" },
|
||||
{ ValidateCIS, "ValidateCIS" },
|
||||
{ WriteMemory, "WriteMemory" },
|
||||
{ BindDevice, "BindDevice" },
|
||||
{ BindMTD, "BindMTD" },
|
||||
{ ReportError, "ReportError" },
|
||||
{ SuspendCard, "SuspendCard" },
|
||||
{ ResumeCard, "ResumeCard" },
|
||||
{ EjectCard, "EjectCard" },
|
||||
{ InsertCard, "InsertCard" },
|
||||
{ ReplaceCIS, "ReplaceCIS" }
|
||||
};
|
||||
|
||||
const char *pcmcia_error_func(int func)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(service_table); i++)
|
||||
if (service_table[i].key == func)
|
||||
return service_table[i].msg;
|
||||
|
||||
return "Unknown service number";
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_error_func);
|
||||
|
||||
const char *pcmcia_error_ret(int ret)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(error_table); i++)
|
||||
if (error_table[i].key == ret)
|
||||
return error_table[i].msg;
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_error_ret);
|
||||
|
||||
/*======================================================================*/
|
||||
|
||||
|
||||
|
||||
static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
|
||||
{
|
||||
struct pcmcia_device_id *did = p_drv->id_table;
|
||||
|
|
@ -303,7 +185,7 @@ int pcmcia_register_driver(struct pcmcia_driver *driver)
|
|||
spin_lock_init(&driver->dynids.lock);
|
||||
INIT_LIST_HEAD(&driver->dynids.list);
|
||||
|
||||
ds_dbg(3, "registering driver %s\n", driver->drv.name);
|
||||
pr_debug("registering driver %s\n", driver->drv.name);
|
||||
|
||||
error = driver_register(&driver->drv);
|
||||
if (error < 0)
|
||||
|
|
@ -323,7 +205,7 @@ EXPORT_SYMBOL(pcmcia_register_driver);
|
|||
*/
|
||||
void pcmcia_unregister_driver(struct pcmcia_driver *driver)
|
||||
{
|
||||
ds_dbg(3, "unregistering driver %s\n", driver->drv.name);
|
||||
pr_debug("unregistering driver %s\n", driver->drv.name);
|
||||
driver_unregister(&driver->drv);
|
||||
pcmcia_free_dynids(driver);
|
||||
}
|
||||
|
|
@ -350,14 +232,14 @@ void pcmcia_put_dev(struct pcmcia_device *p_dev)
|
|||
static void pcmcia_release_function(struct kref *ref)
|
||||
{
|
||||
struct config_t *c = container_of(ref, struct config_t, ref);
|
||||
ds_dbg(1, "releasing config_t\n");
|
||||
pr_debug("releasing config_t\n");
|
||||
kfree(c);
|
||||
}
|
||||
|
||||
static void pcmcia_release_dev(struct device *dev)
|
||||
{
|
||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||
ds_dev_dbg(1, dev, "releasing device\n");
|
||||
dev_dbg(dev, "releasing device\n");
|
||||
pcmcia_put_socket(p_dev->socket);
|
||||
kfree(p_dev->devname);
|
||||
kref_put(&p_dev->function_config->ref, pcmcia_release_function);
|
||||
|
|
@ -367,7 +249,7 @@ static void pcmcia_release_dev(struct device *dev)
|
|||
static void pcmcia_add_device_later(struct pcmcia_socket *s, int mfc)
|
||||
{
|
||||
if (!s->pcmcia_state.device_add_pending) {
|
||||
ds_dev_dbg(1, &s->dev, "scheduling to add %s secondary"
|
||||
dev_dbg(&s->dev, "scheduling to add %s secondary"
|
||||
" device to %d\n", mfc ? "mfc" : "pfc", s->sock);
|
||||
s->pcmcia_state.device_add_pending = 1;
|
||||
s->pcmcia_state.mfc_pfc = mfc;
|
||||
|
|
@ -405,7 +287,7 @@ static int pcmcia_device_probe(struct device * dev)
|
|||
*/
|
||||
did = dev_get_drvdata(&p_dev->dev);
|
||||
|
||||
ds_dev_dbg(1, dev, "trying to bind to %s\n", p_drv->drv.name);
|
||||
dev_dbg(dev, "trying to bind to %s\n", p_drv->drv.name);
|
||||
|
||||
if ((!p_drv->probe) || (!p_dev->function_config) ||
|
||||
(!try_module_get(p_drv->owner))) {
|
||||
|
|
@ -428,7 +310,7 @@ static int pcmcia_device_probe(struct device * dev)
|
|||
|
||||
ret = p_drv->probe(p_dev);
|
||||
if (ret) {
|
||||
ds_dev_dbg(1, dev, "binding to %s failed with %d\n",
|
||||
dev_dbg(dev, "binding to %s failed with %d\n",
|
||||
p_drv->drv.name, ret);
|
||||
goto put_module;
|
||||
}
|
||||
|
|
@ -456,7 +338,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
|||
struct pcmcia_device *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
ds_dev_dbg(2, leftover ? &leftover->dev : &s->dev,
|
||||
dev_dbg(leftover ? &leftover->dev : &s->dev,
|
||||
"pcmcia_card_remove(%d) %s\n", s->sock,
|
||||
leftover ? leftover->devname : "");
|
||||
|
||||
|
|
@ -475,7 +357,7 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
|||
p_dev->_removed=1;
|
||||
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
||||
|
||||
ds_dev_dbg(2, &p_dev->dev, "unregistering device\n");
|
||||
dev_dbg(&p_dev->dev, "unregistering device\n");
|
||||
device_unregister(&p_dev->dev);
|
||||
}
|
||||
|
||||
|
|
@ -492,7 +374,7 @@ static int pcmcia_device_remove(struct device * dev)
|
|||
p_dev = to_pcmcia_dev(dev);
|
||||
p_drv = to_pcmcia_drv(dev->driver);
|
||||
|
||||
ds_dev_dbg(1, dev, "removing device\n");
|
||||
dev_dbg(dev, "removing device\n");
|
||||
|
||||
/* If we're removing the primary module driving a
|
||||
* pseudo multi-function card, we need to unbind
|
||||
|
|
@ -572,7 +454,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
|
|||
}
|
||||
if (!pccard_read_tuple(p_dev->socket, p_dev->func,
|
||||
CISTPL_DEVICE_GEO, devgeo)) {
|
||||
ds_dev_dbg(0, &p_dev->dev,
|
||||
dev_dbg(&p_dev->dev,
|
||||
"mem device geometry probably means "
|
||||
"FUNCID_MEMORY\n");
|
||||
p_dev->func_id = CISTPL_FUNCID_MEMORY;
|
||||
|
|
@ -628,7 +510,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
|||
|
||||
mutex_lock(&device_add_lock);
|
||||
|
||||
ds_dbg(3, "adding device to %d, function %d\n", s->sock, function);
|
||||
pr_debug("adding device to %d, function %d\n", s->sock, function);
|
||||
|
||||
/* max of 4 devices per card */
|
||||
if (s->device_count == 4)
|
||||
|
|
@ -654,7 +536,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
|||
p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
|
||||
if (!p_dev->devname)
|
||||
goto err_free;
|
||||
ds_dev_dbg(3, &p_dev->dev, "devname is %s\n", p_dev->devname);
|
||||
dev_dbg(&p_dev->dev, "devname is %s\n", p_dev->devname);
|
||||
|
||||
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
||||
|
||||
|
|
@ -677,7 +559,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
|||
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
||||
|
||||
if (!p_dev->function_config) {
|
||||
ds_dev_dbg(3, &p_dev->dev, "creating config_t\n");
|
||||
dev_dbg(&p_dev->dev, "creating config_t\n");
|
||||
p_dev->function_config = kzalloc(sizeof(struct config_t),
|
||||
GFP_KERNEL);
|
||||
if (!p_dev->function_config)
|
||||
|
|
@ -722,20 +604,20 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
|
|||
int ret = 0;
|
||||
|
||||
if (!(s->resource_setup_done)) {
|
||||
ds_dev_dbg(3, &s->dev,
|
||||
dev_dbg(&s->dev,
|
||||
"no resources available, delaying card_add\n");
|
||||
return -EAGAIN; /* try again, but later... */
|
||||
}
|
||||
|
||||
if (pcmcia_validate_mem(s)) {
|
||||
ds_dev_dbg(3, &s->dev, "validating mem resources failed, "
|
||||
dev_dbg(&s->dev, "validating mem resources failed, "
|
||||
"delaying card_add\n");
|
||||
return -EAGAIN; /* try again, but later... */
|
||||
}
|
||||
|
||||
ret = pccard_validate_cis(s, &no_chains);
|
||||
if (ret || !no_chains) {
|
||||
ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n");
|
||||
dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -756,7 +638,7 @@ static void pcmcia_delayed_add_device(struct work_struct *work)
|
|||
{
|
||||
struct pcmcia_socket *s =
|
||||
container_of(work, struct pcmcia_socket, device_add);
|
||||
ds_dev_dbg(1, &s->dev, "adding additional device to %d\n", s->sock);
|
||||
dev_dbg(&s->dev, "adding additional device to %d\n", s->sock);
|
||||
pcmcia_device_add(s, s->pcmcia_state.mfc_pfc);
|
||||
s->pcmcia_state.device_add_pending = 0;
|
||||
s->pcmcia_state.mfc_pfc = 0;
|
||||
|
|
@ -766,7 +648,7 @@ static int pcmcia_requery(struct device *dev, void * _data)
|
|||
{
|
||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||
if (!p_dev->dev.driver) {
|
||||
ds_dev_dbg(1, dev, "update device information\n");
|
||||
dev_dbg(dev, "update device information\n");
|
||||
pcmcia_device_query(p_dev);
|
||||
}
|
||||
|
||||
|
|
@ -780,7 +662,7 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt, int new_cis)
|
|||
unsigned long flags;
|
||||
|
||||
/* must be called with skt_mutex held */
|
||||
ds_dev_dbg(0, &skt->dev, "re-scanning socket %d\n", skt->sock);
|
||||
dev_dbg(&skt->dev, "re-scanning socket %d\n", skt->sock);
|
||||
|
||||
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
|
||||
if (list_empty(&skt->devices_list))
|
||||
|
|
@ -835,7 +717,7 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
|
|||
if (!filename)
|
||||
return -EINVAL;
|
||||
|
||||
ds_dev_dbg(1, &dev->dev, "trying to load CIS file %s\n", filename);
|
||||
dev_dbg(&dev->dev, "trying to load CIS file %s\n", filename);
|
||||
|
||||
if (request_firmware(&fw, filename, &dev->dev) == 0) {
|
||||
if (fw->size >= CISTPL_MAX_CIS_SIZE) {
|
||||
|
|
@ -953,14 +835,14 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
|
|||
* after it has re-checked that there is no possible module
|
||||
* with a prod_id/manf_id/card_id match.
|
||||
*/
|
||||
ds_dev_dbg(0, &dev->dev,
|
||||
dev_dbg(&dev->dev,
|
||||
"skipping FUNC_ID match until userspace interaction\n");
|
||||
if (!dev->allow_func_id_match)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
|
||||
ds_dev_dbg(0, &dev->dev, "device needs a fake CIS\n");
|
||||
dev_dbg(&dev->dev, "device needs a fake CIS\n");
|
||||
if (!dev->socket->fake_cis)
|
||||
pcmcia_load_firmware(dev, did->cisfile);
|
||||
|
||||
|
|
@ -992,9 +874,9 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
|
|||
/* match dynamic devices first */
|
||||
spin_lock(&p_drv->dynids.lock);
|
||||
list_for_each_entry(dynid, &p_drv->dynids.list, node) {
|
||||
ds_dev_dbg(3, dev, "trying to match to %s\n", drv->name);
|
||||
dev_dbg(dev, "trying to match to %s\n", drv->name);
|
||||
if (pcmcia_devmatch(p_dev, &dynid->id)) {
|
||||
ds_dev_dbg(0, dev, "matched to %s\n", drv->name);
|
||||
dev_dbg(dev, "matched to %s\n", drv->name);
|
||||
spin_unlock(&p_drv->dynids.lock);
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -1004,15 +886,15 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
|
|||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
/* matching by cardmgr */
|
||||
if (p_dev->cardmgr == p_drv) {
|
||||
ds_dev_dbg(0, dev, "cardmgr matched to %s\n", drv->name);
|
||||
dev_dbg(dev, "cardmgr matched to %s\n", drv->name);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (did && did->match_flags) {
|
||||
ds_dev_dbg(3, dev, "trying to match to %s\n", drv->name);
|
||||
dev_dbg(dev, "trying to match to %s\n", drv->name);
|
||||
if (pcmcia_devmatch(p_dev, did)) {
|
||||
ds_dev_dbg(0, dev, "matched to %s\n", drv->name);
|
||||
dev_dbg(dev, "matched to %s\n", drv->name);
|
||||
return 1;
|
||||
}
|
||||
did++;
|
||||
|
|
@ -1218,7 +1100,7 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
|
|||
if (p_dev->suspended)
|
||||
return 0;
|
||||
|
||||
ds_dev_dbg(2, dev, "suspending\n");
|
||||
dev_dbg(dev, "suspending\n");
|
||||
|
||||
if (dev->driver)
|
||||
p_drv = to_pcmcia_drv(dev->driver);
|
||||
|
|
@ -1238,7 +1120,7 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
|
|||
}
|
||||
|
||||
if (p_dev->device_no == p_dev->func) {
|
||||
ds_dev_dbg(2, dev, "releasing configuration\n");
|
||||
dev_dbg(dev, "releasing configuration\n");
|
||||
pcmcia_release_configuration(p_dev);
|
||||
}
|
||||
|
||||
|
|
@ -1258,7 +1140,7 @@ static int pcmcia_dev_resume(struct device * dev)
|
|||
if (!p_dev->suspended)
|
||||
return 0;
|
||||
|
||||
ds_dev_dbg(2, dev, "resuming\n");
|
||||
dev_dbg(dev, "resuming\n");
|
||||
|
||||
if (dev->driver)
|
||||
p_drv = to_pcmcia_drv(dev->driver);
|
||||
|
|
@ -1267,7 +1149,7 @@ static int pcmcia_dev_resume(struct device * dev)
|
|||
goto out;
|
||||
|
||||
if (p_dev->device_no == p_dev->func) {
|
||||
ds_dev_dbg(2, dev, "requesting configuration\n");
|
||||
dev_dbg(dev, "requesting configuration\n");
|
||||
ret = pcmcia_request_configuration(p_dev, &p_dev->conf);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
@ -1309,14 +1191,14 @@ static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
|
|||
|
||||
static int pcmcia_bus_resume(struct pcmcia_socket *skt)
|
||||
{
|
||||
ds_dev_dbg(2, &skt->dev, "resuming socket %d\n", skt->sock);
|
||||
dev_dbg(&skt->dev, "resuming socket %d\n", skt->sock);
|
||||
bus_for_each_dev(&pcmcia_bus_type, NULL, skt, pcmcia_bus_resume_callback);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
|
||||
{
|
||||
ds_dev_dbg(2, &skt->dev, "suspending socket %d\n", skt->sock);
|
||||
dev_dbg(&skt->dev, "suspending socket %d\n", skt->sock);
|
||||
if (bus_for_each_dev(&pcmcia_bus_type, NULL, skt,
|
||||
pcmcia_bus_suspend_callback)) {
|
||||
pcmcia_bus_resume(skt);
|
||||
|
|
@ -1348,7 +1230,7 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
ds_dev_dbg(1, &skt->dev, "ds_event(0x%06x, %d, 0x%p)\n",
|
||||
dev_dbg(&skt->dev, "ds_event(0x%06x, %d, 0x%p)\n",
|
||||
event, priority, skt);
|
||||
|
||||
switch (event) {
|
||||
|
|
|
|||
|
|
@ -63,21 +63,6 @@
|
|||
#include "vg468.h"
|
||||
#include "ricoh.h"
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static const char version[] =
|
||||
"i82365.c 1.265 1999/11/10 18:36:21 (David Hinds)";
|
||||
|
||||
static int pc_debug;
|
||||
|
||||
module_param(pc_debug, int, 0644);
|
||||
|
||||
#define debug(lvl, fmt, arg...) do { \
|
||||
if (pc_debug > (lvl)) \
|
||||
printk(KERN_DEBUG "i82365: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define debug(lvl, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
static irqreturn_t i365_count_irq(int, void *);
|
||||
static inline int _check_irq(int irq, int flags)
|
||||
|
|
@ -501,13 +486,13 @@ static irqreturn_t i365_count_irq(int irq, void *dev)
|
|||
{
|
||||
i365_get(irq_sock, I365_CSC);
|
||||
irq_hits++;
|
||||
debug(2, "-> hit on irq %d\n", irq);
|
||||
pr_debug("i82365: -> hit on irq %d\n", irq);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static u_int __init test_irq(u_short sock, int irq)
|
||||
{
|
||||
debug(2, " testing ISA irq %d\n", irq);
|
||||
pr_debug("i82365: testing ISA irq %d\n", irq);
|
||||
if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan",
|
||||
i365_count_irq) != 0)
|
||||
return 1;
|
||||
|
|
@ -515,7 +500,7 @@ static u_int __init test_irq(u_short sock, int irq)
|
|||
msleep(10);
|
||||
if (irq_hits) {
|
||||
free_irq(irq, i365_count_irq);
|
||||
debug(2, " spurious hit!\n");
|
||||
pr_debug("i82365: spurious hit!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -528,7 +513,7 @@ static u_int __init test_irq(u_short sock, int irq)
|
|||
|
||||
/* mask all interrupts */
|
||||
i365_set(sock, I365_CSCINT, 0);
|
||||
debug(2, " hits = %d\n", irq_hits);
|
||||
pr_debug("i82365: hits = %d\n", irq_hits);
|
||||
|
||||
return (irq_hits != 1);
|
||||
}
|
||||
|
|
@ -854,7 +839,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
|
|||
u_long flags = 0;
|
||||
int handled = 0;
|
||||
|
||||
debug(4, "pcic_interrupt(%d)\n", irq);
|
||||
pr_debug("pcic_interrupt(%d)\n", irq);
|
||||
|
||||
for (j = 0; j < 20; j++) {
|
||||
active = 0;
|
||||
|
|
@ -878,7 +863,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
|
|||
events |= (csc & I365_CSC_READY) ? SS_READY : 0;
|
||||
}
|
||||
ISA_UNLOCK(i, flags);
|
||||
debug(2, "socket %d event 0x%02x\n", i, events);
|
||||
pr_debug("socket %d event 0x%02x\n", i, events);
|
||||
|
||||
if (events)
|
||||
pcmcia_parse_events(&socket[i].socket, events);
|
||||
|
|
@ -890,7 +875,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
|
|||
if (j == 20)
|
||||
printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
|
||||
|
||||
debug(4, "interrupt done\n");
|
||||
pr_debug("pcic_interrupt done\n");
|
||||
return IRQ_RETVAL(handled);
|
||||
} /* pcic_interrupt */
|
||||
|
||||
|
|
@ -932,7 +917,7 @@ static int i365_get_status(u_short sock, u_int *value)
|
|||
}
|
||||
}
|
||||
|
||||
debug(1, "GetStatus(%d) = %#4.4x\n", sock, *value);
|
||||
pr_debug("GetStatus(%d) = %#4.4x\n", sock, *value);
|
||||
return 0;
|
||||
} /* i365_get_status */
|
||||
|
||||
|
|
@ -943,7 +928,7 @@ static int i365_set_socket(u_short sock, socket_state_t *state)
|
|||
struct i82365_socket *t = &socket[sock];
|
||||
u_char reg;
|
||||
|
||||
debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
pr_debug("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
"io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
|
||||
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
|
||||
|
||||
|
|
@ -1052,7 +1037,7 @@ static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
|
|||
{
|
||||
u_char map, ioctl;
|
||||
|
||||
debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx-%#llx)\n", sock, io->map, io->flags, io->speed,
|
||||
(unsigned long long)io->start, (unsigned long long)io->stop);
|
||||
map = io->map;
|
||||
|
|
@ -1082,7 +1067,7 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
|
|||
u_short base, i;
|
||||
u_char map;
|
||||
|
||||
debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, "
|
||||
pr_debug("SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, "
|
||||
"%#x)\n", sock, mem->map, mem->flags, mem->speed,
|
||||
(unsigned long long)mem->res->start,
|
||||
(unsigned long long)mem->res->end, mem->card_start);
|
||||
|
|
|
|||
|
|
@ -38,17 +38,6 @@
|
|||
|
||||
#include "m32r_cfc.h"
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static int m32r_cfc_debug;
|
||||
module_param(m32r_cfc_debug, int, 0644);
|
||||
#define debug(lvl, fmt, arg...) do { \
|
||||
if (m32r_cfc_debug > (lvl)) \
|
||||
printk(KERN_DEBUG "m32r_cfc: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define debug(n, args...) do { } while (0)
|
||||
#endif
|
||||
|
||||
/* Poll status interval -- 0 means default to interrupt */
|
||||
static int poll_interval = 0;
|
||||
|
||||
|
|
@ -123,7 +112,7 @@ void pcc_ioread_byte(int sock, unsigned long port, void *buf, size_t size,
|
|||
unsigned char *bp = (unsigned char *)buf;
|
||||
unsigned long flags;
|
||||
|
||||
debug(3, "m32r_cfc: pcc_ioread_byte: sock=%d, port=%#lx, buf=%p, "
|
||||
pr_debug("m32r_cfc: pcc_ioread_byte: sock=%d, port=%#lx, buf=%p, "
|
||||
"size=%u, nmemb=%d, flag=%d\n",
|
||||
sock, port, buf, size, nmemb, flag);
|
||||
|
||||
|
|
@ -132,7 +121,7 @@ void pcc_ioread_byte(int sock, unsigned long port, void *buf, size_t size,
|
|||
printk("m32r_cfc:ioread_byte null port :%#lx\n",port);
|
||||
return;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_ioread_byte: addr=%#lx\n", addr);
|
||||
pr_debug("m32r_cfc: pcc_ioread_byte: addr=%#lx\n", addr);
|
||||
|
||||
spin_lock_irqsave(&pcc_lock, flags);
|
||||
/* read Byte */
|
||||
|
|
@ -148,7 +137,7 @@ void pcc_ioread_word(int sock, unsigned long port, void *buf, size_t size,
|
|||
unsigned short *bp = (unsigned short *)buf;
|
||||
unsigned long flags;
|
||||
|
||||
debug(3, "m32r_cfc: pcc_ioread_word: sock=%d, port=%#lx, "
|
||||
pr_debug("m32r_cfc: pcc_ioread_word: sock=%d, port=%#lx, "
|
||||
"buf=%p, size=%u, nmemb=%d, flag=%d\n",
|
||||
sock, port, buf, size, nmemb, flag);
|
||||
|
||||
|
|
@ -163,7 +152,7 @@ void pcc_ioread_word(int sock, unsigned long port, void *buf, size_t size,
|
|||
printk("m32r_cfc:ioread_word null port :%#lx\n",port);
|
||||
return;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_ioread_word: addr=%#lx\n", addr);
|
||||
pr_debug("m32r_cfc: pcc_ioread_word: addr=%#lx\n", addr);
|
||||
|
||||
spin_lock_irqsave(&pcc_lock, flags);
|
||||
/* read Word */
|
||||
|
|
@ -179,7 +168,7 @@ void pcc_iowrite_byte(int sock, unsigned long port, void *buf, size_t size,
|
|||
unsigned char *bp = (unsigned char *)buf;
|
||||
unsigned long flags;
|
||||
|
||||
debug(3, "m32r_cfc: pcc_iowrite_byte: sock=%d, port=%#lx, "
|
||||
pr_debug("m32r_cfc: pcc_iowrite_byte: sock=%d, port=%#lx, "
|
||||
"buf=%p, size=%u, nmemb=%d, flag=%d\n",
|
||||
sock, port, buf, size, nmemb, flag);
|
||||
|
||||
|
|
@ -189,7 +178,7 @@ void pcc_iowrite_byte(int sock, unsigned long port, void *buf, size_t size,
|
|||
printk("m32r_cfc:iowrite_byte null port:%#lx\n",port);
|
||||
return;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_iowrite_byte: addr=%#lx\n", addr);
|
||||
pr_debug("m32r_cfc: pcc_iowrite_byte: addr=%#lx\n", addr);
|
||||
|
||||
spin_lock_irqsave(&pcc_lock, flags);
|
||||
while (nmemb--)
|
||||
|
|
@ -204,7 +193,7 @@ void pcc_iowrite_word(int sock, unsigned long port, void *buf, size_t size,
|
|||
unsigned short *bp = (unsigned short *)buf;
|
||||
unsigned long flags;
|
||||
|
||||
debug(3, "m32r_cfc: pcc_iowrite_word: sock=%d, port=%#lx, "
|
||||
pr_debug("m32r_cfc: pcc_iowrite_word: sock=%d, port=%#lx, "
|
||||
"buf=%p, size=%u, nmemb=%d, flag=%d\n",
|
||||
sock, port, buf, size, nmemb, flag);
|
||||
|
||||
|
|
@ -226,7 +215,7 @@ void pcc_iowrite_word(int sock, unsigned long port, void *buf, size_t size,
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
debug(3, "m32r_cfc: pcc_iowrite_word: addr=%#lx\n", addr);
|
||||
pr_debug("m32r_cfc: pcc_iowrite_word: addr=%#lx\n", addr);
|
||||
|
||||
spin_lock_irqsave(&pcc_lock, flags);
|
||||
while (nmemb--)
|
||||
|
|
@ -262,7 +251,7 @@ static struct timer_list poll_timer;
|
|||
static unsigned int pcc_get(u_short sock, unsigned int reg)
|
||||
{
|
||||
unsigned int val = inw(reg);
|
||||
debug(3, "m32r_cfc: pcc_get: reg(0x%08x)=0x%04x\n", reg, val);
|
||||
pr_debug("m32r_cfc: pcc_get: reg(0x%08x)=0x%04x\n", reg, val);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
|
@ -270,7 +259,7 @@ static unsigned int pcc_get(u_short sock, unsigned int reg)
|
|||
static void pcc_set(u_short sock, unsigned int reg, unsigned int data)
|
||||
{
|
||||
outw(data, reg);
|
||||
debug(3, "m32r_cfc: pcc_set: reg(0x%08x)=0x%04x\n", reg, data);
|
||||
pr_debug("m32r_cfc: pcc_set: reg(0x%08x)=0x%04x\n", reg, data);
|
||||
}
|
||||
|
||||
/*======================================================================
|
||||
|
|
@ -286,14 +275,14 @@ static int __init is_alive(u_short sock)
|
|||
{
|
||||
unsigned int stat;
|
||||
|
||||
debug(3, "m32r_cfc: is_alive:\n");
|
||||
pr_debug("m32r_cfc: is_alive:\n");
|
||||
|
||||
printk("CF: ");
|
||||
stat = pcc_get(sock, (unsigned int)PLD_CFSTS);
|
||||
if (!stat)
|
||||
printk("No ");
|
||||
printk("Card is detected at socket %d : stat = 0x%08x\n", sock, stat);
|
||||
debug(3, "m32r_cfc: is_alive: sock stat is 0x%04x\n", stat);
|
||||
pr_debug("m32r_cfc: is_alive: sock stat is 0x%04x\n", stat);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -303,7 +292,7 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr,
|
|||
{
|
||||
pcc_socket_t *t = &socket[pcc_sockets];
|
||||
|
||||
debug(3, "m32r_cfc: add_pcc_socket: base=%#lx, irq=%d, "
|
||||
pr_debug("m32r_cfc: add_pcc_socket: base=%#lx, irq=%d, "
|
||||
"mapaddr=%#lx, ioaddr=%08x\n",
|
||||
base, irq, mapaddr, ioaddr);
|
||||
|
||||
|
|
@ -358,7 +347,7 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr,
|
|||
/* eject interrupt */
|
||||
request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt);
|
||||
#endif
|
||||
debug(3, "m32r_cfc: enable CFMSK, RDYSEL\n");
|
||||
pr_debug("m32r_cfc: enable CFMSK, RDYSEL\n");
|
||||
pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01);
|
||||
#endif /* CONFIG_PLAT_USRV */
|
||||
#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
|
||||
|
|
@ -378,26 +367,26 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
|
|||
u_int events = 0;
|
||||
int handled = 0;
|
||||
|
||||
debug(3, "m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev);
|
||||
pr_debug("m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev);
|
||||
for (i = 0; i < pcc_sockets; i++) {
|
||||
if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq)
|
||||
continue;
|
||||
|
||||
handled = 1;
|
||||
debug(3, "m32r_cfc: pcc_interrupt: socket %d irq 0x%02x ",
|
||||
pr_debug("m32r_cfc: pcc_interrupt: socket %d irq 0x%02x ",
|
||||
i, irq);
|
||||
events |= SS_DETECT; /* insert or eject */
|
||||
if (events)
|
||||
pcmcia_parse_events(&socket[i].socket, events);
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_interrupt: done\n");
|
||||
pr_debug("m32r_cfc: pcc_interrupt: done\n");
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
} /* pcc_interrupt */
|
||||
|
||||
static void pcc_interrupt_wrapper(u_long data)
|
||||
{
|
||||
debug(3, "m32r_cfc: pcc_interrupt_wrapper:\n");
|
||||
pr_debug("m32r_cfc: pcc_interrupt_wrapper:\n");
|
||||
pcc_interrupt(0, NULL);
|
||||
init_timer(&poll_timer);
|
||||
poll_timer.expires = jiffies + poll_interval;
|
||||
|
|
@ -410,17 +399,17 @@ static int _pcc_get_status(u_short sock, u_int *value)
|
|||
{
|
||||
u_int status;
|
||||
|
||||
debug(3, "m32r_cfc: _pcc_get_status:\n");
|
||||
pr_debug("m32r_cfc: _pcc_get_status:\n");
|
||||
status = pcc_get(sock, (unsigned int)PLD_CFSTS);
|
||||
*value = (status) ? SS_DETECT : 0;
|
||||
debug(3, "m32r_cfc: _pcc_get_status: status=0x%08x\n", status);
|
||||
pr_debug("m32r_cfc: _pcc_get_status: status=0x%08x\n", status);
|
||||
|
||||
#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV) || defined(CONFIG_PLAT_OPSPUT)
|
||||
if ( status ) {
|
||||
/* enable CF power */
|
||||
status = inw((unsigned int)PLD_CPCR);
|
||||
if (!(status & PLD_CPCR_CF)) {
|
||||
debug(3, "m32r_cfc: _pcc_get_status: "
|
||||
pr_debug("m32r_cfc: _pcc_get_status: "
|
||||
"power on (CPCR=0x%08x)\n", status);
|
||||
status |= PLD_CPCR_CF;
|
||||
outw(status, (unsigned int)PLD_CPCR);
|
||||
|
|
@ -439,7 +428,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
|
|||
status &= ~PLD_CPCR_CF;
|
||||
outw(status, (unsigned int)PLD_CPCR);
|
||||
udelay(100);
|
||||
debug(3, "m32r_cfc: _pcc_get_status: "
|
||||
pr_debug("m32r_cfc: _pcc_get_status: "
|
||||
"power off (CPCR=0x%08x)\n", status);
|
||||
}
|
||||
#elif defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3)
|
||||
|
|
@ -465,13 +454,13 @@ static int _pcc_get_status(u_short sock, u_int *value)
|
|||
/* disable CF power */
|
||||
pcc_set(sock, (unsigned int)PLD_CPCR, 0);
|
||||
udelay(100);
|
||||
debug(3, "m32r_cfc: _pcc_get_status: "
|
||||
pr_debug("m32r_cfc: _pcc_get_status: "
|
||||
"power off (CPCR=0x%08x)\n", status);
|
||||
}
|
||||
#else
|
||||
#error no platform configuration
|
||||
#endif
|
||||
debug(3, "m32r_cfc: _pcc_get_status: GetStatus(%d) = %#4.4x\n",
|
||||
pr_debug("m32r_cfc: _pcc_get_status: GetStatus(%d) = %#4.4x\n",
|
||||
sock, *value);
|
||||
return 0;
|
||||
} /* _get_status */
|
||||
|
|
@ -480,7 +469,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
|
|||
|
||||
static int _pcc_set_socket(u_short sock, socket_state_t *state)
|
||||
{
|
||||
debug(3, "m32r_cfc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
pr_debug("m32r_cfc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
"io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
|
||||
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
|
||||
|
||||
|
|
@ -492,41 +481,39 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
|
|||
}
|
||||
#endif
|
||||
if (state->flags & SS_RESET) {
|
||||
debug(3, ":RESET\n");
|
||||
pr_debug(":RESET\n");
|
||||
pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x101);
|
||||
}else{
|
||||
pcc_set(sock,(unsigned int)PLD_CFRSTCR,0x100);
|
||||
}
|
||||
if (state->flags & SS_OUTPUT_ENA){
|
||||
debug(3, ":OUTPUT_ENA\n");
|
||||
pr_debug(":OUTPUT_ENA\n");
|
||||
/* bit clear */
|
||||
pcc_set(sock,(unsigned int)PLD_CFBUFCR,0);
|
||||
} else {
|
||||
pcc_set(sock,(unsigned int)PLD_CFBUFCR,1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
if(state->flags & SS_IOCARD){
|
||||
debug(3, ":IOCARD");
|
||||
pr_debug(":IOCARD");
|
||||
}
|
||||
if (state->flags & SS_PWR_AUTO) {
|
||||
debug(3, ":PWR_AUTO");
|
||||
pr_debug(":PWR_AUTO");
|
||||
}
|
||||
if (state->csc_mask & SS_DETECT)
|
||||
debug(3, ":csc-SS_DETECT");
|
||||
pr_debug(":csc-SS_DETECT");
|
||||
if (state->flags & SS_IOCARD) {
|
||||
if (state->csc_mask & SS_STSCHG)
|
||||
debug(3, ":STSCHG");
|
||||
pr_debug(":STSCHG");
|
||||
} else {
|
||||
if (state->csc_mask & SS_BATDEAD)
|
||||
debug(3, ":BATDEAD");
|
||||
pr_debug(":BATDEAD");
|
||||
if (state->csc_mask & SS_BATWARN)
|
||||
debug(3, ":BATWARN");
|
||||
pr_debug(":BATWARN");
|
||||
if (state->csc_mask & SS_READY)
|
||||
debug(3, ":READY");
|
||||
pr_debug(":READY");
|
||||
}
|
||||
debug(3, "\n");
|
||||
#endif
|
||||
pr_debug("\n");
|
||||
return 0;
|
||||
} /* _set_socket */
|
||||
|
||||
|
|
@ -536,7 +523,7 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io)
|
|||
{
|
||||
u_char map;
|
||||
|
||||
debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx-%#llx)\n", sock, io->map, io->flags,
|
||||
io->speed, (unsigned long long)io->start,
|
||||
(unsigned long long)io->stop);
|
||||
|
|
@ -554,7 +541,7 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem)
|
|||
u_long addr;
|
||||
pcc_socket_t *t = &socket[sock];
|
||||
|
||||
debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx, %#x)\n", sock, map, mem->flags,
|
||||
mem->speed, (unsigned long long)mem->static_start,
|
||||
mem->card_start);
|
||||
|
|
@ -640,11 +627,11 @@ static int pcc_get_status(struct pcmcia_socket *s, u_int *value)
|
|||
unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
|
||||
|
||||
if (socket[sock].flags & IS_ALIVE) {
|
||||
debug(3, "m32r_cfc: pcc_get_status: sock(%d) -EINVAL\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_get_status: sock(%d) -EINVAL\n", sock);
|
||||
*value = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_get_status: sock(%d)\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_get_status: sock(%d)\n", sock);
|
||||
LOCKED(_pcc_get_status(sock, value));
|
||||
}
|
||||
|
||||
|
|
@ -653,10 +640,10 @@ static int pcc_set_socket(struct pcmcia_socket *s, socket_state_t *state)
|
|||
unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
|
||||
|
||||
if (socket[sock].flags & IS_ALIVE) {
|
||||
debug(3, "m32r_cfc: pcc_set_socket: sock(%d) -EINVAL\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_socket: sock(%d) -EINVAL\n", sock);
|
||||
return -EINVAL;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_set_socket: sock(%d)\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_socket: sock(%d)\n", sock);
|
||||
LOCKED(_pcc_set_socket(sock, state));
|
||||
}
|
||||
|
||||
|
|
@ -665,10 +652,10 @@ static int pcc_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
|
|||
unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
|
||||
|
||||
if (socket[sock].flags & IS_ALIVE) {
|
||||
debug(3, "m32r_cfc: pcc_set_io_map: sock(%d) -EINVAL\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_io_map: sock(%d) -EINVAL\n", sock);
|
||||
return -EINVAL;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_set_io_map: sock(%d)\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_io_map: sock(%d)\n", sock);
|
||||
LOCKED(_pcc_set_io_map(sock, io));
|
||||
}
|
||||
|
||||
|
|
@ -677,16 +664,16 @@ static int pcc_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
|
|||
unsigned int sock = container_of(s, struct pcc_socket, socket)->number;
|
||||
|
||||
if (socket[sock].flags & IS_ALIVE) {
|
||||
debug(3, "m32r_cfc: pcc_set_mem_map: sock(%d) -EINVAL\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_mem_map: sock(%d) -EINVAL\n", sock);
|
||||
return -EINVAL;
|
||||
}
|
||||
debug(3, "m32r_cfc: pcc_set_mem_map: sock(%d)\n", sock);
|
||||
dev_dbg(&s->dev, "pcc_set_mem_map: sock(%d)\n", sock);
|
||||
LOCKED(_pcc_set_mem_map(sock, mem));
|
||||
}
|
||||
|
||||
static int pcc_init(struct pcmcia_socket *s)
|
||||
{
|
||||
debug(3, "m32r_cfc: pcc_init()\n");
|
||||
dev_dbg(&s->dev, "pcc_init()\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,16 +45,6 @@
|
|||
|
||||
#define PCC_DEBUG_DBEX
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static int m32r_pcc_debug;
|
||||
module_param(m32r_pcc_debug, int, 0644);
|
||||
#define debug(lvl, fmt, arg...) do { \
|
||||
if (m32r_pcc_debug > (lvl)) \
|
||||
printk(KERN_DEBUG "m32r_pcc: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define debug(n, args...) do { } while (0)
|
||||
#endif
|
||||
|
||||
/* Poll status interval -- 0 means default to interrupt */
|
||||
static int poll_interval = 0;
|
||||
|
|
@ -358,7 +348,7 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
|
|||
u_int events, active;
|
||||
int handled = 0;
|
||||
|
||||
debug(4, "m32r: pcc_interrupt(%d)\n", irq);
|
||||
pr_debug("m32r_pcc: pcc_interrupt(%d)\n", irq);
|
||||
|
||||
for (j = 0; j < 20; j++) {
|
||||
active = 0;
|
||||
|
|
@ -369,13 +359,14 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
|
|||
handled = 1;
|
||||
irc = pcc_get(i, PCIRC);
|
||||
irc >>=16;
|
||||
debug(2, "m32r-pcc:interrupt: socket %d pcirc 0x%02x ", i, irc);
|
||||
pr_debug("m32r_pcc: interrupt: socket %d pcirc 0x%02x ",
|
||||
i, irc);
|
||||
if (!irc)
|
||||
continue;
|
||||
|
||||
events = (irc) ? SS_DETECT : 0;
|
||||
events |= (pcc_get(i,PCCR) & PCCR_PCEN) ? SS_READY : 0;
|
||||
debug(2, " event 0x%02x\n", events);
|
||||
pr_debug("m32r_pcc: event 0x%02x\n", events);
|
||||
|
||||
if (events)
|
||||
pcmcia_parse_events(&socket[i].socket, events);
|
||||
|
|
@ -388,7 +379,7 @@ static irqreturn_t pcc_interrupt(int irq, void *dev)
|
|||
if (j == 20)
|
||||
printk(KERN_NOTICE "m32r-pcc: infinite loop in interrupt handler\n");
|
||||
|
||||
debug(4, "m32r-pcc: interrupt done\n");
|
||||
pr_debug("m32r_pcc: interrupt done\n");
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
} /* pcc_interrupt */
|
||||
|
|
@ -422,7 +413,7 @@ static int _pcc_get_status(u_short sock, u_int *value)
|
|||
status = pcc_get(sock,PCCSIGCR);
|
||||
*value |= (status & PCCSIGCR_VEN) ? SS_POWERON : 0;
|
||||
|
||||
debug(3, "m32r-pcc: GetStatus(%d) = %#4.4x\n", sock, *value);
|
||||
pr_debug("m32r_pcc: GetStatus(%d) = %#4.4x\n", sock, *value);
|
||||
return 0;
|
||||
} /* _get_status */
|
||||
|
||||
|
|
@ -432,7 +423,7 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
|
|||
{
|
||||
u_long reg = 0;
|
||||
|
||||
debug(3, "m32r-pcc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
pr_debug("m32r_pcc: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
"io_irq %d, csc_mask %#2.2x)", sock, state->flags,
|
||||
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
|
||||
|
||||
|
|
@ -448,11 +439,11 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
|
|||
}
|
||||
|
||||
if (state->flags & SS_RESET) {
|
||||
debug(3, ":RESET\n");
|
||||
pr_debug("m32r_pcc: :RESET\n");
|
||||
reg |= PCCSIGCR_CRST;
|
||||
}
|
||||
if (state->flags & SS_OUTPUT_ENA){
|
||||
debug(3, ":OUTPUT_ENA\n");
|
||||
pr_debug("m32r_pcc: :OUTPUT_ENA\n");
|
||||
/* bit clear */
|
||||
} else {
|
||||
reg |= PCCSIGCR_SEN;
|
||||
|
|
@ -460,28 +451,26 @@ static int _pcc_set_socket(u_short sock, socket_state_t *state)
|
|||
|
||||
pcc_set(sock,PCCSIGCR,reg);
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
if(state->flags & SS_IOCARD){
|
||||
debug(3, ":IOCARD");
|
||||
pr_debug("m32r_pcc: :IOCARD");
|
||||
}
|
||||
if (state->flags & SS_PWR_AUTO) {
|
||||
debug(3, ":PWR_AUTO");
|
||||
pr_debug("m32r_pcc: :PWR_AUTO");
|
||||
}
|
||||
if (state->csc_mask & SS_DETECT)
|
||||
debug(3, ":csc-SS_DETECT");
|
||||
pr_debug("m32r_pcc: :csc-SS_DETECT");
|
||||
if (state->flags & SS_IOCARD) {
|
||||
if (state->csc_mask & SS_STSCHG)
|
||||
debug(3, ":STSCHG");
|
||||
pr_debug("m32r_pcc: :STSCHG");
|
||||
} else {
|
||||
if (state->csc_mask & SS_BATDEAD)
|
||||
debug(3, ":BATDEAD");
|
||||
pr_debug("m32r_pcc: :BATDEAD");
|
||||
if (state->csc_mask & SS_BATWARN)
|
||||
debug(3, ":BATWARN");
|
||||
pr_debug("m32r_pcc: :BATWARN");
|
||||
if (state->csc_mask & SS_READY)
|
||||
debug(3, ":READY");
|
||||
pr_debug("m32r_pcc: :READY");
|
||||
}
|
||||
debug(3, "\n");
|
||||
#endif
|
||||
pr_debug("m32r_pcc: \n");
|
||||
return 0;
|
||||
} /* _set_socket */
|
||||
|
||||
|
|
@ -491,7 +480,7 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io)
|
|||
{
|
||||
u_char map;
|
||||
|
||||
debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m32r_pcc: SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx-%#llx)\n", sock, io->map, io->flags,
|
||||
io->speed, (unsigned long long)io->start,
|
||||
(unsigned long long)io->stop);
|
||||
|
|
@ -515,7 +504,7 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m32r_pcc: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx, %#x)\n", sock, map, mem->flags,
|
||||
mem->speed, (unsigned long long)mem->static_start,
|
||||
mem->card_start);
|
||||
|
|
@ -662,7 +651,7 @@ static int pcc_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
|
|||
|
||||
static int pcc_init(struct pcmcia_socket *s)
|
||||
{
|
||||
debug(4, "m32r-pcc: init call\n");
|
||||
pr_debug("m32r_pcc: init call\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,14 +64,6 @@
|
|||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static int pc_debug;
|
||||
module_param(pc_debug, int, 0);
|
||||
#define dprintk(args...) printk(KERN_DEBUG "m8xx_pcmcia: " args);
|
||||
#else
|
||||
#define dprintk(args...)
|
||||
#endif
|
||||
|
||||
#define pcmcia_info(args...) printk(KERN_INFO "m8xx_pcmcia: "args)
|
||||
#define pcmcia_error(args...) printk(KERN_ERR "m8xx_pcmcia: "args)
|
||||
|
||||
|
|
@ -565,7 +557,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
|
|||
unsigned int i, events, pscr, pipr, per;
|
||||
pcmconf8xx_t *pcmcia = socket[0].pcmcia;
|
||||
|
||||
dprintk("Interrupt!\n");
|
||||
pr_debug("m8xx_pcmcia: Interrupt!\n");
|
||||
/* get interrupt sources */
|
||||
|
||||
pscr = in_be32(&pcmcia->pcmc_pscr);
|
||||
|
|
@ -614,7 +606,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
|
|||
|
||||
/* call the handler */
|
||||
|
||||
dprintk("slot %u: events = 0x%02x, pscr = 0x%08x, "
|
||||
pr_debug("m8xx_pcmcia: slot %u: events = 0x%02x, pscr = 0x%08x, "
|
||||
"pipr = 0x%08x\n", i, events, pscr, pipr);
|
||||
|
||||
if (events) {
|
||||
|
|
@ -641,7 +633,7 @@ static irqreturn_t m8xx_interrupt(int irq, void *dev)
|
|||
/* clear the interrupt sources */
|
||||
out_be32(&pcmcia->pcmc_pscr, pscr);
|
||||
|
||||
dprintk("Interrupt done.\n");
|
||||
pr_debug("m8xx_pcmcia: Interrupt done.\n");
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
@ -815,7 +807,7 @@ static int m8xx_get_status(struct pcmcia_socket *sock, unsigned int *value)
|
|||
};
|
||||
}
|
||||
|
||||
dprintk("GetStatus(%d) = %#2.2x\n", lsock, *value);
|
||||
pr_debug("m8xx_pcmcia: GetStatus(%d) = %#2.2x\n", lsock, *value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -828,7 +820,7 @@ static int m8xx_set_socket(struct pcmcia_socket *sock, socket_state_t * state)
|
|||
unsigned long flags;
|
||||
pcmconf8xx_t *pcmcia = socket[0].pcmcia;
|
||||
|
||||
dprintk("SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
pr_debug("m8xx_pcmcia: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
"io_irq %d, csc_mask %#2.2x)\n", lsock, state->flags,
|
||||
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
|
||||
|
||||
|
|
@ -974,7 +966,7 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
|
|||
#define M8XX_SIZE (io->stop - io->start + 1)
|
||||
#define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start)
|
||||
|
||||
dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m8xx_pcmcia: SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#4.4llx-%#4.4llx)\n", lsock, io->map, io->flags,
|
||||
io->speed, (unsigned long long)io->start,
|
||||
(unsigned long long)io->stop);
|
||||
|
|
@ -988,7 +980,7 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
|
|||
|
||||
if (io->flags & MAP_ACTIVE) {
|
||||
|
||||
dprintk("io->flags & MAP_ACTIVE\n");
|
||||
pr_debug("m8xx_pcmcia: io->flags & MAP_ACTIVE\n");
|
||||
|
||||
winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
|
||||
+ (lsock * PCMCIA_IO_WIN_NO) + io->map;
|
||||
|
|
@ -1018,8 +1010,8 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
|
|||
|
||||
out_be32(&w->or, reg);
|
||||
|
||||
dprintk("Socket %u: Mapped io window %u at %#8.8x, "
|
||||
"OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
|
||||
pr_debug("m8xx_pcmcia: Socket %u: Mapped io window %u at "
|
||||
"%#8.8x, OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
|
||||
} else {
|
||||
/* shutdown IO window */
|
||||
winnr = (PCMCIA_MEM_WIN_NO * PCMCIA_SOCKETS_NO)
|
||||
|
|
@ -1033,14 +1025,14 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
|
|||
out_be32(&w->or, 0); /* turn off window */
|
||||
out_be32(&w->br, 0); /* turn off base address */
|
||||
|
||||
dprintk("Socket %u: Unmapped io window %u at %#8.8x, "
|
||||
"OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
|
||||
pr_debug("m8xx_pcmcia: Socket %u: Unmapped io window %u at "
|
||||
"%#8.8x, OR = %#8.8x.\n", lsock, io->map, w->br, w->or);
|
||||
}
|
||||
|
||||
/* copy the struct and modify the copy */
|
||||
s->io_win[io->map] = *io;
|
||||
s->io_win[io->map].flags &= (MAP_WRPROT | MAP_16BIT | MAP_ACTIVE);
|
||||
dprintk("SetIOMap exit\n");
|
||||
pr_debug("m8xx_pcmcia: SetIOMap exit\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1055,7 +1047,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
|
|||
unsigned int reg, winnr;
|
||||
pcmconf8xx_t *pcmcia = s->pcmcia;
|
||||
|
||||
dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m8xx_pcmcia: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags,
|
||||
mem->speed, (unsigned long long)mem->static_start,
|
||||
mem->card_start);
|
||||
|
|
@ -1098,7 +1090,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
|
|||
|
||||
out_be32(&w->or, reg);
|
||||
|
||||
dprintk("Socket %u: Mapped memory window %u at %#8.8x, "
|
||||
pr_debug("m8xx_pcmcia: Socket %u: Mapped memory window %u at %#8.8x, "
|
||||
"OR = %#8.8x.\n", lsock, mem->map, w->br, w->or);
|
||||
|
||||
if (mem->flags & MAP_ACTIVE) {
|
||||
|
|
@ -1108,7 +1100,7 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock,
|
|||
+ mem->card_start;
|
||||
}
|
||||
|
||||
dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
pr_debug("m8xx_pcmcia: SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags,
|
||||
mem->speed, (unsigned long long)mem->static_start,
|
||||
mem->card_start);
|
||||
|
|
@ -1129,7 +1121,7 @@ static int m8xx_sock_init(struct pcmcia_socket *sock)
|
|||
pccard_io_map io = { 0, 0, 0, 0, 1 };
|
||||
pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
dprintk("sock_init(%d)\n", s);
|
||||
pr_debug("m8xx_pcmcia: sock_init(%d)\n", s);
|
||||
|
||||
m8xx_set_socket(sock, &dead_socket);
|
||||
for (i = 0; i < PCMCIA_IO_WIN_NO; i++) {
|
||||
|
|
|
|||
|
|
@ -30,28 +30,6 @@
|
|||
#ifndef _LINUX_O2MICRO_H
|
||||
#define _LINUX_O2MICRO_H
|
||||
|
||||
#ifndef PCI_VENDOR_ID_O2
|
||||
#define PCI_VENDOR_ID_O2 0x1217
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6729
|
||||
#define PCI_DEVICE_ID_O2_6729 0x6729
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6730
|
||||
#define PCI_DEVICE_ID_O2_6730 0x673a
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6832
|
||||
#define PCI_DEVICE_ID_O2_6832 0x6832
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6836
|
||||
#define PCI_DEVICE_ID_O2_6836 0x6836
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6812
|
||||
#define PCI_DEVICE_ID_O2_6812 0x6872
|
||||
#endif
|
||||
#ifndef PCI_DEVICE_ID_O2_6933
|
||||
#define PCI_DEVICE_ID_O2_6933 0x6933
|
||||
#endif
|
||||
|
||||
/* Additional PCI configuration registers */
|
||||
|
||||
#define O2_MUX_CONTROL 0x90 /* 32 bit */
|
||||
|
|
|
|||
|
|
@ -58,17 +58,6 @@ typedef struct user_info_t {
|
|||
} user_info_t;
|
||||
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
extern int ds_pc_debug;
|
||||
|
||||
#define ds_dbg(lvl, fmt, arg...) do { \
|
||||
if (ds_pc_debug >= lvl) \
|
||||
printk(KERN_DEBUG "ds: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define ds_dbg(lvl, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s,
|
||||
unsigned int function)
|
||||
{
|
||||
|
|
@ -229,6 +218,61 @@ static int pcmcia_adjust_resource_info(adjust_t *adj)
|
|||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
/** pcmcia_get_window
|
||||
*/
|
||||
static int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *wh_out,
|
||||
window_handle_t wh, win_req_t *req)
|
||||
{
|
||||
pccard_mem_map *win;
|
||||
window_handle_t w;
|
||||
|
||||
wh--;
|
||||
if (!s || !(s->state & SOCKET_PRESENT))
|
||||
return -ENODEV;
|
||||
if (wh >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
for (w = wh; w < MAX_WIN; w++)
|
||||
if (s->state & SOCKET_WIN_REQ(w))
|
||||
break;
|
||||
if (w == MAX_WIN)
|
||||
return -EINVAL;
|
||||
win = &s->win[w];
|
||||
req->Base = win->res->start;
|
||||
req->Size = win->res->end - win->res->start + 1;
|
||||
req->AccessSpeed = win->speed;
|
||||
req->Attributes = 0;
|
||||
if (win->flags & MAP_ATTRIB)
|
||||
req->Attributes |= WIN_MEMORY_TYPE_AM;
|
||||
if (win->flags & MAP_ACTIVE)
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
if (win->flags & MAP_16BIT)
|
||||
req->Attributes |= WIN_DATA_WIDTH_16;
|
||||
if (win->flags & MAP_USE_WAIT)
|
||||
req->Attributes |= WIN_USE_WAIT;
|
||||
|
||||
*wh_out = w + 1;
|
||||
return 0;
|
||||
} /* pcmcia_get_window */
|
||||
|
||||
|
||||
/** pcmcia_get_mem_page
|
||||
*
|
||||
* Change the card address of an already open memory window.
|
||||
*/
|
||||
static int pcmcia_get_mem_page(struct pcmcia_socket *skt, window_handle_t wh,
|
||||
memreq_t *req)
|
||||
{
|
||||
wh--;
|
||||
if (wh >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
|
||||
req->Page = 0;
|
||||
req->CardOffset = skt->win[wh].card_start;
|
||||
return 0;
|
||||
} /* pcmcia_get_mem_page */
|
||||
|
||||
|
||||
/** pccard_get_status
|
||||
*
|
||||
* Get the current socket state bits. We don't support the latched
|
||||
|
|
@ -431,7 +475,7 @@ static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
|
|||
if (!s)
|
||||
return -EINVAL;
|
||||
|
||||
ds_dbg(2, "bind_request(%d, '%s')\n", s->sock,
|
||||
pr_debug("bind_request(%d, '%s')\n", s->sock,
|
||||
(char *)bind_info->dev_info);
|
||||
|
||||
p_drv = get_pcmcia_driver(&bind_info->dev_info);
|
||||
|
|
@ -623,7 +667,7 @@ static int ds_open(struct inode *inode, struct file *file)
|
|||
static int warning_printed = 0;
|
||||
int ret = 0;
|
||||
|
||||
ds_dbg(0, "ds_open(socket %d)\n", i);
|
||||
pr_debug("ds_open(socket %d)\n", i);
|
||||
|
||||
lock_kernel();
|
||||
s = pcmcia_get_socket_by_nr(i);
|
||||
|
|
@ -685,7 +729,7 @@ static int ds_release(struct inode *inode, struct file *file)
|
|||
struct pcmcia_socket *s;
|
||||
user_info_t *user, **link;
|
||||
|
||||
ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
|
||||
pr_debug("ds_release(socket %d)\n", iminor(inode));
|
||||
|
||||
user = file->private_data;
|
||||
if (CHECK_USER(user))
|
||||
|
|
@ -719,7 +763,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
|
|||
user_info_t *user;
|
||||
int ret;
|
||||
|
||||
ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
pr_debug("ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
|
||||
if (count < 4)
|
||||
return -EINVAL;
|
||||
|
|
@ -744,7 +788,7 @@ static ssize_t ds_read(struct file *file, char __user *buf,
|
|||
static ssize_t ds_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
pr_debug("ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
|
||||
if (count != 4)
|
||||
return -EINVAL;
|
||||
|
|
@ -762,7 +806,7 @@ static u_int ds_poll(struct file *file, poll_table *wait)
|
|||
struct pcmcia_socket *s;
|
||||
user_info_t *user;
|
||||
|
||||
ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
pr_debug("ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
|
||||
|
||||
user = file->private_data;
|
||||
if (CHECK_USER(user))
|
||||
|
|
@ -790,7 +834,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
|||
ds_ioctl_arg_t *buf;
|
||||
user_info_t *user;
|
||||
|
||||
ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
|
||||
pr_debug("ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
|
||||
|
||||
user = file->private_data;
|
||||
if (CHECK_USER(user))
|
||||
|
|
@ -809,13 +853,13 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
|||
|
||||
if (cmd & IOC_IN) {
|
||||
if (!access_ok(VERIFY_READ, uarg, size)) {
|
||||
ds_dbg(3, "ds_ioctl(): verify_read = %d\n", -EFAULT);
|
||||
pr_debug("ds_ioctl(): verify_read = %d\n", -EFAULT);
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
if (cmd & IOC_OUT) {
|
||||
if (!access_ok(VERIFY_WRITE, uarg, size)) {
|
||||
ds_dbg(3, "ds_ioctl(): verify_write = %d\n", -EFAULT);
|
||||
pr_debug("ds_ioctl(): verify_write = %d\n", -EFAULT);
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
|
@ -927,15 +971,15 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
|||
goto free_out;
|
||||
break;
|
||||
case DS_GET_FIRST_WINDOW:
|
||||
ret = pcmcia_get_window(s, &buf->win_info.handle, 0,
|
||||
ret = pcmcia_get_window(s, &buf->win_info.handle, 1,
|
||||
&buf->win_info.window);
|
||||
break;
|
||||
case DS_GET_NEXT_WINDOW:
|
||||
ret = pcmcia_get_window(s, &buf->win_info.handle,
|
||||
buf->win_info.handle->index + 1, &buf->win_info.window);
|
||||
buf->win_info.handle + 1, &buf->win_info.window);
|
||||
break;
|
||||
case DS_GET_MEM_PAGE:
|
||||
ret = pcmcia_get_mem_page(buf->win_info.handle,
|
||||
ret = pcmcia_get_mem_page(s, buf->win_info.handle,
|
||||
&buf->win_info.map);
|
||||
break;
|
||||
case DS_REPLACE_CIS:
|
||||
|
|
@ -962,7 +1006,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
|
|||
}
|
||||
|
||||
if ((err == 0) && (ret != 0)) {
|
||||
ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
|
||||
pr_debug("ds_ioctl: ret = %d\n", ret);
|
||||
switch (ret) {
|
||||
case -ENODEV:
|
||||
case -EINVAL:
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
|
@ -43,21 +44,6 @@ static u8 pcmcia_used_irq[NR_IRQS];
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
extern int ds_pc_debug;
|
||||
|
||||
#define ds_dbg(skt, lvl, fmt, arg...) do { \
|
||||
if (ds_pc_debug >= lvl) \
|
||||
dev_printk(KERN_DEBUG, &skt->dev, \
|
||||
"pcmcia_resource: " fmt, \
|
||||
## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define ds_dbg(skt, lvl, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/** alloc_io_space
|
||||
*
|
||||
* Special stuff for managing IO windows, because they are scarce
|
||||
|
|
@ -72,14 +58,14 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr,
|
|||
align = (*base) ? (lines ? 1<<lines : 0) : 1;
|
||||
if (align && (align < num)) {
|
||||
if (*base) {
|
||||
ds_dbg(s, 0, "odd IO request: num %#x align %#x\n",
|
||||
dev_dbg(&s->dev, "odd IO request: num %#x align %#x\n",
|
||||
num, align);
|
||||
align = 0;
|
||||
} else
|
||||
while (align && (align < num)) align <<= 1;
|
||||
}
|
||||
if (*base & ~(align-1)) {
|
||||
ds_dbg(s, 0, "odd IO request: base %#x align %#x\n",
|
||||
dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
|
||||
*base, align);
|
||||
align = 0;
|
||||
}
|
||||
|
|
@ -173,8 +159,10 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
|||
s = p_dev->socket;
|
||||
c = p_dev->function_config;
|
||||
|
||||
if (!(c->state & CONFIG_LOCKED))
|
||||
if (!(c->state & CONFIG_LOCKED)) {
|
||||
dev_dbg(&s->dev, "Configuration isnt't locked\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
addr = (c->ConfigBase + reg->Offset) >> 1;
|
||||
|
||||
|
|
@ -188,6 +176,7 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
|||
pcmcia_write_cis_mem(s, 1, addr, 1, &val);
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&s->dev, "Invalid conf register request\n");
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
|
@ -196,68 +185,21 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
|||
EXPORT_SYMBOL(pcmcia_access_configuration_register);
|
||||
|
||||
|
||||
/** pcmcia_get_window
|
||||
*/
|
||||
int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle,
|
||||
int idx, win_req_t *req)
|
||||
int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh,
|
||||
memreq_t *req)
|
||||
{
|
||||
window_t *win;
|
||||
int w;
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
|
||||
if (!s || !(s->state & SOCKET_PRESENT))
|
||||
return -ENODEV;
|
||||
for (w = idx; w < MAX_WIN; w++)
|
||||
if (s->state & SOCKET_WIN_REQ(w))
|
||||
break;
|
||||
if (w == MAX_WIN)
|
||||
wh--;
|
||||
if (wh >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
win = &s->win[w];
|
||||
req->Base = win->ctl.res->start;
|
||||
req->Size = win->ctl.res->end - win->ctl.res->start + 1;
|
||||
req->AccessSpeed = win->ctl.speed;
|
||||
req->Attributes = 0;
|
||||
if (win->ctl.flags & MAP_ATTRIB)
|
||||
req->Attributes |= WIN_MEMORY_TYPE_AM;
|
||||
if (win->ctl.flags & MAP_ACTIVE)
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
if (win->ctl.flags & MAP_16BIT)
|
||||
req->Attributes |= WIN_DATA_WIDTH_16;
|
||||
if (win->ctl.flags & MAP_USE_WAIT)
|
||||
req->Attributes |= WIN_USE_WAIT;
|
||||
*handle = win;
|
||||
return 0;
|
||||
} /* pcmcia_get_window */
|
||||
EXPORT_SYMBOL(pcmcia_get_window);
|
||||
|
||||
|
||||
/** pcmcia_get_mem_page
|
||||
*
|
||||
* Change the card address of an already open memory window.
|
||||
*/
|
||||
int pcmcia_get_mem_page(window_handle_t win, memreq_t *req)
|
||||
{
|
||||
if ((win == NULL) || (win->magic != WINDOW_MAGIC))
|
||||
return -EINVAL;
|
||||
req->Page = 0;
|
||||
req->CardOffset = win->ctl.card_start;
|
||||
return 0;
|
||||
} /* pcmcia_get_mem_page */
|
||||
EXPORT_SYMBOL(pcmcia_get_mem_page);
|
||||
|
||||
|
||||
int pcmcia_map_mem_page(window_handle_t win, memreq_t *req)
|
||||
{
|
||||
struct pcmcia_socket *s;
|
||||
if ((win == NULL) || (win->magic != WINDOW_MAGIC))
|
||||
return -EINVAL;
|
||||
s = win->sock;
|
||||
if (req->Page != 0) {
|
||||
ds_dbg(s, 0, "failure: requested page is zero\n");
|
||||
dev_dbg(&s->dev, "failure: requested page is zero\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
win->ctl.card_start = req->CardOffset;
|
||||
if (s->ops->set_mem_map(s, &win->ctl) != 0) {
|
||||
ds_dbg(s, 0, "failed to set_mem_map\n");
|
||||
s->win[wh].card_start = req->CardOffset;
|
||||
if (s->ops->set_mem_map(s, &s->win[wh]) != 0) {
|
||||
dev_dbg(&s->dev, "failed to set_mem_map\n");
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -278,10 +220,14 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
|
|||
s = p_dev->socket;
|
||||
c = p_dev->function_config;
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT))
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
return -ENODEV;
|
||||
if (!(c->state & CONFIG_LOCKED))
|
||||
}
|
||||
if (!(c->state & CONFIG_LOCKED)) {
|
||||
dev_dbg(&s->dev, "Configuration isnt't locked\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
|
||||
if (mod->Attributes & CONF_ENABLE_IRQ) {
|
||||
|
|
@ -295,7 +241,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
|
|||
}
|
||||
|
||||
if (mod->Attributes & CONF_VCC_CHANGE_VALID) {
|
||||
ds_dbg(s, 0, "changing Vcc is not allowed at this time\n");
|
||||
dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -303,7 +249,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
|
|||
if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
|
||||
(mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
|
||||
if (mod->Vpp1 != mod->Vpp2) {
|
||||
ds_dbg(s, 0, "Vpp1 and Vpp2 must be the same\n");
|
||||
dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
s->socket.Vpp = mod->Vpp1;
|
||||
|
|
@ -314,7 +260,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
|
|||
}
|
||||
} else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
|
||||
(mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
|
||||
ds_dbg(s, 0, "changing Vcc is not allowed at this time\n");
|
||||
dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -425,11 +371,11 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
if (c->state & CONFIG_LOCKED)
|
||||
return -EACCES;
|
||||
if (c->irq.Attributes != req->Attributes) {
|
||||
ds_dbg(s, 0, "IRQ attributes must match assigned ones\n");
|
||||
dev_dbg(&s->dev, "IRQ attributes must match assigned ones\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (s->irq.AssignedIRQ != req->AssignedIRQ) {
|
||||
ds_dbg(s, 0, "IRQ must match assigned one\n");
|
||||
dev_dbg(&s->dev, "IRQ must match assigned one\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (--s->irq.Config == 0) {
|
||||
|
|
@ -437,8 +383,8 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
s->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
||||
if (req->Attributes & IRQ_HANDLE_PRESENT) {
|
||||
free_irq(req->AssignedIRQ, req->Instance);
|
||||
if (req->Handler) {
|
||||
free_irq(req->AssignedIRQ, p_dev->priv);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCMCIA_PROBE
|
||||
|
|
@ -449,30 +395,34 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
} /* pcmcia_release_irq */
|
||||
|
||||
|
||||
int pcmcia_release_window(window_handle_t win)
|
||||
int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
|
||||
{
|
||||
struct pcmcia_socket *s;
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
pccard_mem_map *win;
|
||||
|
||||
if ((win == NULL) || (win->magic != WINDOW_MAGIC))
|
||||
wh--;
|
||||
if (wh >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
s = win->sock;
|
||||
if (!(win->handle->_win & CLIENT_WIN_REQ(win->index)))
|
||||
|
||||
win = &s->win[wh];
|
||||
|
||||
if (!(p_dev->_win & CLIENT_WIN_REQ(wh))) {
|
||||
dev_dbg(&s->dev, "not releasing unknown window\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Shut down memory window */
|
||||
win->ctl.flags &= ~MAP_ACTIVE;
|
||||
s->ops->set_mem_map(s, &win->ctl);
|
||||
s->state &= ~SOCKET_WIN_REQ(win->index);
|
||||
win->flags &= ~MAP_ACTIVE;
|
||||
s->ops->set_mem_map(s, win);
|
||||
s->state &= ~SOCKET_WIN_REQ(wh);
|
||||
|
||||
/* Release system memory */
|
||||
if (win->ctl.res) {
|
||||
release_resource(win->ctl.res);
|
||||
kfree(win->ctl.res);
|
||||
win->ctl.res = NULL;
|
||||
if (win->res) {
|
||||
release_resource(win->res);
|
||||
kfree(win->res);
|
||||
win->res = NULL;
|
||||
}
|
||||
win->handle->_win &= ~CLIENT_WIN_REQ(win->index);
|
||||
|
||||
win->magic = 0;
|
||||
p_dev->_win &= ~CLIENT_WIN_REQ(wh);
|
||||
|
||||
return 0;
|
||||
} /* pcmcia_release_window */
|
||||
|
|
@ -492,12 +442,14 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
|
|||
return -ENODEV;
|
||||
|
||||
if (req->IntType & INT_CARDBUS) {
|
||||
ds_dbg(p_dev->socket, 0, "IntType may not be INT_CARDBUS\n");
|
||||
dev_dbg(&s->dev, "IntType may not be INT_CARDBUS\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
c = p_dev->function_config;
|
||||
if (c->state & CONFIG_LOCKED)
|
||||
if (c->state & CONFIG_LOCKED) {
|
||||
dev_dbg(&s->dev, "Configuration is locked\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
/* Do power control. We don't allow changes in Vcc. */
|
||||
s->socket.Vpp = req->Vpp;
|
||||
|
|
@ -609,40 +561,44 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
|
|||
struct pcmcia_socket *s = p_dev->socket;
|
||||
config_t *c;
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT))
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!req)
|
||||
return -EINVAL;
|
||||
c = p_dev->function_config;
|
||||
if (c->state & CONFIG_LOCKED)
|
||||
if (c->state & CONFIG_LOCKED) {
|
||||
dev_dbg(&s->dev, "Configuration is locked\n");
|
||||
return -EACCES;
|
||||
}
|
||||
if (c->state & CONFIG_IO_REQ) {
|
||||
ds_dbg(s, 0, "IO already configured\n");
|
||||
dev_dbg(&s->dev, "IO already configured\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)) {
|
||||
ds_dbg(s, 0, "bad attribute setting for IO region 1\n");
|
||||
dev_dbg(&s->dev, "bad attribute setting for IO region 1\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((req->NumPorts2 > 0) &&
|
||||
(req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))) {
|
||||
ds_dbg(s, 0, "bad attribute setting for IO region 2\n");
|
||||
dev_dbg(&s->dev, "bad attribute setting for IO region 2\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ds_dbg(s, 1, "trying to allocate resource 1\n");
|
||||
dev_dbg(&s->dev, "trying to allocate resource 1\n");
|
||||
if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
|
||||
req->NumPorts1, req->IOAddrLines)) {
|
||||
ds_dbg(s, 0, "allocation of resource 1 failed\n");
|
||||
dev_dbg(&s->dev, "allocation of resource 1 failed\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (req->NumPorts2) {
|
||||
ds_dbg(s, 1, "trying to allocate resource 2\n");
|
||||
dev_dbg(&s->dev, "trying to allocate resource 2\n");
|
||||
if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
|
||||
req->NumPorts2, req->IOAddrLines)) {
|
||||
ds_dbg(s, 0, "allocation of resource 2 failed\n");
|
||||
dev_dbg(&s->dev, "allocation of resource 2 failed\n");
|
||||
release_io_space(s, req->BasePort1, req->NumPorts1);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
|
@ -680,13 +636,17 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
int ret = -EINVAL, irq = 0;
|
||||
int type;
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT))
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
c = p_dev->function_config;
|
||||
if (c->state & CONFIG_LOCKED)
|
||||
if (c->state & CONFIG_LOCKED) {
|
||||
dev_dbg(&s->dev, "Configuration is locked\n");
|
||||
return -EACCES;
|
||||
}
|
||||
if (c->state & CONFIG_IRQ_REQ) {
|
||||
ds_dbg(s, 0, "IRQ already configured\n");
|
||||
dev_dbg(&s->dev, "IRQ already configured\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
|
@ -704,7 +664,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
/* if the underlying IRQ infrastructure allows for it, only allocate
|
||||
* the IRQ, but do not enable it
|
||||
*/
|
||||
if (!(req->Attributes & IRQ_HANDLE_PRESENT))
|
||||
if (!(req->Handler))
|
||||
type |= IRQ_NOAUTOEN;
|
||||
#endif /* IRQ_NOAUTOEN */
|
||||
|
||||
|
|
@ -714,7 +674,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
} else {
|
||||
int try;
|
||||
u32 mask = s->irq_mask;
|
||||
void *data = &p_dev->dev.driver; /* something unique to this device */
|
||||
void *data = p_dev; /* something unique to this device */
|
||||
|
||||
for (try = 0; try < 64; try++) {
|
||||
irq = try % 32;
|
||||
|
|
@ -731,12 +691,12 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
* registering a dummy handle works, i.e. if the IRQ isn't
|
||||
* marked as used by the kernel resource management core */
|
||||
ret = request_irq(irq,
|
||||
(req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action,
|
||||
(req->Handler) ? req->Handler : test_action,
|
||||
type,
|
||||
p_dev->devname,
|
||||
(req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data);
|
||||
(req->Handler) ? p_dev->priv : data);
|
||||
if (!ret) {
|
||||
if (!(req->Attributes & IRQ_HANDLE_PRESENT))
|
||||
if (!req->Handler)
|
||||
free_irq(irq, data);
|
||||
break;
|
||||
}
|
||||
|
|
@ -745,17 +705,22 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
|
|||
#endif
|
||||
/* only assign PCI irq if no IRQ already assigned */
|
||||
if (ret && !s->irq.AssignedIRQ) {
|
||||
if (!s->pci_irq)
|
||||
if (!s->pci_irq) {
|
||||
dev_printk(KERN_INFO, &s->dev, "no IRQ found\n");
|
||||
return ret;
|
||||
}
|
||||
type = IRQF_SHARED;
|
||||
irq = s->pci_irq;
|
||||
}
|
||||
|
||||
if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) {
|
||||
if (ret && req->Handler) {
|
||||
ret = request_irq(irq, req->Handler, type,
|
||||
p_dev->devname, req->Instance);
|
||||
if (ret)
|
||||
p_dev->devname, p_dev->priv);
|
||||
if (ret) {
|
||||
dev_printk(KERN_INFO, &s->dev,
|
||||
"request_irq() failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure the fact the request type was overridden is passed back */
|
||||
|
|
@ -787,17 +752,19 @@ EXPORT_SYMBOL(pcmcia_request_irq);
|
|||
* Request_window() establishes a mapping between card memory space
|
||||
* and system memory space.
|
||||
*/
|
||||
int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_handle_t *wh)
|
||||
int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_handle_t *wh)
|
||||
{
|
||||
struct pcmcia_socket *s = (*p_dev)->socket;
|
||||
window_t *win;
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
pccard_mem_map *win;
|
||||
u_long align;
|
||||
int w;
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT))
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (req->Attributes & (WIN_PAGED | WIN_SHARED)) {
|
||||
ds_dbg(s, 0, "bad attribute setting for iomem region\n");
|
||||
dev_dbg(&s->dev, "bad attribute setting for iomem region\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -808,12 +775,12 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h
|
|||
(req->Attributes & WIN_STRICT_ALIGN)) ?
|
||||
req->Size : s->map_size);
|
||||
if (req->Size & (s->map_size-1)) {
|
||||
ds_dbg(s, 0, "invalid map size\n");
|
||||
dev_dbg(&s->dev, "invalid map size\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((req->Base && (s->features & SS_CAP_STATIC_MAP)) ||
|
||||
(req->Base & (align-1))) {
|
||||
ds_dbg(s, 0, "invalid base address\n");
|
||||
dev_dbg(&s->dev, "invalid base address\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (req->Base)
|
||||
|
|
@ -823,52 +790,48 @@ int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, window_h
|
|||
for (w = 0; w < MAX_WIN; w++)
|
||||
if (!(s->state & SOCKET_WIN_REQ(w))) break;
|
||||
if (w == MAX_WIN) {
|
||||
ds_dbg(s, 0, "all windows are used already\n");
|
||||
dev_dbg(&s->dev, "all windows are used already\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
win = &s->win[w];
|
||||
win->magic = WINDOW_MAGIC;
|
||||
win->index = w;
|
||||
win->handle = *p_dev;
|
||||
win->sock = s;
|
||||
|
||||
if (!(s->features & SS_CAP_STATIC_MAP)) {
|
||||
win->ctl.res = pcmcia_find_mem_region(req->Base, req->Size, align,
|
||||
win->res = pcmcia_find_mem_region(req->Base, req->Size, align,
|
||||
(req->Attributes & WIN_MAP_BELOW_1MB), s);
|
||||
if (!win->ctl.res) {
|
||||
ds_dbg(s, 0, "allocating mem region failed\n");
|
||||
if (!win->res) {
|
||||
dev_dbg(&s->dev, "allocating mem region failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
(*p_dev)->_win |= CLIENT_WIN_REQ(w);
|
||||
p_dev->_win |= CLIENT_WIN_REQ(w);
|
||||
|
||||
/* Configure the socket controller */
|
||||
win->ctl.map = w+1;
|
||||
win->ctl.flags = 0;
|
||||
win->ctl.speed = req->AccessSpeed;
|
||||
win->map = w+1;
|
||||
win->flags = 0;
|
||||
win->speed = req->AccessSpeed;
|
||||
if (req->Attributes & WIN_MEMORY_TYPE)
|
||||
win->ctl.flags |= MAP_ATTRIB;
|
||||
win->flags |= MAP_ATTRIB;
|
||||
if (req->Attributes & WIN_ENABLE)
|
||||
win->ctl.flags |= MAP_ACTIVE;
|
||||
win->flags |= MAP_ACTIVE;
|
||||
if (req->Attributes & WIN_DATA_WIDTH_16)
|
||||
win->ctl.flags |= MAP_16BIT;
|
||||
win->flags |= MAP_16BIT;
|
||||
if (req->Attributes & WIN_USE_WAIT)
|
||||
win->ctl.flags |= MAP_USE_WAIT;
|
||||
win->ctl.card_start = 0;
|
||||
if (s->ops->set_mem_map(s, &win->ctl) != 0) {
|
||||
ds_dbg(s, 0, "failed to set memory mapping\n");
|
||||
win->flags |= MAP_USE_WAIT;
|
||||
win->card_start = 0;
|
||||
if (s->ops->set_mem_map(s, win) != 0) {
|
||||
dev_dbg(&s->dev, "failed to set memory mapping\n");
|
||||
return -EIO;
|
||||
}
|
||||
s->state |= SOCKET_WIN_REQ(w);
|
||||
|
||||
/* Return window handle */
|
||||
if (s->features & SS_CAP_STATIC_MAP) {
|
||||
req->Base = win->ctl.static_start;
|
||||
req->Base = win->static_start;
|
||||
} else {
|
||||
req->Base = win->ctl.res->start;
|
||||
req->Base = win->res->start;
|
||||
}
|
||||
*wh = win;
|
||||
*wh = w + 1;
|
||||
|
||||
return 0;
|
||||
} /* pcmcia_request_window */
|
||||
|
|
@ -879,18 +842,45 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev) {
|
|||
pcmcia_release_io(p_dev, &p_dev->io);
|
||||
pcmcia_release_irq(p_dev, &p_dev->irq);
|
||||
if (p_dev->win)
|
||||
pcmcia_release_window(p_dev->win);
|
||||
pcmcia_release_window(p_dev, p_dev->win);
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_disable_device);
|
||||
|
||||
|
||||
struct pcmcia_cfg_mem {
|
||||
tuple_t tuple;
|
||||
struct pcmcia_device *p_dev;
|
||||
void *priv_data;
|
||||
int (*conf_check) (struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data);
|
||||
cisparse_t parse;
|
||||
u8 buf[256];
|
||||
cistpl_cftable_entry_t dflt;
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_do_loop_config() - internal helper for pcmcia_loop_config()
|
||||
*
|
||||
* pcmcia_do_loop_config() is the internal callback for the call from
|
||||
* pcmcia_loop_config() to pccard_loop_tuple(). Data is transferred
|
||||
* by a struct pcmcia_cfg_mem.
|
||||
*/
|
||||
static int pcmcia_do_loop_config(tuple_t *tuple, cisparse_t *parse, void *priv)
|
||||
{
|
||||
cistpl_cftable_entry_t *cfg = &parse->cftable_entry;
|
||||
struct pcmcia_cfg_mem *cfg_mem = priv;
|
||||
|
||||
/* default values */
|
||||
cfg_mem->p_dev->conf.ConfigIndex = cfg->index;
|
||||
if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
|
||||
cfg_mem->dflt = *cfg;
|
||||
|
||||
return cfg_mem->conf_check(cfg_mem->p_dev, cfg, &cfg_mem->dflt,
|
||||
cfg_mem->p_dev->socket->socket.Vcc,
|
||||
cfg_mem->priv_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* pcmcia_loop_config() - loop over configuration options
|
||||
* @p_dev: the struct pcmcia_device which we need to loop for.
|
||||
|
|
@ -913,48 +903,174 @@ int pcmcia_loop_config(struct pcmcia_device *p_dev,
|
|||
void *priv_data)
|
||||
{
|
||||
struct pcmcia_cfg_mem *cfg_mem;
|
||||
|
||||
tuple_t *tuple;
|
||||
int ret;
|
||||
unsigned int vcc;
|
||||
|
||||
cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL);
|
||||
if (cfg_mem == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* get the current Vcc setting */
|
||||
vcc = p_dev->socket->socket.Vcc;
|
||||
cfg_mem->p_dev = p_dev;
|
||||
cfg_mem->conf_check = conf_check;
|
||||
cfg_mem->priv_data = priv_data;
|
||||
|
||||
tuple = &cfg_mem->tuple;
|
||||
tuple->TupleData = cfg_mem->buf;
|
||||
tuple->TupleDataMax = 255;
|
||||
tuple->TupleOffset = 0;
|
||||
tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
tuple->Attributes = 0;
|
||||
|
||||
ret = pcmcia_get_first_tuple(p_dev, tuple);
|
||||
while (!ret) {
|
||||
cistpl_cftable_entry_t *cfg = &cfg_mem->parse.cftable_entry;
|
||||
|
||||
if (pcmcia_get_tuple_data(p_dev, tuple))
|
||||
goto next_entry;
|
||||
|
||||
if (pcmcia_parse_tuple(tuple, &cfg_mem->parse))
|
||||
goto next_entry;
|
||||
|
||||
/* default values */
|
||||
p_dev->conf.ConfigIndex = cfg->index;
|
||||
if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
|
||||
cfg_mem->dflt = *cfg;
|
||||
|
||||
ret = conf_check(p_dev, cfg, &cfg_mem->dflt, vcc, priv_data);
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
next_entry:
|
||||
ret = pcmcia_get_next_tuple(p_dev, tuple);
|
||||
}
|
||||
ret = pccard_loop_tuple(p_dev->socket, p_dev->func,
|
||||
CISTPL_CFTABLE_ENTRY, &cfg_mem->parse,
|
||||
cfg_mem, pcmcia_do_loop_config);
|
||||
|
||||
kfree(cfg_mem);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_loop_config);
|
||||
|
||||
|
||||
struct pcmcia_loop_mem {
|
||||
struct pcmcia_device *p_dev;
|
||||
void *priv_data;
|
||||
int (*loop_tuple) (struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data);
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_do_loop_tuple() - internal helper for pcmcia_loop_config()
|
||||
*
|
||||
* pcmcia_do_loop_tuple() is the internal callback for the call from
|
||||
* pcmcia_loop_tuple() to pccard_loop_tuple(). Data is transferred
|
||||
* by a struct pcmcia_cfg_mem.
|
||||
*/
|
||||
static int pcmcia_do_loop_tuple(tuple_t *tuple, cisparse_t *parse, void *priv)
|
||||
{
|
||||
struct pcmcia_loop_mem *loop = priv;
|
||||
|
||||
return loop->loop_tuple(loop->p_dev, tuple, loop->priv_data);
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_loop_tuple() - loop over tuples in the CIS
|
||||
* @p_dev: the struct pcmcia_device which we need to loop for.
|
||||
* @code: which CIS code shall we look for?
|
||||
* @priv_data: private data to be passed to the loop_tuple function.
|
||||
* @loop_tuple: function to call for each CIS entry of type @function. IT
|
||||
* gets passed the raw tuple and @priv_data.
|
||||
*
|
||||
* pcmcia_loop_tuple() loops over all CIS entries of type @function, and
|
||||
* calls the @loop_tuple function for each entry. If the call to @loop_tuple
|
||||
* returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
|
||||
*/
|
||||
int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
|
||||
int (*loop_tuple) (struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data),
|
||||
void *priv_data)
|
||||
{
|
||||
struct pcmcia_loop_mem loop = {
|
||||
.p_dev = p_dev,
|
||||
.loop_tuple = loop_tuple,
|
||||
.priv_data = priv_data};
|
||||
|
||||
return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
|
||||
&loop, pcmcia_do_loop_tuple);
|
||||
};
|
||||
EXPORT_SYMBOL(pcmcia_loop_tuple);
|
||||
|
||||
|
||||
struct pcmcia_loop_get {
|
||||
size_t len;
|
||||
cisdata_t **buf;
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_do_get_tuple() - internal helper for pcmcia_get_tuple()
|
||||
*
|
||||
* pcmcia_do_get_tuple() is the internal callback for the call from
|
||||
* pcmcia_get_tuple() to pcmcia_loop_tuple(). As we're only interested in
|
||||
* the first tuple, return 0 unconditionally. Create a memory buffer large
|
||||
* enough to hold the content of the tuple, and fill it with the tuple data.
|
||||
* The caller is responsible to free the buffer.
|
||||
*/
|
||||
static int pcmcia_do_get_tuple(struct pcmcia_device *p_dev, tuple_t *tuple,
|
||||
void *priv)
|
||||
{
|
||||
struct pcmcia_loop_get *get = priv;
|
||||
|
||||
*get->buf = kzalloc(tuple->TupleDataLen, GFP_KERNEL);
|
||||
if (*get->buf) {
|
||||
get->len = tuple->TupleDataLen;
|
||||
memcpy(*get->buf, tuple->TupleData, tuple->TupleDataLen);
|
||||
} else
|
||||
dev_dbg(&p_dev->dev, "do_get_tuple: out of memory\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_get_tuple() - get first tuple from CIS
|
||||
* @p_dev: the struct pcmcia_device which we need to loop for.
|
||||
* @code: which CIS code shall we look for?
|
||||
* @buf: pointer to store the buffer to.
|
||||
*
|
||||
* pcmcia_get_tuple() gets the content of the first CIS entry of type @code.
|
||||
* It returns the buffer length (or zero). The caller is responsible to free
|
||||
* the buffer passed in @buf.
|
||||
*/
|
||||
size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
|
||||
unsigned char **buf)
|
||||
{
|
||||
struct pcmcia_loop_get get = {
|
||||
.len = 0,
|
||||
.buf = buf,
|
||||
};
|
||||
|
||||
*get.buf = NULL;
|
||||
pcmcia_loop_tuple(p_dev, code, pcmcia_do_get_tuple, &get);
|
||||
|
||||
return get.len;
|
||||
};
|
||||
EXPORT_SYMBOL(pcmcia_get_tuple);
|
||||
|
||||
|
||||
/**
|
||||
* pcmcia_do_get_mac() - internal helper for pcmcia_get_mac_from_cis()
|
||||
*
|
||||
* pcmcia_do_get_mac() is the internal callback for the call from
|
||||
* pcmcia_get_mac_from_cis() to pcmcia_loop_tuple(). We check whether the
|
||||
* tuple contains a proper LAN_NODE_ID of length 6, and copy the data
|
||||
* to struct net_device->dev_addr[i].
|
||||
*/
|
||||
static int pcmcia_do_get_mac(struct pcmcia_device *p_dev, tuple_t *tuple,
|
||||
void *priv)
|
||||
{
|
||||
struct net_device *dev = priv;
|
||||
int i;
|
||||
|
||||
if (tuple->TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID)
|
||||
return -EINVAL;
|
||||
if (tuple->TupleDataLen < ETH_ALEN + 2) {
|
||||
dev_warn(&p_dev->dev, "Invalid CIS tuple length for "
|
||||
"LAN_NODE_ID\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tuple->TupleData[1] != ETH_ALEN) {
|
||||
dev_warn(&p_dev->dev, "Invalid header for LAN_NODE_ID\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
for (i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = tuple->TupleData[i+2];
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_get_mac_from_cis() - read out MAC address from CISTPL_FUNCE
|
||||
* @p_dev: the struct pcmcia_device for which we want the address.
|
||||
* @dev: a properly prepared struct net_device to store the info to.
|
||||
*
|
||||
* pcmcia_get_mac_from_cis() reads out the hardware MAC address from
|
||||
* CISTPL_FUNCE and stores it into struct net_device *dev->dev_addr which
|
||||
* must be set up properly by the driver (see examples!).
|
||||
*/
|
||||
int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, struct net_device *dev)
|
||||
{
|
||||
return pcmcia_loop_tuple(p_dev, CISTPL_FUNCE, pcmcia_do_get_mac, dev);
|
||||
};
|
||||
EXPORT_SYMBOL(pcmcia_get_mac_from_cis);
|
||||
|
||||
|
|
|
|||
|
|
@ -213,7 +213,8 @@ static irqreturn_t pd6729_interrupt(int irq, void *dev)
|
|||
|
||||
if (csc & I365_CSC_DETECT) {
|
||||
events |= SS_DETECT;
|
||||
dprintk("Card detected in socket %i!\n", i);
|
||||
dev_vdbg(&socket[i].socket.dev,
|
||||
"Card detected in socket %i!\n", i);
|
||||
}
|
||||
|
||||
if (indirect_read(&socket[i], I365_INTCTL)
|
||||
|
|
@ -331,11 +332,11 @@ static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
|
|||
reg = I365_PWR_NORESET; /* default: disable resetdrv on resume */
|
||||
|
||||
if (state->flags & SS_PWR_AUTO) {
|
||||
dprintk("Auto power\n");
|
||||
dev_dbg(&sock->dev, "Auto power\n");
|
||||
reg |= I365_PWR_AUTO; /* automatic power mngmnt */
|
||||
}
|
||||
if (state->flags & SS_OUTPUT_ENA) {
|
||||
dprintk("Power Enabled\n");
|
||||
dev_dbg(&sock->dev, "Power Enabled\n");
|
||||
reg |= I365_PWR_OUT; /* enable power */
|
||||
}
|
||||
|
||||
|
|
@ -343,40 +344,44 @@ static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
|
|||
case 0:
|
||||
break;
|
||||
case 33:
|
||||
dprintk("setting voltage to Vcc to 3.3V on socket %i\n",
|
||||
dev_dbg(&sock->dev,
|
||||
"setting voltage to Vcc to 3.3V on socket %i\n",
|
||||
socket->number);
|
||||
reg |= I365_VCC_5V;
|
||||
indirect_setbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
|
||||
break;
|
||||
case 50:
|
||||
dprintk("setting voltage to Vcc to 5V on socket %i\n",
|
||||
dev_dbg(&sock->dev,
|
||||
"setting voltage to Vcc to 5V on socket %i\n",
|
||||
socket->number);
|
||||
reg |= I365_VCC_5V;
|
||||
indirect_resetbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
|
||||
break;
|
||||
default:
|
||||
dprintk("pd6729: pd6729_set_socket called with "
|
||||
"invalid VCC power value: %i\n",
|
||||
state->Vcc);
|
||||
dev_dbg(&sock->dev,
|
||||
"pd6729_set_socket called with invalid VCC power "
|
||||
"value: %i\n", state->Vcc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (state->Vpp) {
|
||||
case 0:
|
||||
dprintk("not setting Vpp on socket %i\n", socket->number);
|
||||
dev_dbg(&sock->dev, "not setting Vpp on socket %i\n",
|
||||
socket->number);
|
||||
break;
|
||||
case 33:
|
||||
case 50:
|
||||
dprintk("setting Vpp to Vcc for socket %i\n", socket->number);
|
||||
dev_dbg(&sock->dev, "setting Vpp to Vcc for socket %i\n",
|
||||
socket->number);
|
||||
reg |= I365_VPP1_5V;
|
||||
break;
|
||||
case 120:
|
||||
dprintk("setting Vpp to 12.0\n");
|
||||
dev_dbg(&sock->dev, "setting Vpp to 12.0\n");
|
||||
reg |= I365_VPP1_12V;
|
||||
break;
|
||||
default:
|
||||
dprintk("pd6729: pd6729_set_socket called with invalid VPP power value: %i\n",
|
||||
state->Vpp);
|
||||
dev_dbg(&sock->dev, "pd6729: pd6729_set_socket called with "
|
||||
"invalid VPP power value: %i\n", state->Vpp);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -438,7 +443,7 @@ static int pd6729_set_io_map(struct pcmcia_socket *sock,
|
|||
|
||||
/* Check error conditions */
|
||||
if (map > 1) {
|
||||
dprintk("pd6729_set_io_map with invalid map");
|
||||
dev_dbg(&sock->dev, "pd6729_set_io_map with invalid map\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -446,7 +451,7 @@ static int pd6729_set_io_map(struct pcmcia_socket *sock,
|
|||
if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map))
|
||||
indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map));
|
||||
|
||||
/* dprintk("set_io_map: Setting range to %x - %x\n",
|
||||
/* dev_dbg(&sock->dev, "set_io_map: Setting range to %x - %x\n",
|
||||
io->start, io->stop);*/
|
||||
|
||||
/* write the new values */
|
||||
|
|
@ -478,12 +483,12 @@ static int pd6729_set_mem_map(struct pcmcia_socket *sock,
|
|||
|
||||
map = mem->map;
|
||||
if (map > 4) {
|
||||
printk("pd6729_set_mem_map: invalid map");
|
||||
dev_warn(&sock->dev, "invalid map requested\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((mem->res->start > mem->res->end) || (mem->speed > 1000)) {
|
||||
printk("pd6729_set_mem_map: invalid address / speed");
|
||||
dev_warn(&sock->dev, "invalid invalid address / speed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -529,12 +534,12 @@ static int pd6729_set_mem_map(struct pcmcia_socket *sock,
|
|||
if (mem->flags & MAP_WRPROT)
|
||||
i |= I365_MEM_WRPROT;
|
||||
if (mem->flags & MAP_ATTRIB) {
|
||||
/* dprintk("requesting attribute memory for socket %i\n",
|
||||
socket->number);*/
|
||||
/* dev_dbg(&sock->dev, "requesting attribute memory for "
|
||||
"socket %i\n", socket->number);*/
|
||||
i |= I365_MEM_REG;
|
||||
} else {
|
||||
/* dprintk("requesting normal memory for socket %i\n",
|
||||
socket->number);*/
|
||||
/* dev_dbg(&sock->dev, "requesting normal memory for "
|
||||
"socket %i\n", socket->number);*/
|
||||
}
|
||||
indirect_write16(socket, base + I365_W_OFF, i);
|
||||
|
||||
|
|
@ -577,7 +582,7 @@ static struct pccard_operations pd6729_operations = {
|
|||
|
||||
static irqreturn_t pd6729_test(int irq, void *dev)
|
||||
{
|
||||
dprintk("-> hit on irq %d\n", irq);
|
||||
pr_devel("-> hit on irq %d\n", irq);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
@ -642,13 +647,13 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
|
|||
goto err_out_free_mem;
|
||||
|
||||
if (!pci_resource_start(dev, 0)) {
|
||||
printk(KERN_INFO "pd6729: refusing to load the driver "
|
||||
"as the io_base is 0.\n");
|
||||
dev_warn(&dev->dev, "refusing to load the driver as the "
|
||||
"io_base is NULL.\n");
|
||||
goto err_out_free_mem;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge "
|
||||
"at 0x%llx on irq %d\n",
|
||||
dev_info(&dev->dev, "Cirrus PD6729 PCI to PCMCIA Bridge at 0x%llx "
|
||||
"on irq %d\n",
|
||||
(unsigned long long)pci_resource_start(dev, 0), dev->irq);
|
||||
/*
|
||||
* Since we have no memory BARs some firmware may not
|
||||
|
|
@ -656,14 +661,14 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
|
|||
*/
|
||||
pci_read_config_byte(dev, PCI_COMMAND, &configbyte);
|
||||
if (!(configbyte & PCI_COMMAND_MEMORY)) {
|
||||
printk(KERN_DEBUG "pd6729: Enabling PCI_COMMAND_MEMORY.\n");
|
||||
dev_dbg(&dev->dev, "pd6729: Enabling PCI_COMMAND_MEMORY.\n");
|
||||
configbyte |= PCI_COMMAND_MEMORY;
|
||||
pci_write_config_byte(dev, PCI_COMMAND, configbyte);
|
||||
}
|
||||
|
||||
ret = pci_request_regions(dev, "pd6729");
|
||||
if (ret) {
|
||||
printk(KERN_INFO "pd6729: pci request region failed.\n");
|
||||
dev_warn(&dev->dev, "pci request region failed.\n");
|
||||
goto err_out_disable;
|
||||
}
|
||||
|
||||
|
|
@ -672,7 +677,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
|
|||
|
||||
mask = pd6729_isa_scan();
|
||||
if (irq_mode == 0 && mask == 0) {
|
||||
printk(KERN_INFO "pd6729: no ISA interrupt is available.\n");
|
||||
dev_warn(&dev->dev, "no ISA interrupt is available.\n");
|
||||
goto err_out_free_res;
|
||||
}
|
||||
|
||||
|
|
@ -697,8 +702,8 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
|
|||
/* Register the interrupt handler */
|
||||
if ((ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED,
|
||||
"pd6729", socket))) {
|
||||
printk(KERN_ERR "pd6729: Failed to register irq %d, "
|
||||
"aborting\n", dev->irq);
|
||||
dev_err(&dev->dev, "Failed to register irq %d\n",
|
||||
dev->irq);
|
||||
goto err_out_free_res;
|
||||
}
|
||||
} else {
|
||||
|
|
@ -713,8 +718,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev,
|
|||
for (i = 0; i < MAX_SOCKETS; i++) {
|
||||
ret = pcmcia_register_socket(&socket[i].socket);
|
||||
if (ret) {
|
||||
printk(KERN_INFO "pd6729: pcmcia_register_socket "
|
||||
"failed.\n");
|
||||
dev_warn(&dev->dev, "pcmcia_register_socket failed.\n");
|
||||
for (j = 0; j < i ; j++)
|
||||
pcmcia_unregister_socket(&socket[j].socket);
|
||||
goto err_out_free_res2;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,6 @@
|
|||
#ifndef _INCLUDE_GUARD_PD6729_H_
|
||||
#define _INCLUDE_GUARD_PD6729_H_
|
||||
|
||||
/* Debuging defines */
|
||||
#ifdef NOTRACE
|
||||
#define dprintk(fmt, args...) printk(fmt , ## args)
|
||||
#else
|
||||
#define dprintk(fmt, args...) do {} while (0)
|
||||
#endif
|
||||
|
||||
/* Flags for I365_GENCTL */
|
||||
#define I365_DF_VS1 0x40 /* DF-step Voltage Sense */
|
||||
#define I365_DF_VS2 0x80
|
||||
|
|
|
|||
|
|
@ -228,9 +228,43 @@ static const char *skt_names[] = {
|
|||
#define SKT_DEV_INFO_SIZE(n) \
|
||||
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
||||
|
||||
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||
skt->res_skt.name = skt_names[skt->nr];
|
||||
skt->res_skt.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||
skt->res_io.name = "io";
|
||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
|
||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||
skt->res_mem.name = "memory";
|
||||
skt->res_mem.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||
skt->res_attr.name = "attribute";
|
||||
skt->res_attr.flags = IORESOURCE_MEM;
|
||||
|
||||
return soc_pcmcia_add_one(skt);
|
||||
}
|
||||
|
||||
void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops)
|
||||
{
|
||||
/* Provide our PXA2xx specific timing routines. */
|
||||
ops->set_timing = pxa2xx_pcmcia_set_timing;
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
ops->frequency_change = pxa2xx_pcmcia_frequency_change;
|
||||
#endif
|
||||
}
|
||||
|
||||
int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
||||
{
|
||||
int i, ret;
|
||||
int i, ret = 0;
|
||||
struct pcmcia_low_level *ops;
|
||||
struct skt_dev_info *sinfo;
|
||||
struct soc_pcmcia_socket *skt;
|
||||
|
|
@ -240,6 +274,8 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
|||
|
||||
ops = (struct pcmcia_low_level *)dev->platform_data;
|
||||
|
||||
pxa2xx_drv_pcmcia_ops(ops);
|
||||
|
||||
sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL);
|
||||
if (!sinfo)
|
||||
return -ENOMEM;
|
||||
|
|
@ -250,40 +286,25 @@ int __pxa2xx_drv_pcmcia_probe(struct device *dev)
|
|||
for (i = 0; i < ops->nr; i++) {
|
||||
skt = &sinfo->skt[i];
|
||||
|
||||
skt->nr = ops->first + i;
|
||||
skt->irq = NO_IRQ;
|
||||
skt->nr = ops->first + i;
|
||||
skt->ops = ops;
|
||||
skt->socket.owner = ops->owner;
|
||||
skt->socket.dev.parent = dev;
|
||||
skt->socket.pci_irq = NO_IRQ;
|
||||
|
||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||
skt->res_skt.name = skt_names[skt->nr];
|
||||
skt->res_skt.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||
skt->res_io.name = "io";
|
||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
|
||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||
skt->res_mem.name = "memory";
|
||||
skt->res_mem.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||
skt->res_attr.name = "attribute";
|
||||
skt->res_attr.flags = IORESOURCE_MEM;
|
||||
ret = pxa2xx_drv_pcmcia_add_one(skt);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Provide our PXA2xx specific timing routines. */
|
||||
ops->set_timing = pxa2xx_pcmcia_set_timing;
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
ops->frequency_change = pxa2xx_pcmcia_frequency_change;
|
||||
#endif
|
||||
|
||||
ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo);
|
||||
|
||||
if (!ret)
|
||||
if (ret) {
|
||||
while (--i >= 0)
|
||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||
kfree(sinfo);
|
||||
} else {
|
||||
pxa2xx_configure_sockets(dev);
|
||||
dev_set_drvdata(dev, sinfo);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -297,7 +318,16 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
|
|||
|
||||
static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
|
||||
{
|
||||
return soc_common_drv_pcmcia_remove(&dev->dev);
|
||||
struct skt_dev_info *sinfo = platform_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
platform_set_drvdata(dev, NULL);
|
||||
|
||||
for (i = 0; i < sinfo->nskt; i++)
|
||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||
|
||||
kfree(sinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa2xx_drv_pcmcia_suspend(struct device *dev)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
/* temporary measure */
|
||||
extern int __pxa2xx_drv_pcmcia_probe(struct device *);
|
||||
|
||||
int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||
void pxa2xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
return ret;
|
||||
gpio_direction_output(GPIO_PCMCIA_RESET, 0);
|
||||
|
||||
skt->irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
|
||||
skt->socket.pci_irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
|
||||
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
if (!ret)
|
||||
gpio_free(GPIO_PCMCIA_RESET);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
return ret;
|
||||
gpio_direction_output(GPIO_PCMCIA_RESET, 0);
|
||||
|
||||
skt->irq = PCMCIA_S0_RDYINT;
|
||||
skt->socket.pci_irq = PCMCIA_S0_RDYINT;
|
||||
ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
if (!ret)
|
||||
gpio_free(GPIO_PCMCIA_RESET);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ static struct pcmcia_irqs cd_irqs[] = {
|
|||
|
||||
static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
skt->irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) :
|
||||
skt->socket.pci_irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) :
|
||||
IRQ_GPIO(GPIO_E740_PCMCIA_RDY1);
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1);
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ static int
|
|||
lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
|
||||
const socket_state_t *state)
|
||||
{
|
||||
struct sa1111_pcmcia_socket *s = to_skt(skt);
|
||||
unsigned int pa_dwr_mask, pa_dwr_set, misc_mask, misc_set;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -149,7 +150,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
|
|||
|
||||
if (ret == 0) {
|
||||
lubbock_set_misc_wr(misc_mask, misc_set);
|
||||
sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
|
||||
sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
|
||||
}
|
||||
|
||||
#if 1
|
||||
|
|
@ -175,7 +176,7 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
|
|||
* Switch to 5V, Configure socket with 5V voltage
|
||||
*/
|
||||
lubbock_set_misc_wr(misc_mask, 0);
|
||||
sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, 0);
|
||||
sa1111_set_io(s->dev, pa_dwr_mask, 0);
|
||||
|
||||
/*
|
||||
* It takes about 100ms to turn off Vcc.
|
||||
|
|
@ -200,12 +201,8 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
|
|||
|
||||
static struct pcmcia_low_level lubbock_pcmcia_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.hw_init = sa1111_pcmcia_hw_init,
|
||||
.hw_shutdown = sa1111_pcmcia_hw_shutdown,
|
||||
.socket_state = sa1111_pcmcia_socket_state,
|
||||
.configure_socket = lubbock_pcmcia_configure_socket,
|
||||
.socket_init = sa1111_pcmcia_socket_init,
|
||||
.socket_suspend = sa1111_pcmcia_socket_suspend,
|
||||
.first = 0,
|
||||
.nr = 2,
|
||||
};
|
||||
|
|
@ -228,8 +225,9 @@ int pcmcia_lubbock_init(struct sa1111_dev *sadev)
|
|||
/* Set CF Socket 1 power to standby mode. */
|
||||
lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
|
||||
|
||||
sadev->dev.platform_data = &lubbock_pcmcia_ops;
|
||||
ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev);
|
||||
pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
|
||||
ret = sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
|
||||
pxa2xx_drv_pcmcia_add_one);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ static int mst_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
* before we enable them as outputs.
|
||||
*/
|
||||
|
||||
skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
|
||||
skt->socket.pci_irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
if (ret)
|
||||
goto err4;
|
||||
|
||||
skt->irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);
|
||||
skt->socket.pci_irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY);
|
||||
return 0;
|
||||
|
||||
err4:
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
if (ret)
|
||||
goto err5;
|
||||
|
||||
skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
|
||||
skt->socket.pci_irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
|
||||
return 0;
|
||||
|
||||
err5:
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
}
|
||||
}
|
||||
|
||||
skt->irq = SCOOP_DEV[skt->nr].irq;
|
||||
skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
gpio_free(GPIO_PRDY);
|
||||
return -EINVAL;
|
||||
}
|
||||
skt->irq = IRQ_GPIO(GPIO_PRDY);
|
||||
skt->socket.pci_irq = IRQ_GPIO(GPIO_PRDY);
|
||||
break;
|
||||
|
||||
#ifndef CONFIG_MACH_TRIZEPS_CONXS
|
||||
|
|
@ -63,7 +63,7 @@ static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
break;
|
||||
}
|
||||
/* release the reset of this card */
|
||||
pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->irq);
|
||||
pr_debug("%s: sock %d irq %d\n", __func__, skt->nr, skt->socket.pci_irq);
|
||||
|
||||
/* supplementory irqs for the socket */
|
||||
for (i = 0; i < ARRAY_SIZE(irqs); i++) {
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
skt->irq = gpio_to_irq(VIPER_CF_RDY_GPIO);
|
||||
skt->socket.pci_irq = gpio_to_irq(VIPER_CF_RDY_GPIO);
|
||||
|
||||
if (gpio_request(VIPER_CF_CD_GPIO, "CF detect"))
|
||||
goto err_request_cd;
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include "cs_internal.h"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ static struct pcmcia_irqs irqs[] = {
|
|||
|
||||
static int assabet_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
skt->irq = ASSABET_IRQ_GPIO_CF_IRQ;
|
||||
skt->socket.pci_irq = ASSABET_IRQ_GPIO_CF_IRQ;
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,13 +127,10 @@ badge4_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state
|
|||
|
||||
static struct pcmcia_low_level badge4_pcmcia_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.hw_init = sa1111_pcmcia_hw_init,
|
||||
.hw_shutdown = sa1111_pcmcia_hw_shutdown,
|
||||
.socket_state = sa1111_pcmcia_socket_state,
|
||||
.configure_socket = badge4_pcmcia_configure_socket,
|
||||
|
||||
.socket_init = sa1111_pcmcia_socket_init,
|
||||
.socket_suspend = sa1111_pcmcia_socket_suspend,
|
||||
.first = 0,
|
||||
.nr = 2,
|
||||
};
|
||||
|
||||
int pcmcia_badge4_init(struct device *dev)
|
||||
|
|
@ -146,7 +143,9 @@ int pcmcia_badge4_init(struct device *dev)
|
|||
__func__,
|
||||
badge4_pcmvcc, badge4_pcmvpp, badge4_cfvcc);
|
||||
|
||||
ret = sa11xx_drv_pcmcia_probe(dev, &badge4_pcmcia_ops, 0, 2);
|
||||
sa11xx_drv_pcmcia_ops(&badge4_pcmcia_ops);
|
||||
ret = sa1111_pcmcia_add(dev, &badge4_pcmcia_ops,
|
||||
sa11xx_drv_pcmcia_add_one);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ static struct pcmcia_irqs irqs[] = {
|
|||
|
||||
static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
skt->irq = CERF_IRQ_GPIO_CF_IRQ;
|
||||
skt->socket.pci_irq = CERF_IRQ_GPIO_CF_IRQ;
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,16 @@ static int sa11x0_drv_pcmcia_probe(struct platform_device *dev)
|
|||
|
||||
static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
|
||||
{
|
||||
return soc_common_drv_pcmcia_remove(&dev->dev);
|
||||
struct skt_dev_info *sinfo = platform_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
platform_set_drvdata(dev, NULL);
|
||||
|
||||
for (i = 0; i < sinfo->nskt; i++)
|
||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||
|
||||
kfree(sinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sa11x0_drv_pcmcia_suspend(struct platform_device *dev,
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ static struct pcmcia_irqs irqs[] = {
|
|||
|
||||
static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
skt->irq = skt->nr ? IRQ_GPIO_H3600_PCMCIA_IRQ1
|
||||
: IRQ_GPIO_H3600_PCMCIA_IRQ0;
|
||||
skt->socket.pci_irq = skt->nr ? IRQ_GPIO_H3600_PCMCIA_IRQ1
|
||||
: IRQ_GPIO_H3600_PCMCIA_IRQ0;
|
||||
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
|
|
|
|||
|
|
@ -22,25 +22,10 @@
|
|||
#define SOCKET1_POWER (GPIO_GPIO1 | GPIO_GPIO3)
|
||||
#define SOCKET1_3V GPIO_GPIO3
|
||||
|
||||
static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
|
||||
|
||||
/*
|
||||
* What is all this crap for?
|
||||
*/
|
||||
GRER |= 0x00000002;
|
||||
/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
|
||||
sa1111_set_io_dir(SA1111_DEV(skt->dev), pin, 0, 0);
|
||||
sa1111_set_io(SA1111_DEV(skt->dev), pin, 0);
|
||||
sa1111_set_sleep_io(SA1111_DEV(skt->dev), pin, 0);
|
||||
|
||||
return sa1111_pcmcia_hw_init(skt);
|
||||
}
|
||||
|
||||
static int
|
||||
jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
|
||||
{
|
||||
struct sa1111_pcmcia_socket *s = to_skt(skt);
|
||||
unsigned int pa_dwr_mask, pa_dwr_set;
|
||||
int ret;
|
||||
|
||||
|
|
@ -97,7 +82,7 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
|
|||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
|
||||
sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
|
@ -106,21 +91,30 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
|
|||
|
||||
static struct pcmcia_low_level jornada720_pcmcia_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.hw_init = jornada720_pcmcia_hw_init,
|
||||
.hw_shutdown = sa1111_pcmcia_hw_shutdown,
|
||||
.socket_state = sa1111_pcmcia_socket_state,
|
||||
.configure_socket = jornada720_pcmcia_configure_socket,
|
||||
|
||||
.socket_init = sa1111_pcmcia_socket_init,
|
||||
.socket_suspend = sa1111_pcmcia_socket_suspend,
|
||||
.first = 0,
|
||||
.nr = 2,
|
||||
};
|
||||
|
||||
int __devinit pcmcia_jornada720_init(struct device *dev)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (machine_is_jornada720())
|
||||
ret = sa11xx_drv_pcmcia_probe(dev, &jornada720_pcmcia_ops, 0, 2);
|
||||
if (machine_is_jornada720()) {
|
||||
unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3;
|
||||
|
||||
GRER |= 0x00000002;
|
||||
|
||||
/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
|
||||
sa1111_set_io_dir(dev, pin, 0, 0);
|
||||
sa1111_set_io(dev, pin, 0);
|
||||
sa1111_set_sleep_io(dev, pin, 0);
|
||||
|
||||
sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops);
|
||||
ret = sa1111_pcmcia_add(dev, &jornada720_pcmcia_ops,
|
||||
sa11xx_drv_pcmcia_add_one);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
static int
|
||||
neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
|
||||
{
|
||||
struct sa1111_pcmcia_socket *s = to_skt(skt);
|
||||
unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set;
|
||||
int ret;
|
||||
|
||||
|
|
@ -99,7 +100,7 @@ neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_sta
|
|||
NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set;
|
||||
|
||||
local_irq_restore(flags);
|
||||
sa1111_set_io(SA1111_DEV(skt->dev), pa_dwr_mask, pa_dwr_set);
|
||||
sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -115,12 +116,10 @@ static void neponset_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
|
|||
|
||||
static struct pcmcia_low_level neponset_pcmcia_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.hw_init = sa1111_pcmcia_hw_init,
|
||||
.hw_shutdown = sa1111_pcmcia_hw_shutdown,
|
||||
.socket_state = sa1111_pcmcia_socket_state,
|
||||
.configure_socket = neponset_pcmcia_configure_socket,
|
||||
.socket_init = neponset_pcmcia_socket_init,
|
||||
.socket_suspend = sa1111_pcmcia_socket_suspend,
|
||||
.first = 0,
|
||||
.nr = 2,
|
||||
};
|
||||
|
||||
int pcmcia_neponset_init(struct sa1111_dev *sadev)
|
||||
|
|
@ -135,7 +134,9 @@ int pcmcia_neponset_init(struct sa1111_dev *sadev)
|
|||
sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0);
|
||||
sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
|
||||
sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
|
||||
ret = sa11xx_drv_pcmcia_probe(&sadev->dev, &neponset_pcmcia_ops, 0, 2);
|
||||
sa11xx_drv_pcmcia_ops(&neponset_pcmcia_ops);
|
||||
ret = sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
|
||||
sa11xx_drv_pcmcia_add_one);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ static int shannon_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
GAFR &= ~(SHANNON_GPIO_EJECT_0 | SHANNON_GPIO_EJECT_1 |
|
||||
SHANNON_GPIO_RDY_0 | SHANNON_GPIO_RDY_1);
|
||||
|
||||
skt->irq = skt->nr ? SHANNON_IRQ_GPIO_RDY_1 : SHANNON_IRQ_GPIO_RDY_0;
|
||||
skt->socket.pci_irq = skt->nr ? SHANNON_IRQ_GPIO_RDY_1 : SHANNON_IRQ_GPIO_RDY_0;
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ static int simpad_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
|||
|
||||
clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1);
|
||||
|
||||
skt->irq = IRQ_GPIO_CF_IRQ;
|
||||
skt->socket.pci_irq = IRQ_GPIO_CF_IRQ;
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,23 +28,20 @@ static struct pcmcia_irqs irqs[] = {
|
|||
{ 1, IRQ_S1_BVD1_STSCHG, "SA1111 CF BVD1" },
|
||||
};
|
||||
|
||||
int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
static int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
if (skt->irq == NO_IRQ)
|
||||
skt->irq = skt->nr ? IRQ_S1_READY_NINT : IRQ_S0_READY_NINT;
|
||||
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||
static void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
|
||||
{
|
||||
struct sa1111_dev *sadev = SA1111_DEV(skt->dev);
|
||||
unsigned long status = sa1111_readl(sadev->mapbase + SA1111_PCSR);
|
||||
struct sa1111_pcmcia_socket *s = to_skt(skt);
|
||||
unsigned long status = sa1111_readl(s->dev->mapbase + SA1111_PCSR);
|
||||
|
||||
switch (skt->nr) {
|
||||
case 0:
|
||||
|
|
@ -71,7 +68,7 @@ void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_sta
|
|||
|
||||
int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
|
||||
{
|
||||
struct sa1111_dev *sadev = SA1111_DEV(skt->dev);
|
||||
struct sa1111_pcmcia_socket *s = to_skt(skt);
|
||||
unsigned int pccr_skt_mask, pccr_set_mask, val;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -100,10 +97,10 @@ int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
|
|||
pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT;
|
||||
|
||||
local_irq_save(flags);
|
||||
val = sa1111_readl(sadev->mapbase + SA1111_PCCR);
|
||||
val = sa1111_readl(s->dev->mapbase + SA1111_PCCR);
|
||||
val &= ~pccr_skt_mask;
|
||||
val |= pccr_set_mask & pccr_skt_mask;
|
||||
sa1111_writel(val, sadev->mapbase + SA1111_PCCR);
|
||||
sa1111_writel(val, s->dev->mapbase + SA1111_PCCR);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
|
|
@ -114,15 +111,51 @@ void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
|
|||
soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
|
||||
static void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
|
||||
int (*add)(struct soc_pcmcia_socket *))
|
||||
{
|
||||
struct sa1111_pcmcia_socket *s;
|
||||
int i, ret = 0;
|
||||
|
||||
ops->hw_init = sa1111_pcmcia_hw_init;
|
||||
ops->hw_shutdown = sa1111_pcmcia_hw_shutdown;
|
||||
ops->socket_state = sa1111_pcmcia_socket_state;
|
||||
ops->socket_suspend = sa1111_pcmcia_socket_suspend;
|
||||
|
||||
for (i = 0; i < ops->nr; i++) {
|
||||
s = kzalloc(sizeof(*s), GFP_KERNEL);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
s->soc.nr = ops->first + i;
|
||||
s->soc.ops = ops;
|
||||
s->soc.socket.owner = ops->owner;
|
||||
s->soc.socket.dev.parent = &dev->dev;
|
||||
s->soc.socket.pci_irq = s->soc.nr ? IRQ_S1_READY_NINT : IRQ_S0_READY_NINT;
|
||||
s->dev = dev;
|
||||
|
||||
ret = add(&s->soc);
|
||||
if (ret == 0) {
|
||||
s->next = dev_get_drvdata(&dev->dev);
|
||||
dev_set_drvdata(&dev->dev, s);
|
||||
} else
|
||||
kfree(s);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pcmcia_probe(struct sa1111_dev *dev)
|
||||
{
|
||||
void __iomem *base;
|
||||
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
|
||||
if (!request_mem_region(dev->res.start, 512,
|
||||
SA1111_DRIVER_NAME(dev)))
|
||||
return -EBUSY;
|
||||
|
|
@ -152,7 +185,15 @@ static int pcmcia_probe(struct sa1111_dev *dev)
|
|||
|
||||
static int __devexit pcmcia_remove(struct sa1111_dev *dev)
|
||||
{
|
||||
soc_common_drv_pcmcia_remove(&dev->dev);
|
||||
struct sa1111_pcmcia_socket *next, *s = dev_get_drvdata(&dev->dev);
|
||||
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
|
||||
for (; next = s->next, s; s = next) {
|
||||
soc_pcmcia_remove_one(&s->soc);
|
||||
kfree(s);
|
||||
}
|
||||
|
||||
release_mem_region(dev->res.start, 512);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,23 @@
|
|||
#include "soc_common.h"
|
||||
#include "sa11xx_base.h"
|
||||
|
||||
extern int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *);
|
||||
extern void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *);
|
||||
struct sa1111_pcmcia_socket {
|
||||
struct soc_pcmcia_socket soc;
|
||||
struct sa1111_dev *dev;
|
||||
struct sa1111_pcmcia_socket *next;
|
||||
};
|
||||
|
||||
static inline struct sa1111_pcmcia_socket *to_skt(struct soc_pcmcia_socket *s)
|
||||
{
|
||||
return container_of(s, struct sa1111_pcmcia_socket, soc);
|
||||
}
|
||||
|
||||
int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
|
||||
int (*add)(struct soc_pcmcia_socket *));
|
||||
|
||||
extern void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *, struct pcmcia_state *);
|
||||
extern int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *, const socket_state_t *);
|
||||
extern void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *);
|
||||
extern void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *);
|
||||
|
||||
extern int pcmcia_badge4_init(struct device *);
|
||||
extern int pcmcia_jornada720_init(struct device *);
|
||||
|
|
|
|||
|
|
@ -171,47 +171,34 @@ static const char *skt_names[] = {
|
|||
#define SKT_DEV_INFO_SIZE(n) \
|
||||
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
|
||||
|
||||
int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||
int first, int nr)
|
||||
int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
struct skt_dev_info *sinfo;
|
||||
struct soc_pcmcia_socket *skt;
|
||||
int i;
|
||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||
skt->res_skt.name = skt_names[skt->nr];
|
||||
skt->res_skt.flags = IORESOURCE_MEM;
|
||||
|
||||
sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
|
||||
if (!sinfo)
|
||||
return -ENOMEM;
|
||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||
skt->res_io.name = "io";
|
||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
|
||||
sinfo->nskt = nr;
|
||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||
skt->res_mem.name = "memory";
|
||||
skt->res_mem.flags = IORESOURCE_MEM;
|
||||
|
||||
/* Initiliaze processor specific parameters */
|
||||
for (i = 0; i < nr; i++) {
|
||||
skt = &sinfo->skt[i];
|
||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||
skt->res_attr.name = "attribute";
|
||||
skt->res_attr.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->nr = first + i;
|
||||
skt->irq = NO_IRQ;
|
||||
|
||||
skt->res_skt.start = _PCMCIA(skt->nr);
|
||||
skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1;
|
||||
skt->res_skt.name = skt_names[skt->nr];
|
||||
skt->res_skt.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_io.start = _PCMCIAIO(skt->nr);
|
||||
skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1;
|
||||
skt->res_io.name = "io";
|
||||
skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
|
||||
skt->res_mem.start = _PCMCIAMem(skt->nr);
|
||||
skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1;
|
||||
skt->res_mem.name = "memory";
|
||||
skt->res_mem.flags = IORESOURCE_MEM;
|
||||
|
||||
skt->res_attr.start = _PCMCIAAttr(skt->nr);
|
||||
skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1;
|
||||
skt->res_attr.name = "attribute";
|
||||
skt->res_attr.flags = IORESOURCE_MEM;
|
||||
}
|
||||
return soc_pcmcia_add_one(skt);
|
||||
}
|
||||
EXPORT_SYMBOL(sa11xx_drv_pcmcia_add_one);
|
||||
|
||||
void sa11xx_drv_pcmcia_ops(struct pcmcia_low_level *ops)
|
||||
{
|
||||
/*
|
||||
* set default MECR calculation if the board specific
|
||||
* code did not specify one...
|
||||
|
|
@ -225,8 +212,48 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
|||
#ifdef CONFIG_CPU_FREQ
|
||||
ops->frequency_change = sa1100_pcmcia_frequency_change;
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(sa11xx_drv_pcmcia_ops);
|
||||
|
||||
return soc_common_drv_pcmcia_probe(dev, ops, sinfo);
|
||||
int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||
int first, int nr)
|
||||
{
|
||||
struct skt_dev_info *sinfo;
|
||||
struct soc_pcmcia_socket *skt;
|
||||
int i, ret = 0;
|
||||
|
||||
sa11xx_drv_pcmcia_ops(ops);
|
||||
|
||||
sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL);
|
||||
if (!sinfo)
|
||||
return -ENOMEM;
|
||||
|
||||
sinfo->nskt = nr;
|
||||
|
||||
/* Initiliaze processor specific parameters */
|
||||
for (i = 0; i < nr; i++) {
|
||||
skt = &sinfo->skt[i];
|
||||
|
||||
skt->nr = first + i;
|
||||
skt->ops = ops;
|
||||
skt->socket.owner = ops->owner;
|
||||
skt->socket.dev.parent = dev;
|
||||
skt->socket.pci_irq = NO_IRQ;
|
||||
|
||||
ret = sa11xx_drv_pcmcia_add_one(skt);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
while (--i >= 0)
|
||||
soc_pcmcia_remove_one(&sinfo->skt[i]);
|
||||
kfree(sinfo);
|
||||
} else {
|
||||
dev_set_drvdata(dev, sinfo);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe);
|
||||
|
||||
|
|
|
|||
|
|
@ -118,6 +118,8 @@ static inline unsigned int sa1100_pcmcia_cmd_time(unsigned int cpu_clock_khz,
|
|||
}
|
||||
|
||||
|
||||
int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||
void sa11xx_drv_pcmcia_ops(struct pcmcia_low_level *ops);
|
||||
extern int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr);
|
||||
|
||||
#endif /* !defined(_PCMCIA_SA1100_H) */
|
||||
|
|
|
|||
|
|
@ -144,10 +144,10 @@ soc_common_pcmcia_config_skt(struct soc_pcmcia_socket *skt, socket_state_t *stat
|
|||
*/
|
||||
if (skt->irq_state != 1 && state->io_irq) {
|
||||
skt->irq_state = 1;
|
||||
set_irq_type(skt->irq, IRQ_TYPE_EDGE_FALLING);
|
||||
set_irq_type(skt->socket.pci_irq, IRQ_TYPE_EDGE_FALLING);
|
||||
} else if (skt->irq_state == 1 && state->io_irq == 0) {
|
||||
skt->irq_state = 0;
|
||||
set_irq_type(skt->irq, IRQ_TYPE_NONE);
|
||||
set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE);
|
||||
}
|
||||
|
||||
skt->cs_state = *state;
|
||||
|
|
@ -492,7 +492,8 @@ static ssize_t show_status(struct device *dev, struct device_attribute *attr, ch
|
|||
|
||||
p+=sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
|
||||
p+=sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
|
||||
p+=sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq, skt->irq);
|
||||
p+=sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq,
|
||||
skt->socket.pci_irq);
|
||||
if (skt->ops->show_timing)
|
||||
p+=skt->ops->show_timing(skt, p);
|
||||
|
||||
|
|
@ -574,7 +575,7 @@ void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt,
|
|||
EXPORT_SYMBOL(soc_pcmcia_enable_irqs);
|
||||
|
||||
|
||||
LIST_HEAD(soc_pcmcia_sockets);
|
||||
static LIST_HEAD(soc_pcmcia_sockets);
|
||||
static DEFINE_MUTEX(soc_pcmcia_sockets_lock);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
|
|
@ -609,177 +610,137 @@ static int soc_pcmcia_cpufreq_register(void)
|
|||
"notifier for PCMCIA (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
fs_initcall(soc_pcmcia_cpufreq_register);
|
||||
|
||||
static void soc_pcmcia_cpufreq_unregister(void)
|
||||
{
|
||||
cpufreq_unregister_notifier(&soc_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
|
||||
}
|
||||
module_exit(soc_pcmcia_cpufreq_unregister);
|
||||
|
||||
#else
|
||||
static int soc_pcmcia_cpufreq_register(void) { return 0; }
|
||||
static void soc_pcmcia_cpufreq_unregister(void) {}
|
||||
#endif
|
||||
|
||||
int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
|
||||
struct skt_dev_info *sinfo)
|
||||
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
struct soc_pcmcia_socket *skt;
|
||||
int ret, i;
|
||||
mutex_lock(&soc_pcmcia_sockets_lock);
|
||||
del_timer_sync(&skt->poll_timer);
|
||||
|
||||
pcmcia_unregister_socket(&skt->socket);
|
||||
|
||||
flush_scheduled_work();
|
||||
|
||||
skt->ops->hw_shutdown(skt);
|
||||
|
||||
soc_common_pcmcia_config_skt(skt, &dead_socket);
|
||||
|
||||
list_del(&skt->node);
|
||||
mutex_unlock(&soc_pcmcia_sockets_lock);
|
||||
|
||||
iounmap(skt->virt_io);
|
||||
skt->virt_io = NULL;
|
||||
release_resource(&skt->res_attr);
|
||||
release_resource(&skt->res_mem);
|
||||
release_resource(&skt->res_io);
|
||||
release_resource(&skt->res_skt);
|
||||
}
|
||||
EXPORT_SYMBOL(soc_pcmcia_remove_one);
|
||||
|
||||
int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
int ret;
|
||||
|
||||
init_timer(&skt->poll_timer);
|
||||
skt->poll_timer.function = soc_common_pcmcia_poll_event;
|
||||
skt->poll_timer.data = (unsigned long)skt;
|
||||
skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
|
||||
|
||||
ret = request_resource(&iomem_resource, &skt->res_skt);
|
||||
if (ret)
|
||||
goto out_err_1;
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_io);
|
||||
if (ret)
|
||||
goto out_err_2;
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_mem);
|
||||
if (ret)
|
||||
goto out_err_3;
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_attr);
|
||||
if (ret)
|
||||
goto out_err_4;
|
||||
|
||||
skt->virt_io = ioremap(skt->res_io.start, 0x10000);
|
||||
if (skt->virt_io == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto out_err_5;
|
||||
}
|
||||
|
||||
mutex_lock(&soc_pcmcia_sockets_lock);
|
||||
|
||||
list_add(&skt->node, &soc_pcmcia_sockets);
|
||||
|
||||
/*
|
||||
* Initialise the per-socket structure.
|
||||
* We initialize default socket timing here, because
|
||||
* we are not guaranteed to see a SetIOMap operation at
|
||||
* runtime.
|
||||
*/
|
||||
for (i = 0; i < sinfo->nskt; i++) {
|
||||
skt = &sinfo->skt[i];
|
||||
skt->ops->set_timing(skt);
|
||||
|
||||
skt->socket.ops = &soc_common_pcmcia_operations;
|
||||
skt->socket.owner = ops->owner;
|
||||
skt->socket.dev.parent = dev;
|
||||
ret = skt->ops->hw_init(skt);
|
||||
if (ret)
|
||||
goto out_err_6;
|
||||
|
||||
init_timer(&skt->poll_timer);
|
||||
skt->poll_timer.function = soc_common_pcmcia_poll_event;
|
||||
skt->poll_timer.data = (unsigned long)skt;
|
||||
skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
|
||||
skt->socket.ops = &soc_common_pcmcia_operations;
|
||||
skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
|
||||
skt->socket.resource_ops = &pccard_static_ops;
|
||||
skt->socket.irq_mask = 0;
|
||||
skt->socket.map_size = PAGE_SIZE;
|
||||
skt->socket.io_offset = (unsigned long)skt->virt_io;
|
||||
|
||||
skt->dev = dev;
|
||||
skt->ops = ops;
|
||||
skt->status = soc_common_pcmcia_skt_state(skt);
|
||||
|
||||
ret = request_resource(&iomem_resource, &skt->res_skt);
|
||||
if (ret)
|
||||
goto out_err_1;
|
||||
ret = pcmcia_register_socket(&skt->socket);
|
||||
if (ret)
|
||||
goto out_err_7;
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_io);
|
||||
if (ret)
|
||||
goto out_err_2;
|
||||
add_timer(&skt->poll_timer);
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_mem);
|
||||
if (ret)
|
||||
goto out_err_3;
|
||||
mutex_unlock(&soc_pcmcia_sockets_lock);
|
||||
|
||||
ret = request_resource(&skt->res_skt, &skt->res_attr);
|
||||
if (ret)
|
||||
goto out_err_4;
|
||||
ret = device_create_file(&skt->socket.dev, &dev_attr_status);
|
||||
if (ret)
|
||||
goto out_err_8;
|
||||
|
||||
skt->virt_io = ioremap(skt->res_io.start, 0x10000);
|
||||
if (skt->virt_io == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto out_err_5;
|
||||
}
|
||||
return ret;
|
||||
|
||||
if (list_empty(&soc_pcmcia_sockets))
|
||||
soc_pcmcia_cpufreq_register();
|
||||
|
||||
list_add(&skt->node, &soc_pcmcia_sockets);
|
||||
|
||||
/*
|
||||
* We initialize default socket timing here, because
|
||||
* we are not guaranteed to see a SetIOMap operation at
|
||||
* runtime.
|
||||
*/
|
||||
ops->set_timing(skt);
|
||||
|
||||
ret = ops->hw_init(skt);
|
||||
if (ret)
|
||||
goto out_err_6;
|
||||
|
||||
skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD;
|
||||
skt->socket.resource_ops = &pccard_static_ops;
|
||||
skt->socket.irq_mask = 0;
|
||||
skt->socket.map_size = PAGE_SIZE;
|
||||
skt->socket.pci_irq = skt->irq;
|
||||
skt->socket.io_offset = (unsigned long)skt->virt_io;
|
||||
|
||||
skt->status = soc_common_pcmcia_skt_state(skt);
|
||||
|
||||
ret = pcmcia_register_socket(&skt->socket);
|
||||
if (ret)
|
||||
goto out_err_7;
|
||||
|
||||
WARN_ON(skt->socket.sock != i);
|
||||
|
||||
add_timer(&skt->poll_timer);
|
||||
|
||||
ret = device_create_file(&skt->socket.dev, &dev_attr_status);
|
||||
if (ret)
|
||||
goto out_err_8;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, sinfo);
|
||||
ret = 0;
|
||||
goto out;
|
||||
|
||||
do {
|
||||
skt = &sinfo->skt[i];
|
||||
|
||||
device_remove_file(&skt->socket.dev, &dev_attr_status);
|
||||
out_err_8:
|
||||
del_timer_sync(&skt->poll_timer);
|
||||
pcmcia_unregister_socket(&skt->socket);
|
||||
mutex_lock(&soc_pcmcia_sockets_lock);
|
||||
del_timer_sync(&skt->poll_timer);
|
||||
pcmcia_unregister_socket(&skt->socket);
|
||||
|
||||
out_err_7:
|
||||
flush_scheduled_work();
|
||||
flush_scheduled_work();
|
||||
|
||||
ops->hw_shutdown(skt);
|
||||
skt->ops->hw_shutdown(skt);
|
||||
out_err_6:
|
||||
list_del(&skt->node);
|
||||
iounmap(skt->virt_io);
|
||||
out_err_5:
|
||||
release_resource(&skt->res_attr);
|
||||
out_err_4:
|
||||
release_resource(&skt->res_mem);
|
||||
out_err_3:
|
||||
release_resource(&skt->res_io);
|
||||
out_err_2:
|
||||
release_resource(&skt->res_skt);
|
||||
out_err_1:
|
||||
i--;
|
||||
} while (i > 0);
|
||||
|
||||
kfree(sinfo);
|
||||
|
||||
out:
|
||||
list_del(&skt->node);
|
||||
mutex_unlock(&soc_pcmcia_sockets_lock);
|
||||
iounmap(skt->virt_io);
|
||||
out_err_5:
|
||||
release_resource(&skt->res_attr);
|
||||
out_err_4:
|
||||
release_resource(&skt->res_mem);
|
||||
out_err_3:
|
||||
release_resource(&skt->res_io);
|
||||
out_err_2:
|
||||
release_resource(&skt->res_skt);
|
||||
out_err_1:
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(soc_pcmcia_add_one);
|
||||
|
||||
int soc_common_drv_pcmcia_remove(struct device *dev)
|
||||
{
|
||||
struct skt_dev_info *sinfo = dev_get_drvdata(dev);
|
||||
int i;
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
||||
mutex_lock(&soc_pcmcia_sockets_lock);
|
||||
for (i = 0; i < sinfo->nskt; i++) {
|
||||
struct soc_pcmcia_socket *skt = &sinfo->skt[i];
|
||||
|
||||
del_timer_sync(&skt->poll_timer);
|
||||
|
||||
pcmcia_unregister_socket(&skt->socket);
|
||||
|
||||
flush_scheduled_work();
|
||||
|
||||
skt->ops->hw_shutdown(skt);
|
||||
|
||||
soc_common_pcmcia_config_skt(skt, &dead_socket);
|
||||
|
||||
list_del(&skt->node);
|
||||
iounmap(skt->virt_io);
|
||||
skt->virt_io = NULL;
|
||||
release_resource(&skt->res_attr);
|
||||
release_resource(&skt->res_mem);
|
||||
release_resource(&skt->res_io);
|
||||
release_resource(&skt->res_skt);
|
||||
}
|
||||
if (list_empty(&soc_pcmcia_sockets))
|
||||
soc_pcmcia_cpufreq_unregister();
|
||||
|
||||
mutex_unlock(&soc_pcmcia_sockets_lock);
|
||||
|
||||
kfree(sinfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(soc_common_drv_pcmcia_remove);
|
||||
MODULE_AUTHOR("John Dorsey <[email protected]>");
|
||||
MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
|
||||
MODULE_LICENSE("Dual MPL/GPL");
|
||||
|
|
|
|||
|
|
@ -30,14 +30,12 @@ struct soc_pcmcia_socket {
|
|||
/*
|
||||
* Info from low level handler
|
||||
*/
|
||||
struct device *dev;
|
||||
unsigned int nr;
|
||||
unsigned int irq;
|
||||
|
||||
/*
|
||||
* Core PCMCIA state
|
||||
*/
|
||||
struct pcmcia_low_level *ops;
|
||||
const struct pcmcia_low_level *ops;
|
||||
|
||||
unsigned int status;
|
||||
socket_state_t cs_state;
|
||||
|
|
@ -135,10 +133,8 @@ extern void soc_pcmcia_enable_irqs(struct soc_pcmcia_socket *skt, struct pcmcia_
|
|||
extern void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *, struct soc_pcmcia_timing *);
|
||||
|
||||
|
||||
extern struct list_head soc_pcmcia_sockets;
|
||||
|
||||
extern int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, struct skt_dev_info *sinfo);
|
||||
extern int soc_common_drv_pcmcia_remove(struct device *dev);
|
||||
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt);
|
||||
int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt);
|
||||
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
|
|
|
|||
|
|
@ -55,21 +55,6 @@
|
|||
#include <pcmcia/ss.h>
|
||||
#include "tcic.h"
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
static int pc_debug;
|
||||
|
||||
module_param(pc_debug, int, 0644);
|
||||
static const char version[] =
|
||||
"tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
|
||||
|
||||
#define debug(lvl, fmt, arg...) do { \
|
||||
if (pc_debug > (lvl)) \
|
||||
printk(KERN_DEBUG "tcic: " fmt , ## arg); \
|
||||
} while (0)
|
||||
#else
|
||||
#define debug(lvl, fmt, arg...) do { } while (0)
|
||||
#endif
|
||||
|
||||
MODULE_AUTHOR("David Hinds <[email protected]>");
|
||||
MODULE_DESCRIPTION("Databook TCIC-2 PCMCIA socket driver");
|
||||
MODULE_LICENSE("Dual MPL/GPL");
|
||||
|
|
@ -574,7 +559,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev)
|
|||
} else
|
||||
active = 1;
|
||||
|
||||
debug(2, "tcic_interrupt()\n");
|
||||
pr_debug("tcic_interrupt()\n");
|
||||
|
||||
for (i = 0; i < sockets; i++) {
|
||||
psock = socket_table[i].psock;
|
||||
|
|
@ -611,13 +596,13 @@ static irqreturn_t tcic_interrupt(int irq, void *dev)
|
|||
}
|
||||
active = 0;
|
||||
|
||||
debug(2, "interrupt done\n");
|
||||
pr_debug("interrupt done\n");
|
||||
return IRQ_HANDLED;
|
||||
} /* tcic_interrupt */
|
||||
|
||||
static void tcic_timer(u_long data)
|
||||
{
|
||||
debug(2, "tcic_timer()\n");
|
||||
pr_debug("tcic_timer()\n");
|
||||
tcic_timer_pending = 0;
|
||||
tcic_interrupt(0, NULL);
|
||||
} /* tcic_timer */
|
||||
|
|
@ -644,7 +629,7 @@ static int tcic_get_status(struct pcmcia_socket *sock, u_int *value)
|
|||
reg = tcic_getb(TCIC_PWR);
|
||||
if (reg & (TCIC_PWR_VCC(psock)|TCIC_PWR_VPP(psock)))
|
||||
*value |= SS_POWERON;
|
||||
debug(1, "GetStatus(%d) = %#2.2x\n", psock, *value);
|
||||
dev_dbg(&sock->dev, "GetStatus(%d) = %#2.2x\n", psock, *value);
|
||||
return 0;
|
||||
} /* tcic_get_status */
|
||||
|
||||
|
|
@ -656,7 +641,7 @@ static int tcic_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
|
|||
u_char reg;
|
||||
u_short scf1, scf2;
|
||||
|
||||
debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
dev_dbg(&sock->dev, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
|
||||
"io_irq %d, csc_mask %#2.2x)\n", psock, state->flags,
|
||||
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
|
||||
tcic_setw(TCIC_ADDR+2, (psock << TCIC_SS_SHFT) | TCIC_ADR2_INDREG);
|
||||
|
|
@ -731,7 +716,7 @@ static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
|
|||
u_int addr;
|
||||
u_short base, len, ioctl;
|
||||
|
||||
debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
dev_dbg(&sock->dev, "SetIOMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx-%#llx)\n", psock, io->map, io->flags, io->speed,
|
||||
(unsigned long long)io->start, (unsigned long long)io->stop);
|
||||
if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
|
||||
|
|
@ -768,7 +753,7 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m
|
|||
u_short addr, ctl;
|
||||
u_long base, len, mmap;
|
||||
|
||||
debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
dev_dbg(&sock->dev, "SetMemMap(%d, %d, %#2.2x, %d ns, "
|
||||
"%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags,
|
||||
mem->speed, (unsigned long long)mem->res->start,
|
||||
(unsigned long long)mem->res->end, mem->card_start);
|
||||
|
|
|
|||
|
|
@ -114,22 +114,17 @@ static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
|
|||
reg_zv |= TOPIC97_ZV_CONTROL_ENABLE;
|
||||
config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
|
||||
|
||||
reg = config_readb(socket, TOPIC97_MISC2);
|
||||
reg |= TOPIC97_MISC2_ZV_ENABLE;
|
||||
config_writeb(socket, TOPIC97_MISC2, reg);
|
||||
|
||||
/* not sure this is needed, doc is unclear */
|
||||
#if 0
|
||||
reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
|
||||
reg |= TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL;
|
||||
config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
reg_zv &= ~TOPIC97_ZV_CONTROL_ENABLE;
|
||||
config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
|
||||
}
|
||||
|
||||
reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
|
||||
reg &= ~(TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL);
|
||||
config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
|
||||
}
|
||||
}
|
||||
|
||||
static int topic97_override(struct yenta_socket *socket)
|
||||
|
|
|
|||
Loading…
Reference in a new issue