icom_adapter
struct icom_adapter *icom_adapter;
icom_adapter = (struct icom_adapter *) dev_id;
if (icom_adapter->version == ADAPTER_V2) {
int_reg = icom_adapter->base_addr + 0x8024;
icom_port = &icom_adapter->port_info[2];
icom_port = &icom_adapter->port_info[3];
int_reg = icom_adapter->base_addr + 0x8004;
int_reg = icom_adapter->base_addr + 0x4004;
icom_port = &icom_adapter->port_info[0];
icom_port = &icom_adapter->port_info[1];
static int icom_init_ports(struct icom_adapter *icom_adapter)
u32 subsystem_id = icom_adapter->subsystem_id;
if (icom_adapter->version == ADAPTER_V1) {
icom_adapter->numb_ports = 2;
icom_port = &icom_adapter->port_info[i];
icom_adapter->numb_ports = 4;
icom_port = &icom_adapter->port_info[i];
icom_adapter->numb_ports = 4;
icom_adapter->port_info[0].port = 0;
icom_adapter->port_info[0].status = ICOM_PORT_ACTIVE;
icom_adapter->port_info[1].status = ICOM_PORT_OFF;
icom_adapter->port_info[2].port = 2;
icom_adapter->port_info[2].status = ICOM_PORT_ACTIVE;
icom_adapter->port_info[3].status = ICOM_PORT_OFF;
static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
if (icom_adapter->version == ADAPTER_V1) {
icom_port->global_reg = icom_adapter->base_addr + 0x4000;
icom_port->int_reg = icom_adapter->base_addr +
icom_port->global_reg = icom_adapter->base_addr + 0x8000;
icom_port->int_reg = icom_adapter->base_addr +
icom_port->int_reg = icom_adapter->base_addr +
static int icom_load_ports(struct icom_adapter *icom_adapter)
for (port_num = 0; port_num < icom_adapter->numb_ports; port_num++) {
icom_port = &icom_adapter->port_info[port_num];
icom_port_active(icom_port, icom_adapter, port_num);
icom_port->dram = icom_adapter->base_addr +
icom_port->adapter = icom_adapter;
static int icom_alloc_adapter(struct icom_adapter
struct icom_adapter *icom_adapter;
struct icom_adapter *cur_adapter_entry;
icom_adapter = kzalloc_obj(struct icom_adapter);
if (!icom_adapter) {
icom_adapter->index = adapter_count;
list_add_tail(&icom_adapter->icom_adapter_entry,
*icom_adapter_ref = icom_adapter;
static void icom_free_adapter(struct icom_adapter *icom_adapter)
list_del(&icom_adapter->icom_adapter_entry);
kfree(icom_adapter);
struct icom_adapter *icom_adapter = container_of(kref,
struct icom_adapter, kref);
for (index = 0; index < icom_adapter->numb_ports; index++) {
icom_port = &icom_adapter->port_info[index];
dev_info(&icom_adapter->pci_dev->dev,
free_irq(icom_adapter->pci_dev->irq, (void *) icom_adapter);
iounmap(icom_adapter->base_addr);
pci_release_regions(icom_adapter->pci_dev);
icom_free_adapter(icom_adapter);
struct icom_adapter *icom_adapter;
retval = icom_alloc_adapter(&icom_adapter);
icom_adapter->base_addr_pci = pci_resource_start(dev, 0);
icom_adapter->pci_dev = dev;
icom_adapter->version = ent->driver_data;
icom_adapter->subsystem_id = ent->subdevice;
retval = icom_init_ports(icom_adapter);
icom_adapter->base_addr = pci_ioremap_bar(dev, 0);
if (!icom_adapter->base_addr) {
retval = request_irq(dev->irq, icom_interrupt, IRQF_SHARED, ICOM_DRIVER_NAME, icom_adapter);
retval = icom_load_ports(icom_adapter);
for (index = 0; index < icom_adapter->numb_ports; index++) {
icom_port = &icom_adapter->port_info[index];
(unsigned char __iomem *)icom_adapter->base_addr_pci;
icom_port->port + icom_adapter->index * 4;
kref_init(&icom_adapter->kref);
iounmap(icom_adapter->base_addr);
icom_free_adapter(icom_adapter);
struct icom_adapter *icom_adapter;
list_for_each_entry(icom_adapter, &icom_adapter_head,
if (icom_adapter->pci_dev == dev) {
kref_put(&icom_adapter->kref, icom_kref_release);
struct icom_adapter;
struct icom_adapter *adapter;