Lines Matching +full:vcc +full:- +full:env +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs.c -- Kernel Card Services - core services
75 struct device *dev = get_device(&skt->dev); in pcmcia_get_socket()
85 put_device(&skt->dev); in pcmcia_put_socket()
94 complete(&socket->socket_released); in pcmcia_release_socket()
100 * pcmcia_register_socket - add a new pcmcia socket device
108 if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops) in pcmcia_register_socket()
109 return -EINVAL; in pcmcia_register_socket()
111 dev_dbg(&socket->dev, "pcmcia_register_socket(0x%p)\n", socket->ops); in pcmcia_register_socket()
119 socket->sock = 0; in pcmcia_register_socket()
126 if (tmp->sock == i) in pcmcia_register_socket()
131 socket->sock = i - 1; in pcmcia_register_socket()
133 list_add_tail(&socket->socket_list, &pcmcia_socket_list); in pcmcia_register_socket()
141 socket->features &= ~SS_CAP_CARDBUS; in pcmcia_register_socket()
144 /* set proper values in socket->dev */ in pcmcia_register_socket()
145 dev_set_drvdata(&socket->dev, socket); in pcmcia_register_socket()
146 socket->dev.class = &pcmcia_socket_class; in pcmcia_register_socket()
147 dev_set_name(&socket->dev, "pcmcia_socket%u", socket->sock); in pcmcia_register_socket()
150 socket->cis_mem.flags = 0; in pcmcia_register_socket()
151 socket->cis_mem.speed = cis_speed; in pcmcia_register_socket()
153 INIT_LIST_HEAD(&socket->cis_cache); in pcmcia_register_socket()
155 init_completion(&socket->socket_released); in pcmcia_register_socket()
156 init_completion(&socket->thread_done); in pcmcia_register_socket()
157 mutex_init(&socket->skt_mutex); in pcmcia_register_socket()
158 mutex_init(&socket->ops_mutex); in pcmcia_register_socket()
159 spin_lock_init(&socket->thread_lock); in pcmcia_register_socket()
161 if (socket->resource_ops->init) { in pcmcia_register_socket()
162 mutex_lock(&socket->ops_mutex); in pcmcia_register_socket()
163 ret = socket->resource_ops->init(socket); in pcmcia_register_socket()
164 mutex_unlock(&socket->ops_mutex); in pcmcia_register_socket()
175 wait_for_completion(&socket->thread_done); in pcmcia_register_socket()
176 if (!socket->thread) { in pcmcia_register_socket()
177 dev_warn(&socket->dev, in pcmcia_register_socket()
179 return -EIO; in pcmcia_register_socket()
185 * Let's try to get the PCMCIA module for 16-bit PCMCIA support. in pcmcia_register_socket()
186 * If it fails, it doesn't matter -- we still have 32-bit CardBus in pcmcia_register_socket()
195 list_del(&socket->socket_list); in pcmcia_register_socket()
203 * pcmcia_unregister_socket - remove a pcmcia socket device
211 dev_dbg(&socket->dev, "pcmcia_unregister_socket(0x%p)\n", socket->ops); in pcmcia_unregister_socket()
213 if (socket->thread) in pcmcia_unregister_socket()
214 kthread_stop(socket->thread); in pcmcia_unregister_socket()
218 list_del(&socket->socket_list); in pcmcia_unregister_socket()
222 if (socket->resource_ops->exit) { in pcmcia_unregister_socket()
223 mutex_lock(&socket->ops_mutex); in pcmcia_unregister_socket()
224 socket->resource_ops->exit(socket); in pcmcia_unregister_socket()
225 mutex_unlock(&socket->ops_mutex); in pcmcia_unregister_socket()
227 wait_for_completion(&socket->socket_released); in pcmcia_unregister_socket()
238 if (s->sock == nr) { in pcmcia_get_socket_by_nr()
253 dev_dbg(&skt->dev, "reset\n"); in socket_reset()
255 skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET; in socket_reset()
256 skt->ops->set_socket(skt, &skt->socket); in socket_reset()
259 skt->socket.flags &= ~SS_RESET; in socket_reset()
260 skt->ops->set_socket(skt, &skt->socket); in socket_reset()
264 skt->ops->get_status(skt, &status); in socket_reset()
267 return -ENODEV; in socket_reset()
275 dev_err(&skt->dev, "time out after reset\n"); in socket_reset()
276 return -ETIMEDOUT; in socket_reset()
289 dev_dbg(&s->dev, "shutdown\n"); in socket_shutdown()
291 if (s->callback) in socket_shutdown()
292 s->callback->remove(s); in socket_shutdown()
294 mutex_lock(&s->ops_mutex); in socket_shutdown()
295 s->state &= SOCKET_INUSE | SOCKET_PRESENT; in socket_shutdown()
297 s->state &= SOCKET_INUSE; in socket_shutdown()
300 s->socket = dead_socket; in socket_shutdown()
301 s->ops->init(s); in socket_shutdown()
302 s->ops->set_socket(s, &s->socket); in socket_shutdown()
303 s->lock_count = 0; in socket_shutdown()
304 kfree(s->fake_cis); in socket_shutdown()
305 s->fake_cis = NULL; in socket_shutdown()
306 s->functions = 0; in socket_shutdown()
309 * pccardd thread) accesses this socket, and all (16-bit) in socket_shutdown()
311 * ops_mutex so that we don't get a sysfs-related lockdep in socket_shutdown()
314 mutex_unlock(&s->ops_mutex); in socket_shutdown()
323 s->ops->get_status(s, &status); in socket_shutdown()
325 dev_err(&s->dev, in socket_shutdown()
329 s->state &= ~SOCKET_INUSE; in socket_shutdown()
336 dev_dbg(&skt->dev, "setup\n"); in socket_setup()
338 skt->ops->get_status(skt, &status); in socket_setup()
340 return -ENODEV; in socket_setup()
345 skt->ops->get_status(skt, &status); in socket_setup()
347 return -ENODEV; in socket_setup()
356 dev_err(&skt->dev, "voltage interrogation timed out\n"); in socket_setup()
357 return -ETIMEDOUT; in socket_setup()
361 if (!(skt->features & SS_CAP_CARDBUS)) { in socket_setup()
362 dev_err(&skt->dev, "cardbus cards are not supported\n"); in socket_setup()
363 return -EINVAL; in socket_setup()
365 skt->state |= SOCKET_CARDBUS; in socket_setup()
367 skt->state &= ~SOCKET_CARDBUS; in socket_setup()
373 skt->socket.Vcc = skt->socket.Vpp = 33; in socket_setup()
375 skt->socket.Vcc = skt->socket.Vpp = 50; in socket_setup()
377 dev_err(&skt->dev, "unsupported voltage key\n"); in socket_setup()
378 return -EIO; in socket_setup()
381 if (skt->power_hook) in socket_setup()
382 skt->power_hook(skt, HOOK_POWER_PRE); in socket_setup()
384 skt->socket.flags = 0; in socket_setup()
385 skt->ops->set_socket(skt, &skt->socket); in socket_setup()
388 * Wait "vcc_settle" for the supply to stabilise. in socket_setup()
392 skt->ops->get_status(skt, &status); in socket_setup()
394 dev_err(&skt->dev, "unable to apply power\n"); in socket_setup()
395 return -EIO; in socket_setup()
400 if (skt->power_hook) in socket_setup()
401 skt->power_hook(skt, HOOK_POWER_POST); in socket_setup()
414 dev_dbg(&skt->dev, "insert\n"); in socket_insert()
416 mutex_lock(&skt->ops_mutex); in socket_insert()
417 if (skt->state & SOCKET_INUSE) { in socket_insert()
418 mutex_unlock(&skt->ops_mutex); in socket_insert()
419 return -EINVAL; in socket_insert()
421 skt->state |= SOCKET_INUSE; in socket_insert()
425 skt->state |= SOCKET_PRESENT; in socket_insert()
427 dev_notice(&skt->dev, "pccard: %s card inserted into slot %d\n", in socket_insert()
428 (skt->state & SOCKET_CARDBUS) ? "CardBus" : "PCMCIA", in socket_insert()
429 skt->sock); in socket_insert()
432 if (skt->state & SOCKET_CARDBUS) { in socket_insert()
434 skt->state |= SOCKET_CARDBUS_CONFIG; in socket_insert()
437 dev_dbg(&skt->dev, "insert done\n"); in socket_insert()
438 mutex_unlock(&skt->ops_mutex); in socket_insert()
440 if (!(skt->state & SOCKET_CARDBUS) && (skt->callback)) in socket_insert()
441 skt->callback->add(skt); in socket_insert()
443 mutex_unlock(&skt->ops_mutex); in socket_insert()
452 if ((skt->state & SOCKET_SUSPEND) && !(skt->state & SOCKET_IN_RESUME)) in socket_suspend()
453 return -EBUSY; in socket_suspend()
455 mutex_lock(&skt->ops_mutex); in socket_suspend()
457 if (!(skt->state & SOCKET_IN_RESUME)) in socket_suspend()
458 skt->suspended_state = skt->state; in socket_suspend()
460 skt->socket = dead_socket; in socket_suspend()
461 skt->ops->set_socket(skt, &skt->socket); in socket_suspend()
462 if (skt->ops->suspend) in socket_suspend()
463 skt->ops->suspend(skt); in socket_suspend()
464 skt->state |= SOCKET_SUSPEND; in socket_suspend()
465 skt->state &= ~SOCKET_IN_RESUME; in socket_suspend()
466 mutex_unlock(&skt->ops_mutex); in socket_suspend()
472 mutex_lock(&skt->ops_mutex); in socket_early_resume()
473 skt->socket = dead_socket; in socket_early_resume()
474 skt->ops->init(skt); in socket_early_resume()
475 skt->ops->set_socket(skt, &skt->socket); in socket_early_resume()
476 if (skt->state & SOCKET_PRESENT) in socket_early_resume()
477 skt->resume_status = socket_setup(skt, resume_delay); in socket_early_resume()
478 skt->state |= SOCKET_IN_RESUME; in socket_early_resume()
479 mutex_unlock(&skt->ops_mutex); in socket_early_resume()
487 mutex_lock(&skt->ops_mutex); in socket_late_resume()
488 skt->state &= ~(SOCKET_SUSPEND | SOCKET_IN_RESUME); in socket_late_resume()
489 mutex_unlock(&skt->ops_mutex); in socket_late_resume()
491 if (!(skt->state & SOCKET_PRESENT)) { in socket_late_resume()
493 if (ret == -ENODEV) in socket_late_resume()
498 if (skt->resume_status) { in socket_late_resume()
503 if (skt->suspended_state != skt->state) { in socket_late_resume()
504 dev_dbg(&skt->dev, in socket_late_resume()
506 skt->suspended_state, skt->state); in socket_late_resume()
512 if (!(skt->state & SOCKET_CARDBUS) && (skt->callback)) in socket_late_resume()
513 ret = skt->callback->early_resume(skt); in socket_late_resume()
526 if (skt->state & SOCKET_CARDBUS) { in socket_complete_resume()
529 * and re-add... */ in socket_complete_resume()
547 if (!(skt->state & SOCKET_SUSPEND)) in socket_resume()
548 return -EBUSY; in socket_resume()
559 dev_notice(&skt->dev, "pccard: card ejected from slot %d\n", skt->sock); in socket_remove()
569 * Some i82365-based systems send multiple SS_DETECT events during card
571 * will probably be true with GPIO-based card detection systems after
576 if (!(skt->state & SOCKET_SUSPEND)) { in socket_detect_change()
579 if (!(skt->state & SOCKET_PRESENT)) in socket_detect_change()
582 skt->ops->get_status(skt, &status); in socket_detect_change()
583 if ((skt->state & SOCKET_PRESENT) && in socket_detect_change()
586 if (!(skt->state & SOCKET_PRESENT) && in socket_detect_change()
597 skt->thread = current; in pccardd()
598 skt->socket = dead_socket; in pccardd()
599 skt->ops->init(skt); in pccardd()
600 skt->ops->set_socket(skt, &skt->socket); in pccardd()
603 ret = device_register(&skt->dev); in pccardd()
605 dev_warn(&skt->dev, "PCMCIA: unable to register socket\n"); in pccardd()
606 skt->thread = NULL; in pccardd()
607 complete(&skt->thread_done); in pccardd()
608 put_device(&skt->dev); in pccardd()
611 ret = pccard_sysfs_add_socket(&skt->dev); in pccardd()
613 dev_warn(&skt->dev, "err %d adding socket attributes\n", ret); in pccardd()
615 complete(&skt->thread_done); in pccardd()
626 spin_lock_irqsave(&skt->thread_lock, flags); in pccardd()
627 events = skt->thread_events; in pccardd()
628 skt->thread_events = 0; in pccardd()
629 sysfs_events = skt->sysfs_events; in pccardd()
630 skt->sysfs_events = 0; in pccardd()
631 spin_unlock_irqrestore(&skt->thread_lock, flags); in pccardd()
633 mutex_lock(&skt->skt_mutex); in pccardd()
643 !(skt->state & SOCKET_CARDBUS)) { in pccardd()
644 if (skt->callback) in pccardd()
645 ret = skt->callback->suspend(skt); in pccardd()
654 !(skt->state & SOCKET_CARDBUS)) { in pccardd()
656 if (!ret && skt->callback) in pccardd()
657 skt->callback->resume(skt); in pccardd()
660 !(skt->state & SOCKET_CARDBUS)) { in pccardd()
661 if (!ret && skt->callback) in pccardd()
662 skt->callback->requery(skt); in pccardd()
665 mutex_unlock(&skt->skt_mutex); in pccardd()
682 if (skt->state & SOCKET_PRESENT) { in pccardd()
683 mutex_lock(&skt->skt_mutex); in pccardd()
685 mutex_unlock(&skt->skt_mutex); in pccardd()
689 pccard_sysfs_remove_socket(&skt->dev); in pccardd()
690 device_unregister(&skt->dev); in pccardd()
702 dev_dbg(&s->dev, "parse_events: events %08x\n", events); in pcmcia_parse_events()
703 if (s->thread) { in pcmcia_parse_events()
704 spin_lock_irqsave(&s->thread_lock, flags); in pcmcia_parse_events()
705 s->thread_events |= events; in pcmcia_parse_events()
706 spin_unlock_irqrestore(&s->thread_lock, flags); in pcmcia_parse_events()
708 wake_up_process(s->thread); in pcmcia_parse_events()
714 * pcmcia_parse_uevents() - tell pccardd to issue manual commands
718 * userspace-issued insert, eject, suspend and resume commands must be
719 * handled by pccardd to avoid any sysfs-related deadlocks. Valid events
722 * and PCMCIA_UEVENT_REQUERY (for re-querying the PCMCIA card).
727 dev_dbg(&s->dev, "parse_uevents: events %08x\n", events); in pcmcia_parse_uevents()
728 if (s->thread) { in pcmcia_parse_uevents()
729 spin_lock_irqsave(&s->thread_lock, flags); in pcmcia_parse_uevents()
730 s->sysfs_events |= events; in pcmcia_parse_uevents()
731 spin_unlock_irqrestore(&s->thread_lock, flags); in pcmcia_parse_uevents()
733 wake_up_process(s->thread); in pcmcia_parse_uevents()
744 /* s->skt_mutex also protects s->callback */ in pccard_register_pcmcia()
745 mutex_lock(&s->skt_mutex); in pccard_register_pcmcia()
749 if (s->callback) { in pccard_register_pcmcia()
750 ret = -EBUSY; in pccard_register_pcmcia()
754 s->callback = c; in pccard_register_pcmcia()
756 if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT) in pccard_register_pcmcia()
757 s->callback->add(s); in pccard_register_pcmcia()
759 s->callback = NULL; in pccard_register_pcmcia()
761 mutex_unlock(&s->skt_mutex); in pccard_register_pcmcia()
769 * but for now, it uses the low-level interface's reset, not the
777 dev_dbg(&skt->dev, "resetting socket\n"); in pcmcia_reset_card()
779 mutex_lock(&skt->skt_mutex); in pcmcia_reset_card()
781 if (!(skt->state & SOCKET_PRESENT)) { in pcmcia_reset_card()
782 dev_dbg(&skt->dev, "can't reset, not present\n"); in pcmcia_reset_card()
783 ret = -ENODEV; in pcmcia_reset_card()
786 if (skt->state & SOCKET_SUSPEND) { in pcmcia_reset_card()
787 dev_dbg(&skt->dev, "can't reset, suspended\n"); in pcmcia_reset_card()
788 ret = -EBUSY; in pcmcia_reset_card()
791 if (skt->state & SOCKET_CARDBUS) { in pcmcia_reset_card()
792 dev_dbg(&skt->dev, "can't reset, is cardbus\n"); in pcmcia_reset_card()
793 ret = -EPERM; in pcmcia_reset_card()
797 if (skt->callback) in pcmcia_reset_card()
798 skt->callback->suspend(skt); in pcmcia_reset_card()
799 mutex_lock(&skt->ops_mutex); in pcmcia_reset_card()
801 mutex_unlock(&skt->ops_mutex); in pcmcia_reset_card()
802 if ((ret == 0) && (skt->callback)) in pcmcia_reset_card()
803 skt->callback->resume(skt); in pcmcia_reset_card()
807 mutex_unlock(&skt->skt_mutex); in pcmcia_reset_card()
815 struct kobj_uevent_env *env) in pcmcia_socket_uevent() argument
819 if (add_uevent_var(env, "SOCKET_NO=%u", s->sock)) in pcmcia_socket_uevent()
820 return -ENOMEM; in pcmcia_socket_uevent()
842 mutex_lock(&s->skt_mutex); in __pcmcia_pm_op()
844 mutex_unlock(&s->skt_mutex); in __pcmcia_pm_op()