Lines Matching refs:skt
59 void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func, in soc_pcmcia_debug() argument
70 printk(KERN_DEBUG "skt%u: %s: %pV", skt->nr, func, &vaf); in soc_pcmcia_debug()
97 void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt, in soc_common_pcmcia_get_timing() argument
101 calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS); in soc_common_pcmcia_get_timing()
103 calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); in soc_common_pcmcia_get_timing()
105 calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); in soc_common_pcmcia_get_timing()
109 static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt, in __soc_pcmcia_hw_shutdown() argument
115 if (skt->stat[i].irq) in __soc_pcmcia_hw_shutdown()
116 free_irq(skt->stat[i].irq, skt); in __soc_pcmcia_hw_shutdown()
117 if (gpio_is_valid(skt->stat[i].gpio)) in __soc_pcmcia_hw_shutdown()
118 gpio_free(skt->stat[i].gpio); in __soc_pcmcia_hw_shutdown()
121 if (skt->ops->hw_shutdown) in __soc_pcmcia_hw_shutdown()
122 skt->ops->hw_shutdown(skt); in __soc_pcmcia_hw_shutdown()
125 static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_shutdown() argument
127 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat)); in soc_pcmcia_hw_shutdown()
130 static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_init() argument
134 if (skt->ops->hw_init) { in soc_pcmcia_hw_init()
135 ret = skt->ops->hw_init(skt); in soc_pcmcia_hw_init()
140 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { in soc_pcmcia_hw_init()
141 if (gpio_is_valid(skt->stat[i].gpio)) { in soc_pcmcia_hw_init()
144 ret = gpio_request_one(skt->stat[i].gpio, GPIOF_IN, in soc_pcmcia_hw_init()
145 skt->stat[i].name); in soc_pcmcia_hw_init()
147 __soc_pcmcia_hw_shutdown(skt, i); in soc_pcmcia_hw_init()
151 irq = gpio_to_irq(skt->stat[i].gpio); in soc_pcmcia_hw_init()
154 skt->socket.pci_irq = irq; in soc_pcmcia_hw_init()
156 skt->stat[i].irq = irq; in soc_pcmcia_hw_init()
159 if (skt->stat[i].irq) { in soc_pcmcia_hw_init()
160 ret = request_irq(skt->stat[i].irq, in soc_pcmcia_hw_init()
163 skt->stat[i].name, skt); in soc_pcmcia_hw_init()
165 if (gpio_is_valid(skt->stat[i].gpio)) in soc_pcmcia_hw_init()
166 gpio_free(skt->stat[i].gpio); in soc_pcmcia_hw_init()
167 __soc_pcmcia_hw_shutdown(skt, i); in soc_pcmcia_hw_init()
176 static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_enable() argument
180 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_hw_enable()
181 if (skt->stat[i].irq) { in soc_pcmcia_hw_enable()
182 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_RISING); in soc_pcmcia_hw_enable()
183 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_BOTH); in soc_pcmcia_hw_enable()
187 static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_disable() argument
191 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_hw_disable()
192 if (skt->stat[i].irq) in soc_pcmcia_hw_disable()
193 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE); in soc_pcmcia_hw_disable()
196 static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt) in soc_common_pcmcia_skt_state() argument
208 if (gpio_is_valid(skt->stat[SOC_STAT_CD].gpio)) in soc_common_pcmcia_skt_state()
209 state.detect = !gpio_get_value(skt->stat[SOC_STAT_CD].gpio); in soc_common_pcmcia_skt_state()
212 if (gpio_is_valid(skt->stat[SOC_STAT_RDY].gpio)) in soc_common_pcmcia_skt_state()
213 state.ready = !!gpio_get_value(skt->stat[SOC_STAT_RDY].gpio); in soc_common_pcmcia_skt_state()
214 if (gpio_is_valid(skt->stat[SOC_STAT_BVD1].gpio)) in soc_common_pcmcia_skt_state()
215 state.bvd1 = !!gpio_get_value(skt->stat[SOC_STAT_BVD1].gpio); in soc_common_pcmcia_skt_state()
216 if (gpio_is_valid(skt->stat[SOC_STAT_BVD2].gpio)) in soc_common_pcmcia_skt_state()
217 state.bvd2 = !!gpio_get_value(skt->stat[SOC_STAT_BVD2].gpio); in soc_common_pcmcia_skt_state()
219 skt->ops->socket_state(skt, &state); in soc_common_pcmcia_skt_state()
231 stat |= skt->cs_state.Vcc ? SS_POWERON : 0; in soc_common_pcmcia_skt_state()
233 if (skt->cs_state.flags & SS_IOCARD) in soc_common_pcmcia_skt_state()
251 struct soc_pcmcia_socket *skt, socket_state_t *state) in soc_common_pcmcia_config_skt() argument
255 ret = skt->ops->configure_socket(skt, state); in soc_common_pcmcia_config_skt()
261 if (skt->irq_state != 1 && state->io_irq) { in soc_common_pcmcia_config_skt()
262 skt->irq_state = 1; in soc_common_pcmcia_config_skt()
263 irq_set_irq_type(skt->socket.pci_irq, in soc_common_pcmcia_config_skt()
265 } else if (skt->irq_state == 1 && state->io_irq == 0) { in soc_common_pcmcia_config_skt()
266 skt->irq_state = 0; in soc_common_pcmcia_config_skt()
267 irq_set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE); in soc_common_pcmcia_config_skt()
270 skt->cs_state = *state; in soc_common_pcmcia_config_skt()
275 "socket %d\n", skt->nr); in soc_common_pcmcia_config_skt()
291 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_sock_init() local
293 debug(skt, 2, "initializing socket\n"); in soc_common_pcmcia_sock_init()
294 if (skt->ops->socket_init) in soc_common_pcmcia_sock_init()
295 skt->ops->socket_init(skt); in soc_common_pcmcia_sock_init()
296 soc_pcmcia_hw_enable(skt); in soc_common_pcmcia_sock_init()
312 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_suspend() local
314 debug(skt, 2, "suspending socket\n"); in soc_common_pcmcia_suspend()
316 soc_pcmcia_hw_disable(skt); in soc_common_pcmcia_suspend()
317 if (skt->ops->socket_suspend) in soc_common_pcmcia_suspend()
318 skt->ops->socket_suspend(skt); in soc_common_pcmcia_suspend()
325 static void soc_common_check_status(struct soc_pcmcia_socket *skt) in soc_common_check_status() argument
329 debug(skt, 4, "entering PCMCIA monitoring thread\n"); in soc_common_check_status()
335 status = soc_common_pcmcia_skt_state(skt); in soc_common_check_status()
338 events = (status ^ skt->status) & skt->cs_state.csc_mask; in soc_common_check_status()
339 skt->status = status; in soc_common_check_status()
342 debug(skt, 4, "events: %s%s%s%s%s%s\n", in soc_common_check_status()
351 pcmcia_parse_events(&skt->socket, events); in soc_common_check_status()
358 struct soc_pcmcia_socket *skt = (struct soc_pcmcia_socket *)dummy; in soc_common_pcmcia_poll_event() local
359 debug(skt, 4, "polling for events\n"); in soc_common_pcmcia_poll_event()
361 mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD); in soc_common_pcmcia_poll_event()
363 soc_common_check_status(skt); in soc_common_pcmcia_poll_event()
377 struct soc_pcmcia_socket *skt = dev; in soc_common_pcmcia_interrupt() local
379 debug(skt, 3, "servicing IRQ %d\n", irq); in soc_common_pcmcia_interrupt()
381 soc_common_check_status(skt); in soc_common_pcmcia_interrupt()
405 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_get_status() local
407 skt->status = soc_common_pcmcia_skt_state(skt); in soc_common_pcmcia_get_status()
408 *status = skt->status; in soc_common_pcmcia_get_status()
424 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_socket() local
426 debug(skt, 2, "mask: %s%s%s%s%s%s flags: %s%s%s%s%s%s Vcc %d Vpp %d irq %d\n", in soc_common_pcmcia_set_socket()
441 return soc_common_pcmcia_config_skt(skt, state); in soc_common_pcmcia_set_socket()
456 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_io_map() local
459 debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n", in soc_common_pcmcia_set_io_map()
462 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", in soc_common_pcmcia_set_io_map()
485 skt->spd_io[map->map] = speed; in soc_common_pcmcia_set_io_map()
486 skt->ops->set_timing(skt); in soc_common_pcmcia_set_io_map()
492 map->stop += skt->socket.io_offset; in soc_common_pcmcia_set_io_map()
493 map->start = skt->socket.io_offset; in soc_common_pcmcia_set_io_map()
510 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_mem_map() local
514 debug(skt, 2, "map %u speed %u card_start %08x\n", in soc_common_pcmcia_set_mem_map()
516 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", in soc_common_pcmcia_set_mem_map()
537 res = &skt->res_attr; in soc_common_pcmcia_set_mem_map()
538 skt->spd_attr[map->map] = speed; in soc_common_pcmcia_set_mem_map()
539 skt->spd_mem[map->map] = 0; in soc_common_pcmcia_set_mem_map()
541 res = &skt->res_mem; in soc_common_pcmcia_set_mem_map()
542 skt->spd_attr[map->map] = 0; in soc_common_pcmcia_set_mem_map()
543 skt->spd_mem[map->map] = speed; in soc_common_pcmcia_set_mem_map()
546 skt->ops->set_timing(skt); in soc_common_pcmcia_set_mem_map()
601 struct soc_pcmcia_socket *skt = in show_status() local
605 p += sprintf(p, "slot : %d\n", skt->nr); in show_status()
607 dump_bits(&p, "status", skt->status, in show_status()
609 dump_bits(&p, "csc_mask", skt->cs_state.csc_mask, in show_status()
611 dump_bits(&p, "cs_flags", skt->cs_state.flags, in show_status()
614 p += sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc); in show_status()
615 p += sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp); in show_status()
616 p += sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq, in show_status()
617 skt->socket.pci_irq); in show_status()
618 if (skt->ops->show_timing) in show_status()
619 p += skt->ops->show_timing(skt, p); in show_status()
643 struct soc_pcmcia_socket *skt; in soc_pcmcia_notifier() local
648 list_for_each_entry(skt, &soc_pcmcia_sockets, node) in soc_pcmcia_notifier()
649 if (skt->ops->frequency_change) in soc_pcmcia_notifier()
650 ret += skt->ops->frequency_change(skt, val, freqs); in soc_pcmcia_notifier()
682 void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt, in soc_pcmcia_init_one() argument
687 skt->ops = ops; in soc_pcmcia_init_one()
688 skt->socket.owner = ops->owner; in soc_pcmcia_init_one()
689 skt->socket.dev.parent = dev; in soc_pcmcia_init_one()
690 skt->socket.pci_irq = NO_IRQ; in soc_pcmcia_init_one()
692 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_init_one()
693 skt->stat[i].gpio = -EINVAL; in soc_pcmcia_init_one()
697 void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) in soc_pcmcia_remove_one() argument
700 del_timer_sync(&skt->poll_timer); in soc_pcmcia_remove_one()
702 pcmcia_unregister_socket(&skt->socket); in soc_pcmcia_remove_one()
704 soc_pcmcia_hw_shutdown(skt); in soc_pcmcia_remove_one()
707 soc_common_pcmcia_config_skt(skt, &dead_socket); in soc_pcmcia_remove_one()
709 list_del(&skt->node); in soc_pcmcia_remove_one()
712 iounmap(skt->virt_io); in soc_pcmcia_remove_one()
713 skt->virt_io = NULL; in soc_pcmcia_remove_one()
714 release_resource(&skt->res_attr); in soc_pcmcia_remove_one()
715 release_resource(&skt->res_mem); in soc_pcmcia_remove_one()
716 release_resource(&skt->res_io); in soc_pcmcia_remove_one()
717 release_resource(&skt->res_skt); in soc_pcmcia_remove_one()
721 int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) in soc_pcmcia_add_one() argument
725 init_timer(&skt->poll_timer); in soc_pcmcia_add_one()
726 skt->poll_timer.function = soc_common_pcmcia_poll_event; in soc_pcmcia_add_one()
727 skt->poll_timer.data = (unsigned long)skt; in soc_pcmcia_add_one()
728 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD; in soc_pcmcia_add_one()
730 ret = request_resource(&iomem_resource, &skt->res_skt); in soc_pcmcia_add_one()
734 ret = request_resource(&skt->res_skt, &skt->res_io); in soc_pcmcia_add_one()
738 ret = request_resource(&skt->res_skt, &skt->res_mem); in soc_pcmcia_add_one()
742 ret = request_resource(&skt->res_skt, &skt->res_attr); in soc_pcmcia_add_one()
746 skt->virt_io = ioremap(skt->res_io.start, 0x10000); in soc_pcmcia_add_one()
747 if (skt->virt_io == NULL) { in soc_pcmcia_add_one()
754 list_add(&skt->node, &soc_pcmcia_sockets); in soc_pcmcia_add_one()
761 skt->ops->set_timing(skt); in soc_pcmcia_add_one()
763 ret = soc_pcmcia_hw_init(skt); in soc_pcmcia_add_one()
767 skt->socket.ops = &soc_common_pcmcia_operations; in soc_pcmcia_add_one()
768 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD; in soc_pcmcia_add_one()
769 skt->socket.resource_ops = &pccard_static_ops; in soc_pcmcia_add_one()
770 skt->socket.irq_mask = 0; in soc_pcmcia_add_one()
771 skt->socket.map_size = PAGE_SIZE; in soc_pcmcia_add_one()
772 skt->socket.io_offset = (unsigned long)skt->virt_io; in soc_pcmcia_add_one()
774 skt->status = soc_common_pcmcia_skt_state(skt); in soc_pcmcia_add_one()
776 ret = pcmcia_register_socket(&skt->socket); in soc_pcmcia_add_one()
780 add_timer(&skt->poll_timer); in soc_pcmcia_add_one()
784 ret = device_create_file(&skt->socket.dev, &dev_attr_status); in soc_pcmcia_add_one()
792 del_timer_sync(&skt->poll_timer); in soc_pcmcia_add_one()
793 pcmcia_unregister_socket(&skt->socket); in soc_pcmcia_add_one()
796 soc_pcmcia_hw_shutdown(skt); in soc_pcmcia_add_one()
798 list_del(&skt->node); in soc_pcmcia_add_one()
800 iounmap(skt->virt_io); in soc_pcmcia_add_one()
802 release_resource(&skt->res_attr); in soc_pcmcia_add_one()
804 release_resource(&skt->res_mem); in soc_pcmcia_add_one()
806 release_resource(&skt->res_io); in soc_pcmcia_add_one()
808 release_resource(&skt->res_skt); in soc_pcmcia_add_one()