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); /* * We initialize default socket timing here, because * we are not guaranteed to see a SetIOMap operation at * runtime. */ skt->ops->set_timing(skt); ret = soc_pcmcia_hw_init(skt); if (ret) goto out_err_6; 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->status = soc_common_pcmcia_skt_state(skt); ret = pcmcia_register_socket(&skt->socket); if (ret) goto out_err_7; add_timer(&skt->poll_timer); mutex_unlock(&soc_pcmcia_sockets_lock); ret = device_create_file(&skt->socket.dev, &dev_attr_status); if (ret) goto out_err_8; return ret; out_err_8: mutex_lock(&soc_pcmcia_sockets_lock); del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); out_err_7: soc_pcmcia_hw_shutdown(skt); out_err_6: 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; }
int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) { int ret; skt->cs_state = dead_socket; setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event, (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; } /* * We initialize default socket timing here, because * we are not guaranteed to see a SetIOMap operation at * runtime. */ skt->ops->set_timing(skt); ret = soc_pcmcia_hw_init(skt); if (ret) goto out_err_6; 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->status = soc_common_pcmcia_skt_state(skt); #ifdef CONFIG_CPU_FREQ if (skt->ops->frequency_change) { skt->cpufreq_nb.notifier_call = soc_common_pcmcia_cpufreq_nb; ret = cpufreq_register_notifier(&skt->cpufreq_nb, CPUFREQ_TRANSITION_NOTIFIER); if (ret < 0) dev_err(skt->socket.dev.parent, "unable to register CPU frequency change notifier for PCMCIA (%d)\n", ret); } #endif ret = pcmcia_register_socket(&skt->socket); if (ret) goto out_err_7; ret = device_create_file(&skt->socket.dev, &dev_attr_status); if (ret) goto out_err_8; return ret; out_err_8: del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); out_err_7: soc_pcmcia_hw_shutdown(skt); out_err_6: 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; }