You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07: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: (29 commits)
pcmcia: disable PCMCIA ioctl also for ARM
drivers/staging/comedi: dev_node removal (quatech_daqp_cs)
drivers/staging/comedi: dev_node removal (ni_mio_cs)
drivers/staging/comedi: dev_node removal (ni_labpc_cs)
drivers/staging/comedi: dev_node removal (ni_daq_dio24)
drivers/staging/comedi: dev_node removal (ni_daq_700)
drivers/staging/comedi: dev_node removal (das08_cs)
drivers/staging/comedi: dev_node removal (cb_das16_cs)
pata_pcmcia: get rid of extra indirection
pcmcia: remove suspend-related comment from yenta_socket.c
pcmcia: call pcmcia_{read,write}_cis_mem with ops_mutex held
pcmcia: remove pcmcia_add_device_lock
pcmcia: update gfp/slab.h includes
pcmcia: remove unused mem_op.h
pcmcia: do not autoadd root PCI bus resources
pcmcia: clarify alloc_io_space, move it to resource handlers
pcmcia: move all pcmcia_resource_ops providers into one module
pcmcia: move high level CIS access code to separate file
pcmcia: dev_node removal (core)
pcmcia: dev_node removal (remaining drivers)
...
This commit is contained in:
@@ -1,4 +1,17 @@
|
||||
This file details changes in 2.6 which affect PCMCIA card driver authors:
|
||||
* No dev_node_t (as of 2.6.35)
|
||||
There is no more need to fill out a "dev_node_t" structure.
|
||||
|
||||
* New IRQ request rules (as of 2.6.35)
|
||||
Instead of the old pcmcia_request_irq() interface, drivers may now
|
||||
choose between:
|
||||
- calling request_irq/free_irq directly. Use the IRQ from *p_dev->irq.
|
||||
- use pcmcia_request_irq(p_dev, handler_t); the PCMCIA core will
|
||||
clean up automatically on calls to pcmcia_disable_device() or
|
||||
device ejection.
|
||||
- drivers still not capable of IRQF_SHARED (or not telling us so) may
|
||||
use the deprecated pcmcia_request_exclusive_irq() for the time
|
||||
being; they might receive a shared IRQ nonetheless.
|
||||
|
||||
* no cs_error / CS_CHECK / CONFIG_PCMCIA_DEBUG (as of 2.6.33)
|
||||
Instead of the cs_error() callback or the CS_CHECK() macro, please use
|
||||
|
||||
@@ -45,16 +45,6 @@
|
||||
#define DRV_NAME "pata_pcmcia"
|
||||
#define DRV_VERSION "0.3.5"
|
||||
|
||||
/*
|
||||
* Private data structure to glue stuff together
|
||||
*/
|
||||
|
||||
struct ata_pcmcia_info {
|
||||
struct pcmcia_device *pdev;
|
||||
int ndev;
|
||||
dev_node_t node;
|
||||
};
|
||||
|
||||
/**
|
||||
* pcmcia_set_mode - PCMCIA specific mode setup
|
||||
* @link: link
|
||||
@@ -248,7 +238,6 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
{
|
||||
struct ata_host *host;
|
||||
struct ata_port *ap;
|
||||
struct ata_pcmcia_info *info;
|
||||
struct pcmcia_config_check *stk = NULL;
|
||||
int is_kme = 0, ret = -ENOMEM, p;
|
||||
unsigned long io_base, ctl_base;
|
||||
@@ -256,19 +245,10 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
int n_ports = 1;
|
||||
struct ata_port_operations *ops = &pcmcia_port_ops;
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (info == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Glue stuff together. FIXME: We may be able to get rid of info with care */
|
||||
info->pdev = pdev;
|
||||
pdev->priv = info;
|
||||
|
||||
/* Set up attributes in order to probe card and get resources */
|
||||
pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
pdev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
pdev->io.IOAddrLines = 3;
|
||||
pdev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
pdev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
pdev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -293,8 +273,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
}
|
||||
io_base = pdev->io.BasePort1;
|
||||
ctl_base = stk->ctl_base;
|
||||
ret = pcmcia_request_irq(pdev, &pdev->irq);
|
||||
if (ret)
|
||||
if (!pdev->irq)
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_request_configuration(pdev, &pdev->conf);
|
||||
@@ -344,21 +323,19 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
}
|
||||
|
||||
/* activate */
|
||||
ret = ata_host_activate(host, pdev->irq.AssignedIRQ, ata_sff_interrupt,
|
||||
ret = ata_host_activate(host, pdev->irq, ata_sff_interrupt,
|
||||
IRQF_SHARED, &pcmcia_sht);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
info->ndev = 1;
|
||||
pdev->priv = host;
|
||||
kfree(stk);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
kfree(stk);
|
||||
info->ndev = 0;
|
||||
pcmcia_disable_device(pdev);
|
||||
out1:
|
||||
kfree(info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -372,20 +349,12 @@ out1:
|
||||
|
||||
static void pcmcia_remove_one(struct pcmcia_device *pdev)
|
||||
{
|
||||
struct ata_pcmcia_info *info = pdev->priv;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ata_host *host = pdev->priv;
|
||||
|
||||
if (host)
|
||||
ata_host_detach(host);
|
||||
|
||||
if (info != NULL) {
|
||||
/* If we have attached the device to the ATA layer, detach it */
|
||||
if (info->ndev) {
|
||||
struct ata_host *host = dev_get_drvdata(dev);
|
||||
ata_host_detach(host);
|
||||
}
|
||||
info->ndev = 0;
|
||||
pdev->priv = NULL;
|
||||
}
|
||||
pcmcia_disable_device(pdev);
|
||||
kfree(info);
|
||||
}
|
||||
|
||||
static struct pcmcia_device_id pcmcia_devices[] = {
|
||||
|
||||
@@ -65,7 +65,6 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
typedef struct bluecard_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
|
||||
@@ -869,9 +868,6 @@ static int bluecard_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
link->irq.Handler = bluecard_interrupt;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -908,9 +904,9 @@ static int bluecard_config(struct pcmcia_device *link)
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
i = pcmcia_request_irq(link, bluecard_interrupt);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
@@ -919,9 +915,6 @@ static int bluecard_config(struct pcmcia_device *link)
|
||||
if (bluecard_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
strcpy(info->node.dev_name, info->hdev->name);
|
||||
link->dev_node = &info->node;
|
||||
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
|
||||
@@ -72,7 +72,6 @@ MODULE_FIRMWARE("BT3CPCC.bin");
|
||||
|
||||
typedef struct bt3c_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
|
||||
@@ -661,9 +660,6 @@ static int bt3c_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
link->irq.Handler = bt3c_interrupt;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -743,9 +739,9 @@ static int bt3c_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
|
||||
found_port:
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
i = pcmcia_request_irq(link, &bt3c_interrupt);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
@@ -754,9 +750,6 @@ found_port:
|
||||
if (bt3c_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
strcpy(info->node.dev_name, info->hdev->name);
|
||||
link->dev_node = &info->node;
|
||||
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
|
||||
@@ -67,7 +67,6 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
typedef struct btuart_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
|
||||
@@ -590,9 +589,6 @@ static int btuart_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
link->irq.Handler = btuart_interrupt;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -672,9 +668,9 @@ static int btuart_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
|
||||
found_port:
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
i = pcmcia_request_irq(link, btuart_interrupt);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
@@ -683,9 +679,6 @@ found_port:
|
||||
if (btuart_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
strcpy(info->node.dev_name, info->hdev->name);
|
||||
link->dev_node = &info->node;
|
||||
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
|
||||
@@ -67,7 +67,6 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
typedef struct dtl1_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
|
||||
struct hci_dev *hdev;
|
||||
|
||||
@@ -575,9 +574,6 @@ static int dtl1_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
link->irq.Handler = dtl1_interrupt;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -621,9 +617,9 @@ static int dtl1_config(struct pcmcia_device *link)
|
||||
if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0)
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
i = pcmcia_request_irq(link, dtl1_interrupt);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
@@ -632,9 +628,6 @@ static int dtl1_config(struct pcmcia_device *link)
|
||||
if (dtl1_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
strcpy(info->node.dev_name, info->hdev->name);
|
||||
link->dev_node = &info->node;
|
||||
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
|
||||
@@ -106,7 +106,6 @@ static int major; /* major number we get from the kernel */
|
||||
|
||||
struct cm4000_dev {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node; /* OS node (major,minor) */
|
||||
|
||||
unsigned char atr[MAX_ATR];
|
||||
unsigned char rbuf[512];
|
||||
@@ -884,8 +883,7 @@ static void monitor_card(unsigned long p)
|
||||
/* slow down warning, but prompt immediately after insertion */
|
||||
if (dev->cwarn == 0 || dev->cwarn == 10) {
|
||||
set_bit(IS_BAD_CARD, &dev->flags);
|
||||
printk(KERN_WARNING MODULE_NAME ": device %s: ",
|
||||
dev->node.dev_name);
|
||||
dev_warn(&dev->p_dev->dev, MODULE_NAME ": ");
|
||||
if (test_bit(IS_BAD_CSUM, &dev->flags)) {
|
||||
DEBUGP(4, dev, "ATR checksum (0x%.2x, should "
|
||||
"be zero) failed\n", dev->atr_csum);
|
||||
@@ -1781,11 +1779,6 @@ static int cm4000_config(struct pcmcia_device * link, int devno)
|
||||
goto cs_release;
|
||||
|
||||
dev = link->priv;
|
||||
sprintf(dev->node.dev_name, DEVICE_NAME "%d", devno);
|
||||
dev->node.major = major;
|
||||
dev->node.minor = devno;
|
||||
dev->node.next = NULL;
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -72,7 +72,6 @@ static struct class *cmx_class;
|
||||
|
||||
struct reader_dev {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
wait_queue_head_t devq;
|
||||
wait_queue_head_t poll_wait;
|
||||
wait_queue_head_t read_wait;
|
||||
@@ -568,10 +567,6 @@ static int reader_config(struct pcmcia_device *link, int devno)
|
||||
}
|
||||
|
||||
dev = link->priv;
|
||||
sprintf(dev->node.dev_name, DEVICE_NAME "%d", devno);
|
||||
dev->node.major = major;
|
||||
dev->node.minor = devno;
|
||||
dev->node.next = &dev->node;
|
||||
|
||||
DEBUGP(2, dev, "device " DEVICE_NAME "%d at 0x%.4x-0x%.4x\n", devno,
|
||||
link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1);
|
||||
|
||||
@@ -195,9 +195,6 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = ipwireless_interrupt;
|
||||
|
||||
INIT_WORK(&ipw->work_reboot, signalled_reboot_work);
|
||||
|
||||
ipwireless_init_hardware_v1(ipw->hardware, link->io.BasePort1,
|
||||
@@ -205,8 +202,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
ipw->is_v2_card, signalled_reboot_callback,
|
||||
ipw);
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
|
||||
ret = pcmcia_request_irq(link, ipwireless_interrupt);
|
||||
if (ret != 0)
|
||||
goto exit;
|
||||
|
||||
@@ -217,7 +213,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
(unsigned int) link->io.BasePort1,
|
||||
(unsigned int) (link->io.BasePort1 +
|
||||
link->io.NumPorts1 - 1),
|
||||
(unsigned int) link->irq.AssignedIRQ);
|
||||
(unsigned int) link->irq);
|
||||
if (ipw->attr_memory && ipw->common_memory)
|
||||
printk(KERN_INFO IPWIRELESS_PCCARD_NAME
|
||||
": attr memory 0x%08lx-0x%08lx, common memory 0x%08lx-0x%08lx\n",
|
||||
@@ -232,8 +228,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
if (!ipw->network)
|
||||
goto exit;
|
||||
|
||||
ipw->tty = ipwireless_tty_create(ipw->hardware, ipw->network,
|
||||
ipw->nodes);
|
||||
ipw->tty = ipwireless_tty_create(ipw->hardware, ipw->network);
|
||||
if (!ipw->tty)
|
||||
goto exit;
|
||||
|
||||
@@ -248,8 +243,6 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
if (ret != 0)
|
||||
goto exit;
|
||||
|
||||
link->dev_node = &ipw->nodes[0];
|
||||
|
||||
return 0;
|
||||
|
||||
exit:
|
||||
@@ -271,8 +264,6 @@ exit:
|
||||
|
||||
static void release_ipwireless(struct ipw_dev *ipw)
|
||||
{
|
||||
pcmcia_disable_device(ipw->link);
|
||||
|
||||
if (ipw->common_memory) {
|
||||
release_mem_region(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size);
|
||||
@@ -288,7 +279,6 @@ static void release_ipwireless(struct ipw_dev *ipw)
|
||||
if (ipw->attr_memory)
|
||||
pcmcia_release_window(ipw->link, ipw->handle_attr_memory);
|
||||
|
||||
/* Break the link with Card Services */
|
||||
pcmcia_disable_device(ipw->link);
|
||||
}
|
||||
|
||||
@@ -313,9 +303,6 @@ static int ipwireless_attach(struct pcmcia_device *link)
|
||||
ipw->link = link;
|
||||
link->priv = ipw;
|
||||
|
||||
/* Link this device into our device list. */
|
||||
link->dev_node = &ipw->nodes[0];
|
||||
|
||||
ipw->hardware = ipwireless_hardware_create();
|
||||
if (!ipw->hardware) {
|
||||
kfree(ipw);
|
||||
|
||||
@@ -54,7 +54,6 @@ struct ipw_dev {
|
||||
void __iomem *common_memory;
|
||||
win_req_t request_common_memory;
|
||||
|
||||
dev_node_t nodes[2];
|
||||
/* Reference to attribute memory, containing CIS data */
|
||||
void *attribute_memory;
|
||||
|
||||
|
||||
@@ -487,7 +487,7 @@ static int ipw_ioctl(struct tty_struct *linux_tty, struct file *file,
|
||||
return tty_mode_ioctl(linux_tty, file, cmd , arg);
|
||||
}
|
||||
|
||||
static int add_tty(dev_node_t *nodesp, int j,
|
||||
static int add_tty(int j,
|
||||
struct ipw_hardware *hardware,
|
||||
struct ipw_network *network, int channel_idx,
|
||||
int secondary_channel_idx, int tty_type)
|
||||
@@ -510,19 +510,13 @@ static int add_tty(dev_node_t *nodesp, int j,
|
||||
ipwireless_associate_network_tty(network,
|
||||
secondary_channel_idx,
|
||||
ttys[j]);
|
||||
if (nodesp != NULL) {
|
||||
sprintf(nodesp->dev_name, "ttyIPWp%d", j);
|
||||
nodesp->major = ipw_tty_driver->major;
|
||||
nodesp->minor = j + ipw_tty_driver->minor_start;
|
||||
}
|
||||
if (get_tty(j + ipw_tty_driver->minor_start) == ttys[j])
|
||||
report_registering(ttys[j]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ipw_tty *ipwireless_tty_create(struct ipw_hardware *hardware,
|
||||
struct ipw_network *network,
|
||||
dev_node_t *nodes)
|
||||
struct ipw_network *network)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
@@ -539,26 +533,23 @@ struct ipw_tty *ipwireless_tty_create(struct ipw_hardware *hardware,
|
||||
if (allfree) {
|
||||
j = i;
|
||||
|
||||
if (add_tty(&nodes[0], j, hardware, network,
|
||||
if (add_tty(j, hardware, network,
|
||||
IPW_CHANNEL_DIALLER, IPW_CHANNEL_RAS,
|
||||
TTYTYPE_MODEM))
|
||||
return NULL;
|
||||
|
||||
j += IPWIRELESS_PCMCIA_MINOR_RANGE;
|
||||
if (add_tty(&nodes[1], j, hardware, network,
|
||||
if (add_tty(j, hardware, network,
|
||||
IPW_CHANNEL_DIALLER, -1,
|
||||
TTYTYPE_MONITOR))
|
||||
return NULL;
|
||||
|
||||
j += IPWIRELESS_PCMCIA_MINOR_RANGE;
|
||||
if (add_tty(NULL, j, hardware, network,
|
||||
if (add_tty(j, hardware, network,
|
||||
IPW_CHANNEL_RAS, -1,
|
||||
TTYTYPE_RAS_RAW))
|
||||
return NULL;
|
||||
|
||||
nodes[0].next = &nodes[1];
|
||||
nodes[1].next = NULL;
|
||||
|
||||
return ttys[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,8 +34,7 @@ int ipwireless_tty_init(void);
|
||||
void ipwireless_tty_release(void);
|
||||
|
||||
struct ipw_tty *ipwireless_tty_create(struct ipw_hardware *hw,
|
||||
struct ipw_network *net,
|
||||
dev_node_t *nodes);
|
||||
struct ipw_network *net);
|
||||
void ipwireless_tty_free(struct ipw_tty *tty);
|
||||
void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,
|
||||
unsigned int length);
|
||||
|
||||
@@ -220,7 +220,6 @@ typedef struct _mgslpc_info {
|
||||
|
||||
/* PCMCIA support */
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
int stop;
|
||||
|
||||
/* SPPP/Cisco HDLC device parts */
|
||||
@@ -552,10 +551,6 @@ static int mgslpc_probe(struct pcmcia_device *link)
|
||||
|
||||
/* Initialize the struct pcmcia_device structure */
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
link->conf.Attributes = 0;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -608,9 +603,7 @@ static int mgslpc_config(struct pcmcia_device *link)
|
||||
link->conf.ConfigIndex = 8;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
||||
link->irq.Handler = mgslpc_isr;
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
ret = pcmcia_request_irq(link, mgslpc_isr);
|
||||
if (ret)
|
||||
goto failed;
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
@@ -618,17 +611,12 @@ static int mgslpc_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
|
||||
info->io_base = link->io.BasePort1;
|
||||
info->irq_level = link->irq.AssignedIRQ;
|
||||
info->irq_level = link->irq;
|
||||
|
||||
/* add to linked list of devices */
|
||||
sprintf(info->node.dev_name, "mgslpc0");
|
||||
info->node.major = info->node.minor = 0;
|
||||
link->dev_node = &info->node;
|
||||
|
||||
printk(KERN_INFO "%s: index 0x%02x:",
|
||||
info->node.dev_name, link->conf.ConfigIndex);
|
||||
dev_info(&link->dev, "index 0x%02x:",
|
||||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq.AssignedIRQ);
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
|
||||
+7
-13
@@ -65,8 +65,7 @@ MODULE_LICENSE("Dual MPL/GPL");
|
||||
typedef struct ide_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
struct ide_host *host;
|
||||
int ndev;
|
||||
dev_node_t node;
|
||||
int ndev;
|
||||
} ide_info_t;
|
||||
|
||||
static void ide_release(struct pcmcia_device *);
|
||||
@@ -102,7 +101,6 @@ static int ide_probe(struct pcmcia_device *link)
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.IOAddrLines = 3;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -285,8 +283,7 @@ static int ide_config(struct pcmcia_device *link)
|
||||
io_base = link->io.BasePort1;
|
||||
ctl_base = stk->ctl_base;
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
if (!link->irq)
|
||||
goto failed;
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
@@ -299,24 +296,21 @@ static int ide_config(struct pcmcia_device *link)
|
||||
if (is_kme)
|
||||
outb(0x81, ctl_base+1);
|
||||
|
||||
host = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link);
|
||||
host = idecs_register(io_base, ctl_base, link->irq, link);
|
||||
if (host == NULL && link->io.NumPorts1 == 0x20) {
|
||||
outb(0x02, ctl_base + 0x10);
|
||||
host = idecs_register(io_base + 0x10, ctl_base + 0x10,
|
||||
link->irq.AssignedIRQ, link);
|
||||
link->irq, link);
|
||||
}
|
||||
|
||||
if (host == NULL)
|
||||
goto failed;
|
||||
|
||||
info->ndev = 1;
|
||||
sprintf(info->node.dev_name, "hd%c", 'a' + host->ports[0]->index * 2);
|
||||
info->node.major = host->ports[0]->major;
|
||||
info->node.minor = 0;
|
||||
info->host = host;
|
||||
link->dev_node = &info->node;
|
||||
printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n",
|
||||
info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10);
|
||||
dev_info(&link->dev, "ide-cs: hd%c: Vpp = %d.%d\n",
|
||||
'a' + host->ports[0]->index * 2,
|
||||
link->conf.Vpp / 10, link->conf.Vpp % 10);
|
||||
|
||||
kfree(stk);
|
||||
return 0;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial.h>
|
||||
@@ -61,31 +60,6 @@ static void avmcs_release(struct pcmcia_device *link);
|
||||
|
||||
static void avmcs_detach(struct pcmcia_device *p_dev);
|
||||
|
||||
/*
|
||||
A linked list of "instances" of the skeleton device. Each actual
|
||||
PCMCIA card corresponds to one device instance, and is described
|
||||
by one struct pcmcia_device structure (defined in ds.h).
|
||||
|
||||
You may not want to use a linked list for this -- for example, the
|
||||
memory card driver uses an array of struct pcmcia_device pointers, where minor
|
||||
device numbers are used to derive the corresponding array index.
|
||||
*/
|
||||
|
||||
/*
|
||||
A driver needs to provide a dev_node_t structure for each device
|
||||
on a card. In some cases, there is only one device per card (for
|
||||
example, ethernet cards, modems). In other cases, there may be
|
||||
many actual or logical devices (SCSI adapters, memory cards with
|
||||
multiple partitions). The dev_node_t structures need to be kept
|
||||
in a linked list starting at the 'dev' field of a struct pcmcia_device
|
||||
structure. We allocate them in the card's private data structure,
|
||||
because they generally can't be allocated dynamically.
|
||||
*/
|
||||
|
||||
typedef struct local_info_t {
|
||||
dev_node_t node;
|
||||
} local_info_t;
|
||||
|
||||
/*======================================================================
|
||||
|
||||
avmcs_attach() creates an "instance" of the driver, allocating
|
||||
@@ -100,32 +74,19 @@ typedef struct local_info_t {
|
||||
|
||||
static int avmcs_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.NumPorts2 = 0;
|
||||
|
||||
/* Interrupt setup */
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
p_dev->conf.ConfigIndex = 1;
|
||||
p_dev->conf.Present = PRESENT_OPTION;
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
if (!local)
|
||||
goto err;
|
||||
p_dev->priv = local;
|
||||
|
||||
return avmcs_config(p_dev);
|
||||
|
||||
err:
|
||||
return -ENOMEM;
|
||||
} /* avmcs_attach */
|
||||
|
||||
/*======================================================================
|
||||
@@ -140,7 +101,6 @@ static int avmcs_probe(struct pcmcia_device *p_dev)
|
||||
static void avmcs_detach(struct pcmcia_device *link)
|
||||
{
|
||||
avmcs_release(link);
|
||||
kfree(link->priv);
|
||||
} /* avmcs_detach */
|
||||
|
||||
/*======================================================================
|
||||
@@ -171,14 +131,11 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev,
|
||||
|
||||
static int avmcs_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
int i;
|
||||
int i = -1;
|
||||
char devname[128];
|
||||
int cardtype;
|
||||
int (*addcard)(unsigned int port, unsigned irq);
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
devname[0] = 0;
|
||||
if (link->prod_id[1])
|
||||
strlcpy(devname, link->prod_id[1], sizeof(devname));
|
||||
@@ -190,11 +147,7 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
return -ENODEV;
|
||||
|
||||
do {
|
||||
/*
|
||||
* allocate an interrupt line
|
||||
*/
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
if (!link->irq) {
|
||||
/* undo */
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
@@ -211,15 +164,11 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
|
||||
} while (0);
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. */
|
||||
|
||||
if (devname[0]) {
|
||||
char *s = strrchr(devname, ' ');
|
||||
if (!s)
|
||||
s = devname;
|
||||
else s++;
|
||||
strcpy(dev->node.dev_name, s);
|
||||
if (strcmp("M1", s) == 0) {
|
||||
cardtype = AVM_CARDTYPE_M1;
|
||||
} else if (strcmp("M2", s) == 0) {
|
||||
@@ -227,14 +176,8 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
} else {
|
||||
cardtype = AVM_CARDTYPE_B1;
|
||||
}
|
||||
} else {
|
||||
strcpy(dev->node.dev_name, "b1");
|
||||
} else
|
||||
cardtype = AVM_CARDTYPE_B1;
|
||||
}
|
||||
|
||||
dev->node.major = 64;
|
||||
dev->node.minor = 0;
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
/* If any step failed, release any partially configured state */
|
||||
if (i != 0) {
|
||||
@@ -249,13 +192,12 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
default:
|
||||
case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break;
|
||||
}
|
||||
if ((i = (*addcard)(link->io.BasePort1, link->irq.AssignedIRQ)) < 0) {
|
||||
printk(KERN_ERR "avm_cs: failed to add AVM-%s-Controller at i/o %#x, irq %d\n",
|
||||
dev->node.dev_name, link->io.BasePort1, link->irq.AssignedIRQ);
|
||||
avmcs_release(link);
|
||||
return -ENODEV;
|
||||
if ((i = (*addcard)(link->io.BasePort1, link->irq)) < 0) {
|
||||
dev_err(&link->dev, "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
|
||||
link->io.BasePort1, link->irq);
|
||||
avmcs_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
dev->node.minor = i;
|
||||
return 0;
|
||||
|
||||
} /* avmcs_config */
|
||||
@@ -270,7 +212,7 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
|
||||
static void avmcs_release(struct pcmcia_device *link)
|
||||
{
|
||||
b1pcmcia_delcard(link->io.BasePort1, link->irq.AssignedIRQ);
|
||||
b1pcmcia_delcard(link->io.BasePort1, link->irq);
|
||||
pcmcia_disable_device(link);
|
||||
} /* avmcs_release */
|
||||
|
||||
|
||||
@@ -62,31 +62,6 @@ static void avma1cs_release(struct pcmcia_device *link);
|
||||
static void avma1cs_detach(struct pcmcia_device *p_dev) __devexit ;
|
||||
|
||||
|
||||
/*
|
||||
A linked list of "instances" of the skeleton device. Each actual
|
||||
PCMCIA card corresponds to one device instance, and is described
|
||||
by one struct pcmcia_device structure (defined in ds.h).
|
||||
|
||||
You may not want to use a linked list for this -- for example, the
|
||||
memory card driver uses an array of struct pcmcia_device pointers, where minor
|
||||
device numbers are used to derive the corresponding array index.
|
||||
*/
|
||||
|
||||
/*
|
||||
A driver needs to provide a dev_node_t structure for each device
|
||||
on a card. In some cases, there is only one device per card (for
|
||||
example, ethernet cards, modems). In other cases, there may be
|
||||
many actual or logical devices (SCSI adapters, memory cards with
|
||||
multiple partitions). The dev_node_t structures need to be kept
|
||||
in a linked list starting at the 'dev' field of a struct pcmcia_device
|
||||
structure. We allocate them in the card's private data structure,
|
||||
because they generally can't be allocated dynamically.
|
||||
*/
|
||||
|
||||
typedef struct local_info_t {
|
||||
dev_node_t node;
|
||||
} local_info_t;
|
||||
|
||||
/*======================================================================
|
||||
|
||||
avma1cs_attach() creates an "instance" of the driver, allocating
|
||||
@@ -101,17 +76,8 @@ typedef struct local_info_t {
|
||||
|
||||
static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
if (!local)
|
||||
return -ENOMEM;
|
||||
|
||||
p_dev->priv = local;
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
@@ -119,9 +85,6 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
|
||||
p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
|
||||
p_dev->io.IOAddrLines = 5;
|
||||
|
||||
/* Interrupt setup */
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -176,14 +139,11 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev,
|
||||
|
||||
static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
int i;
|
||||
int i = -1;
|
||||
char devname[128];
|
||||
IsdnCard_t icard;
|
||||
int busy = 0;
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
dev_dbg(&link->dev, "avma1cs_config(0x%p)\n", link);
|
||||
|
||||
devname[0] = 0;
|
||||
@@ -197,8 +157,7 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
/*
|
||||
* allocate an interrupt line
|
||||
*/
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
if (!link->irq) {
|
||||
/* undo */
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
@@ -215,14 +174,6 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
|
||||
} while (0);
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. */
|
||||
|
||||
strcpy(dev->node.dev_name, "A1");
|
||||
dev->node.major = 45;
|
||||
dev->node.minor = 0;
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
/* If any step failed, release any partially configured state */
|
||||
if (i != 0) {
|
||||
avma1cs_release(link);
|
||||
@@ -230,9 +181,9 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n",
|
||||
link->io.BasePort1, link->irq.AssignedIRQ);
|
||||
link->io.BasePort1, link->irq);
|
||||
|
||||
icard.para[0] = link->irq.AssignedIRQ;
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.protocol = isdnprot;
|
||||
icard.typ = ISDN_CTYPE_A1_PCMCIA;
|
||||
@@ -243,7 +194,7 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
avma1cs_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
dev->node.minor = i;
|
||||
link->priv = (void *) (unsigned long) i;
|
||||
|
||||
return 0;
|
||||
} /* avma1cs_config */
|
||||
@@ -258,12 +209,12 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
||||
|
||||
static void avma1cs_release(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local = link->priv;
|
||||
unsigned long minor = (unsigned long) link->priv;
|
||||
|
||||
dev_dbg(&link->dev, "avma1cs_release(0x%p)\n", link);
|
||||
|
||||
/* now unregister function with hisax */
|
||||
HiSax_closecard(local->node.minor);
|
||||
HiSax_closecard(minor);
|
||||
|
||||
pcmcia_disable_device(link);
|
||||
} /* avma1cs_release */
|
||||
|
||||
@@ -87,24 +87,8 @@ static void elsa_cs_release(struct pcmcia_device *link);
|
||||
|
||||
static void elsa_cs_detach(struct pcmcia_device *p_dev) __devexit;
|
||||
|
||||
/*
|
||||
A driver needs to provide a dev_node_t structure for each device
|
||||
on a card. In some cases, there is only one device per card (for
|
||||
example, ethernet cards, modems). In other cases, there may be
|
||||
many actual or logical devices (SCSI adapters, memory cards with
|
||||
multiple partitions). The dev_node_t structures need to be kept
|
||||
in a linked list starting at the 'dev' field of a struct pcmcia_device
|
||||
structure. We allocate them in the card's private data structure,
|
||||
because they generally shouldn't be allocated dynamically.
|
||||
In this case, we also provide a flag to indicate if a device is
|
||||
"stopped" due to a power management event, or card ejection. The
|
||||
device IO routines can use a flag like this to throttle IO to a
|
||||
card that is not ready to accept it.
|
||||
*/
|
||||
|
||||
typedef struct local_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
int busy;
|
||||
int cardnr;
|
||||
} local_info_t;
|
||||
@@ -136,10 +120,6 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link)
|
||||
|
||||
local->cardnr = -1;
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
General socket configuration defaults can go here. In this
|
||||
client, we assume very little, and rely on the CIS for almost
|
||||
@@ -223,28 +203,18 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link)
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
link->irq.AssignedIRQ = 0;
|
||||
if (!link->irq)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. *//* */
|
||||
sprintf(dev->node.dev_name, "elsa");
|
||||
dev->node.major = dev->node.minor = 0x0;
|
||||
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
/* Finally, report what we've done */
|
||||
printk(KERN_INFO "%s: index 0x%02x: ",
|
||||
dev->node.dev_name, link->conf.ConfigIndex);
|
||||
dev_info(&link->dev, "index 0x%02x: ",
|
||||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq.AssignedIRQ);
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
@@ -253,7 +223,7 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link)
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq.AssignedIRQ;
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_ELSA_PCMCIA;
|
||||
|
||||
@@ -87,32 +87,8 @@ static void sedlbauer_release(struct pcmcia_device *link);
|
||||
|
||||
static void sedlbauer_detach(struct pcmcia_device *p_dev) __devexit;
|
||||
|
||||
/*
|
||||
You'll also need to prototype all the functions that will actually
|
||||
be used to talk to your device. See 'memory_cs' for a good example
|
||||
of a fully self-sufficient driver; the other drivers rely more or
|
||||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
A driver needs to provide a dev_node_t structure for each device
|
||||
on a card. In some cases, there is only one device per card (for
|
||||
example, ethernet cards, modems). In other cases, there may be
|
||||
many actual or logical devices (SCSI adapters, memory cards with
|
||||
multiple partitions). The dev_node_t structures need to be kept
|
||||
in a linked list starting at the 'dev' field of a struct pcmcia_device
|
||||
structure. We allocate them in the card's private data structure,
|
||||
because they generally shouldn't be allocated dynamically.
|
||||
|
||||
In this case, we also provide a flag to indicate if a device is
|
||||
"stopped" due to a power management event, or card ejection. The
|
||||
device IO routines can use a flag like this to throttle IO to a
|
||||
card that is not ready to accept it.
|
||||
*/
|
||||
|
||||
typedef struct local_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
int stop;
|
||||
int cardnr;
|
||||
} local_info_t;
|
||||
@@ -143,10 +119,6 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link)
|
||||
local->p_dev = link;
|
||||
link->priv = local;
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
General socket configuration defaults can go here. In this
|
||||
client, we assume very little, and rely on the CIS for almost
|
||||
@@ -227,9 +199,7 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
||||
else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
|
||||
p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
|
||||
|
||||
/* Do we need to allocate an interrupt? */
|
||||
if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
|
||||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
@@ -285,7 +255,6 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
||||
|
||||
static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev = link->priv;
|
||||
win_req_t *req;
|
||||
int ret;
|
||||
IsdnCard_t icard;
|
||||
@@ -312,17 +281,6 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
Allocate an interrupt line. Note that this does not assign a
|
||||
handler to the interrupt, unless the 'Handler' member of the
|
||||
irq structure is initialized.
|
||||
*/
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ) {
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
This actually configures the PCMCIA socket -- setting up
|
||||
the I/O windows and the interrupt mapping, and putting the
|
||||
@@ -332,21 +290,13 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
At this point, the dev_node_t structure(s) need to be
|
||||
initialized and arranged in a linked list at link->dev.
|
||||
*/
|
||||
sprintf(dev->node.dev_name, "sedlbauer");
|
||||
dev->node.major = dev->node.minor = 0;
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
/* Finally, report what we've done */
|
||||
printk(KERN_INFO "%s: index 0x%02x:",
|
||||
dev->node.dev_name, link->conf.ConfigIndex);
|
||||
dev_info(&link->dev, "index 0x%02x:",
|
||||
link->conf.ConfigIndex);
|
||||
if (link->conf.Vpp)
|
||||
printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq.AssignedIRQ);
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
@@ -358,7 +308,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
||||
req->Base+req->Size-1);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq.AssignedIRQ;
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
|
||||
|
||||
@@ -68,34 +68,8 @@ static void teles_cs_release(struct pcmcia_device *link);
|
||||
|
||||
static void teles_detach(struct pcmcia_device *p_dev) __devexit ;
|
||||
|
||||
/*
|
||||
A linked list of "instances" of the teles_cs device. Each actual
|
||||
PCMCIA card corresponds to one device instance, and is described
|
||||
by one struct pcmcia_device structure (defined in ds.h).
|
||||
|
||||
You may not want to use a linked list for this -- for example, the
|
||||
memory card driver uses an array of struct pcmcia_device pointers, where minor
|
||||
device numbers are used to derive the corresponding array index.
|
||||
*/
|
||||
|
||||
/*
|
||||
A driver needs to provide a dev_node_t structure for each device
|
||||
on a card. In some cases, there is only one device per card (for
|
||||
example, ethernet cards, modems). In other cases, there may be
|
||||
many actual or logical devices (SCSI adapters, memory cards with
|
||||
multiple partitions). The dev_node_t structures need to be kept
|
||||
in a linked list starting at the 'dev' field of a struct pcmcia_device
|
||||
structure. We allocate them in the card's private data structure,
|
||||
because they generally shouldn't be allocated dynamically.
|
||||
In this case, we also provide a flag to indicate if a device is
|
||||
"stopped" due to a power management event, or card ejection. The
|
||||
device IO routines can use a flag like this to throttle IO to a
|
||||
card that is not ready to accept it.
|
||||
*/
|
||||
|
||||
typedef struct local_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node;
|
||||
int busy;
|
||||
int cardnr;
|
||||
} local_info_t;
|
||||
@@ -126,10 +100,6 @@ static int __devinit teles_probe(struct pcmcia_device *link)
|
||||
local->p_dev = link;
|
||||
link->priv = local;
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
General socket configuration defaults can go here. In this
|
||||
client, we assume very little, and rely on the CIS for almost
|
||||
@@ -213,28 +183,18 @@ static int __devinit teles_cs_config(struct pcmcia_device *link)
|
||||
if (i != 0)
|
||||
goto cs_failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
link->irq.AssignedIRQ = 0;
|
||||
if (!link->irq)
|
||||
goto cs_failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
goto cs_failed;
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. *//* */
|
||||
sprintf(dev->node.dev_name, "teles");
|
||||
dev->node.major = dev->node.minor = 0x0;
|
||||
|
||||
link->dev_node = &dev->node;
|
||||
|
||||
/* Finally, report what we've done */
|
||||
printk(KERN_INFO "%s: index 0x%02x:",
|
||||
dev->node.dev_name, link->conf.ConfigIndex);
|
||||
dev_info(&link->dev, "index 0x%02x:",
|
||||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq.AssignedIRQ);
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
@@ -243,7 +203,7 @@ static int __devinit teles_cs_config(struct pcmcia_device *link)
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq.AssignedIRQ;
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_TELESPCMCIA;
|
||||
|
||||
@@ -52,7 +52,6 @@ static const int debug = 0;
|
||||
|
||||
struct pcmciamtd_dev {
|
||||
struct pcmcia_device *p_dev;
|
||||
dev_node_t node; /* device node */
|
||||
caddr_t win_base; /* ioremapped address of PCMCIA window */
|
||||
unsigned int win_size; /* size of window */
|
||||
unsigned int offset; /* offset into card the window currently points at */
|
||||
@@ -647,9 +646,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
snprintf(dev->node.dev_name, sizeof(dev->node.dev_name), "mtd%d", mtd->index);
|
||||
info("mtd%d: %s", mtd->index, mtd->name);
|
||||
link->dev_node = &dev->node;
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user