Lines Matching refs:skt

61 void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func,  in soc_pcmcia_debug()  argument
72 printk(KERN_DEBUG "skt%u: %s: %pV", skt->nr, func, &vaf); in soc_pcmcia_debug()
84 int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt, in soc_pcmcia_regulator_set() argument
102 dev_warn(&skt->socket.dev, in soc_pcmcia_regulator_set()
104 r == &skt->vcc ? "Vcc" : "Vpp", in soc_pcmcia_regulator_set()
134 void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket *skt, in soc_common_pcmcia_get_timing() argument
138 calc_speed(skt->spd_io, MAX_IO_WIN, SOC_PCMCIA_IO_ACCESS); in soc_common_pcmcia_get_timing()
140 calc_speed(skt->spd_mem, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); in soc_common_pcmcia_get_timing()
142 calc_speed(skt->spd_attr, MAX_WIN, SOC_PCMCIA_3V_MEM_ACCESS); in soc_common_pcmcia_get_timing()
146 static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt, in __soc_pcmcia_hw_shutdown() argument
152 if (skt->stat[i].irq) in __soc_pcmcia_hw_shutdown()
153 free_irq(skt->stat[i].irq, skt); in __soc_pcmcia_hw_shutdown()
155 if (skt->ops->hw_shutdown) in __soc_pcmcia_hw_shutdown()
156 skt->ops->hw_shutdown(skt); in __soc_pcmcia_hw_shutdown()
158 clk_disable_unprepare(skt->clk); in __soc_pcmcia_hw_shutdown()
161 static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_shutdown() argument
163 __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat)); in soc_pcmcia_hw_shutdown()
166 int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket *skt) in soc_pcmcia_request_gpiods() argument
168 struct device *dev = skt->socket.dev.parent; in soc_pcmcia_request_gpiods()
172 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { in soc_pcmcia_request_gpiods()
173 if (!skt->stat[i].name) in soc_pcmcia_request_gpiods()
176 desc = devm_gpiod_get(dev, skt->stat[i].name, GPIOD_IN); in soc_pcmcia_request_gpiods()
179 skt->stat[i].name, PTR_ERR(desc)); in soc_pcmcia_request_gpiods()
183 skt->stat[i].desc = desc; in soc_pcmcia_request_gpiods()
190 static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_init() argument
194 ret = clk_prepare_enable(skt->clk); in soc_pcmcia_hw_init()
198 if (skt->ops->hw_init) { in soc_pcmcia_hw_init()
199 ret = skt->ops->hw_init(skt); in soc_pcmcia_hw_init()
201 clk_disable_unprepare(skt->clk); in soc_pcmcia_hw_init()
206 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { in soc_pcmcia_hw_init()
207 if (gpio_is_valid(skt->stat[i].gpio)) { in soc_pcmcia_hw_init()
214 ret = devm_gpio_request_one(skt->socket.dev.parent, in soc_pcmcia_hw_init()
215 skt->stat[i].gpio, flags, in soc_pcmcia_hw_init()
216 skt->stat[i].name); in soc_pcmcia_hw_init()
218 __soc_pcmcia_hw_shutdown(skt, i); in soc_pcmcia_hw_init()
222 skt->stat[i].desc = gpio_to_desc(skt->stat[i].gpio); in soc_pcmcia_hw_init()
225 if (i < SOC_STAT_VS1 && skt->stat[i].desc) { in soc_pcmcia_hw_init()
226 int irq = gpiod_to_irq(skt->stat[i].desc); in soc_pcmcia_hw_init()
230 skt->socket.pci_irq = irq; in soc_pcmcia_hw_init()
232 skt->stat[i].irq = irq; in soc_pcmcia_hw_init()
236 if (skt->stat[i].irq) { in soc_pcmcia_hw_init()
237 ret = request_irq(skt->stat[i].irq, in soc_pcmcia_hw_init()
240 skt->stat[i].name, skt); in soc_pcmcia_hw_init()
242 __soc_pcmcia_hw_shutdown(skt, i); in soc_pcmcia_hw_init()
251 static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_enable() argument
255 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_hw_enable()
256 if (skt->stat[i].irq) { in soc_pcmcia_hw_enable()
257 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_RISING); in soc_pcmcia_hw_enable()
258 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_EDGE_BOTH); in soc_pcmcia_hw_enable()
262 static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket *skt) in soc_pcmcia_hw_disable() argument
266 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_hw_disable()
267 if (skt->stat[i].irq) in soc_pcmcia_hw_disable()
268 irq_set_irq_type(skt->stat[i].irq, IRQ_TYPE_NONE); in soc_pcmcia_hw_disable()
276 void soc_common_cf_socket_state(struct soc_pcmcia_socket *skt, in soc_common_cf_socket_state() argument
283 static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket *skt) in soc_common_pcmcia_skt_state() argument
294 if (skt->stat[SOC_STAT_CD].desc) in soc_common_pcmcia_skt_state()
295 state.detect = !!gpiod_get_value(skt->stat[SOC_STAT_CD].desc); in soc_common_pcmcia_skt_state()
296 if (skt->stat[SOC_STAT_RDY].desc) in soc_common_pcmcia_skt_state()
297 state.ready = !!gpiod_get_value(skt->stat[SOC_STAT_RDY].desc); in soc_common_pcmcia_skt_state()
298 if (skt->stat[SOC_STAT_BVD1].desc) in soc_common_pcmcia_skt_state()
299 state.bvd1 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD1].desc); in soc_common_pcmcia_skt_state()
300 if (skt->stat[SOC_STAT_BVD2].desc) in soc_common_pcmcia_skt_state()
301 state.bvd2 = !!gpiod_get_value(skt->stat[SOC_STAT_BVD2].desc); in soc_common_pcmcia_skt_state()
302 if (skt->stat[SOC_STAT_VS1].desc) in soc_common_pcmcia_skt_state()
303 state.vs_3v = !!gpiod_get_value(skt->stat[SOC_STAT_VS1].desc); in soc_common_pcmcia_skt_state()
304 if (skt->stat[SOC_STAT_VS2].desc) in soc_common_pcmcia_skt_state()
305 state.vs_Xv = !!gpiod_get_value(skt->stat[SOC_STAT_VS2].desc); in soc_common_pcmcia_skt_state()
307 skt->ops->socket_state(skt, &state); in soc_common_pcmcia_skt_state()
319 stat |= skt->cs_state.Vcc ? SS_POWERON : 0; in soc_common_pcmcia_skt_state()
321 if (skt->cs_state.flags & SS_IOCARD) in soc_common_pcmcia_skt_state()
339 struct soc_pcmcia_socket *skt, socket_state_t *state) in soc_common_pcmcia_config_skt() argument
343 ret = skt->ops->configure_socket(skt, state); in soc_common_pcmcia_config_skt()
346 skt->nr); in soc_common_pcmcia_config_skt()
348 WARN_ON(skt->ops->configure_socket(skt, &skt->cs_state)); in soc_common_pcmcia_config_skt()
357 if (skt->gpio_reset) { in soc_common_pcmcia_config_skt()
358 descs[n] = skt->gpio_reset; in soc_common_pcmcia_config_skt()
361 if (skt->gpio_bus_enable) { in soc_common_pcmcia_config_skt()
362 descs[n] = skt->gpio_bus_enable; in soc_common_pcmcia_config_skt()
373 if (skt->irq_state != 1 && state->io_irq) { in soc_common_pcmcia_config_skt()
374 skt->irq_state = 1; in soc_common_pcmcia_config_skt()
375 irq_set_irq_type(skt->socket.pci_irq, in soc_common_pcmcia_config_skt()
377 } else if (skt->irq_state == 1 && state->io_irq == 0) { in soc_common_pcmcia_config_skt()
378 skt->irq_state = 0; in soc_common_pcmcia_config_skt()
379 irq_set_irq_type(skt->socket.pci_irq, IRQ_TYPE_NONE); in soc_common_pcmcia_config_skt()
382 skt->cs_state = *state; in soc_common_pcmcia_config_skt()
399 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_sock_init() local
401 debug(skt, 2, "initializing socket\n"); in soc_common_pcmcia_sock_init()
402 if (skt->ops->socket_init) in soc_common_pcmcia_sock_init()
403 skt->ops->socket_init(skt); in soc_common_pcmcia_sock_init()
404 soc_pcmcia_hw_enable(skt); in soc_common_pcmcia_sock_init()
420 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_suspend() local
422 debug(skt, 2, "suspending socket\n"); in soc_common_pcmcia_suspend()
424 soc_pcmcia_hw_disable(skt); in soc_common_pcmcia_suspend()
425 if (skt->ops->socket_suspend) in soc_common_pcmcia_suspend()
426 skt->ops->socket_suspend(skt); in soc_common_pcmcia_suspend()
433 static void soc_common_check_status(struct soc_pcmcia_socket *skt) in soc_common_check_status() argument
437 debug(skt, 4, "entering PCMCIA monitoring thread\n"); in soc_common_check_status()
443 status = soc_common_pcmcia_skt_state(skt); in soc_common_check_status()
446 events = (status ^ skt->status) & skt->cs_state.csc_mask; in soc_common_check_status()
447 skt->status = status; in soc_common_check_status()
450 debug(skt, 4, "events: %s%s%s%s%s%s\n", in soc_common_check_status()
459 pcmcia_parse_events(&skt->socket, events); in soc_common_check_status()
466 struct soc_pcmcia_socket *skt = from_timer(skt, t, poll_timer); in soc_common_pcmcia_poll_event() local
467 debug(skt, 4, "polling for events\n"); in soc_common_pcmcia_poll_event()
469 mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD); in soc_common_pcmcia_poll_event()
471 soc_common_check_status(skt); in soc_common_pcmcia_poll_event()
485 struct soc_pcmcia_socket *skt = dev; in soc_common_pcmcia_interrupt() local
487 debug(skt, 3, "servicing IRQ %d\n", irq); in soc_common_pcmcia_interrupt()
489 soc_common_check_status(skt); in soc_common_pcmcia_interrupt()
513 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_get_status() local
515 skt->status = soc_common_pcmcia_skt_state(skt); in soc_common_pcmcia_get_status()
516 *status = skt->status; in soc_common_pcmcia_get_status()
532 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_socket() local
534 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()
549 return soc_common_pcmcia_config_skt(skt, state); in soc_common_pcmcia_set_socket()
564 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_io_map() local
567 debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n", in soc_common_pcmcia_set_io_map()
570 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", in soc_common_pcmcia_set_io_map()
593 skt->spd_io[map->map] = speed; in soc_common_pcmcia_set_io_map()
594 skt->ops->set_timing(skt); in soc_common_pcmcia_set_io_map()
600 map->stop += skt->socket.io_offset; in soc_common_pcmcia_set_io_map()
601 map->start = skt->socket.io_offset; in soc_common_pcmcia_set_io_map()
618 struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); in soc_common_pcmcia_set_mem_map() local
622 debug(skt, 2, "map %u speed %u card_start %08x\n", in soc_common_pcmcia_set_mem_map()
624 debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", in soc_common_pcmcia_set_mem_map()
645 res = &skt->res_attr; in soc_common_pcmcia_set_mem_map()
646 skt->spd_attr[map->map] = speed; in soc_common_pcmcia_set_mem_map()
647 skt->spd_mem[map->map] = 0; in soc_common_pcmcia_set_mem_map()
649 res = &skt->res_mem; in soc_common_pcmcia_set_mem_map()
650 skt->spd_attr[map->map] = 0; in soc_common_pcmcia_set_mem_map()
651 skt->spd_mem[map->map] = speed; in soc_common_pcmcia_set_mem_map()
654 skt->ops->set_timing(skt); in soc_common_pcmcia_set_mem_map()
709 struct soc_pcmcia_socket *skt = in show_status() local
713 p += sprintf(p, "slot : %d\n", skt->nr); in show_status()
715 dump_bits(&p, "status", skt->status, in show_status()
717 dump_bits(&p, "csc_mask", skt->cs_state.csc_mask, in show_status()
719 dump_bits(&p, "cs_flags", skt->cs_state.flags, in show_status()
722 p += sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc); in show_status()
723 p += sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp); in show_status()
724 p += sprintf(p, "IRQ : %d (%d)\n", skt->cs_state.io_irq, in show_status()
725 skt->socket.pci_irq); in show_status()
726 if (skt->ops->show_timing) in show_status()
727 p += skt->ops->show_timing(skt, p); in show_status()
748 struct soc_pcmcia_socket *skt = container_of(nb, struct soc_pcmcia_socket, cpufreq_nb); in soc_common_pcmcia_cpufreq_nb() local
751 return skt->ops->frequency_change(skt, val, freqs); in soc_common_pcmcia_cpufreq_nb()
755 void soc_pcmcia_init_one(struct soc_pcmcia_socket *skt, in soc_pcmcia_init_one() argument
760 skt->ops = ops; in soc_pcmcia_init_one()
761 skt->socket.owner = ops->owner; in soc_pcmcia_init_one()
762 skt->socket.dev.parent = dev; in soc_pcmcia_init_one()
763 skt->socket.pci_irq = NO_IRQ; in soc_pcmcia_init_one()
765 for (i = 0; i < ARRAY_SIZE(skt->stat); i++) in soc_pcmcia_init_one()
766 skt->stat[i].gpio = -EINVAL; in soc_pcmcia_init_one()
770 void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) in soc_pcmcia_remove_one() argument
772 del_timer_sync(&skt->poll_timer); in soc_pcmcia_remove_one()
774 pcmcia_unregister_socket(&skt->socket); in soc_pcmcia_remove_one()
777 if (skt->ops->frequency_change) in soc_pcmcia_remove_one()
778 cpufreq_unregister_notifier(&skt->cpufreq_nb, in soc_pcmcia_remove_one()
782 soc_pcmcia_hw_shutdown(skt); in soc_pcmcia_remove_one()
785 soc_common_pcmcia_config_skt(skt, &dead_socket); in soc_pcmcia_remove_one()
787 iounmap(skt->virt_io); in soc_pcmcia_remove_one()
788 skt->virt_io = NULL; in soc_pcmcia_remove_one()
789 release_resource(&skt->res_attr); in soc_pcmcia_remove_one()
790 release_resource(&skt->res_mem); in soc_pcmcia_remove_one()
791 release_resource(&skt->res_io); in soc_pcmcia_remove_one()
792 release_resource(&skt->res_skt); in soc_pcmcia_remove_one()
796 int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt) in soc_pcmcia_add_one() argument
800 skt->cs_state = dead_socket; in soc_pcmcia_add_one()
802 timer_setup(&skt->poll_timer, soc_common_pcmcia_poll_event, 0); in soc_pcmcia_add_one()
803 skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD; in soc_pcmcia_add_one()
805 ret = request_resource(&iomem_resource, &skt->res_skt); in soc_pcmcia_add_one()
809 ret = request_resource(&skt->res_skt, &skt->res_io); in soc_pcmcia_add_one()
813 ret = request_resource(&skt->res_skt, &skt->res_mem); in soc_pcmcia_add_one()
817 ret = request_resource(&skt->res_skt, &skt->res_attr); in soc_pcmcia_add_one()
821 skt->virt_io = ioremap(skt->res_io.start, 0x10000); in soc_pcmcia_add_one()
822 if (skt->virt_io == NULL) { in soc_pcmcia_add_one()
832 skt->ops->set_timing(skt); in soc_pcmcia_add_one()
834 ret = soc_pcmcia_hw_init(skt); in soc_pcmcia_add_one()
838 skt->socket.ops = &soc_common_pcmcia_operations; in soc_pcmcia_add_one()
839 skt->socket.features = SS_CAP_STATIC_MAP|SS_CAP_PCCARD; in soc_pcmcia_add_one()
840 skt->socket.resource_ops = &pccard_static_ops; in soc_pcmcia_add_one()
841 skt->socket.irq_mask = 0; in soc_pcmcia_add_one()
842 skt->socket.map_size = PAGE_SIZE; in soc_pcmcia_add_one()
843 skt->socket.io_offset = (unsigned long)skt->virt_io; in soc_pcmcia_add_one()
845 skt->status = soc_common_pcmcia_skt_state(skt); in soc_pcmcia_add_one()
848 if (skt->ops->frequency_change) { in soc_pcmcia_add_one()
849 skt->cpufreq_nb.notifier_call = soc_common_pcmcia_cpufreq_nb; in soc_pcmcia_add_one()
851 ret = cpufreq_register_notifier(&skt->cpufreq_nb, in soc_pcmcia_add_one()
854 dev_err(skt->socket.dev.parent, in soc_pcmcia_add_one()
860 ret = pcmcia_register_socket(&skt->socket); in soc_pcmcia_add_one()
864 ret = device_create_file(&skt->socket.dev, &dev_attr_status); in soc_pcmcia_add_one()
871 del_timer_sync(&skt->poll_timer); in soc_pcmcia_add_one()
872 pcmcia_unregister_socket(&skt->socket); in soc_pcmcia_add_one()
875 soc_pcmcia_hw_shutdown(skt); in soc_pcmcia_add_one()
877 iounmap(skt->virt_io); in soc_pcmcia_add_one()
879 release_resource(&skt->res_attr); in soc_pcmcia_add_one()
881 release_resource(&skt->res_mem); in soc_pcmcia_add_one()
883 release_resource(&skt->res_io); in soc_pcmcia_add_one()
885 release_resource(&skt->res_skt); in soc_pcmcia_add_one()