linux/drivers/pcmcia/cs.c
<<
>>
Prefs
   1/*
   2 * cs.c -- Kernel Card Services - core services
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * The initial developer of the original code is David A. Hinds
   9 * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
  10 * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
  11 *
  12 * (C) 1999             David A. Hinds
  13 */
  14
  15#include <linux/module.h>
  16#include <linux/moduleparam.h>
  17#include <linux/init.h>
  18#include <linux/kernel.h>
  19#include <linux/string.h>
  20#include <linux/major.h>
  21#include <linux/errno.h>
  22#include <linux/slab.h>
  23#include <linux/mm.h>
  24#include <linux/interrupt.h>
  25#include <linux/timer.h>
  26#include <linux/ioport.h>
  27#include <linux/delay.h>
  28#include <linux/pm.h>
  29#include <linux/device.h>
  30#include <linux/kthread.h>
  31#include <linux/freezer.h>
  32#include <asm/system.h>
  33#include <asm/irq.h>
  34
  35#include <pcmcia/cs_types.h>
  36#include <pcmcia/ss.h>
  37#include <pcmcia/cs.h>
  38#include <pcmcia/cistpl.h>
  39#include <pcmcia/cisreg.h>
  40#include <pcmcia/ds.h>
  41#include "cs_internal.h"
  42
  43
  44/* Module parameters */
  45
  46MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
  47MODULE_DESCRIPTION("Linux Kernel Card Services");
  48MODULE_LICENSE("GPL");
  49
  50#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
  51
  52INT_MODULE_PARM(setup_delay,    10);            /* centiseconds */
  53INT_MODULE_PARM(resume_delay,   20);            /* centiseconds */
  54INT_MODULE_PARM(shutdown_delay, 3);             /* centiseconds */
  55INT_MODULE_PARM(vcc_settle,     40);            /* centiseconds */
  56INT_MODULE_PARM(reset_time,     10);            /* usecs */
  57INT_MODULE_PARM(unreset_delay,  10);            /* centiseconds */
  58INT_MODULE_PARM(unreset_check,  10);            /* centiseconds */
  59INT_MODULE_PARM(unreset_limit,  30);            /* unreset_check's */
  60
  61/* Access speed for attribute memory windows */
  62INT_MODULE_PARM(cis_speed,      300);           /* ns */
  63
  64#ifdef CONFIG_PCMCIA_DEBUG
  65static int pc_debug;
  66
  67module_param(pc_debug, int, 0644);
  68
  69int cs_debug_level(int level)
  70{
  71        return pc_debug > level;
  72}
  73#endif
  74
  75
  76socket_state_t dead_socket = {
  77        .csc_mask       = SS_DETECT,
  78};
  79EXPORT_SYMBOL(dead_socket);
  80
  81
  82/* List of all sockets, protected by a rwsem */
  83LIST_HEAD(pcmcia_socket_list);
  84EXPORT_SYMBOL(pcmcia_socket_list);
  85
  86DECLARE_RWSEM(pcmcia_socket_list_rwsem);
  87EXPORT_SYMBOL(pcmcia_socket_list_rwsem);
  88
  89
  90/*
  91 * Low-level PCMCIA socket drivers need to register with the PCCard
  92 * core using pcmcia_register_socket.
  93 *
  94 * socket drivers are expected to use the following callbacks in their
  95 * .drv struct:
  96 *  - pcmcia_socket_dev_suspend
  97 *  - pcmcia_socket_dev_resume
  98 * These functions check for the appropriate struct pcmcia_soket arrays,
  99 * and pass them to the low-level functions pcmcia_{suspend,resume}_socket
 100 */
 101static int socket_resume(struct pcmcia_socket *skt);
 102static int socket_suspend(struct pcmcia_socket *skt);
 103
 104int pcmcia_socket_dev_suspend(struct device *dev, pm_message_t state)
 105{
 106        struct pcmcia_socket *socket;
 107
 108        down_read(&pcmcia_socket_list_rwsem);
 109        list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
 110                if (socket->dev.parent != dev)
 111                        continue;
 112                mutex_lock(&socket->skt_mutex);
 113                socket_suspend(socket);
 114                mutex_unlock(&socket->skt_mutex);
 115        }
 116        up_read(&pcmcia_socket_list_rwsem);
 117
 118        return 0;
 119}
 120EXPORT_SYMBOL(pcmcia_socket_dev_suspend);
 121
 122int pcmcia_socket_dev_resume(struct device *dev)
 123{
 124        struct pcmcia_socket *socket;
 125
 126        down_read(&pcmcia_socket_list_rwsem);
 127        list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
 128                if (socket->dev.parent != dev)
 129                        continue;
 130                mutex_lock(&socket->skt_mutex);
 131                socket_resume(socket);
 132                mutex_unlock(&socket->skt_mutex);
 133        }
 134        up_read(&pcmcia_socket_list_rwsem);
 135
 136        return 0;
 137}
 138EXPORT_SYMBOL(pcmcia_socket_dev_resume);
 139
 140
 141struct pcmcia_socket * pcmcia_get_socket(struct pcmcia_socket *skt)
 142{
 143        struct device *dev = get_device(&skt->dev);
 144        if (!dev)
 145                return NULL;
 146        skt = dev_get_drvdata(dev);
 147        if (!try_module_get(skt->owner)) {
 148                put_device(&skt->dev);
 149                return NULL;
 150        }
 151        return (skt);
 152}
 153EXPORT_SYMBOL(pcmcia_get_socket);
 154
 155
 156void pcmcia_put_socket(struct pcmcia_socket *skt)
 157{
 158        module_put(skt->owner);
 159        put_device(&skt->dev);
 160}
 161EXPORT_SYMBOL(pcmcia_put_socket);
 162
 163
 164static void pcmcia_release_socket(struct device *dev)
 165{
 166        struct pcmcia_socket *socket = dev_get_drvdata(dev);
 167
 168        complete(&socket->socket_released);
 169}
 170
 171static int pccardd(void *__skt);
 172
 173/**
 174 * pcmcia_register_socket - add a new pcmcia socket device
 175 * @socket: the &socket to register
 176 */
 177int pcmcia_register_socket(struct pcmcia_socket *socket)
 178{
 179        struct task_struct *tsk;
 180        int ret;
 181
 182        if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops)
 183                return -EINVAL;
 184
 185        cs_dbg(socket, 0, "pcmcia_register_socket(0x%p)\n", socket->ops);
 186
 187        spin_lock_init(&socket->lock);
 188
 189        /* try to obtain a socket number [yes, it gets ugly if we
 190         * register more than 2^sizeof(unsigned int) pcmcia
 191         * sockets... but the socket number is deprecated
 192         * anyways, so I don't care] */
 193        down_write(&pcmcia_socket_list_rwsem);
 194        if (list_empty(&pcmcia_socket_list))
 195                socket->sock = 0;
 196        else {
 197                unsigned int found, i = 1;
 198                struct pcmcia_socket *tmp;
 199                do {
 200                        found = 1;
 201                        list_for_each_entry(tmp, &pcmcia_socket_list, socket_list) {
 202                                if (tmp->sock == i)
 203                                        found = 0;
 204                        }
 205                        i++;
 206                } while (!found);
 207                socket->sock = i - 1;
 208        }
 209        list_add_tail(&socket->socket_list, &pcmcia_socket_list);
 210        up_write(&pcmcia_socket_list_rwsem);
 211
 212#ifndef CONFIG_CARDBUS
 213        /*
 214         * If we do not support Cardbus, ensure that
 215         * the Cardbus socket capability is disabled.
 216         */
 217        socket->features &= ~SS_CAP_CARDBUS;
 218#endif
 219
 220        /* set proper values in socket->dev */
 221        dev_set_drvdata(&socket->dev, socket);
 222        socket->dev.class = &pcmcia_socket_class;
 223        dev_set_name(&socket->dev, "pcmcia_socket%u", socket->sock);
 224
 225        /* base address = 0, map = 0 */
 226        socket->cis_mem.flags = 0;
 227        socket->cis_mem.speed = cis_speed;
 228
 229        INIT_LIST_HEAD(&socket->cis_cache);
 230
 231        init_completion(&socket->socket_released);
 232        init_completion(&socket->thread_done);
 233        mutex_init(&socket->skt_mutex);
 234        spin_lock_init(&socket->thread_lock);
 235
 236        if (socket->resource_ops->init) {
 237                ret = socket->resource_ops->init(socket);
 238                if (ret)
 239                        goto err;
 240        }
 241
 242        tsk = kthread_run(pccardd, socket, "pccardd");
 243        if (IS_ERR(tsk)) {
 244                ret = PTR_ERR(tsk);
 245                goto err;
 246        }
 247
 248        wait_for_completion(&socket->thread_done);
 249        if (!socket->thread) {
 250                dev_printk(KERN_WARNING, &socket->dev,
 251                           "PCMCIA: warning: socket thread did not start\n");
 252                return -EIO;
 253        }
 254
 255        pcmcia_parse_events(socket, SS_DETECT);
 256
 257        return 0;
 258
 259 err:
 260        down_write(&pcmcia_socket_list_rwsem);
 261        list_del(&socket->socket_list);
 262        up_write(&pcmcia_socket_list_rwsem);
 263        return ret;
 264} /* pcmcia_register_socket */
 265EXPORT_SYMBOL(pcmcia_register_socket);
 266
 267
 268/**
 269 * pcmcia_unregister_socket - remove a pcmcia socket device
 270 * @socket: the &socket to unregister
 271 */
 272void pcmcia_unregister_socket(struct pcmcia_socket *socket)
 273{
 274        if (!socket)
 275                return;
 276
 277        cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
 278
 279        if (socket->thread)
 280                kthread_stop(socket->thread);
 281
 282        release_cis_mem(socket);
 283
 284        /* remove from our own list */
 285        down_write(&pcmcia_socket_list_rwsem);
 286        list_del(&socket->socket_list);
 287        up_write(&pcmcia_socket_list_rwsem);
 288
 289        /* wait for sysfs to drop all references */
 290        release_resource_db(socket);
 291        wait_for_completion(&socket->socket_released);
 292} /* pcmcia_unregister_socket */
 293EXPORT_SYMBOL(pcmcia_unregister_socket);
 294
 295
 296struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr)
 297{
 298        struct pcmcia_socket *s;
 299
 300        down_read(&pcmcia_socket_list_rwsem);
 301        list_for_each_entry(s, &pcmcia_socket_list, socket_list)
 302                if (s->sock == nr) {
 303                        up_read(&pcmcia_socket_list_rwsem);
 304                        return s;
 305                }
 306        up_read(&pcmcia_socket_list_rwsem);
 307
 308        return NULL;
 309
 310}
 311EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
 312
 313/*
 314 * The central event handler.  Send_event() sends an event to the
 315 * 16-bit subsystem, which then calls the relevant device drivers.
 316 * Parse_events() interprets the event bits from
 317 * a card status change report.  Do_shutdown() handles the high
 318 * priority stuff associated with a card removal.
 319 */
 320
 321/* NOTE: send_event needs to be called with skt->sem held. */
 322
 323static int send_event(struct pcmcia_socket *s, event_t event, int priority)
 324{
 325        int ret;
 326
 327        if (s->state & SOCKET_CARDBUS)
 328                return 0;
 329
 330        cs_dbg(s, 1, "send_event(event %d, pri %d, callback 0x%p)\n",
 331           event, priority, s->callback);
 332
 333        if (!s->callback)
 334                return 0;
 335        if (!try_module_get(s->callback->owner))
 336                return 0;
 337
 338        ret = s->callback->event(s, event, priority);
 339
 340        module_put(s->callback->owner);
 341
 342        return ret;
 343}
 344
 345static void socket_remove_drivers(struct pcmcia_socket *skt)
 346{
 347        cs_dbg(skt, 4, "remove_drivers\n");
 348
 349        send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
 350}
 351
 352static int socket_reset(struct pcmcia_socket *skt)
 353{
 354        int status, i;
 355
 356        cs_dbg(skt, 4, "reset\n");
 357
 358        skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
 359        skt->ops->set_socket(skt, &skt->socket);
 360        udelay((long)reset_time);
 361
 362        skt->socket.flags &= ~SS_RESET;
 363        skt->ops->set_socket(skt, &skt->socket);
 364
 365        msleep(unreset_delay * 10);
 366        for (i = 0; i < unreset_limit; i++) {
 367                skt->ops->get_status(skt, &status);
 368
 369                if (!(status & SS_DETECT))
 370                        return -ENODEV;
 371
 372                if (status & SS_READY)
 373                        return 0;
 374
 375                msleep(unreset_check * 10);
 376        }
 377
 378        cs_err(skt, "time out after reset.\n");
 379        return -ETIMEDOUT;
 380}
 381
 382/*
 383 * socket_setup() and socket_shutdown() are called by the main event handler
 384 * when card insertion and removal events are received.
 385 * socket_setup() turns on socket power and resets the socket, in two stages.
 386 * socket_shutdown() unconfigures a socket and turns off socket power.
 387 */
 388static void socket_shutdown(struct pcmcia_socket *s)
 389{
 390        int status;
 391
 392        cs_dbg(s, 4, "shutdown\n");
 393
 394        socket_remove_drivers(s);
 395        s->state &= SOCKET_INUSE | SOCKET_PRESENT;
 396        msleep(shutdown_delay * 10);
 397        s->state &= SOCKET_INUSE;
 398
 399        /* Blank out the socket state */
 400        s->socket = dead_socket;
 401        s->ops->init(s);
 402        s->ops->set_socket(s, &s->socket);
 403        s->irq.AssignedIRQ = s->irq.Config = 0;
 404        s->lock_count = 0;
 405        destroy_cis_cache(s);
 406#ifdef CONFIG_CARDBUS
 407        cb_free(s);
 408#endif
 409        s->functions = 0;
 410
 411        /* give socket some time to power down */
 412        msleep(100);
 413
 414        s->ops->get_status(s, &status);
 415        if (status & SS_POWERON) {
 416                dev_printk(KERN_ERR, &s->dev,
 417                           "*** DANGER *** unable to remove socket power\n");
 418        }
 419
 420        cs_socket_put(s);
 421}
 422
 423static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
 424{
 425        int status, i;
 426
 427        cs_dbg(skt, 4, "setup\n");
 428
 429        skt->ops->get_status(skt, &status);
 430        if (!(status & SS_DETECT))
 431                return -ENODEV;
 432
 433        msleep(initial_delay * 10);
 434
 435        for (i = 0; i < 100; i++) {
 436                skt->ops->get_status(skt, &status);
 437                if (!(status & SS_DETECT))
 438                        return -ENODEV;
 439
 440                if (!(status & SS_PENDING))
 441                        break;
 442
 443                msleep(100);
 444        }
 445
 446        if (status & SS_PENDING) {
 447                cs_err(skt, "voltage interrogation timed out.\n");
 448                return -ETIMEDOUT;
 449        }
 450
 451        if (status & SS_CARDBUS) {
 452                if (!(skt->features & SS_CAP_CARDBUS)) {
 453                        cs_err(skt, "cardbus cards are not supported.\n");
 454                        return -EINVAL;
 455                }
 456                skt->state |= SOCKET_CARDBUS;
 457        }
 458
 459        /*
 460         * Decode the card voltage requirements, and apply power to the card.
 461         */
 462        if (status & SS_3VCARD)
 463                skt->socket.Vcc = skt->socket.Vpp = 33;
 464        else if (!(status & SS_XVCARD))
 465                skt->socket.Vcc = skt->socket.Vpp = 50;
 466        else {
 467                cs_err(skt, "unsupported voltage key.\n");
 468                return -EIO;
 469        }
 470
 471        if (skt->power_hook)
 472                skt->power_hook(skt, HOOK_POWER_PRE);
 473
 474        skt->socket.flags = 0;
 475        skt->ops->set_socket(skt, &skt->socket);
 476
 477        /*
 478         * Wait "vcc_settle" for the supply to stabilise.
 479         */
 480        msleep(vcc_settle * 10);
 481
 482        skt->ops->get_status(skt, &status);
 483        if (!(status & SS_POWERON)) {
 484                cs_err(skt, "unable to apply power.\n");
 485                return -EIO;
 486        }
 487
 488        status = socket_reset(skt);
 489
 490        if (skt->power_hook)
 491                skt->power_hook(skt, HOOK_POWER_POST);
 492
 493        return status;
 494}
 495
 496/*
 497 * Handle card insertion.  Setup the socket, reset the card,
 498 * and then tell the rest of PCMCIA that a card is present.
 499 */
 500static int socket_insert(struct pcmcia_socket *skt)
 501{
 502        int ret;
 503
 504        cs_dbg(skt, 4, "insert\n");
 505
 506        if (!cs_socket_get(skt))
 507                return -ENODEV;
 508
 509        ret = socket_setup(skt, setup_delay);
 510        if (ret == 0) {
 511                skt->state |= SOCKET_PRESENT;
 512
 513                dev_printk(KERN_NOTICE, &skt->dev,
 514                           "pccard: %s card inserted into slot %d\n",
 515                           (skt->state & SOCKET_CARDBUS) ? "CardBus" : "PCMCIA",
 516                           skt->sock);
 517
 518#ifdef CONFIG_CARDBUS
 519                if (skt->state & SOCKET_CARDBUS) {
 520                        cb_alloc(skt);
 521                        skt->state |= SOCKET_CARDBUS_CONFIG;
 522                }
 523#endif
 524                cs_dbg(skt, 4, "insert done\n");
 525
 526                send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
 527        } else {
 528                socket_shutdown(skt);
 529        }
 530
 531        return ret;
 532}
 533
 534static int socket_suspend(struct pcmcia_socket *skt)
 535{
 536        if (skt->state & SOCKET_SUSPEND)
 537                return -EBUSY;
 538
 539        send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
 540        skt->socket = dead_socket;
 541        skt->ops->set_socket(skt, &skt->socket);
 542        if (skt->ops->suspend)
 543                skt->ops->suspend(skt);
 544        skt->state |= SOCKET_SUSPEND;
 545
 546        return 0;
 547}
 548
 549/*
 550 * Resume a socket.  If a card is present, verify its CIS against
 551 * our cached copy.  If they are different, the card has been
 552 * replaced, and we need to tell the drivers.
 553 */
 554static int socket_resume(struct pcmcia_socket *skt)
 555{
 556        int ret;
 557
 558        if (!(skt->state & SOCKET_SUSPEND))
 559                return -EBUSY;
 560
 561        skt->socket = dead_socket;
 562        skt->ops->init(skt);
 563        skt->ops->set_socket(skt, &skt->socket);
 564
 565        if (!(skt->state & SOCKET_PRESENT)) {
 566                skt->state &= ~SOCKET_SUSPEND;
 567                return socket_insert(skt);
 568        }
 569
 570        ret = socket_setup(skt, resume_delay);
 571        if (ret == 0) {
 572                /*
 573                 * FIXME: need a better check here for cardbus cards.
 574                 */
 575                if (verify_cis_cache(skt) != 0) {
 576                        cs_dbg(skt, 4, "cis mismatch - different card\n");
 577                        socket_remove_drivers(skt);
 578                        destroy_cis_cache(skt);
 579                        /*
 580                         * Workaround: give DS time to schedule removal.
 581                         * Remove me once the 100ms delay is eliminated
 582                         * in ds.c
 583                         */
 584                        msleep(200);
 585                        send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
 586                } else {
 587                        cs_dbg(skt, 4, "cis matches cache\n");
 588                        send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
 589                }
 590        } else {
 591                socket_shutdown(skt);
 592        }
 593
 594        skt->state &= ~SOCKET_SUSPEND;
 595
 596        return 0;
 597}
 598
 599static void socket_remove(struct pcmcia_socket *skt)
 600{
 601        dev_printk(KERN_NOTICE, &skt->dev,
 602                   "pccard: card ejected from slot %d\n", skt->sock);
 603        socket_shutdown(skt);
 604}
 605
 606/*
 607 * Process a socket card detect status change.
 608 *
 609 * If we don't have a card already present, delay the detect event for
 610 * about 20ms (to be on the safe side) before reading the socket status.
 611 *
 612 * Some i82365-based systems send multiple SS_DETECT events during card
 613 * insertion, and the "card present" status bit seems to bounce.  This
 614 * will probably be true with GPIO-based card detection systems after
 615 * the product has aged.
 616 */
 617static void socket_detect_change(struct pcmcia_socket *skt)
 618{
 619        if (!(skt->state & SOCKET_SUSPEND)) {
 620                int status;
 621
 622                if (!(skt->state & SOCKET_PRESENT))
 623                        msleep(20);
 624
 625                skt->ops->get_status(skt, &status);
 626                if ((skt->state & SOCKET_PRESENT) &&
 627                     !(status & SS_DETECT))
 628                        socket_remove(skt);
 629                if (!(skt->state & SOCKET_PRESENT) &&
 630                    (status & SS_DETECT))
 631                        socket_insert(skt);
 632        }
 633}
 634
 635static int pccardd(void *__skt)
 636{
 637        struct pcmcia_socket *skt = __skt;
 638        int ret;
 639
 640        skt->thread = current;
 641        skt->socket = dead_socket;
 642        skt->ops->init(skt);
 643        skt->ops->set_socket(skt, &skt->socket);
 644
 645        /* register with the device core */
 646        ret = device_register(&skt->dev);
 647        if (ret) {
 648                dev_printk(KERN_WARNING, &skt->dev,
 649                           "PCMCIA: unable to register socket\n");
 650                skt->thread = NULL;
 651                complete(&skt->thread_done);
 652                return 0;
 653        }
 654        ret = pccard_sysfs_add_socket(&skt->dev);
 655        if (ret)
 656                dev_warn(&skt->dev, "err %d adding socket attributes\n", ret);
 657
 658        complete(&skt->thread_done);
 659
 660        set_freezable();
 661        for (;;) {
 662                unsigned long flags;
 663                unsigned int events;
 664
 665                set_current_state(TASK_INTERRUPTIBLE);
 666
 667                spin_lock_irqsave(&skt->thread_lock, flags);
 668                events = skt->thread_events;
 669                skt->thread_events = 0;
 670                spin_unlock_irqrestore(&skt->thread_lock, flags);
 671
 672                if (events) {
 673                        mutex_lock(&skt->skt_mutex);
 674                        if (events & SS_DETECT)
 675                                socket_detect_change(skt);
 676                        if (events & SS_BATDEAD)
 677                                send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
 678                        if (events & SS_BATWARN)
 679                                send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
 680                        if (events & SS_READY)
 681                                send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
 682                        mutex_unlock(&skt->skt_mutex);
 683                        continue;
 684                }
 685
 686                if (kthread_should_stop())
 687                        break;
 688
 689                schedule();
 690                try_to_freeze();
 691        }
 692        /* make sure we are running before we exit */
 693        set_current_state(TASK_RUNNING);
 694
 695        /* remove from the device core */
 696        pccard_sysfs_remove_socket(&skt->dev);
 697        device_unregister(&skt->dev);
 698
 699        return 0;
 700}
 701
 702/*
 703 * Yenta (at least) probes interrupts before registering the socket and
 704 * starting the handler thread.
 705 */
 706void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
 707{
 708        unsigned long flags;
 709        cs_dbg(s, 4, "parse_events: events %08x\n", events);
 710        if (s->thread) {
 711                spin_lock_irqsave(&s->thread_lock, flags);
 712                s->thread_events |= events;
 713                spin_unlock_irqrestore(&s->thread_lock, flags);
 714
 715                wake_up_process(s->thread);
 716        }
 717} /* pcmcia_parse_events */
 718EXPORT_SYMBOL(pcmcia_parse_events);
 719
 720
 721/* register pcmcia_callback */
 722int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
 723{
 724        int ret = 0;
 725
 726        /* s->skt_mutex also protects s->callback */
 727        mutex_lock(&s->skt_mutex);
 728
 729        if (c) {
 730                /* registration */
 731                if (s->callback) {
 732                        ret = -EBUSY;
 733                        goto err;
 734                }
 735
 736                s->callback = c;
 737
 738                if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT)
 739                        send_event(s, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
 740        } else
 741                s->callback = NULL;
 742 err:
 743        mutex_unlock(&s->skt_mutex);
 744
 745        return ret;
 746}
 747EXPORT_SYMBOL(pccard_register_pcmcia);
 748
 749
 750/* I'm not sure which "reset" function this is supposed to use,
 751 * but for now, it uses the low-level interface's reset, not the
 752 * CIS register.
 753 */
 754
 755int pcmcia_reset_card(struct pcmcia_socket *skt)
 756{
 757        int ret;
 758
 759        cs_dbg(skt, 1, "resetting socket\n");
 760
 761        mutex_lock(&skt->skt_mutex);
 762        do {
 763                if (!(skt->state & SOCKET_PRESENT)) {
 764                        ret = -ENODEV;
 765                        break;
 766                }
 767                if (skt->state & SOCKET_SUSPEND) {
 768                        ret = -EBUSY;
 769                        break;
 770                }
 771                if (skt->state & SOCKET_CARDBUS) {
 772                        ret = -EPERM;
 773                        break;
 774                }
 775
 776                ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
 777                if (ret == 0) {
 778                        send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
 779                        if (skt->callback)
 780                                skt->callback->suspend(skt);
 781                        if (socket_reset(skt) == 0) {
 782                                send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
 783                                if (skt->callback)
 784                                        skt->callback->resume(skt);
 785                        }
 786                }
 787
 788                ret = 0;
 789        } while (0);
 790        mutex_unlock(&skt->skt_mutex);
 791
 792        return ret;
 793} /* reset_card */
 794EXPORT_SYMBOL(pcmcia_reset_card);
 795
 796
 797/* These shut down or wake up a socket.  They are sort of user
 798 * initiated versions of the APM suspend and resume actions.
 799 */
 800int pcmcia_suspend_card(struct pcmcia_socket *skt)
 801{
 802        int ret;
 803
 804        cs_dbg(skt, 1, "suspending socket\n");
 805
 806        mutex_lock(&skt->skt_mutex);
 807        do {
 808                if (!(skt->state & SOCKET_PRESENT)) {
 809                        ret = -ENODEV;
 810                        break;
 811                }
 812                if (skt->state & SOCKET_CARDBUS) {
 813                        ret = -EPERM;
 814                        break;
 815                }
 816                if (skt->callback) {
 817                        ret = skt->callback->suspend(skt);
 818                        if (ret)
 819                                break;
 820                }
 821                ret = socket_suspend(skt);
 822        } while (0);
 823        mutex_unlock(&skt->skt_mutex);
 824
 825        return ret;
 826} /* suspend_card */
 827EXPORT_SYMBOL(pcmcia_suspend_card);
 828
 829
 830int pcmcia_resume_card(struct pcmcia_socket *skt)
 831{
 832        int ret;
 833    
 834        cs_dbg(skt, 1, "waking up socket\n");
 835
 836        mutex_lock(&skt->skt_mutex);
 837        do {
 838                if (!(skt->state & SOCKET_PRESENT)) {
 839                        ret = -ENODEV;
 840                        break;
 841                }
 842                if (skt->state & SOCKET_CARDBUS) {
 843                        ret = -EPERM;
 844                        break;
 845                }
 846                ret = socket_resume(skt);
 847                if (!ret && skt->callback)
 848                        skt->callback->resume(skt);
 849        } while (0);
 850        mutex_unlock(&skt->skt_mutex);
 851
 852        return ret;
 853} /* resume_card */
 854EXPORT_SYMBOL(pcmcia_resume_card);
 855
 856
 857/* These handle user requests to eject or insert a card. */
 858int pcmcia_eject_card(struct pcmcia_socket *skt)
 859{
 860        int ret;
 861    
 862        cs_dbg(skt, 1, "user eject request\n");
 863
 864        mutex_lock(&skt->skt_mutex);
 865        do {
 866                if (!(skt->state & SOCKET_PRESENT)) {
 867                        ret = -ENODEV;
 868                        break;
 869                }
 870
 871                ret = send_event(skt, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW);
 872                if (ret != 0) {
 873                        ret = -EINVAL;
 874                        break;
 875                }
 876
 877                socket_remove(skt);
 878                ret = 0;
 879        } while (0);
 880        mutex_unlock(&skt->skt_mutex);
 881
 882        return ret;
 883} /* eject_card */
 884EXPORT_SYMBOL(pcmcia_eject_card);
 885
 886
 887int pcmcia_insert_card(struct pcmcia_socket *skt)
 888{
 889        int ret;
 890
 891        cs_dbg(skt, 1, "user insert request\n");
 892
 893        mutex_lock(&skt->skt_mutex);
 894        do {
 895                if (skt->state & SOCKET_PRESENT) {
 896                        ret = -EBUSY;
 897                        break;
 898                }
 899                if (socket_insert(skt) == -ENODEV) {
 900                        ret = -ENODEV;
 901                        break;
 902                }
 903                ret = 0;
 904        } while (0);
 905        mutex_unlock(&skt->skt_mutex);
 906
 907        return ret;
 908} /* insert_card */
 909EXPORT_SYMBOL(pcmcia_insert_card);
 910
 911
 912static int pcmcia_socket_uevent(struct device *dev,
 913                                struct kobj_uevent_env *env)
 914{
 915        struct pcmcia_socket *s = container_of(dev, struct pcmcia_socket, dev);
 916
 917        if (add_uevent_var(env, "SOCKET_NO=%u", s->sock))
 918                return -ENOMEM;
 919
 920        return 0;
 921}
 922
 923
 924static struct completion pcmcia_unload;
 925
 926static void pcmcia_release_socket_class(struct class *data)
 927{
 928        complete(&pcmcia_unload);
 929}
 930
 931
 932struct class pcmcia_socket_class = {
 933        .name = "pcmcia_socket",
 934        .dev_uevent = pcmcia_socket_uevent,
 935        .dev_release = pcmcia_release_socket,
 936        .class_release = pcmcia_release_socket_class,
 937};
 938EXPORT_SYMBOL(pcmcia_socket_class);
 939
 940
 941static int __init init_pcmcia_cs(void)
 942{
 943        init_completion(&pcmcia_unload);
 944        return class_register(&pcmcia_socket_class);
 945}
 946
 947static void __exit exit_pcmcia_cs(void)
 948{
 949        class_unregister(&pcmcia_socket_class);
 950        wait_for_completion(&pcmcia_unload);
 951}
 952
 953subsys_initcall(init_pcmcia_cs);
 954module_exit(exit_pcmcia_cs);
 955
 956