Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 25109
b: refs/heads/master
c: 30bac7a
h: refs/heads/master
i:
  25107: cf822ab
v: v3
  • Loading branch information
Petr Vandrovec authored and Dominik Brodowski committed Mar 31, 2006
1 parent 2389448 commit cd13e61
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d6ff5a8532b553e4d85ea65c99eaa0794edf5311
refs/heads/master: 30bac7aa0e3678c79ff00fc9372f34712eeb34fc
52 changes: 46 additions & 6 deletions trunk/drivers/serial/serial_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/serial_core.h>
#include <linux/delay.h>
#include <linux/major.h>
#include <asm/io.h>
#include <asm/system.h>
Expand Down Expand Up @@ -102,6 +103,8 @@ struct serial_info {
int multi;
int slave;
int manfid;
int prodid;
int c950ctrl;
dev_node_t node[4];
int line[4];
};
Expand All @@ -116,6 +119,33 @@ struct serial_cfg_mem {
static int serial_config(struct pcmcia_device * link);


static void wakeup_card(struct serial_info *info)
{
int ctrl = info->c950ctrl;

if (info->manfid == MANFID_OXSEMI) {
outb(12, ctrl + 1);
} else if (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC) {
/* request_region? oxsemi branch does no request_region too... */
/* This sequence is needed to properly initialize MC45 attached to OXCF950.
* I tried decreasing these msleep()s, but it worked properly (survived
* 1000 stop/start operations) with these timeouts (or bigger). */
outb(0xA, ctrl + 1);
msleep(100);
outb(0xE, ctrl + 1);
msleep(300);
outb(0xC, ctrl + 1);
msleep(100);
outb(0xE, ctrl + 1);
msleep(200);
outb(0xF, ctrl + 1);
msleep(100);
outb(0xE, ctrl + 1);
msleep(100);
outb(0xC, ctrl + 1);
}
}

/*======================================================================
After a card is removed, serial_remove() will unregister
Expand Down Expand Up @@ -161,6 +191,7 @@ static int serial_resume(struct pcmcia_device *link)

for (i = 0; i < info->ndev; i++)
serial8250_resume_port(info->line[i]);
wakeup_card(info);
}

return 0;
Expand Down Expand Up @@ -503,15 +534,23 @@ static int multi_config(struct pcmcia_device * link)
}

/* The Oxford Semiconductor OXCF950 cards are in fact single-port:
8 registers are for the UART, the others are extra registers */
if (info->manfid == MANFID_OXSEMI) {
* 8 registers are for the UART, the others are extra registers.
* Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
*/
if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
info->prodid == PRODID_POSSIO_GCC)) {
int err;

if (cf->index == 1 || cf->index == 3) {
setup_serial(link, info, base2, link->irq.AssignedIRQ);
outb(12, link->io.BasePort1 + 1);
err = setup_serial(link, info, base2,
link->irq.AssignedIRQ);
base2 = link->io.BasePort1;
} else {
setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ);
outb(12, base2 + 1);
err = setup_serial(link, info, link->io.BasePort1,
link->irq.AssignedIRQ);
}
info->c950ctrl = base2;
wakeup_card(info);
rc = 0;
goto free_cfg_mem;
}
Expand Down Expand Up @@ -583,6 +622,7 @@ static int serial_config(struct pcmcia_device * link)
tuple->DesiredTuple = CISTPL_MANFID;
if (first_tuple(link, tuple, parse) == CS_SUCCESS) {
info->manfid = parse->manfid.manf;
info->prodid = le16_to_cpu(buf[1]);
for (i = 0; i < MULTI_COUNT; i++)
if ((info->manfid == multi_id[i].manfid) &&
(parse->manfid.card == multi_id[i].prodid))
Expand Down
3 changes: 3 additions & 0 deletions trunk/include/pcmcia/ciscode.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,7 @@

#define MANFID_XIRCOM 0x0105

#define MANFID_POSSIO 0x030c
#define PRODID_POSSIO_GCC 0x0003

#endif /* _LINUX_CISCODE_H */

0 comments on commit cd13e61

Please sign in to comment.